| /* |
| 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; |