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