forked from enviPath/enviPy
127 lines
3.5 KiB
JavaScript
127 lines
3.5 KiB
JavaScript
/*
|
|
Copyright (c) 2012, Yahoo! Inc. All rights reserved.
|
|
Code licensed under the BSD License:
|
|
http://yuilibrary.com/license/
|
|
*/
|
|
|
|
var fs = require('fs'),
|
|
path = require('path');
|
|
|
|
/* istanbul ignore next */
|
|
var exists = fs.exists || path.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');
|
|
}
|
|
};
|
|
|
|
var parse = function(file, cb) {
|
|
exists(file, function(x) {
|
|
if (!x) {
|
|
return walkFile(file, cb);
|
|
}
|
|
fs.readFile(file, 'utf8', function(err, str) {
|
|
walkFile(str, cb);
|
|
});
|
|
});
|
|
|
|
};
|
|
|
|
|
|
module.exports = parse;
|
|
module.exports.source = walkFile;
|