From 1158e558606034b681f4663d62677e798cf5ec23 Mon Sep 17 00:00:00 2001 From: Kevin J Hoerr Date: Fri, 29 Nov 2019 18:28:54 -0500 Subject: Implement report parsing for Tarpaulin The generated Tarpaulin HTML report does not have stats to parse via the DOM - the data is injected via a script tag, which only has line-by-line coverage, though it includes statistics for each file. The total coverage is counted by summing the covered/coverable stats reported for each file. Also, the bad version for express is fixed, and messages are included for errors that occur for the POST endpoint. --- src/formats.ts | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/formats.ts') diff --git a/src/formats.ts b/src/formats.ts index 34f97df..5d389b4 100644 --- a/src/formats.ts +++ b/src/formats.ts @@ -33,8 +33,30 @@ const FormatsObj: FormatObj = { formats: { tarpaulin: { parse_coverage: (file: Document) => { - //TODO parse coverage from file (example?) - return 0.0; + const scripts = file.getElementsByTagName("script"); + if (scripts.length == 0) { + throw new Error("Invalid report document"); + } + const data = scripts[0].text; + const accumFunc = (regex: RegExp) => { + let acc: number = 0; + while (true) { + const match = regex.exec(data); + if (match === null) break; + acc += Number(match[1]); + } + + return acc; + }; + + const covered = accumFunc(/"covered":(\d*)/g); + const coverable = accumFunc(/"coverable":(\d*)/g); + + // do not error if LOC is 0 + if (coverable === 0) { + return 0.0; + } + return (100 * covered) / coverable; }, match_color: default_color_matches } -- cgit