From c66a50bd0842b60ee781ea52a78bbf2cb9d537fa Mon Sep 17 00:00:00 2001 From: "G. Grau" Date: Fri, 26 Feb 2016 10:20:44 +0100 Subject: [PATCH] Add coverage testing --- .gitignore | 3 +++ .npmignore | 1 + .travis.yml | 2 ++ dist/timm.js | 1 - dist/timm.min.js | 2 +- package.json | 12 ++++++++++-- src/timm.coffee | 1 - test/mocha.opts | 4 ++-- test/tests.coffee | 10 ++++++++++ tools/coffeeCoverageLoader.js | 23 +++++++++++++++++++++++ tools/coffeeCoverageMerge.coffee | 16 ++++++++++++++++ 11 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 tools/coffeeCoverageLoader.js create mode 100644 tools/coffeeCoverageMerge.coffee diff --git a/.gitignore b/.gitignore index a3fec8a..6ad3dbc 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,9 @@ pids # Dependency directory node_modules + +# Others +/coverage /.extractedApi.md *.sublime-project *.sublime-workspace diff --git a/.npmignore b/.npmignore index b3ae3b6..cd3260c 100644 --- a/.npmignore +++ b/.npmignore @@ -1,2 +1,3 @@ /tools /test +/coverage diff --git a/.travis.yml b/.travis.yml index 7a56d2a..c189e95 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ language: node_js node_js: - "stable" +after_success: + - 'cat ./coverage/lcov.info | ./node_modules/.bin/coveralls' \ No newline at end of file diff --git a/dist/timm.js b/dist/timm.js index c822935..131f528 100644 --- a/dist/timm.js +++ b/dist/timm.js @@ -31,7 +31,6 @@ var args, fChanged, i, idx, j, key, keys, len, len1, obj, out, ref; args = arguments; len = args.length; - !(len > 1) && _throw(process.env.NODE_ENV !== 'production' ? "At least one object should be provided to merge()" : MERGE_ERROR); out = args[1]; !(out != null) && _throw(process.env.NODE_ENV !== 'production' ? "At least one object should be provided to merge()" : MERGE_ERROR); fChanged = false; diff --git a/dist/timm.min.js b/dist/timm.min.js index b21410f..512dbba 100644 --- a/dist/timm.min.js +++ b/dist/timm.min.js @@ -3,4 +3,4 @@ | (c) Guillermo Grau Panea 2016 | License: MIT */ -(function(){var n,t,r,e,c,a,u,l,o,i,s,f,g,y=[].slice;e=function(n){throw new Error(n)},t=function(n){var t,r,e,c,a;for(e=Object.keys(n),a={},t=0,c=e.length;c>t;t++)r=e[t],a[r]=n[r];return a},n="MERGE_ERROR",r=function(r){var c,a,u,l,o,i,s,f,g,y,h,d;for(c=arguments,f=c.length,!(f>1)&&e(n),h=c[1],!(null!=h)&&e(n),a=!1,l=u=2,d=f;d>u;l=u+=1)if(y=c[l],null!=y&&(s=Object.keys(y),s.length))for(o=0,g=s.length;g>o;o++)i=s[o],r&&void 0!==h[i]||y[i]!==h[i]&&(a||(a=!0,h=t(h)),h[i]=y[i]);return h},u=function(n,t){return n.concat(Array.isArray(t)?t:[t])},a=function(n,t){return Array.isArray(t)?t.concat(n):[t].concat(n)},l=function(n,t,r){return n.slice(0,t).concat(Array.isArray(r)?r:[r]).concat(n.slice(t))},i=function(n,t){return n.slice(0,t).concat(n.slice(t+1))},s=function(n,t,r){return n[t]===r?n:n.slice(0,t).concat([r]).concat(n.slice(t+1))},f=function(n,r,e){var c;return n[r]===e?n:(c=t(n),c[r]=e,c)},g=function(n,t,r,e){var c,a;return null==e&&(e=0),c=t[e],a=e===t.length-1?r:g(n[c],t,r,e+1),f(n,c,a)},o=function(n,t,e,c,a,u){return arguments.length<=6?r(!1,n,t,e,c,a,u):r.apply(null,[!1].concat(y.call(arguments)))},c=function(n,t,e,c,a,u){return arguments.length<=6?r(!0,n,t,e,c,a,u):r.apply(null,[!0].concat(y.call(arguments)))},module.exports={addLast:u,addFirst:a,insert:l,removeAt:i,replaceAt:s,set:f,setIn:g,merge:o,addDefaults:c}}).call(this); \ No newline at end of file +(function(){var n,t,r,e,c,a,u,l,o,i,s,f,g,y=[].slice;e=function(n){throw new Error(n)},t=function(n){var t,r,e,c,a;for(e=Object.keys(n),a={},t=0,c=e.length;c>t;t++)r=e[t],a[r]=n[r];return a},n="MERGE_ERROR",r=function(r){var c,a,u,l,o,i,s,f,g,y,h,d;for(c=arguments,f=c.length,h=c[1],!(null!=h)&&e(n),a=!1,l=u=2,d=f;d>u;l=u+=1)if(y=c[l],null!=y&&(s=Object.keys(y),s.length))for(o=0,g=s.length;g>o;o++)i=s[o],r&&void 0!==h[i]||y[i]!==h[i]&&(a||(a=!0,h=t(h)),h[i]=y[i]);return h},u=function(n,t){return n.concat(Array.isArray(t)?t:[t])},a=function(n,t){return Array.isArray(t)?t.concat(n):[t].concat(n)},l=function(n,t,r){return n.slice(0,t).concat(Array.isArray(r)?r:[r]).concat(n.slice(t))},i=function(n,t){return n.slice(0,t).concat(n.slice(t+1))},s=function(n,t,r){return n[t]===r?n:n.slice(0,t).concat([r]).concat(n.slice(t+1))},f=function(n,r,e){var c;return n[r]===e?n:(c=t(n),c[r]=e,c)},g=function(n,t,r,e){var c,a;return null==e&&(e=0),c=t[e],a=e===t.length-1?r:g(n[c],t,r,e+1),f(n,c,a)},o=function(n,t,e,c,a,u){return arguments.length<=6?r(!1,n,t,e,c,a,u):r.apply(null,[!1].concat(y.call(arguments)))},c=function(n,t,e,c,a,u){return arguments.length<=6?r(!0,n,t,e,c,a,u):r.apply(null,[!0].concat(y.call(arguments)))},module.exports={addLast:u,addFirst:a,insert:l,removeAt:i,replaceAt:s,set:f,setIn:g,merge:o,addDefaults:c}}).call(this); \ No newline at end of file diff --git a/package.json b/package.json index 8f287b3..db1f0cb 100644 --- a/package.json +++ b/package.json @@ -7,23 +7,31 @@ "devDependencies": { "chai": "^3.5.0", "chalk": "^1.1.1", + "coffee-coverage": "^1.0.1", "coffee-script": "^1.10.0", + "coveralls": "^2.11.6", "cross-env": "^1.0.7", "debug": "^2.2.0", "envify": "^3.4.0", "immutable": "^3.7.6", + "istanbul": "^0.4.2", "lodash": "^4.5.0", "mocha": "^2.4.5", "seamless-immutable": "^5.0.1", "uglifyjs": "^2.4.10" }, "scripts": { - "test": "mocha", + "t": "mocha", + "test": "npm run testCoverage", + "testCoverageDev": "cross-env TEST_COV=1 NODE_ENV=development mocha", + "testCoverageProd": "cross-env TEST_COV=1 NODE_ENV=production mocha", + "testCoverageMerge": "coffee tools/coffeeCoverageMerge.coffee", + "testCoverage": "npm run testCoverageDev && npm run testCoverageProd && npm run testCoverageMerge", "testMinified": "cross-env TEST_MINIFIED_LIB=1 mocha", "compile": "rm -rf dist && coffee -o dist -c src", "docs": "coffee tools/extractDocs.coffee", "uglify": "cross-env NODE_ENV=production envify dist/timm.js | uglifyjs - -o dist/timm.min.js --mangle --compress --comments \"/\\|/\"", - "build": "npm test && npm run compile && npm run uglify && npm run testMinified && npm run docs", + "build": "npm run testCoverage && npm run compile && npm run uglify && npm run testMinified && npm run docs", "benchmarks": "coffee tools/benchmarks.coffee" }, "repository": { diff --git a/src/timm.coffee b/src/timm.coffee index 313e11c..fc1a2a8 100644 --- a/src/timm.coffee +++ b/src/timm.coffee @@ -18,7 +18,6 @@ MERGE_ERROR = 'MERGE_ERROR' _merge = (fAddDefaults) -> args = arguments len = args.length - not(len > 1) and _throw if process.env.NODE_ENV isnt 'production' then "At least one object should be provided to merge()" else MERGE_ERROR out = args[1] not(out?) and _throw if process.env.NODE_ENV isnt 'production' then "At least one object should be provided to merge()" else MERGE_ERROR fChanged = false diff --git a/test/mocha.opts b/test/mocha.opts index 5ff97c1..92ed0f8 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -1,5 +1,5 @@ ---compilers coffee:coffee-script ---require coffee-script/register +--compilers coffee:coffee-script/register +--require ./tools/coffeeCoverageLoader.js --recursive -R spec --colors diff --git a/test/tests.coffee b/test/tests.coffee index c927864..747df6f 100644 --- a/test/tests.coffee +++ b/test/tests.coffee @@ -165,6 +165,12 @@ describe 'Object operations', -> obj2 = timm.merge obj, {b: 2, d: obj.d} expect(obj2).to.equal obj + it 'with more than 6 args', -> + obj2 = timm.merge {a: 1}, {b: 2}, {c: 3}, {d: 4}, {e: 5}, {f: 6}, {g: 7} + expect(obj2).to.deep.equal {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7} + + it 'should throw with no args', -> expect(timm.merge).to.throw(Error) + describe 'merge multiple', -> it 'with changes', -> obj2 = timm.merge obj, {b: 4}, {c: 3}, {b: 7} @@ -218,6 +224,10 @@ describe 'Object operations', -> obj2 = timm.addDefaults obj, {b: 2, d: obj.d} expect(obj2).to.equal obj + it 'with more than 6 args', -> + obj2 = timm.addDefaults {a: 1}, {b: 2}, {c: 3}, {d: 4}, {e: 5}, {f: 6}, {g: 7} + expect(obj2).to.deep.equal {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7} + describe 'addDefaults multiple', -> it 'with changes', -> obj2 = timm.addDefaults obj, {b: 4}, {c: 3}, {b: 7}, {c: 6} diff --git a/tools/coffeeCoverageLoader.js b/tools/coffeeCoverageLoader.js new file mode 100644 index 0000000..7775b8e --- /dev/null +++ b/tools/coffeeCoverageLoader.js @@ -0,0 +1,23 @@ +if (!process.env.TEST_COV) { + return; +} +console.log("Configuring coffee-coverage..."); + +var path = require('path'); +var coffeeCoverage = require('coffee-coverage'); +var projectRoot = path.resolve(__dirname, ".."); +var coverageVar = coffeeCoverage.findIstanbulVariable(); +// Only write a coverage report if we're not running inside of Istanbul. +var covFileName = process.env.NODE_ENV === 'production' + ? "coverage-coffee-prod.json" + : "coverage-coffee-dev.json" +var writeOnExit = (coverageVar == null) ? (projectRoot + '/coverage/' + covFileName) : null; + +coffeeCoverage.register({ + instrumentor: 'istanbul', + basePath: projectRoot, + exclude: ['/test', '/node_modules', '/.git', '/tools'], + coverageVar: coverageVar, + writeOnExit: writeOnExit, + initAll: true +}); diff --git a/tools/coffeeCoverageMerge.coffee b/tools/coffeeCoverageMerge.coffee new file mode 100644 index 0000000..e6b5d3a --- /dev/null +++ b/tools/coffeeCoverageMerge.coffee @@ -0,0 +1,16 @@ +istanbul = require 'istanbul' +collector = new istanbul.Collector() +reporter = new istanbul.Reporter() +SYNC = false + +_addToCollector = (filePath) -> + collector.add JSON.parse fs.readFileSync(filePath, 'utf8') + +collector.add require '../coverage/coverage-coffee-dev.json' +collector.add require '../coverage/coverage-coffee-prod.json' + +reporter.add 'text' +reporter.add 'lcov' + +reporter.write collector, SYNC, -> + console.log "All reports generated"