DiffCov/src/lcov-parser.js

131 lines
2.9 KiB
JavaScript
Raw Normal View History

2022-10-24 18:48:49 +00:00
/*
Copyright (c) 2012, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://yuilibrary.com/license/
*/
import fs from "fs";
const exists = fs.exists;
var walkFile = function (str, cb) {
var data = [],
item;
["end_of_record"].concat(str.split("\n")).forEach(function (line) {
line = line.trim();
var allparts = line.split(":"),
parts = [allparts.shift(), allparts.join(":")],
lines,
fn;
switch (parts[0].toUpperCase()) {
case "TN":
item.title = parts[1].trim();
break;
case "SF":
item.file = parts.slice(1).join(":").trim();
break;
case "FNF":
item.functions.found = Number(parts[1].trim());
break;
case "FNH":
item.functions.hit = Number(parts[1].trim());
break;
case "LF":
item.lines.found = Number(parts[1].trim());
break;
case "LH":
item.lines.hit = Number(parts[1].trim());
break;
case "DA":
lines = parts[1].split(",");
item.lines.details.push({
line: Number(lines[0]),
hit: Number(lines[1]),
});
break;
case "FN":
fn = parts[1].split(",");
item.functions.details.push({
name: fn[1],
line: Number(fn[0]),
});
break;
case "FNDA":
fn = parts[1].split(",");
item.functions.details.some(function (i, k) {
if (i.name === fn[1] && i.hit === undefined) {
item.functions.details[k].hit = Number(fn[0]);
return true;
}
});
break;
case "BRDA":
fn = parts[1].split(",");
item.branches.details.push({
line: Number(fn[0]),
block: Number(fn[1]),
branch: Number(fn[2]),
taken: fn[3] === "-" ? 0 : Number(fn[3]),
});
break;
case "BRF":
item.branches.found = Number(parts[1]);
break;
case "BRH":
item.branches.hit = Number(parts[1]);
break;
}
if (line.indexOf("end_of_record") > -1) {
data.push(item);
item = {
lines: {
found: 0,
hit: 0,
details: [],
},
functions: {
hit: 0,
found: 0,
details: [],
},
branches: {
hit: 0,
found: 0,
details: [],
},
};
}
});
data.shift();
if (data.length) {
cb(null, data);
} else {
cb("Failed to parse string");
}
};
const parseInternal = function (file, cb) {
exists(file, function (x) {
if (!x) {
return walkFile(file, cb);
}
fs.readFile(file, "utf8", function (err, str) {
walkFile(str, cb);
});
});
};
export const parse = (file) =>
new Promise((resolve, reject) => {
parseInternal(file, (error, coverage) => {
error ? reject(error) : resolve(coverage);
});
});
export default parse;