Skip to content

Commit 6fa6460

Browse files
committed
refactor: parse-lcov pt 2
1 parent 5187be2 commit 6fa6460

File tree

1 file changed

+55
-46
lines changed

1 file changed

+55
-46
lines changed

src/parse-lcov.ts

+55-46
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { existsSync, readFile } from "fs";
22
import { Coverage, CoverageCollection } from "./coverage-info";
33

44
type MetricsMap = {
5-
[key: string]: (item: Coverage, args: string) => void;
5+
[key: string]: (item: Coverage, value: string) => void;
66
};
77

88
/**
@@ -34,41 +34,43 @@ function createCoverageItem(): Coverage {
3434
* @description This object maps lcov metrics to a handler function.
3535
*/
3636
const metricsMap: MetricsMap = {
37-
TN: (item: Coverage, args: string) => (item.title = args.trim()),
38-
SF: (item: Coverage, args: string) => (item.file = args.trim()),
39-
LF: (item: Coverage, args: string) =>
40-
(item.lines.found = Number(args.trim())),
41-
LH: (item: Coverage, args: string) => (item.lines.hit = Number(args.trim())),
42-
DA: (item: Coverage, args: string) => {
43-
const details = args.split(",");
44-
item.lines.details.push({
45-
line: Number(details[0]),
46-
hit: Number(details[1]),
47-
});
37+
TN: (item, val) => {
38+
item.title = val;
4839
},
49-
FNF: (item: Coverage, args: string) =>
50-
(item.functions.found = Number(args.trim())),
51-
FNH: (item: Coverage, args: string) =>
52-
(item.functions.hit = Number(args.trim())),
53-
FNDA: (item: Coverage, args: string) => {
54-
const details = args.split(",");
55-
item.functions.details.push({
56-
line: Number(details[0]),
57-
name: details[1],
58-
});
40+
SF: (item, val) => {
41+
item.file = val;
5942
},
60-
BRF: (item: Coverage, args: string) =>
61-
(item.branches.found = Number(args.trim())),
62-
BRH: (item: Coverage, args: string) =>
63-
(item.branches.hit = Number(args.trim())),
64-
BRDA: (item: Coverage, args: string) => {
65-
const details = args.split(",");
66-
item.branches.details.push({
67-
line: Number(details[0]),
68-
block: Number(details[1]),
69-
branch: Number(details[2]),
70-
hit: details[3] === "-" ? 0 : Number(details[3]),
71-
});
43+
LF: (item, val) => {
44+
item.lines.found = Number(val);
45+
},
46+
LH: (item, val) => {
47+
item.lines.hit = Number(val);
48+
},
49+
DA: (item, val) => {
50+
const [line, hit, ..._] = val.split(",").map((v) => Number(v));
51+
item.lines.details.push({ line, hit });
52+
},
53+
FNF: (item, val) => {
54+
item.functions.found = Number(val);
55+
},
56+
FNH: (item, val) => {
57+
item.functions.hit = Number(val);
58+
},
59+
FNDA: (item, val) => {
60+
const [line, name, ..._] = val.split(",");
61+
item.functions.details.push({ line: Number(line), name });
62+
},
63+
BRF: (item, val) => {
64+
item.branches.found = Number(val);
65+
},
66+
BRH: (item, val) => {
67+
item.branches.hit = Number(val);
68+
},
69+
BRDA: (item, val) => {
70+
const [line, block, branch, hit, ..._] = val
71+
.split(",")
72+
.map((v) => (v === "-" ? 0 : Number(v)));
73+
item.branches.details.push({ line, block, branch, hit });
7274
},
7375
};
7476

@@ -78,25 +80,32 @@ const metricsMap: MetricsMap = {
7880
* @returns A CoverageCollection
7981
*/
8082
function parseFile(str: string): CoverageCollection {
81-
let data: CoverageCollection = [];
82-
let item: Coverage = createCoverageItem();
83+
const data: CoverageCollection = [];
8384
const lines = str.split("\n");
85+
let item = createCoverageItem();
8486

85-
for (let line of lines) {
86-
line = line.trim();
87-
const allparts = line.split(":");
88-
const metrics = allparts.shift();
89-
const args = allparts.join(":");
87+
for (const line of lines) {
88+
const trimmedLine = line.trim();
89+
const allParts = trimmedLine.split(":");
90+
const metrics = allParts[0];
91+
const args = allParts.slice(1).join(":");
9092

9193
if (item && metrics) {
9294
const handler = metricsMap[metrics.toUpperCase()];
9395
if (handler) {
94-
handler(item, args);
96+
try {
97+
handler(item, args.trim());
98+
} catch (e) {
99+
console.error(`Error parsing line: ${line}`);
100+
console.error(e);
101+
}
95102
}
96103
}
97104

98-
if (line.indexOf("end_of_record") > -1) {
99-
item && data.push(item);
105+
if (trimmedLine.includes("end_of_record")) {
106+
if (item) {
107+
data.push(item);
108+
}
100109
item = createCoverageItem();
101110
}
102111
}
@@ -115,7 +124,7 @@ export async function parse(file: string): Promise<CoverageCollection> {
115124
!existsSync(file)
116125
? reject(new Error(`File not found: ${file}`))
117126
: readFile(file, "utf8", (_, str) => {
118-
resolve(parseFile(str));
119-
});
127+
resolve(parseFile(str));
128+
});
120129
});
121130
}

0 commit comments

Comments
 (0)