130 lines
2.9 KiB
JavaScript
130 lines
2.9 KiB
JavaScript
/*
|
|
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;
|