Commit c5b4f331 by Marcin Cieslak

Merge 'Rework test coverage facility w/ istanbul'

parents 705fa104 3caabebc
......@@ -5,3 +5,7 @@ build
lib-cov
node_modules
vendor
test/html-report
test/lcov-report
test/lcov.info
coverage
node_modules/**
test/coverage/html
......@@ -64,7 +64,7 @@
"devDependencies": {
"coveralls": "^2.11.2",
"cross-spawn": "^1.0.3",
"jscoverage": "^0.5.9",
"istanbul": "^0.3.13",
"jshint": "^2.8.0",
"mocha": "^2.2.5",
"mocha-lcov-reporter": "^0.0.2",
......
......@@ -2,62 +2,82 @@
* node-sass: scripts/coverage.js
*/
require('../lib/extensions');
var Mocha = require('mocha'),
fs = require('fs'),
path = require('path'),
mkdirp = require('mkdirp'),
coveralls = require('coveralls'),
Instrumenter = require('istanbul').Instrumenter,
Report = require('istanbul').Report,
Collector = new require('istanbul').Collector,
sourcefiles = ['index.js', 'extensions.js', 'render.js'],
summary= Report.create('text-summary'),
lcov = Report.create('lcovonly', { dir: path.join('coverage') }),
html = Report.create('html', { dir: path.join('coverage', 'html') });
var bin = require('path').join.bind(null, __dirname, '..', 'node_modules', '.bin'),
spawn = require('child_process').spawn;
/**
* Run test suite
*
* @api private
*/
function suite() {
function coverage() {
var mocha = new Mocha();
var rep = function(runner) {
runner.on('end', function(){
var cov = global.__coverage__,
collector = new Collector();
if (cov) {
mkdirp(path.join('coverage', 'html'), function(err) {
if (err) { throw err; }
collector.add(cov);
summary.writeReport(collector, true);
html.writeReport(collector, true);
lcov.on('done', function() {
fs.readFile(path.join('coverage', 'lcov.info'), function(err, data) {
if (err) { console.error(err); }
coveralls.handleInput(data.toString(),
function (err) { if (err) { console.error(err); } });
});
});
lcov.writeReport(collector, true);
});
} else {
console.warn('No coverage');
}
});
};
var instrumenter = new Instrumenter();
var instrumentedfiles = [];
var processfile = function(source) {
fs.readFile(path.join('lib', source), function(err, data) {
if (err) { throw err; }
mkdirp('lib-cov', function(err) {
if (err) { throw err; }
fs.writeFile(path.join('lib-cov', source),
instrumenter.instrumentSync(data.toString(),
path.join('lib', source)),
function(err) {
if (err) { throw err; }
instrumentedfiles.push(source);
if (instrumentedfiles.length === sourcefiles.length) {
fs.readdirSync('test').filter(function(file){
return file.substr(-6) === 'api.js' ||
file.substr(-11) === 'runtime.js' ||
file.substr(-7) === 'spec.js';
}).forEach(function(file){
mocha.addFile(
path.join('test', file)
);
});
process.env.NODESASS_COV = 1;
var coveralls = spawn(bin('coveralls'));
var args = [bin('_mocha')].concat(['--reporter', 'mocha-lcov-reporter']);
var mocha = spawn(process.sass.runtime.execPath, args, {
env: process.env
mocha.reporter(rep).run(function(failures) {
process.on('exit', function () {
process.exit(failures);
});
mocha.on('error', function(err) {
console.error(err);
process.exit(1);
});
mocha.stderr.setEncoding('utf8');
mocha.stderr.on('data', function(err) {
console.error(err);
process.exit(1);
}
});
mocha.stdout.pipe(coveralls.stdin);
}
/**
* Generate coverage files
*
* @api private
*/
function coverage() {
var jscoverage = spawn(bin('jscoverage'), ['lib', 'lib-cov']);
jscoverage.on('error', function(err) {
console.error(err);
process.exit(1);
});
jscoverage.stderr.setEncoding('utf8');
jscoverage.stderr.on('data', function(err) {
console.error(err);
process.exit(1);
});
jscoverage.on('close', suite);
};
for (var i in sourcefiles) {
processfile(sourcefiles[i]);
}
}
/**
......
......@@ -3,7 +3,9 @@ var assert = require('assert'),
exists = fs.existsSync,
path = require('path'),
read = fs.readFileSync,
sass = require('../lib'),
sass = process.env.NODESASS_COV
? require('../lib-cov')
: require('../lib'),
util = require('./util');
describe('spec', function() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment