Combine standard coverage and rendering coverage
This commit is contained in:
+72
-16
@@ -20,6 +20,8 @@ var backupDir = path.join(__dirname, '../src-backup');
|
|||||||
var instrumentedDir = path.join(__dirname, '../src-instrumented');
|
var instrumentedDir = path.join(__dirname, '../src-instrumented');
|
||||||
var coverageDir = path.join(__dirname, '../coverage');
|
var coverageDir = path.join(__dirname, '../coverage');
|
||||||
|
|
||||||
|
fs.mkdirSync(coverageDir);
|
||||||
|
|
||||||
// The main players in the coverage generation via istanbul
|
// The main players in the coverage generation via istanbul
|
||||||
var instrumenter = new istanbul.Instrumenter();
|
var instrumenter = new istanbul.Instrumenter();
|
||||||
var reporter = new istanbul.Reporter(false, coverageDir);
|
var reporter = new istanbul.Reporter(false, coverageDir);
|
||||||
@@ -76,16 +78,23 @@ var revertBackupAndInstrumentationDir = function() {
|
|||||||
fs.removeSync(instrumentedDir);
|
fs.removeSync(instrumentedDir);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback for when runTestsuite() has finished.
|
* Callback for when runTestsuite() has finished.
|
||||||
*/
|
*/
|
||||||
var collectAndWriteCoverageData = function() {
|
var collectAndWriteCoverageData = function() {
|
||||||
log('• collect data from coverage.json');
|
log('• collect data from coverage *.json files');
|
||||||
|
|
||||||
var coverageFile = path.join(__dirname,'../coverage/coverage.json');
|
var coverageFiles = [
|
||||||
var coverageJson = JSON.parse(fs.readFileSync(coverageFile, 'utf8'));
|
path.join(__dirname, '..', 'coverage', 'coverage.json'),
|
||||||
collector.add(coverageJson);
|
path.join(__dirname, '..', 'coverage', 'coverage-rendering.json')
|
||||||
|
];
|
||||||
|
coverageFiles.forEach(function(coverageFile) {
|
||||||
|
if (fs.existsSync(coverageFile)) {
|
||||||
|
log(' • collect data from ' + path.basename(coverageFile));
|
||||||
|
var coverageJson = JSON.parse(fs.readFileSync(coverageFile, 'utf8'));
|
||||||
|
collector.add(coverageJson);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
reporter.addAll(['lcovonly','html']);
|
reporter.addAll(['lcovonly','html']);
|
||||||
|
|
||||||
@@ -97,6 +106,44 @@ var collectAndWriteCoverageData = function() {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs the rendering test by spawning a call to `make test-rendering`. The
|
||||||
|
* `make`-call sets up certain things so that the rendering tests can actually
|
||||||
|
* run, which is why we call it this way.
|
||||||
|
*
|
||||||
|
* @param {Function} callback The callback to invoke once `make` has exited.
|
||||||
|
* Will receive the exit code.
|
||||||
|
*/
|
||||||
|
var runRenderingTestsuite = function(callback) {
|
||||||
|
var spawn = require('child_process').spawn;
|
||||||
|
var child = spawn('make', ['test-rendering'], {stdio: 'inherit'});
|
||||||
|
child.on('exit', function(code) {
|
||||||
|
callback(code);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Derive output file name from input file name, by replacing the *last*
|
||||||
|
* occurence of `/src/` by `/src-instrumented/`
|
||||||
|
*
|
||||||
|
* @param {String} file The input filename.
|
||||||
|
* @return {String} file The output filename.
|
||||||
|
*/
|
||||||
|
var outputFilenameByFilename = function(file) {
|
||||||
|
var search = '/src/';
|
||||||
|
var replace = '/src-instrumented/';
|
||||||
|
var re = new RegExp(search, 'g');
|
||||||
|
var m, match;
|
||||||
|
while ((m = re.exec(file)) !== null) {
|
||||||
|
match = m;
|
||||||
|
}
|
||||||
|
var idx = match.index;
|
||||||
|
var outfile = file.substr(0, idx) + replace +
|
||||||
|
file.substr(idx + search.length);
|
||||||
|
|
||||||
|
return outfile;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will instrument all JavaScript files that are passed as second parameter.
|
* Will instrument all JavaScript files that are passed as second parameter.
|
||||||
* This is the callback to the glob call.
|
* This is the callback to the glob call.
|
||||||
@@ -113,15 +160,7 @@ var foundAllJavaScriptSourceFiles = function(err, files) {
|
|||||||
files.forEach(function(file) {
|
files.forEach(function(file) {
|
||||||
cnt++;
|
cnt++;
|
||||||
var content = fs.readFileSync(file, 'utf-8');
|
var content = fs.readFileSync(file, 'utf-8');
|
||||||
// derive output file name from input file name, by replacing the *last*
|
var outfile = outputFilenameByFilename(file);
|
||||||
// occurence of /src/ by /src-instrumented/
|
|
||||||
var re = new RegExp('/src/', 'g');
|
|
||||||
var m, match;
|
|
||||||
while ((m = re.exec(file)) !== null) {
|
|
||||||
match = m;
|
|
||||||
}
|
|
||||||
var outfile = file.substr(0, match.index) + '/src-instrumented/' +
|
|
||||||
file.substr(match.index + '/src/'.length);
|
|
||||||
var instrumented = instrumenter.instrumentSync(content, file);
|
var instrumented = instrumenter.instrumentSync(content, file);
|
||||||
fs.writeFileSync(outfile, instrumented);
|
fs.writeFileSync(outfile, instrumented);
|
||||||
if (cnt % 10 === 0) {
|
if (cnt % 10 === 0) {
|
||||||
@@ -133,8 +172,25 @@ var foundAllJavaScriptSourceFiles = function(err, files) {
|
|||||||
|
|
||||||
fs.copySync(instrumentedDir, dir, copyOpts);
|
fs.copySync(instrumentedDir, dir, copyOpts);
|
||||||
|
|
||||||
log('• run test suite on instrumented code');
|
log('• run test suites on instrumented code');
|
||||||
runTestsuite({coverage: true, reporter: 'dot'}, collectAndWriteCoverageData);
|
|
||||||
|
log(' • run rendering test suite');
|
||||||
|
runRenderingTestsuite(function(codeRendering) {
|
||||||
|
if (codeRendering === 0) {
|
||||||
|
log(' • run standard test suite');
|
||||||
|
runTestsuite({coverage: true, reporter: 'dot'}, function(code) {
|
||||||
|
if (code === 0) {
|
||||||
|
collectAndWriteCoverageData();
|
||||||
|
} else {
|
||||||
|
process.stderr.write('Trouble running the standard testsuite\n');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
process.stderr.write('Trouble running the rendering testsuite\n');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -19,8 +19,23 @@ page.open(url).then(function(status) {
|
|||||||
}
|
}
|
||||||
console.error(failedTests.length + ' test(s) failed.');
|
console.error(failedTests.length + ' test(s) failed.');
|
||||||
} else {
|
} else {
|
||||||
|
// check for cov here
|
||||||
|
var coverage = page.evaluate(function() {
|
||||||
|
return window.__coverage__;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (coverage) {
|
||||||
|
console.log('Writing coverage to coverage/coverage-rendering.json');
|
||||||
|
var fs = require('fs');
|
||||||
|
fs.write(
|
||||||
|
fs.workingDirectory + '/coverage/coverage-rendering.json',
|
||||||
|
JSON.stringify(coverage),
|
||||||
|
'w'
|
||||||
|
);
|
||||||
|
}
|
||||||
console.log('All tests passed.');
|
console.log('All tests passed.');
|
||||||
}
|
}
|
||||||
|
|
||||||
page.close();
|
page.close();
|
||||||
phantom.exit(failedTests.length === 0 ? 0 : 1);
|
phantom.exit(failedTests.length === 0 ? 0 : 1);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user