@samitouri / QOS-React-2 / commits / eda56b7af2

new grunt test:coverage task

Thomas Aylott committed Nov 15, 2013 at 16:31 UTC eda56b7af2456c09879b343f255c21881400bbc0
2 files changed +52
Gruntfile.js
+4
@@ -70,6 +70,7 @@ module.exports = function(grunt) {
70 grunt.registerTask('build:transformer', ['jsx:debug', 'browserify:transformer']);
71 grunt.registerTask('build:min', ['jsx:release', 'version-check', 'browserify:min']);
72 grunt.registerTask('build:addons-min', ['jsx:debug', 'browserify:addonsMin']);
73 + grunt.registerTask('build:withCodeCoverageLogging', ['jsx:debug', 'version-check', 'browserify:withCodeCoverageLogging']);
74 grunt.registerTask('build:test', [
75 'jsx:test',
76 'version-check',
@@ -78,11 +79,14 @@ module.exports = function(grunt) {
79
80 grunt.registerTask('webdriver-phantomjs', webdriverPhantomJSTask);
81
82 + grunt.registerTask('coverage:parse', require('./grunt/tasks/coverage-parse'));
83 +
84 grunt.registerTask('test:webdriver:phantomjs', [
85 'connect',
86 'webdriver-phantomjs',
87 'webdriver-jasmine:local'
88 ]);
89 + grunt.registerTask('test:coverage', ['build:test', 'build:withCodeCoverageLogging', 'test:webdriver:phantomjs', 'coverage:parse']);
90 grunt.registerTask('test', ['build:test', 'build:basic', 'test:webdriver:phantomjs']);
91 grunt.registerTask('npm:test', ['build', 'npm:pack']);
92
grunt/tasks/coverage-parse.js new
+48
@@ -0,0 +1,48 @@
1 +var grunt = require('grunt');
2 +
3 +module.exports = function(){
4 + var ROOT = require('path').normalize(__dirname + '/../..');
5 + var done = this.async();
6 + var uncoveredExpressionCount = 0;
7 + var uncoveredLineCount = 0;
8 +
9 + require('fs').createReadStream(ROOT + '/coverage.log')
10 + .pipe(require('coverify/parse')(function(error, results){
11 + if (error) grunt.fatal(error);
12 +
13 + Object.keys(results)
14 + .sort(function(a, b){
15 + if (results[a].length > results[b].length) return -1;
16 + if (results[a].length < results[b].length) return 1;
17 + return 0;
18 + })
19 + .forEach(function(path){
20 + if (results[path].length === 0) return;
21 + var relativePath = path.replace(ROOT, '');
22 + uncoveredExpressionCount += results[path].length;
23 + grunt.log.error(results[path].length + ' expressions not covered ' + relativePath);
24 +
25 + results[path].forEach(function(c){
26 + uncoveredLineCount += c.code.split('\n').length;
27 + // console.log(
28 + // 'https://github.com/' + process.env.TRAVIS_REPO_SLUG + '/blob/' + process.env.TRAVIS_BRANCH + relativePath + '#L' + (c.lineNum+1) + '-L' + (c.lineNum+1 + c.code.split('\n').length)
29 + // );
30 + console.log(
31 + 'txmt://open?url=' + encodeURIComponent('file://' + path) + '&line=' + (c.lineNum+1) + '&column=' + (c.column[0]+2)
32 + );
33 + // console.log(c.code.split('\n').map(function(line){return '\t' + line}).join('\n'))
34 + });
35 + console.log('');
36 + });
37 +
38 + Object.keys(results).sort().forEach(function(path){
39 + if (results[path].length > 0) return;
40 + var relativePath = path.replace(ROOT, '');
41 + grunt.log.ok('100% coverage ' + relativePath);
42 + });
43 +
44 + if (uncoveredExpressionCount > 0) grunt.log.error(uncoveredExpressionCount + ' expressions not covered');
45 + if (uncoveredLineCount > 0) grunt.log.error(uncoveredLineCount + ' lines not covered');
46 + done();
47 + }));
48 +}
\ No newline at end of file