#!/usr/bin/env node var fs = require('fs'); var path = require('path'); var FFI = require('node-ffi'); var libc = new FFI.Library(null, {'system': ['int32', ['string']]}); var exec = libc.system; var jsRequire = require.extensions['.js']; require.extensions['.js'] = function(module, filename) { var baseFile = path.relative(path.join(__dirname, '..'), filename); if (baseFile.match(/^lib\//)) { filename = filename.replace(/\/lib\//, '/lib-cov/'); } jsRequire(module, filename); } function printStats(file, covered, total) { var maxFileLength = 26; var pad = maxFileLength - file.length; for (var i = 0; i < pad; i++) file += ' '; console.log(file + ' ' + (parseFloat(covered) / parseFloat(total) * 100).toFixed(2) + '%' + ((covered != total) ? ' ' : ' ') + '(' + covered + '/' + total + ')'); } function cleanup() { exec('rm -rf lib-cov'); } process.on('uncaughtException', function(err) { cleanup(); throw err; }); process.on('exit', function() { var out = 'NO COVERAGE'; if (typeof(_$jscoverage) !== 'undefined') { var stats = {} var entireCovered = 0; var entireTotal = 0; out = ''; var cov = _$jscoverage; for (var file in cov) { stats[file] = {covered: 0, total: 0}; var id = file.replace(/[\.\/]/, '_'); var total = cov[file].length; var uncovered = 0; for (var idx in cov[file]) { if (cov[file][idx] === 0) uncovered++; } var covered = total - uncovered; stats[file].covered = covered; stats[file].total = total; entireCovered += covered; entireTotal += total; out += '

' + file + ' (' + covered + '/' + total + ', ' + (parseFloat(covered) / parseFloat(total) * 100).toFixed(2) + '% covered) [+]

\n'; var lineAccess = []; out += ""; for (var lineNo in cov[file].source) { lineNo = parseInt(lineNo); out += ""; out += "\n"; } out += "\n\n"; } out += ''; } var head = ""; var body = out; body = "

Total coverage: " + (parseFloat(entireCovered) / parseFloat(entireTotal) * 100).toFixed(2) + "%

\n" + body; var page = "\n\n"+head+"\n\n\n"+body+"\n\n\n"; fs.writeFileSync('coverage.html', page); console.log('Test coverage:\n'); var files = []; for (var file in stats) { files.push([file, stats[file]]); } files.sort(function(a, b) { var aVal = parseFloat(a[1].covered) / parseFloat(a[1].total); var bVal = parseFloat(b[1].covered) / parseFloat(b[1].total); return (aVal > bVal ? -1 : 1); }); for (var item in files) { var file = files[item][0]; var stats = files[item][1]; printStats(file, stats.covered, stats.total) } console.log(''); printStats('Total', entireCovered, entireTotal); cleanup(); }); exec('./node_modules/visionmedia-jscoverage/jscoverage lib lib-cov') require(path.join(__dirname, '../node_modules/jasmine-node/lib/jasmine-node/cli.js'));