From cb1c6b013c6c789e190081801bc628a18f81ba1b Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Fri, 4 Jan 2019 23:05:20 +0100 Subject: [PATCH 1/9] Add test for Runner event order (#3642) * runner: basic events test * tests basic, bail, retries * delete first test --- test/integration/events.spec.js | 59 +++++++++++++++++++ .../fixtures/runner/events-bail.fixture.js | 29 +++++++++ .../fixtures/runner/events-basic.fixture.js | 28 +++++++++ .../fixtures/runner/events-retries.fixture.js | 27 +++++++++ 4 files changed, 143 insertions(+) create mode 100644 test/integration/events.spec.js create mode 100644 test/integration/fixtures/runner/events-bail.fixture.js create mode 100644 test/integration/fixtures/runner/events-basic.fixture.js create mode 100644 test/integration/fixtures/runner/events-retries.fixture.js diff --git a/test/integration/events.spec.js b/test/integration/events.spec.js new file mode 100644 index 0000000000..dc08a57381 --- /dev/null +++ b/test/integration/events.spec.js @@ -0,0 +1,59 @@ +'use strict'; + +var helpers = require('./helpers'); +var runMochaJSON = helpers.runMochaJSON; + +describe('event order', function() { + describe('trivial test case', function() { + it('should assert trivial event order', function(done) { + runMochaJSON('runner/events-basic.fixture.js', [], function(err, res) { + if (err) { + done(err); + return; + } + expect(res, 'to have passed') + .and('to have passed test count', 2) + .and('to have passed test order', 'test A', 'test B') + .and('to have failed test count', 0); + done(); + }); + }); + }); + + describe('--bail test case', function() { + it('should assert --bail event order', function(done) { + runMochaJSON('runner/events-bail.fixture.js', ['--bail'], function( + err, + res + ) { + if (err) { + done(err); + return; + } + expect(res, 'to have failed with error', 'error test A') + .and('to have failed test count', 1) + .and('to have passed test count', 0); + done(); + }); + }); + }); + + describe('--retries test case', function() { + it('should assert --retries event order', function(done) { + runMochaJSON( + 'runner/events-retries.fixture.js', + ['--retries', '1'], + function(err, res) { + if (err) { + done(err); + return; + } + expect(res, 'to have failed with error', 'error test A') + .and('to have failed test count', 1) + .and('to have passed test count', 0); + done(); + } + ); + }); + }); +}); diff --git a/test/integration/fixtures/runner/events-bail.fixture.js b/test/integration/fixtures/runner/events-bail.fixture.js new file mode 100644 index 0000000000..3a345f8169 --- /dev/null +++ b/test/integration/fixtures/runner/events-bail.fixture.js @@ -0,0 +1,29 @@ +'use strict'; +var Runner = require('../../../../lib/runner.js'); +var assert = require('assert'); + +var emitOrder = [ + 'suite'/* incorrect order*/, 'start', 'suite', + 'hook', 'hook end', 'test', 'hook', 'hook end', 'fail', 'test end', 'hook', 'hook end', + 'hook', 'hook end', 'suite end', 'suite end', 'end' +]; + +var realEmit = Runner.prototype.emit; +Runner.prototype.emit = function(event, ...args) { + // console.log(`emit: ${event}`); + assert.strictEqual(event, emitOrder.shift()); + return realEmit.call(this, event, ...args); +}; + +describe('suite A', function() { + before('before', function() {}); + beforeEach('beforeEach', function() {}); + it('test A', function() { + throw new Error('error test A'); + }); + describe('suite B', function() { + it('test B', function() {}); + }); + afterEach('afterEach', function() {}); + after('after', function() {}); +}); diff --git a/test/integration/fixtures/runner/events-basic.fixture.js b/test/integration/fixtures/runner/events-basic.fixture.js new file mode 100644 index 0000000000..81c55a8bb4 --- /dev/null +++ b/test/integration/fixtures/runner/events-basic.fixture.js @@ -0,0 +1,28 @@ +'use strict'; +var Runner = require('../../../../lib/runner.js'); +var assert = require('assert'); + +var emitOrder = [ + 'suite'/* incorrect order*/, 'start', 'suite', + 'hook', 'hook end', 'test', 'hook', 'hook end', 'pass', 'test end', 'hook', 'hook end', + 'suite', 'test', 'hook', 'hook end', 'pass', 'test end', 'hook', 'hook end', + 'suite end', 'hook', 'hook end', 'suite end', 'suite end', 'end' +]; + +var realEmit = Runner.prototype.emit; +Runner.prototype.emit = function(event, ...args) { + // console.log(`emit: ${event}`); + assert.strictEqual(event, emitOrder.shift()); + return realEmit.call(this, event, ...args); +}; + +describe('suite A', function() { + before('before', function() {}); + beforeEach('beforeEach', function() {}); + it('test A', function() {}); + describe('suite B', function() { + it('test B', function() {}); + }); + afterEach('afterEach', function() {}); + after('after', function() {}); +}); diff --git a/test/integration/fixtures/runner/events-retries.fixture.js b/test/integration/fixtures/runner/events-retries.fixture.js new file mode 100644 index 0000000000..a4547c8fa8 --- /dev/null +++ b/test/integration/fixtures/runner/events-retries.fixture.js @@ -0,0 +1,27 @@ +'use strict'; +var Runner = require('../../../../lib/runner.js'); +var assert = require('assert'); + +var emitOrder = [ + 'suite'/* incorrect order*/, 'start', 'suite', + 'hook', 'hook end', 'test', 'hook', 'hook end', 'retry', 'hook', 'hook end', + 'test', 'hook', 'hook end', 'fail', 'test end', 'hook', 'hook end', 'hook', 'hook end', + 'suite end', 'suite end', 'end' +]; + +var realEmit = Runner.prototype.emit; +Runner.prototype.emit = function(event, ...args) { + // console.log(`emit: ${event}`); + assert.strictEqual(event, emitOrder.shift()); + return realEmit.call(this, event, ...args); +}; + +describe('suite A', function() { + before('before', function() {}); + beforeEach('beforeEach', function() {}); + it('test A', function() { + throw new Error('error test A'); + }); + afterEach('afterEach', function() {}); + after('after', function() {}); +}); From 9d62030046443a68b875f93132a116b58bdfe829 Mon Sep 17 00:00:00 2001 From: "P. Roebuck" Date: Sat, 5 Jan 2019 12:55:07 -0600 Subject: [PATCH 2/9] Update documentation concerning fs.readdir (#3657) No order is implied via fs.readdir(). Different OS/filesystem combinations can give different results via readdir(3) which returns directory entries in traversal order (e.g., on macOS, HFS+ uses lexical order and APFS uses filename hash order). --- lib/utils.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/utils.js b/lib/utils.js index c6d42ba9a5..fc0aa640fd 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -83,6 +83,10 @@ function ignored(path) { /** * Lookup files in the given `dir`. * + * @description + * Filenames are returned in _traversal_ order by the OS/filesystem. + * **Make no assumption that the names will be sorted in any fashion.** + * * @private * @param {string} dir * @param {string[]} [ext=['.js']] @@ -502,12 +506,16 @@ exports.canonicalize = function canonicalize(value, stack, typeHint) { /** * Lookup file names at the given `path`. * - * @memberof Mocha.utils + * @description + * Filenames are returned in _traversal_ order by the OS/filesystem. + * **Make no assumption that the names will be sorted in any fashion.** + * * @public - * @param {string} filepath Base path to start searching from. - * @param {string[]} extensions File extensions to look for. - * @param {boolean} recursive Whether or not to recurse into subdirectories. + * @memberof Mocha.utils * @todo Fix extension handling + * @param {string} filepath - Base path to start searching from. + * @param {string[]} extensions - File extensions to look for. + * @param {boolean} recursive - Whether to recurse into subdirectories. * @return {string[]} An array of paths. */ exports.lookupFiles = function lookupFiles(filepath, extensions, recursive) { From f223298b869e1a7f333678b37e3d2772efecc63d Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 3 Jan 2019 14:35:30 -0800 Subject: [PATCH 3/9] mega-upgrade of .gitignore [ci skip] --- .gitignore | 155 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 136 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 7e1edeb748..89785b3128 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,143 @@ -.DS_Store -node_modules -*.sock -*.sw* -.idea -*.iml -*.patch -*.diff -npm-debug.log* -.envrc +# Mocha-specific +docs/_site +docs/_dist +docs/api +/mocha.js .karma/ + +######################################### +# NON-MOCHA STUFF GOES BELOW THIS THING # +######################################### + +# Git mergetool +# Use `git config mergetool.keepBackup false` to stop generating these files *.orig -.nyc_output/ -coverage/ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# nyc/istanbul +coverage +.nyc_output + +# Dependencies +node_modules/ + +# npm +.npm +*.tgz + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# dotenv environment variables file +.env +.env.test + +# Yarn yarn.lock -/mocha.js -# artifacts from various diff tools +.yarn-integrity + +# Various temporary files +*~ + +# Emacs +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Vim +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] +Session.vim +[._]*.un~ + +# Diff +*.patch +*.diff + +# VSCode +.vscode/ + +# JetBrains' IDEs +.idea/ +*.iws +out/ +.idea_modules/ +atlassian-ide-plugin.xml + +# SourceTree *_BACKUP_* *_BASE_* *_LOCAL_* *_REMOTE_* -docs/_site -docs/_dist -docs/api -out/ -.vscode/ + +# SublimeText +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache +*.sublime-workspace +*.sublime-project +sftp-config.json +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache +GitHub.sublime-settings + +# direnv +.envrc + +# Linux +.fuse_hidden* +.directory +.Trash-* +.nfs* + +# Windows +Thumbs.db +ehthumbs.db +ehthumbs_vista.db +*.stackdump +[Dd]esktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msix +*.msm +*.msp +*.lnk + +# macOS +.DS_Store +.AppleDouble +.LSOverride +._* +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# SauceConnect +*.sock From 1786e6e7c9d6ab57712cd13acb7734a50be92d1f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 10 Jan 2019 14:45:10 -0800 Subject: [PATCH 4/9] fix WallabyJS config [ci skip] Signed-off-by: Christopher Hiller --- .wallaby.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.wallaby.js b/.wallaby.js index e23c2a8ad6..fa6063fa55 100644 --- a/.wallaby.js +++ b/.wallaby.js @@ -17,13 +17,13 @@ module.exports = () => { }, 'package.json', 'test/opts/mocha.opts', - 'mocharc.yml', - '!lib/browser/**/*.js', + 'mocharc.yml' ], filesWithNoCoverageCalculated: [ 'test/**/*.fixture.js', 'test/setup.js', - 'test/assertions.js' + 'test/assertions.js', + 'lib/browser/**/*.js' ], tests: ['test/unit/**/*.spec.js', 'test/node-unit/**/*.spec.js'], env: { From 0a86e6f4a7d1724782d2cc4695ac6422bae94f37 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 10 Jan 2019 14:46:16 -0800 Subject: [PATCH 5/9] remove invalid comment; see #1962 Signed-off-by: Christopher Hiller --- lib/suite.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/suite.js b/lib/suite.js index 64e7db4b24..0e3831fabb 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -22,9 +22,7 @@ var createInvalidArgumentTypeError = errors.createInvalidArgumentTypeError; exports = module.exports = Suite; /** - * Create a new `Suite` with the given `title` and parent `Suite`. When a suite - * with the same title is already present, that suite is returned to provide - * nicer reporter and more flexible meta-testing. + * Create a new `Suite` with the given `title` and parent `Suite`. * * @memberof Mocha * @public From e2d49295c12432e08a929aa80c02cf87f2405a0f Mon Sep 17 00:00:00 2001 From: Juerg B <44573692+juergba@users.noreply.github.com> Date: Wed, 16 Jan 2019 07:41:34 +0100 Subject: [PATCH 6/9] Set "root" property on Suite correctly (#3632) * suite constructor * tests * suite.js corrections and new tests --- lib/mocha.js | 2 +- lib/suite.js | 16 ++++++++++------ test/unit/suite.spec.js | 25 +++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/lib/mocha.js b/lib/mocha.js index c703e09dee..687f5c77a3 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -92,7 +92,7 @@ function Mocha(options) { this.files = []; this.options = options; // root suite - this.suite = new exports.Suite('', new exports.Context()); + this.suite = new exports.Suite('', new exports.Context(), true); if ('useColors' in options) { utils.deprecate( diff --git a/lib/suite.js b/lib/suite.js index 0e3831fabb..2cb3a39de9 100644 --- a/lib/suite.js +++ b/lib/suite.js @@ -39,15 +39,18 @@ exports.create = function(parent, title) { }; /** - * Initialize a new `Suite` with the given `title` and `ctx`. Derived from [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter) + * Constructs a new `Suite` instance with the given `title`, `ctx`, and `isRoot`. * - * @memberof Mocha * @public * @class - * @param {string} title - * @param {Context} parentContext + * @extends EventEmitter + * @memberof Mocha + * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter|EventEmitter} + * @param {string} title - Suite title. + * @param {Context} parentContext - Parent context instance. + * @param {boolean} [isRoot=false] - Whether this is the root suite. */ -function Suite(title, parentContext) { +function Suite(title, parentContext, isRoot) { if (!utils.isString(title)) { throw createInvalidArgumentTypeError( 'Suite argument "title" must be a string. Received type "' + @@ -68,7 +71,7 @@ function Suite(title, parentContext) { this._beforeAll = []; this._afterEach = []; this._afterAll = []; - this.root = !title; + this.root = isRoot === true; this._timeout = 2000; this._enableTimeouts = true; this._slow = 75; @@ -324,6 +327,7 @@ Suite.prototype.afterEach = function(title, fn) { */ Suite.prototype.addSuite = function(suite) { suite.parent = this; + suite.root = false; suite.timeout(this.timeout()); suite.retries(this.retries()); suite.enableTimeouts(this.enableTimeouts()); diff --git a/test/unit/suite.spec.js b/test/unit/suite.spec.js index 50a0bda332..fa57898a51 100644 --- a/test/unit/suite.spec.js +++ b/test/unit/suite.spec.js @@ -302,6 +302,27 @@ describe('Suite', function() { }); }); + describe('.create()', function() { + before(function() { + this.first = new Suite('Root suite', {}, true); + this.second = new Suite('RottenRoot suite', {}, true); + this.first.addSuite(this.second); + }); + + it('does not create a second root suite', function() { + expect(this.second.parent, 'to be', this.first); + expect(this.first.root, 'to be', true); + expect(this.second.root, 'to be', false); + }); + + it('does not denote the root suite by being titleless', function() { + var emptyTitleSuite = Suite.create(this.second, ''); + expect(emptyTitleSuite.parent, 'to be', this.second); + expect(emptyTitleSuite.root, 'to be', false); + expect(this.second.root, 'to be', false); + }); + }); + describe('.addSuite()', function() { beforeEach(function() { this.first = new Suite('First suite'); @@ -390,8 +411,8 @@ describe('Suite', function() { describe('when there is a parent', function() { describe('the parent is the root suite', function() { it('returns the suite title', function() { - var parentSuite = new Suite(''); - parentSuite.addSuite(this.suite); + var rootSuite = new Suite('', {}, true); + rootSuite.addSuite(this.suite); expect(this.suite.titlePath(), 'to equal', ['A Suite']); }); }); From 635ecd1cf25aebdd42611b065fe57522e08be243 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 16 Jan 2019 15:25:54 -0800 Subject: [PATCH 7/9] fix tests & formatting on windows; closes #3643 --- package-lock.json | 164 +++++++++++++++++++-------------------------- package-scripts.js | 10 +-- package.json | 4 +- 3 files changed, 78 insertions(+), 100 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07a0f7b33a..045008886c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3038,6 +3038,16 @@ "integrity": "sha512-w9UZUtkaGd8MfS7eMG7Sa0lV5vCJghqQfiOnwNVrPhbZScUp5h0jwYoAF933MKlotlG1JAJOCCT3xU6r+SDKNw==", "dev": true }, + "cross-env": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", + "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.5", + "is-windows": "^1.0.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -4417,9 +4427,9 @@ } }, "eslint": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.10.0.tgz", - "integrity": "sha512-HpqzC+BHULKlnPwWae9MaVZ5AXJKpkxCVXQHrFaRw3hbDj26V/9ArYM4Rr/SQ8pi6qUPLXSSXC4RBJlyq2Z2OQ==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.11.1.tgz", + "integrity": "sha512-gOKhM8JwlFOc2acbOrkYR05NW8M6DCMSvfcJiBB5NDxRE1gv8kbvxKaC9u69e6ZGEMWXcswA/7eKR229cEIpvg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -4497,23 +4507,12 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -4525,12 +4524,6 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4551,6 +4544,15 @@ "requires": { "ansi-regex": "^3.0.0" } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -4748,9 +4750,9 @@ } }, "eslint-plugin-prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.0.tgz", - "integrity": "sha512-4g11opzhqq/8+AMmo5Vc2Gn7z9alZ4JqrbZ+D4i8KlSyxeQhZHlmIrY8U9Akf514MoEhogPa87Jgkq87aZ2Ohw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz", + "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -4825,9 +4827,9 @@ }, "dependencies": { "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", "dev": true } } @@ -7455,16 +7457,16 @@ } }, "husky": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-1.2.1.tgz", - "integrity": "sha512-4Ylal3HWhnDvIszuiyLoVrSGI7QLg/ogkNCoHE34c+yZYzb9kBZNrlTOsdw92cGi3cJT8pPb6CdVfxFkLnc8Dg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", + "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", "dev": true, "requires": { "cosmiconfig": "^5.0.7", "execa": "^1.0.0", "find-up": "^3.0.0", "get-stdin": "^6.0.0", - "is-ci": "^1.2.1", + "is-ci": "^2.0.0", "pkg-dir": "^3.0.0", "please-upgrade-node": "^3.1.1", "read-pkg": "^4.0.1", @@ -7473,9 +7475,9 @@ }, "dependencies": { "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "find-up": { @@ -7494,12 +7496,12 @@ "dev": true }, "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "ci-info": "^1.5.0" + "ci-info": "^2.0.0" } }, "locate-path": { @@ -7513,9 +7515,9 @@ } }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -7593,6 +7595,12 @@ "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", "dev": true }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "ignore-walk": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", @@ -7752,17 +7760,6 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "figures": { @@ -7780,15 +7777,6 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -7809,6 +7797,15 @@ } } } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -15339,9 +15336,9 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "rewiremock": { - "version": "3.12.3", - "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.12.3.tgz", - "integrity": "sha512-6OSIpeAEmHejoxBb1UEg7cdgfiA/BXuGT6qcM1YVWbfme8ybzTJIKANaLDLFfU+juMevKyM8F3OSw9gBGo5PJg==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.13.0.tgz", + "integrity": "sha512-1MkO4mX4j31GilbMsqdgLNXjmrHo9EUKQFCa82rLye8ltOHnJe0rRaHUSKz2yUClr8l0Qnj1ZTjZHmp6vNTrzQ==", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -15352,27 +15349,6 @@ "path-parse": "^1.0.5", "wipe-node-cache": "^2.1.0", "wipe-webpack-cache": "^2.1.0" - }, - "dependencies": { - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~3.0.0" - } - } } }, "rfdc": { @@ -15394,12 +15370,12 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "ripemd160": { @@ -17549,9 +17525,9 @@ } }, "unexpected": { - "version": "10.39.2", - "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-10.39.2.tgz", - "integrity": "sha512-bL/e8kSBeqaIdEQfwSE64++i7YgsBiyveQkOkSXRCZBIaLCdpiyYwuczPzkXI3d9noczV1nXDzwzI3FwEqPq4g==", + "version": "10.40.2", + "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-10.40.2.tgz", + "integrity": "sha512-xwLScBxEnHiK8H8yLblQ6u3Uoammhpk+oCB/HWiNY6exMEwxenUR+eWIKderEXQPOlZkUEakBAKborGJqK6hZQ==", "dev": true, "requires": { "array-changes": "3.0.1", diff --git a/package-scripts.js b/package-scripts.js index ccaf1bb3da..9c224c0ae7 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -217,26 +217,26 @@ module.exports = { description: 'Run browser tests' }, unit: { - script: 'NODE_PATH=. karma start --single-run', + script: 'cross-env NODE_PATH=. karma start --single-run', description: 'Run browser unit tests' }, bdd: { - script: 'MOCHA_TEST=bdd nps test.browser.unit', + script: 'cross-env MOCHA_TEST=bdd nps test.browser.unit', description: 'Run browser BDD interface tests', hiddenFromHelp: true }, tdd: { - script: 'MOCHA_TEST=tdd nps test.browser.unit', + script: 'cross-env MOCHA_TEST=tdd nps test.browser.unit', description: 'Run browser TDD interface tests', hiddenFromHelp: true }, qunit: { - script: 'MOCHA_TEST=qunit nps test.browser.unit', + script: 'cross-env MOCHA_TEST=qunit nps test.browser.unit', description: 'Run browser QUnit interface tests', hiddenFromHelp: true }, esm: { - script: 'MOCHA_TEST=esm nps test.browser.unit', + script: 'cross-env MOCHA_TEST=esm nps test.browser.unit', description: 'Run browser ES modules support test', hiddenFromHelp: true } diff --git a/package.json b/package.json index 15ba1c37c1..6bf79b3885 100644 --- a/package.json +++ b/package.json @@ -517,6 +517,7 @@ "chai": "^4.2.0", "coffee-script": "^1.10.0", "coveralls": "^3.0.2", + "cross-env": "^5.2.0", "cross-spawn": "^6.0.5", "eslint": "^5.10.0", "eslint-config-prettier": "^3.3.0", @@ -582,7 +583,8 @@ }, "prettier": { "singleQuote": true, - "bracketSpacing": false + "bracketSpacing": false, + "endOfLine": "auto" }, "yargs": { "combine-arrays": true, From 414bc1e184358cac886a3649fa2a610b7cb35cd8 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Thu, 17 Jan 2019 16:43:52 -0500 Subject: [PATCH 8/9] Fix couple errors missing codes (#3666) ### Requirements * Filling out the template is required. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. * All new code requires tests to ensure against regressions. ### Description of the Change #3656 added a couple utils for setting `code` on errors. I fixed a couple here and wanted to make sure I was on the right track before making more changes. ### Alternate Designs N/A ### Why should this be in core? Codes help identify errors as mocha errors at a glance without using custom error types, and better DX is always good. ### Benefits :point_up: ### Possible Drawbacks None that I can see ### Applicable issues #3656, #3125. semver-patch --- lib/cli/run.js | 14 +++++++++----- test/integration/options.spec.js | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/lib/cli/run.js b/lib/cli/run.js index e6c14f67ad..1d8a26d872 100644 --- a/lib/cli/run.js +++ b/lib/cli/run.js @@ -9,8 +9,10 @@ const Mocha = require('../mocha'); const ansi = require('ansi-colors'); -const errors = require('../errors'); -const createInvalidArgumentValueError = errors.createInvalidArgumentValueError; +const { + createInvalidArgumentValueError, + createMissingArgumentError +} = require('../errors'); const { list, @@ -258,13 +260,15 @@ exports.builder = yargs => // yargs.implies() isn't flexible enough to handle this if (argv.invert && !('fgrep' in argv || 'grep' in argv)) { - throw new Error( - '"--invert" requires one of "--fgrep " or "--grep "' + throw createMissingArgumentError( + '"--invert" requires one of "--fgrep " or "--grep "', + '--fgrep|--grep', + 'string|regexp' ); } if (argv.compilers) { - throw new Error( + throw createInvalidArgumentValueError( `--compilers is DEPRECATED and no longer supported. See ${ansi.cyan('https://git.io/vdcSr')} for migration information.` ); diff --git a/test/integration/options.spec.js b/test/integration/options.spec.js index 81eac5786a..6854528566 100644 --- a/test/integration/options.spec.js +++ b/test/integration/options.spec.js @@ -346,6 +346,26 @@ describe('options', function() { done(); }); }); + + it('should throw an error when `--invert` used in isolation', function(done) { + args = ['--invert']; + runMocha( + 'options/grep.fixture.js', + args, + function(err, res) { + if (err) { + done(err); + return; + } + expect(res, 'to satisfy', { + code: 1, + output: /--invert.*--grep / + }); + done(); + }, + {stdio: 'pipe'} + ); + }); }); }); From c8383157b4970dbe892a18ac089dcc1ad2fc3af9 Mon Sep 17 00:00:00 2001 From: Paul Roebuck Date: Wed, 16 Jan 2019 07:34:02 -0600 Subject: [PATCH 9/9] test(integration/reporters.spec.js): Add test for TAP when given invalid reporter option Added test for invalid reporter option for `tapVersion`. --- test/integration/reporters.spec.js | 38 ++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/test/integration/reporters.spec.js b/test/integration/reporters.spec.js index c78da8ab6b..d44a222324 100644 --- a/test/integration/reporters.spec.js +++ b/test/integration/reporters.spec.js @@ -134,7 +134,7 @@ describe('reporters', function() { describe('produces valid TAP v13 output', function() { var runFixtureAndValidateOutput = function(fixture, expected) { it('for ' + fixture, function(done) { - var args = ['--reporter=tap', '--reporter-options', 'tapVersion=13']; + var args = ['--reporter=tap', '--reporter-option', 'tapVersion=13']; run(fixture, args, function(err, res) { if (err) { @@ -196,8 +196,42 @@ describe('reporters', function() { }); }); + it('should fail if given invalid `tapVersion`', function(done) { + var invalidTapVersion = 'nosuch'; + var args = [ + '--reporter=tap', + '--reporter-option', + 'tapVersion=' + invalidTapVersion + ]; + + run( + 'reporters.fixture.js', + args, + function(err, res) { + if (err) { + done(err); + return; + } + + function dquote(s) { + return '"' + s + '"'; + } + + var pattern = + '^Error: invalid or unsupported TAP version: ' + + dquote(invalidTapVersion); + expect(res, 'to satisfy', { + code: 1, + output: new RegExp(pattern, 'm') + }); + done(); + }, + {stdio: 'pipe'} + ); + }); + it('places exceptions correctly in YAML blocks', function(done) { - var args = ['--reporter=tap', '--reporter-options', 'tapVersion=13']; + var args = ['--reporter=tap', '--reporter-option', 'tapVersion=13']; run('reporters.fixture.js', args, function(err, res) { if (err) {