diff --git a/.gitignore b/.gitignore index 4992982a5..8585a9d0f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,7 @@ coverage .nvmrc ~* -/.cache \ No newline at end of file +/.cache +*.marko.js +/test/generated/ +.nyc_output \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index f77a3681a..71214311d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,5 +5,5 @@ node_js: - "6" - "7" language: node_js -script: "npm run test-coverage" +script: "npm run test-generate-coverage" after_success: "npm run coveralls" \ No newline at end of file diff --git a/package.json b/package.json index c3d9cc99f..ded64fc5d 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,10 @@ "url": "https://github.com/marko-js/marko.git" }, "scripts": { - "test": "npm run mocha -s && npm run test-widgets -s && npm run jshint -s", + "test": "npm run jshint -s && npm run mocha -s && npm run test-widgets -s", "mocha": "mocha --ui bdd --reporter spec ./test/", - "test-coverage": "istanbul cover _mocha --include-all-sources -- --ui bdd --reporter spec ./test && npm run test-widgets && npm run jshint", + "test-coverage": "npm run test-generate-coverage && nyc report --reporter=html && open ./coverage/index.html", + "test-generate-coverage": "nyc -asc npm run test", "test-fast": "mocha --ui bdd --reporter spec ./test/render-test", "test-async": "mocha --ui bdd --reporter spec ./test/async-render-test", "test-taglib-loader": "mocha --ui bdd --reporter spec ./test/taglib-loader-test", @@ -34,7 +35,7 @@ "test-widgets-browser-dev": "browser-refresh test/browser-tests-runner/cli.js test/widgets-browser-tests.js --server", "test-widgets-page": "browser-refresh test/browser-tests-runner/cli.js test/widgets-browser-tests.js --server --page", "jshint": "jshint compiler/ runtime/ taglibs/ widgets/", - "coveralls": "cat ./coverage/lcov.info | coveralls" + "coveralls": "nyc report --reporter=text-lcov | coveralls" }, "author": "Patrick Steele-Idem ", "maintainers": [ @@ -86,15 +87,19 @@ "express": "^4.13.4", "fs-extra": "^0.30.0", "ignoring-watcher": "^1.0.2", - "istanbul": "^0.4.3", + "istanbul-lib-instrument": "^1.3.0", "jquery": "^2.1.3", "jsdom": "^9.6.0", "jshint": "^2.5.0", "lasso": "^2.4.1", "lasso-marko": "^2.1.0", + "md5-hex": "^1.3.0", "mkdirp": "^0.5.1", "mocha": "^2.3.3", - "mocha-phantomjs": "^4.1.0", + "mocha-phantomjs-core": "^1.3.1", + "mocha-phantomjs-istanbul": "0.0.2", + "nyc": "^9.0.0", + "open": "0.0.5", "phantomjs-prebuilt": "^2.1.13", "request": "^2.72.0", "require-self-ref": "^2.0.1", @@ -113,6 +118,13 @@ "browser": { "./node-require.js": "./node-require-browser.js" }, + "nyc": { + "exclude": [ + "**/benchmark/**", + "**/coverage/**", + "**/test/**" + ] + }, "homepage": "http://markojs.com/", "version": "4.0.0-beta.2", "logo": { diff --git a/test/autotest.js b/test/autotest.js index 772f1a813..ee55e216e 100644 --- a/test/autotest.js +++ b/test/autotest.js @@ -69,6 +69,9 @@ function autoTest(name, dir, run, options, done) { exports.scanDir = function(autoTestDir, run, options) { describe('autotest', function() { + if(options && options.timeout) { + this.timeout(options.timeout); + } fs.readdirSync(autoTestDir) .forEach(function(name) { if (name.charAt(0) === '.') { diff --git a/test/browser-tests-runner/index.js b/test/browser-tests-runner/index.js index 27d3a63ae..42b62d5e7 100644 --- a/test/browser-tests-runner/index.js +++ b/test/browser-tests-runner/index.js @@ -11,8 +11,10 @@ var defaultPageTemplate = require('./page-template.marko'); var spawn = require('child-process-promise').spawn; var fs = require('fs'); var mkdirp = require('mkdirp'); -var mochaPhantomJSCommand = path.join(__dirname, '../../node_modules/.bin/mocha-phantomjs'); +var md5Hex = require('md5-hex'); +var mochaPhantomJSCommand = require.resolve('mocha-phantomjs-core'); var phantomjsBinPath = require('phantomjs-prebuilt').path; +var shouldCover = !!process.env.NYC_CONFIG; function generate(options) { return new Promise((resolve, reject) => { @@ -41,7 +43,7 @@ function generate(options) { } ]; - var myLasso = lasso.create({ + var lassoConfig = { outputDir: path.join(generatedDir, 'static'), urlPrefix: startServer ? '/static' : './static', bundlingEnabled: false, @@ -56,7 +58,15 @@ function generate(options) { }, require('./lasso-autotest-plugin') ] - }); + }; + + if(shouldCover) { + lassoConfig.plugins.push( + require('./lasso-istanbul-plugin') + ); + } + + var myLasso = lasso.create(lassoConfig); var templateData = { lasso: myLasso, @@ -119,12 +129,23 @@ function runTests(options) { return generate(options) .then((generated) => { console.log(`Running ${generated.url} using mocha-phantomjs...`); - return spawn(mochaPhantomJSCommand, ['-p', phantomjsBinPath, generated.url], { + var mochaPhantomJSOptions = { useColors:true }; + + if(shouldCover) { + mochaPhantomJSOptions.hooks = 'mocha-phantomjs-istanbul'; + mochaPhantomJSOptions.coverageFile = getCoverageFile(options.testsFile); + } + + return spawn(phantomjsBinPath, [mochaPhantomJSCommand, generated.url, 'spec', JSON.stringify(mochaPhantomJSOptions)], { stdio: 'inherit' }); }); } +function getCoverageFile(testsFile) { + return './.nyc_output/'+md5Hex(testsFile)+'.json'; +} + exports.generate = generate; exports.runTests = runTests; diff --git a/test/browser-tests-runner/lasso-istanbul-plugin.js b/test/browser-tests-runner/lasso-istanbul-plugin.js new file mode 100644 index 000000000..9e1a80e25 --- /dev/null +++ b/test/browser-tests-runner/lasso-istanbul-plugin.js @@ -0,0 +1,21 @@ +var istanbul = require('istanbul-lib-instrument'); + +module.exports = function(lasso, pluginConfig) { + var instrumenter = istanbul.createInstrumenter(); + + lasso.addTransform({ + stream: false, + contentType: 'js', + transform: function(code, context) { + var file = context.dependency.file + + if(!file || file.includes('node_modules/') + || file.includes('test/') + || file.includes('coverage/') + || file.includes('benchmark/') + ) return code; + + return instrumenter.instrumentSync(code, context.dependency.file); + } + }); +} \ No newline at end of file diff --git a/test/markoc-tests.js b/test/markoc-tests.js index 082b53662..ef89025d5 100644 --- a/test/markoc-tests.js +++ b/test/markoc-tests.js @@ -32,5 +32,5 @@ describe('markoc' , function() { testModule.test(helpers); done(); - }); + }, { timeout:20000 }); });