diff --git a/.eslintrc.yml b/.eslintrc.yml index 92081da735..cd953505e6 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -33,7 +33,6 @@ overrides: mocha: yes globals: expect: no - assert: no - files: - doc/**/*.js env: diff --git a/.wallaby.js b/.wallaby.js index 5296c52d62..5b85d21486 100644 --- a/.wallaby.js +++ b/.wallaby.js @@ -3,7 +3,7 @@ module.exports = () => { return { files: [ - 'index.js', 'lib/**/*.js', 'test/setup.js', + 'index.js', 'lib/**/*.js', 'test/setup.js', 'test/assertions.js', { pattern: 'test/node-unit/**/*.fixture.js', instrument: false diff --git a/karma.conf.js b/karma.conf.js index 1ccbb2bbbf..7b9036908c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -16,7 +16,7 @@ const browserPlatformPairs = { module.exports = config => { let bundleDirpath; const cfg = { - frameworks: ['browserify', 'expect', 'mocha'], + frameworks: ['browserify', 'mocha'], files: [ // we use the BDD interface for all of the tests that // aren't interface-specific. @@ -141,8 +141,8 @@ module.exports = config => { // support cfg.browsers = ['ChromeHeadless']; cfg.files = [ - 'test/browser-fixtures/esm.fixture.html', - 'test/browser-specific/esm.spec.js' + 'test/browser-specific/esm.spec.js', + 'test/browser-fixtures/esm.fixture.html' ]; break; default: @@ -151,6 +151,12 @@ module.exports = config => { } } + cfg.files.unshift( + 'node_modules/unexpected/unexpected.js', + {pattern: 'node_modules/unexpected/unexpected.js.map', included: false}, + 'test/browser-specific/setup.js' + ); + config.set(cfg); }; diff --git a/lib/utils.js b/lib/utils.js index 37282d3ce7..e67bf74414 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -546,6 +546,11 @@ exports.lookupFiles = function lookupFiles(filepath, extensions, recursive) { // ignore error return; } + if (!extensions) { + throw new Error( + 'extensions parameter required when filepath is a directory' + ); + } var re = new RegExp('\\.(?:' + extensions.join('|') + ')$'); if (!stat.isFile() || !re.test(file) || path.basename(file)[0] === '.') { return; diff --git a/package-lock.json b/package-lock.json index 7606af715b..6c91dc653e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -366,6 +366,24 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-changes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-changes/-/array-changes-3.0.1.tgz", + "integrity": "sha512-UYXV+qUaTKJO3GUBVfD6b9Mu7wUzDvpfovZKtbxNJApwRUifgrJMidvE+/rbqV3wCffly5HXcbOW3/7shmmEag==", + "dev": true, + "requires": { + "arraydiff-papandreou": "0.1.1-patch1" + } + }, + "array-changes-async": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-changes-async/-/array-changes-async-3.0.1.tgz", + "integrity": "sha512-WNHLhMOTzntixkBxNm/MiWCNKuC4FMYXk6DKuzZUbkWXAe0Xomwv40SEUicfOuHHtW7Ue661Mc5AJA0AOfqApg==", + "dev": true, + "requires": { + "arraydiff-async": "0.2.0" + } + }, "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", @@ -447,6 +465,18 @@ "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", "dev": true }, + "arraydiff-async": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/arraydiff-async/-/arraydiff-async-0.2.0.tgz", + "integrity": "sha1-uwUouY6BS3AvAfSWvHO+w+V/QIY=", + "dev": true + }, + "arraydiff-papandreou": { + "version": "0.1.1-patch1", + "resolved": "https://registry.npmjs.org/arraydiff-papandreou/-/arraydiff-papandreou-0.1.1-patch1.tgz", + "integrity": "sha1-ApAnC/27Sy762LdIJjitWnIQkhA=", + "dev": true + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -485,6 +515,12 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, "assetgraph": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/assetgraph/-/assetgraph-3.14.2.tgz", @@ -1554,6 +1590,20 @@ } } }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + } + }, "chainsaw": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.0.9.tgz", @@ -1591,6 +1641,12 @@ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1822,6 +1878,12 @@ "color-name": "1.1.3" } }, + "color-diff": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz", + "integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=", + "dev": true + }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", @@ -2792,6 +2854,15 @@ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", @@ -2929,6 +3000,34 @@ "minimalistic-assert": "^1.0.0" } }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "minimist": "1.2.0", + "repeating": "1.1.3" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + } + } + }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -3852,12 +3951,6 @@ } } }, - "expect.js": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", - "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", - "dev": true - }, "express-processimage": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/express-processimage/-/express-processimage-7.4.0.tgz", @@ -4315,24 +4408,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, "optional": true, "requires": { @@ -4342,12 +4439,14 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "1.0.0", @@ -4356,34 +4455,40 @@ }, "chownr": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "optional": true, "requires": { @@ -4392,25 +4497,29 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "optional": true, "requires": { @@ -4419,13 +4528,15 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, "requires": { @@ -4441,7 +4552,8 @@ }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "optional": true, "requires": { @@ -4455,13 +4567,15 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.21", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "dev": true, "optional": true, "requires": { @@ -4470,7 +4584,8 @@ }, "ignore-walk": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "optional": true, "requires": { @@ -4479,7 +4594,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, "requires": { @@ -4489,18 +4605,21 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "1.0.1" @@ -4508,13 +4627,15 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "1.1.11" @@ -4522,12 +4643,14 @@ }, "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "minipass": { "version": "2.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", + "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "dev": true, "requires": { "safe-buffer": "5.1.1", @@ -4536,7 +4659,8 @@ }, "minizlib": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "dev": true, "optional": true, "requires": { @@ -4545,7 +4669,8 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -4553,13 +4678,15 @@ }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true, "optional": true }, "needle": { "version": "2.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", + "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", "dev": true, "optional": true, "requires": { @@ -4570,7 +4697,8 @@ }, "node-pre-gyp": { "version": "0.9.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz", + "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=", "dev": true, "optional": true, "requires": { @@ -4588,7 +4716,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "optional": true, "requires": { @@ -4598,13 +4727,15 @@ }, "npm-bundled": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", + "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.1.10", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", + "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", "dev": true, "optional": true, "requires": { @@ -4614,7 +4745,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, "requires": { @@ -4626,18 +4758,21 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1.0.2" @@ -4645,19 +4780,22 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, "requires": { @@ -4667,19 +4805,22 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true, "optional": true }, "rc": { "version": "1.2.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "dev": true, "optional": true, "requires": { @@ -4691,7 +4832,8 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true, "optional": true } @@ -4699,7 +4841,8 @@ }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "optional": true, "requires": { @@ -4714,7 +4857,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "optional": true, "requires": { @@ -4723,42 +4867,49 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.5.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "1.1.0", @@ -4768,7 +4919,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, "requires": { @@ -4777,7 +4929,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "2.1.1" @@ -4785,13 +4938,15 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", + "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", "dev": true, "optional": true, "requires": { @@ -4806,13 +4961,15 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "optional": true, "requires": { @@ -4821,12 +4978,14 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "yallist": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", "dev": true } } @@ -4896,6 +5055,12 @@ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, "get-own-enumerable-property-symbols": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", @@ -5212,6 +5377,12 @@ } } }, + "greedy-interval-packer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/greedy-interval-packer/-/greedy-interval-packer-1.2.0.tgz", + "integrity": "sha1-1toR82Ybt5eBLaeKHqUQZ4oqhzk=", + "dev": true + }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", @@ -7268,15 +7439,6 @@ "which": "^1.2.1" } }, - "karma-expect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/karma-expect/-/karma-expect-1.1.3.tgz", - "integrity": "sha1-xrClb/GJA9sRr08JjMbnzxmM4nU=", - "dev": true, - "requires": { - "expect.js": "^0.3.1" - } - }, "karma-mocha": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", @@ -8426,6 +8588,31 @@ "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", "dev": true }, + "magicpen": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/magicpen/-/magicpen-5.12.0.tgz", + "integrity": "sha1-u+nunUI2R2rs+EE27KGDPrRwqWs=", + "dev": true, + "requires": { + "ansi-styles": "2.0.0", + "color-diff": "0.1.7", + "supports-color": "1.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.0.0.tgz", + "integrity": "sha1-QysmFi/qG2PIeIlqvIzFVI8lBj4=", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + } + } + }, "make-plural": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.2.0.tgz", @@ -9601,7 +9788,8 @@ "dependencies": { "align-text": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { "kind-of": "3.2.2", @@ -9611,22 +9799,26 @@ }, "amdefine": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { "version": "2.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "append-transform": { "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { "default-require-extensions": "1.0.0" @@ -9634,12 +9826,14 @@ }, "archy": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "arr-diff": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { "arr-flatten": "1.1.0" @@ -9647,42 +9841,50 @@ }, "arr-flatten": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-union": { "version": "3.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, "array-unique": { "version": "0.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, "arrify": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "assign-symbols": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, "async": { "version": "1.5.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, "atob": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", + "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==", "dev": true }, "babel-code-frame": { "version": "6.26.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { "chalk": "1.1.3", @@ -9692,7 +9894,8 @@ }, "babel-generator": { "version": "6.26.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { "babel-messages": "6.23.0", @@ -9707,7 +9910,8 @@ }, "babel-messages": { "version": "6.23.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { "babel-runtime": "6.26.0" @@ -9715,7 +9919,8 @@ }, "babel-runtime": { "version": "6.26.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { "core-js": "2.5.5", @@ -9724,7 +9929,8 @@ }, "babel-template": { "version": "6.26.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { "babel-runtime": "6.26.0", @@ -9736,7 +9942,8 @@ }, "babel-traverse": { "version": "6.26.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { "babel-code-frame": "6.26.0", @@ -9752,7 +9959,8 @@ }, "babel-types": { "version": "6.26.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { "babel-runtime": "6.26.0", @@ -9763,17 +9971,20 @@ }, "babylon": { "version": "6.18.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "base": { "version": "0.11.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { "cache-base": "1.0.1", @@ -9787,7 +9998,8 @@ "dependencies": { "define-property": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "1.0.2" @@ -9795,7 +10007,8 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -9803,7 +10016,8 @@ }, "is-data-descriptor": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -9811,7 +10025,8 @@ }, "is-descriptor": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "1.0.0", @@ -9821,19 +10036,22 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "kind-of": { "version": "6.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "1.0.0", @@ -9842,7 +10060,8 @@ }, "braces": { "version": "1.8.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { "expand-range": "1.8.2", @@ -9852,12 +10071,14 @@ }, "builtin-modules": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "cache-base": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { "collection-visit": "1.0.0", @@ -9873,14 +10094,16 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, "caching-transform": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", + "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", "dev": true, "requires": { "md5-hex": "1.3.0", @@ -9890,13 +10113,15 @@ }, "camelcase": { "version": "1.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true, "optional": true }, "center-align": { "version": "0.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "optional": true, "requires": { @@ -9906,7 +10131,8 @@ }, "chalk": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { "ansi-styles": "2.2.1", @@ -9918,7 +10144,8 @@ }, "class-utils": { "version": "0.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { "arr-union": "3.1.0", @@ -9929,7 +10156,8 @@ "dependencies": { "define-property": { "version": "0.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "0.1.6" @@ -9937,14 +10165,16 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, "cliui": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "optional": true, "requires": { @@ -9955,7 +10185,8 @@ "dependencies": { "wordwrap": { "version": "0.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true, "optional": true } @@ -9963,12 +10194,14 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "collection-visit": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { "map-visit": "1.0.0", @@ -9977,37 +10210,44 @@ }, "commondir": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "component-emitter": { "version": "1.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { "version": "1.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, "copy-descriptor": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, "core-js": { "version": "2.5.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", "dev": true }, "cross-spawn": { "version": "4.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { "lru-cache": "4.1.2", @@ -10016,7 +10256,8 @@ }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -10024,22 +10265,26 @@ }, "debug-log": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", "dev": true }, "decamelize": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "decode-uri-component": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, "default-require-extensions": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { "strip-bom": "2.0.0" @@ -10047,7 +10292,8 @@ }, "define-property": { "version": "2.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { "is-descriptor": "1.0.2", @@ -10056,7 +10302,8 @@ "dependencies": { "is-accessor-descriptor": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -10064,7 +10311,8 @@ }, "is-data-descriptor": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -10072,7 +10320,8 @@ }, "is-descriptor": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "1.0.0", @@ -10082,19 +10331,22 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "kind-of": { "version": "6.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, "detect-indent": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { "repeating": "2.0.1" @@ -10102,7 +10354,8 @@ }, "error-ex": { "version": "1.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { "is-arrayish": "0.2.1" @@ -10110,17 +10363,20 @@ }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "esutils": { "version": "2.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "execa": { "version": "0.7.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { "cross-spawn": "5.1.0", @@ -10134,7 +10390,8 @@ "dependencies": { "cross-spawn": { "version": "5.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { "lru-cache": "4.1.2", @@ -10146,7 +10403,8 @@ }, "expand-brackets": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { "is-posix-bracket": "0.1.1" @@ -10154,7 +10412,8 @@ }, "expand-range": { "version": "1.8.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { "fill-range": "2.2.3" @@ -10162,7 +10421,8 @@ }, "extend-shallow": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { "assign-symbols": "1.0.0", @@ -10171,7 +10431,8 @@ "dependencies": { "is-extendable": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "2.0.4" @@ -10181,7 +10442,8 @@ }, "extglob": { "version": "0.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { "is-extglob": "1.0.0" @@ -10189,12 +10451,14 @@ }, "filename-regex": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, "fill-range": { "version": "2.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { "is-number": "2.1.0", @@ -10206,7 +10470,8 @@ }, "find-cache-dir": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "dev": true, "requires": { "commondir": "1.0.1", @@ -10216,7 +10481,8 @@ }, "find-up": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "2.0.0" @@ -10224,12 +10490,14 @@ }, "for-in": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "for-own": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { "for-in": "1.0.2" @@ -10237,7 +10505,8 @@ }, "foreground-child": { "version": "1.5.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { "cross-spawn": "4.0.2", @@ -10246,7 +10515,8 @@ }, "fragment-cache": { "version": "0.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { "map-cache": "0.2.2" @@ -10254,27 +10524,32 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "get-caller-file": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, "get-stream": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, "get-value": { "version": "2.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -10287,7 +10562,8 @@ }, "glob-base": { "version": "0.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { "glob-parent": "2.0.0", @@ -10296,7 +10572,8 @@ }, "glob-parent": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { "is-glob": "2.0.1" @@ -10304,17 +10581,20 @@ }, "globals": { "version": "9.18.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, "graceful-fs": { "version": "4.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "handlebars": { "version": "4.0.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { "async": "1.5.2", @@ -10325,7 +10605,8 @@ "dependencies": { "source-map": { "version": "0.4.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { "amdefine": "1.0.1" @@ -10335,7 +10616,8 @@ }, "has-ansi": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { "ansi-regex": "2.1.1" @@ -10343,12 +10625,14 @@ }, "has-flag": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, "has-value": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { "get-value": "2.0.6", @@ -10358,14 +10642,16 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, "has-values": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { "is-number": "3.0.0", @@ -10374,7 +10660,8 @@ "dependencies": { "is-number": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -10382,7 +10669,8 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "1.1.6" @@ -10392,7 +10680,8 @@ }, "kind-of": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { "is-buffer": "1.1.6" @@ -10402,17 +10691,20 @@ }, "hosted-git-info": { "version": "2.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", "dev": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "1.4.0", @@ -10421,12 +10713,14 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "invariant": { "version": "2.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { "loose-envify": "1.3.1" @@ -10434,12 +10728,14 @@ }, "invert-kv": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, "is-accessor-descriptor": { "version": "0.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -10447,17 +10743,20 @@ }, "is-arrayish": { "version": "0.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-buffer": { "version": "1.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { "builtin-modules": "1.1.1" @@ -10465,7 +10764,8 @@ }, "is-data-descriptor": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -10473,7 +10773,8 @@ }, "is-descriptor": { "version": "0.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", @@ -10483,19 +10784,22 @@ "dependencies": { "kind-of": { "version": "5.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "is-dotfile": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", "dev": true }, "is-equal-shallow": { "version": "0.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { "is-primitive": "2.0.0" @@ -10503,17 +10807,20 @@ }, "is-extendable": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "is-extglob": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, "is-finite": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { "number-is-nan": "1.0.1" @@ -10521,12 +10828,14 @@ }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-glob": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { "is-extglob": "1.0.0" @@ -10534,7 +10843,8 @@ }, "is-number": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -10542,7 +10852,8 @@ }, "is-odd": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { "is-number": "4.0.0" @@ -10550,14 +10861,16 @@ "dependencies": { "is-number": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } }, "is-plain-object": { "version": "2.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "3.0.1" @@ -10565,49 +10878,58 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, "is-posix-bracket": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", "dev": true }, "is-primitive": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-utf8": { "version": "0.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, "is-windows": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isobject": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { "isarray": "1.0.0" @@ -10615,12 +10937,14 @@ }, "istanbul-lib-coverage": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", "dev": true }, "istanbul-lib-hook": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", "dev": true, "requires": { "append-transform": "0.4.0" @@ -10628,7 +10952,8 @@ }, "istanbul-lib-instrument": { "version": "1.10.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "dev": true, "requires": { "babel-generator": "6.26.1", @@ -10642,7 +10967,8 @@ }, "istanbul-lib-report": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz", + "integrity": "sha512-D4jVbMDtT2dPmloPJS/rmeP626N5Pr3Rp+SovrPn1+zPChGHcggd/0sL29jnbm4oK9W0wHjCRsdch9oLd7cm6g==", "dev": true, "requires": { "istanbul-lib-coverage": "1.2.0", @@ -10653,7 +10979,8 @@ "dependencies": { "supports-color": { "version": "3.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { "has-flag": "1.0.0" @@ -10663,7 +10990,8 @@ }, "istanbul-lib-source-maps": { "version": "1.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", + "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", "dev": true, "requires": { "debug": "3.1.0", @@ -10675,7 +11003,8 @@ "dependencies": { "debug": { "version": "3.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -10685,7 +11014,8 @@ }, "istanbul-reports": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.4.0.tgz", + "integrity": "sha512-OPzVo1fPZ2H+owr8q/LYKLD+vquv9Pj4F+dj808MdHbuQLD7S4ACRjcX+0Tne5Vxt2lxXvdZaL7v+FOOAV281w==", "dev": true, "requires": { "handlebars": "4.0.11" @@ -10693,17 +11023,20 @@ }, "js-tokens": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, "jsesc": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, "kind-of": { "version": "3.2.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "1.1.6" @@ -10711,13 +11044,15 @@ }, "lazy-cache": { "version": "1.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true, "optional": true }, "lcid": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { "invert-kv": "1.0.0" @@ -10725,7 +11060,8 @@ }, "load-json-file": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { "graceful-fs": "4.1.11", @@ -10737,7 +11073,8 @@ }, "locate-path": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "2.0.0", @@ -10746,24 +11083,28 @@ "dependencies": { "path-exists": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "lodash": { "version": "4.17.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", "dev": true }, "longest": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, "loose-envify": { "version": "1.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { "js-tokens": "3.0.2" @@ -10771,7 +11112,8 @@ }, "lru-cache": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "dev": true, "requires": { "pseudomap": "1.0.2", @@ -10780,12 +11122,14 @@ }, "map-cache": { "version": "0.2.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, "map-visit": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { "object-visit": "1.0.1" @@ -10793,7 +11137,8 @@ }, "md5-hex": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", "dev": true, "requires": { "md5-o-matic": "0.1.1" @@ -10801,12 +11146,14 @@ }, "md5-o-matic": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", "dev": true }, "mem": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { "mimic-fn": "1.2.0" @@ -10814,7 +11161,8 @@ }, "merge-source-map": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { "source-map": "0.6.1" @@ -10822,14 +11170,16 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "micromatch": { "version": "2.3.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { "arr-diff": "2.0.0", @@ -10849,12 +11199,14 @@ }, "mimic-fn": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "1.1.11" @@ -10862,12 +11214,14 @@ }, "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mixin-deep": { "version": "1.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { "for-in": "1.0.2", @@ -10876,7 +11230,8 @@ "dependencies": { "is-extendable": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "2.0.4" @@ -10886,7 +11241,8 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -10894,12 +11250,14 @@ }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "nanomatch": { "version": "1.2.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { "arr-diff": "4.0.0", @@ -10918,24 +11276,28 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, "array-unique": { "version": "0.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "kind-of": { "version": "6.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, "normalize-package-data": { "version": "2.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { "hosted-git-info": "2.6.0", @@ -10946,7 +11308,8 @@ }, "normalize-path": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { "remove-trailing-separator": "1.1.0" @@ -10954,7 +11317,8 @@ }, "npm-run-path": { "version": "2.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "2.0.1" @@ -10962,17 +11326,20 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object-copy": { "version": "0.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { "copy-descriptor": "0.1.1", @@ -10982,7 +11349,8 @@ "dependencies": { "define-property": { "version": "0.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "0.1.6" @@ -10992,7 +11360,8 @@ }, "object-visit": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { "isobject": "3.0.1" @@ -11000,14 +11369,16 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, "object.omit": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { "for-own": "0.1.5", @@ -11016,7 +11387,8 @@ }, "object.pick": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { "isobject": "3.0.1" @@ -11024,14 +11396,16 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1.0.2" @@ -11039,7 +11413,8 @@ }, "optimist": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { "minimist": "0.0.8", @@ -11048,12 +11423,14 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-locale": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { "execa": "0.7.0", @@ -11063,12 +11440,14 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-limit": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "dev": true, "requires": { "p-try": "1.0.0" @@ -11076,7 +11455,8 @@ }, "p-locate": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "1.2.0" @@ -11084,12 +11464,14 @@ }, "p-try": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "parse-glob": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { "glob-base": "0.3.0", @@ -11100,7 +11482,8 @@ }, "parse-json": { "version": "2.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { "error-ex": "1.3.1" @@ -11108,12 +11491,14 @@ }, "pascalcase": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, "path-exists": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { "pinkie-promise": "2.0.1" @@ -11121,22 +11506,26 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, "path-type": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { "graceful-fs": "4.1.11", @@ -11146,17 +11535,20 @@ }, "pify": { "version": "2.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pinkie": { "version": "2.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, "pinkie-promise": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { "pinkie": "2.0.4" @@ -11164,7 +11556,8 @@ }, "pkg-dir": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { "find-up": "1.1.2" @@ -11172,7 +11565,8 @@ "dependencies": { "find-up": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { "path-exists": "2.1.0", @@ -11183,22 +11577,26 @@ }, "posix-character-classes": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, "preserve": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, "pseudomap": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "randomatic": { "version": "1.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { "is-number": "3.0.0", @@ -11207,7 +11605,8 @@ "dependencies": { "is-number": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -11215,7 +11614,8 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "1.1.6" @@ -11225,7 +11625,8 @@ }, "kind-of": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { "is-buffer": "1.1.6" @@ -11235,7 +11636,8 @@ }, "read-pkg": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { "load-json-file": "1.1.0", @@ -11245,7 +11647,8 @@ }, "read-pkg-up": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { "find-up": "1.1.2", @@ -11254,7 +11657,8 @@ "dependencies": { "find-up": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { "path-exists": "2.1.0", @@ -11265,12 +11669,14 @@ }, "regenerator-runtime": { "version": "0.11.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, "regex-cache": { "version": "0.4.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { "is-equal-shallow": "0.1.3" @@ -11278,7 +11684,8 @@ }, "regex-not": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { "extend-shallow": "3.0.2", @@ -11287,22 +11694,26 @@ }, "remove-trailing-separator": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, "repeat-element": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", "dev": true }, "repeat-string": { "version": "1.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "repeating": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { "is-finite": "1.0.2" @@ -11310,32 +11721,38 @@ }, "require-directory": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "resolve-from": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", "dev": true }, "resolve-url": { "version": "0.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, "ret": { "version": "0.1.15", - "bundled": true, + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, "right-align": { "version": "0.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "optional": true, "requires": { @@ -11344,7 +11761,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "7.1.2" @@ -11352,7 +11770,8 @@ }, "safe-regex": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { "ret": "0.1.15" @@ -11360,17 +11779,20 @@ }, "semver": { "version": "5.5.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "set-value": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { "extend-shallow": "2.0.1", @@ -11381,7 +11803,8 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "0.1.1" @@ -11391,7 +11814,8 @@ }, "shebang-command": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "1.0.0" @@ -11399,22 +11823,26 @@ }, "shebang-regex": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "slide": { "version": "1.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, "snapdragon": { "version": "0.8.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { "base": "0.11.2", @@ -11429,7 +11857,8 @@ "dependencies": { "define-property": { "version": "0.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "0.1.6" @@ -11437,7 +11866,8 @@ }, "extend-shallow": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "0.1.1" @@ -11447,7 +11877,8 @@ }, "snapdragon-node": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { "define-property": "1.0.0", @@ -11457,7 +11888,8 @@ "dependencies": { "define-property": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "1.0.2" @@ -11465,7 +11897,8 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -11473,7 +11906,8 @@ }, "is-data-descriptor": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -11481,7 +11915,8 @@ }, "is-descriptor": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "1.0.0", @@ -11491,19 +11926,22 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "kind-of": { "version": "6.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, "snapdragon-util": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { "kind-of": "3.2.2" @@ -11511,12 +11949,14 @@ }, "source-map": { "version": "0.5.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-resolve": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "dev": true, "requires": { "atob": "2.1.0", @@ -11528,12 +11968,14 @@ }, "source-map-url": { "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "spawn-wrap": { "version": "1.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", "dev": true, "requires": { "foreground-child": "1.5.6", @@ -11546,7 +11988,8 @@ }, "spdx-correct": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { "spdx-expression-parse": "3.0.0", @@ -11555,12 +11998,14 @@ }, "spdx-exceptions": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", "dev": true }, "spdx-expression-parse": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "2.1.0", @@ -11569,12 +12014,14 @@ }, "spdx-license-ids": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", "dev": true }, "split-string": { "version": "3.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { "extend-shallow": "3.0.2" @@ -11582,7 +12029,8 @@ }, "static-extend": { "version": "0.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { "define-property": "0.2.5", @@ -11591,7 +12039,8 @@ "dependencies": { "define-property": { "version": "0.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "0.1.6" @@ -11601,7 +12050,8 @@ }, "string-width": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -11610,12 +12060,14 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "3.0.0" @@ -11625,7 +12077,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "2.1.1" @@ -11633,7 +12086,8 @@ }, "strip-bom": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { "is-utf8": "0.2.1" @@ -11641,17 +12095,20 @@ }, "strip-eof": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "supports-color": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, "test-exclude": { "version": "4.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", + "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", "dev": true, "requires": { "arrify": "1.0.1", @@ -11663,17 +12120,20 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, "array-unique": { "version": "0.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "braces": { "version": "2.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { "arr-flatten": "1.1.0", @@ -11690,7 +12150,8 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "0.1.1" @@ -11700,7 +12161,8 @@ }, "expand-brackets": { "version": "2.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { "debug": "2.6.9", @@ -11714,7 +12176,8 @@ "dependencies": { "define-property": { "version": "0.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "0.1.6" @@ -11722,7 +12185,8 @@ }, "extend-shallow": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "0.1.1" @@ -11730,7 +12194,8 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -11738,7 +12203,8 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "1.1.6" @@ -11748,7 +12214,8 @@ }, "is-data-descriptor": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -11756,7 +12223,8 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "1.1.6" @@ -11766,7 +12234,8 @@ }, "is-descriptor": { "version": "0.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", @@ -11776,14 +12245,16 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "extglob": { "version": "2.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { "array-unique": "0.3.2", @@ -11798,7 +12269,8 @@ "dependencies": { "define-property": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "1.0.2" @@ -11806,7 +12278,8 @@ }, "extend-shallow": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "0.1.1" @@ -11816,7 +12289,8 @@ }, "fill-range": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { "extend-shallow": "2.0.1", @@ -11827,7 +12301,8 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "0.1.1" @@ -11837,7 +12312,8 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -11845,7 +12321,8 @@ }, "is-data-descriptor": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -11853,7 +12330,8 @@ }, "is-descriptor": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "1.0.0", @@ -11863,7 +12341,8 @@ }, "is-number": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -11871,7 +12350,8 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "1.1.6" @@ -11881,17 +12361,20 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "kind-of": { "version": "6.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, "micromatch": { "version": "3.1.10", - "bundled": true, + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { "arr-diff": "4.0.0", @@ -11913,12 +12396,14 @@ }, "to-fast-properties": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, "to-object-path": { "version": "0.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -11926,7 +12411,8 @@ }, "to-regex": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { "define-property": "2.0.2", @@ -11937,7 +12423,8 @@ }, "to-regex-range": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { "is-number": "3.0.0", @@ -11946,7 +12433,8 @@ "dependencies": { "is-number": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "3.2.2" @@ -11956,12 +12444,14 @@ }, "trim-right": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, "uglify-js": { "version": "2.8.29", - "bundled": true, + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "optional": true, "requires": { @@ -11972,7 +12462,8 @@ "dependencies": { "yargs": { "version": "3.10.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "optional": true, "requires": { @@ -11986,13 +12477,15 @@ }, "uglify-to-browserify": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "dev": true, "optional": true }, "union-value": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { "arr-union": "3.1.0", @@ -12003,7 +12496,8 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "0.1.1" @@ -12011,7 +12505,8 @@ }, "set-value": { "version": "0.4.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { "extend-shallow": "2.0.1", @@ -12024,7 +12519,8 @@ }, "unset-value": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { "has-value": "0.3.1", @@ -12033,7 +12529,8 @@ "dependencies": { "has-value": { "version": "0.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { "get-value": "2.0.6", @@ -12043,7 +12540,8 @@ "dependencies": { "isobject": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { "isarray": "1.0.0" @@ -12053,24 +12551,28 @@ }, "has-values": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true }, "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, "urix": { "version": "0.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, "use": { "version": "3.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -12078,14 +12580,16 @@ "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, "validate-npm-package-license": { "version": "3.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { "spdx-correct": "3.0.0", @@ -12094,7 +12598,8 @@ }, "which": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { "isexe": "2.0.0" @@ -12102,23 +12607,27 @@ }, "which-module": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "window-size": { "version": "0.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true, "optional": true }, "wordwrap": { "version": "0.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, "wrap-ansi": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "1.0.2", @@ -12127,7 +12636,8 @@ "dependencies": { "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "1.0.1" @@ -12135,7 +12645,8 @@ }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "1.1.0", @@ -12147,12 +12658,14 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "1.3.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "dev": true, "requires": { "graceful-fs": "4.1.11", @@ -12162,17 +12675,20 @@ }, "y18n": { "version": "3.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yallist": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { "version": "11.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { "cliui": "4.0.0", @@ -12191,17 +12707,20 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "camelcase": { "version": "4.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "cliui": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", + "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", "dev": true, "requires": { "string-width": "2.1.1", @@ -12211,7 +12730,8 @@ }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "3.0.0" @@ -12219,7 +12739,8 @@ }, "yargs-parser": { "version": "9.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { "camelcase": "4.1.0" @@ -12229,7 +12750,8 @@ }, "yargs-parser": { "version": "8.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "dev": true, "requires": { "camelcase": "4.1.0" @@ -12237,7 +12759,8 @@ "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true } } @@ -12808,6 +13331,12 @@ "pify": "^2.0.0" } }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", @@ -16865,6 +17394,37 @@ "util-deprecate": "^1.0.2" } }, + "unexpected": { + "version": "10.37.5", + "resolved": "https://registry.npmjs.org/unexpected/-/unexpected-10.37.5.tgz", + "integrity": "sha512-ADCYrD5WN5I6eQmLL2IH/HdWX/OSHNtzShBLj1xpw+wCawaTgtLRpUcu4YVjvajKmeyBI3eiOP9NT3d/CKh7MQ==", + "dev": true, + "requires": { + "array-changes": "3.0.1", + "array-changes-async": "3.0.1", + "babel-runtime": "6.26.0", + "detect-indent": "3.0.1", + "diff": "1.1.0", + "greedy-interval-packer": "1.2.0", + "leven": "2.1.0", + "magicpen": "5.12.0", + "unexpected-bluebird": "2.9.34-longstack2" + }, + "dependencies": { + "diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.1.0.tgz", + "integrity": "sha1-eYpJOBqkZBUem08Ob/Kwmooa0j8=", + "dev": true + } + } + }, + "unexpected-bluebird": { + "version": "2.9.34-longstack2", + "resolved": "https://registry.npmjs.org/unexpected-bluebird/-/unexpected-bluebird-2.9.34-longstack2.tgz", + "integrity": "sha1-SaysdTsFVt7WAlIQ7pYYIwfSssk=", + "dev": true + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", diff --git a/package-scripts.js b/package-scripts.js index 7a1099bc53..f6d8549234 100644 --- a/package-scripts.js +++ b/package-scripts.js @@ -159,7 +159,7 @@ module.exports = { hiddenFromHelp: true }, reporters: { - script: test('reporters', '"test/reporters/*.spec.js"'), + script: test('reporters', '--timeout 500 "test/reporters/*.spec.js"'), description: 'Run Node.js reporter tests', hiddenFromHelp: true }, diff --git a/package.json b/package.json index 1c40ba5143..89334bb64d 100644 --- a/package.json +++ b/package.json @@ -472,9 +472,9 @@ }, "devDependencies": { "@mocha/docdash": "^1.0.1", - "assert": "^1.4.1", "assetgraph-builder": "^5.6.4", "browserify": "^14.4.0", + "chai": "^4.1.2", "coffee-script": "^1.10.0", "coveralls": "^3.0.0", "cross-spawn": "^5.1.0", @@ -487,13 +487,11 @@ "eslint-plugin-prettier": "^2.6.0", "eslint-plugin-promise": "^3.7.0", "eslint-plugin-standard": "^3.0.1", - "expect.js": "^0.3.1", "husky": "^0.14.3", "jsdoc": "^3.5.5", "karma": "^1.7.1", "karma-browserify": "^5.0.5", "karma-chrome-launcher": "^2.0.0", - "karma-expect": "^1.1.2", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.4", "karma-sauce-launcher": "^1.2.0", @@ -506,6 +504,7 @@ "rimraf": "^2.5.2", "svgo": "^0.7.2", "through2": "^2.0.1", + "unexpected": "^10.37.5", "watchify": "^3.7.0" }, "files": [ diff --git a/test/README.md b/test/README.md new file mode 100644 index 0000000000..2d1b8e1c3f --- /dev/null +++ b/test/README.md @@ -0,0 +1,15 @@ +# About Mocha's Tests + +- **All assertions should be made using [unexpected](http://unexpected.js.org)**, unless there's a good reason not to. Exceptions include: + - Testing diff output. Mocha generates diff output unless the assertion library decides to do this itself. Since `unexpected` generates its *own* diff output, we need to use an assertion library that does not; we use the built-in `assert` module. + - `test/unit/runnable.spec.js` must avoid 3rd-party code; read source for more info + - Tests asserting interop with other specific assertion libraries. +- All tests have extension `.spec.js`. +- All test fixtures have extension `.fixture.js`. +- All test fixtures are *ignored* by ESLint. +- `mocha.opts` will require `test/setup.js`, which is the main harness. +- `test/assertions.js` contains Mocha-specific types and assertions for `unexpected` +- `test/node-unit/` only runs in Node.js; `test/browser-specific/` only runs in the browser. + - See `../karma.conf.js` for more information on which tests run in the browser. +- We can't run all of the Node.js tests in one `mocha` command, because we need to use different command-line options to test the various reporters and interfaces. + - See `../package-scripts.js` for more info about how things are split up. diff --git a/test/assertions.js b/test/assertions.js new file mode 100644 index 0000000000..4395c0bb90 --- /dev/null +++ b/test/assertions.js @@ -0,0 +1,285 @@ +'use strict'; + +exports.mixinMochaAssertions = function(expect) { + return expect + .addType({ + name: 'JSONResult', + base: 'object', + identify: function(v) { + return ( + Object.prototype.toString.call(v) === '[object Object]' && + Object.prototype.toString.call(v.stats) === '[object Object]' && + Array.isArray(v.failures) && + typeof v.code === 'number' + ); + } + }) + .addType({ + name: 'RawResult', + base: 'object', + identify: function(v) { + return ( + Object.prototype.toString.call(v) === '[object Object]' && + typeof v.passing === 'number' && + typeof v.failing === 'number' && + typeof v.pending === 'number' && + typeof v.output === 'string' && + typeof v.code === 'number' + ); + } + }) + .addAssertion(' [not] to have passed', function( + expect, + result + ) { + expect(result, 'to satisfy', { + code: expect.it('[not] to be', 0), + stats: { + failures: expect.it('[not] to be', 0) + }, + failures: expect.it('[not] to be empty') + }); + }) + .addAssertion(' [not] to have passed', function(expect, result) { + expect(result.code, '[not] to be', 0); + }) + .addAssertion( + ' [not] to have completed with [exit] code ', + function(expect, result, code) { + expect(result.code, '[not] to be', code); + } + ) + .addAssertion( + ' [not] to have passed (with|having) count ', + function(expect, result, count) { + expect(result, '[not] to pass').and('[not] to satisfy', { + stats: {passes: expect.it('to be', count)} + }); + } + ) + .addAssertion( + ' [not] to have failed (with|having) count ', + function(expect, result, count) { + expect(result, '[not] to have failed').and('[not] to satisfy', { + stats: {failures: expect.it('to be', count)} + }); + } + ) + .addAssertion(' [not] to have failed', function( + expect, + result + ) { + expect(result, '[not] to satisfy', { + code: expect.it('to be greater than', 0), + stats: { + failures: expect.it('to be greater than', 0) + }, + failures: expect.it('to be non-empty') + }); + }) + .addAssertion(' [not] to have failed', function(expect, result) { + expect(result.code, '[not] to be greater than', 0); + }) + .addAssertion(' [not] to have test count ', function( + expect, + result, + count + ) { + expect(result.stats.tests, '[not] to be', count); + }) + .addAssertion( + ' [not] to have failed [test] count ', + function(expect, result, count) { + expect(result.stats.failures, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have passed [test] count ', + function(expect, result, count) { + expect(result.stats.passes, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have pending [test] count ', + function(expect, result, count) { + expect(result.stats.pending, '[not] to be', count); + } + ) + .addAssertion( + ' [not] to have run (test|tests) ', + function(expect, result, titles) { + Array.prototype.slice.call(arguments, 2).forEach(function(title) { + expect( + result, + '[not] to have a value satisfying', + expect.it('to have an item satisfying', {title: title}) + ); + }); + } + ) + .addAssertion( + ' [not] to have failed (test|tests) ', + function(expect, result, titles) { + Array.prototype.slice.call(arguments, 2).forEach(function(title) { + expect(result.failures, '[not] to have an item satisfying', { + title: title + }); + }); + } + ) + .addAssertion( + ' [not] to have failed with (error|errors) ', + function(expect, result, errors) { + Array.prototype.slice.call(arguments, 2).forEach(function(error) { + expect(result, '[not] to have failed').and('[not] to satisfy', { + failures: expect.it('to have an item satisfying', { + err: expect + .it('to satisfy', error) + .or('to satisfy', {message: error}) + }) + }); + }); + } + ) + .addAssertion(' [not] to have (error|errors) ', function( + expect, + result, + errors + ) { + Array.prototype.slice.call(arguments, 2).forEach(function(error) { + expect(result, '[not] to satisfy', { + failures: expect.it('to have an item satisfying', { + err: expect + .it('to satisfy', error) + .or('to satisfy', {message: error}) + }) + }); + }); + }) + .addAssertion( + ' [not] to have passed (test|tests) ', + function(expect, result, titles) { + Array.prototype.slice.call(arguments, 2).forEach(function(title) { + expect(result.passes, '[not] to have an item satisfying', { + title: title + }); + }); + } + ) + .addAssertion( + ' [not] to have test order ', + function(expect, result, state, titles) { + expect( + result[state].slice(0, titles.length), + '[not] to satisfy', + titles.map(function(title) { + return typeof title === 'string' ? {title: title} : title; + }) + ); + } + ) + .addAssertion( + ' [not] to have passed test order ', + function(expect, result, titles) { + expect(result, '[not] to have test order', 'passes', titles); + } + ) + .addAssertion( + ' [not] to have passed test order ', + function(expect, result, titles) { + expect( + result, + '[not] to have test order', + 'passes', + Array.prototype.slice.call(arguments, 2) + ); + } + ) + .addAssertion( + ' [not] to have failed test order ', + function(expect, result, titles) { + expect(result, '[not] to have test order', 'failures', titles); + } + ) + .addAssertion( + ' [not] to have failed test order ', + function(expect, result, titles) { + expect( + result, + '[not] to have test order', + 'failures', + Array.prototype.slice.call(arguments, 2) + ); + } + ) + .addAssertion( + ' [not] to have pending test order ', + function(expect, result, titles) { + expect(result, '[not] to have test order', 'pending', titles); + } + ) + .addAssertion( + ' [not] to have pending test order ', + function(expect, result, titles) { + expect( + result, + '[not] to have test order', + 'pending', + Array.prototype.slice.call(arguments, 2) + ); + } + ) + .addAssertion(' [not] to have pending tests', function( + expect, + result + ) { + expect(result.stats.pending, '[not] to be greater than', 0); + }) + .addAssertion(' [not] to have passed tests', function( + expect, + result + ) { + expect(result.stats.passes, '[not] to be greater than', 0); + }) + .addAssertion(' [not] to have failed tests', function( + expect, + result + ) { + expect(result.stats.failed, '[not] to be greater than', 0); + }) + .addAssertion(' [not] to have tests', function(expect, result) { + expect(result.stats.tests, '[not] to be greater than', 0); + }) + .addAssertion(' [not] to have retried test ', function( + expect, + result, + title + ) { + expect(result.tests, '[not] to have an item satisfying', { + title: title, + currentRetry: expect.it('to be positive') + }); + }) + .addAssertion( + ' [not] to have retried test ', + function(expect, result, title, count) { + expect(result.tests, '[not] to have an item satisfying', { + title: title, + currentRetry: count + }); + } + ) + .addAssertion(' [not] to contain output ', function( + expect, + result, + output + ) { + expect(result.output, '[not] to satisfy', output); + }) + .addAssertion( + ' to have [exit] code ', + function(expect, result, code) { + expect(result.code, 'to be', code); + } + ); +}; diff --git a/test/browser-specific/esm.spec.js b/test/browser-specific/esm.spec.js index 2af61d3135..974699d72f 100644 --- a/test/browser-specific/esm.spec.js +++ b/test/browser-specific/esm.spec.js @@ -1,5 +1,5 @@ 'use strict'; it('should register a global if it did not fail', function() { - expect(window.MOCHA_IS_OK).to.be.ok(); + expect(window.MOCHA_IS_OK, 'to be ok'); }); diff --git a/test/browser-specific/setup.js b/test/browser-specific/setup.js new file mode 100644 index 0000000000..1e0dd7bd4e --- /dev/null +++ b/test/browser-specific/setup.js @@ -0,0 +1,2 @@ +/* eslint strict:off */ +window.expect = window.weknowhow.expect; diff --git a/test/browser/README.md b/test/browser/README.md deleted file mode 100644 index 15e4178b3e..0000000000 --- a/test/browser/README.md +++ /dev/null @@ -1,3 +0,0 @@ -These files need to be run manually by loading the `.html` file(s) in a browser. - -It would be awesome if we could automate that! diff --git a/test/browser/array.spec.js b/test/browser/array.spec.js deleted file mode 100644 index bd44d4b6f4..0000000000 --- a/test/browser/array.spec.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -describe('Array', function() { - describe('#push()', function() { - it('should append a value', function() { - var arr = []; - arr.push('foo'); - arr.push('bar'); - arr.push('baz'); - assert(arr[0] === 'foo'); // to test indentation - assert(arr[1] === 'bar'); - assert(arr[2] === 'baz'); - }); - - it('should return the length', function() { - var arr = []; - assert(arr.push('foo') === 1); - assert(arr.push('bar') === 2); - assert(arr.push('baz') === 3); - }); - }); -}); - -describe('Array', function() { - describe('#pop()', function() { - it('should remove and return the last value with expected error', function() { - var arr = [1, 2, 3]; - assert(arr.pop() === 3); - assert(arr.pop() === 2); - assert(arr.pop() === -1); - }); - - it('should adjust .length', function() { - var arr = [1, 2, 3]; - arr.pop(); - assert(arr.length === 2); - }); - }); -}); diff --git a/test/browser/grep.html b/test/browser/grep.html deleted file mode 100644 index 44bff517df..0000000000 --- a/test/browser/grep.html +++ /dev/null @@ -1,51 +0,0 @@ - - - Mocha - - - - - - - - - -
- - - diff --git a/test/browser/grep.spec.js b/test/browser/grep.spec.js deleted file mode 100644 index 45041a7cda..0000000000 --- a/test/browser/grep.spec.js +++ /dev/null @@ -1,110 +0,0 @@ -'use strict'; - -// numbers -describe('21', function() { - it('1', function() { - assert(true); - }); - it('2', function() { - assert(true); - }); -}); -// symbols -describe('@Array', function() { - it('.pop()', function() { - assert(true); - }); - it('.push()', function() { - assert(true); - }); - it('.length', function() { - assert(true); - }); -}); - -describe('@Function', function() { - it('.call()', function() { - assert(true); - }); - it('.apply()', function() { - assert(true); - }); - it('.length', function() { - assert(true); - }); - it('.name', function() { - assert(true); - }); - it('.prototype', function() { - assert(true); - }); -}); - -// url with hashtags -describe('#Services', function() { - describe('#http', function() { - it('.createClient()', function() { - assert(true); - }); - it('.Server()', function() { - assert(true); - }); - }); - describe('#crypto', function() { - it('.randomBytes()', function() { - assert(true); - }); - it('.Hmac()', function() { - assert(true); - }); - }); -}); - -// Uppercase -describe('CONSTANTS', function() { - it('.STATUS_CODES', function() { - assert(true); - }); -}); - -// Dates -describe('Date:', function() { - it('01/02/2015', function() { - assert(true); - }); - it('01/03/2015', function() { - assert(true); - }); - it('01/06/2015', function() { - assert(true); - }); -}); - -// etc.. -describe('booking/summary', function() { - it('should be run last', function() { - assert(true); - }); -}); - -describe('component/booking/summary', function() { - it('should be run second', function() { - assert(true); - }); -}); - -describe('component/booking/intro', function() { - it('should be run first', function() { - assert(true); - }); -}); - -describe('contains numbers', function() { - it('should run if the number 92 matching', function() { - assert(true); - }); - - it('should run if the number 8 matching', function() { - assert(true); - }); -}); diff --git a/test/browser/index.html b/test/browser/index.html deleted file mode 100644 index 26dc8722a2..0000000000 --- a/test/browser/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - Mocha - - - - - - - - - - - - - -
- - diff --git a/test/browser/large.html b/test/browser/large.html deleted file mode 100644 index 14be6e40c6..0000000000 --- a/test/browser/large.html +++ /dev/null @@ -1,24 +0,0 @@ - - - Mocha - - - - - - - - - - -
- - diff --git a/test/browser/large.spec.js b/test/browser/large.spec.js deleted file mode 100644 index 3b26cc2860..0000000000 --- a/test/browser/large.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; - -var n = 30; -while (n--) { - describe('Array ' + n, function() { - var arr; - - beforeEach(function() { - arr = [1, 2, 3]; - }); - - describe('#indexOf()', function() { - it('should return -1 when the value is not present', function() { - assert(arr.indexOf(5) === -1); - }); - - it('should return the correct index when the value is present', function(done) { - assert(arr.indexOf(1) === 0); - assert(arr.indexOf(2) === 1); - done(); - }); - }); - }); -} - -describe('something', function() { - it('should provide a useful error', function(done) { - setTimeout(function() { - throw new Error('boom'); - }, 1); - }); - - it('should provide an even better error on phantomjs', function(done) { - setTimeout(function() { - var AssertionError = function(message, actual, expected) { - this.message = message; - this.actual = actual; - this.expected = expected; - this.showDiff = true; - }; - AssertionError.prototype = Object.create(Error.prototype); - AssertionError.prototype.name = 'AssertionError'; - AssertionError.prototype.constructor = AssertionError; - - mocha.throwError( - new AssertionError('kabooom', 'text with a typo', 'text without a typo') - ); - done(); - }, 1); - }); -}); diff --git a/test/browser/multiple-done.spec.js b/test/browser/multiple-done.spec.js deleted file mode 100644 index 2a84e777e9..0000000000 --- a/test/browser/multiple-done.spec.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -describe('Multiple Done calls', function() { - it('should report an error if done was called more than once', function(done) { - done(); - done(); - }); - - it('should report an error if an exception happened async after done was called', function(done) { - done(); - setTimeout(done, 50); - }); - - it('should report an error if an exception happened after done was called', function(done) { - done(); - throw new Error('thrown error'); - }); -}); diff --git a/test/browser/opts.html b/test/browser/opts.html deleted file mode 100644 index b646e8610b..0000000000 --- a/test/browser/opts.html +++ /dev/null @@ -1,30 +0,0 @@ - - - Mocha - - - - - - - - - - - -
- - diff --git a/test/browser/opts.spec.js b/test/browser/opts.spec.js deleted file mode 100644 index 78e6fbd333..0000000000 --- a/test/browser/opts.spec.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -describe('Options', function() { - it('should set timeout value', function() { - assert(this.test._timeout === 1500); - }); -}); diff --git a/test/browser/stack-trace.html b/test/browser/stack-trace.html deleted file mode 100644 index b490bedfa5..0000000000 --- a/test/browser/stack-trace.html +++ /dev/null @@ -1,24 +0,0 @@ - - - Mocha - - - - - - - - - - -
- - diff --git a/test/browser/stack-trace.spec.js b/test/browser/stack-trace.spec.js deleted file mode 100644 index b10acf604b..0000000000 --- a/test/browser/stack-trace.spec.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; -describe('Stack trace', function() { - it('should prettify the stack-trace', function() { - var err = new Error(); - // We do this fake stack-trace because we under development, - // and our root isn't `node_modules`, `bower` or `components` - err.stack = [ - 'Error: failed', - 'at assert (stack-trace.html:11:30)', - 'at Context. (stack-trace.js:5:5)', - 'at callFn (http://localhost:63342/node_modules/mocha.js:4546:21)', - 'at Test.require.register.Runnable.run (http://localhost:63342/node_modules/mocha.js:4539:7)', - 'at Runner.require.register.Runner.runTest (http://localhost:63342/node_modules/mocha.js:4958:10)', - 'at http://localhost:63342/bower_components/mocha.js:5041:12', - 'at next (http://localhost:63342/bower_components/mocha.js:4883:14)', - 'at http://localhost:63342/bower_components/mocha.js:4893:7', - 'at next (http://localhost:63342/bower_components/mocha.js:4828:23)', - 'at http://localhost:63342/bower_components/mocha.js:4860:5' - ].join('\n'); - assert(false, err); - }); -}); diff --git a/test/browser/ui.html b/test/browser/ui.html deleted file mode 100644 index 0ad9301e0d..0000000000 --- a/test/browser/ui.html +++ /dev/null @@ -1,46 +0,0 @@ - - - Mocha - - - - - - - - - -
- - - diff --git a/test/browser/ui.spec.js b/test/browser/ui.spec.js deleted file mode 100644 index 4247c30302..0000000000 --- a/test/browser/ui.spec.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -// test titles containing regex-conflicting characters - -// leading $ -describe('$.jQuery', function() { - // parens - describe('.on()', function() { - it('should set an event', function() { - assert(true); - }); - }); - - describe('.off()', function() { - it('should remove an event', function() {}); - }); -}); - -// another generic describe block to verify it is absent -// when grepping on $.jQuery -describe('@Array', function() { - it('.pop()', function() { - assert(true); - }); - it('.push()', function() { - assert(true); - }); - it('.length', function() { - assert(true); - }); -}); diff --git a/test/bundle/amd.spec.js b/test/bundle/amd.spec.js index bb616f02a7..bc6e93aa4e 100644 --- a/test/bundle/amd.spec.js +++ b/test/bundle/amd.spec.js @@ -10,7 +10,7 @@ it('should build a non-broken bundle for AMD', function(done) { return done(err); } - expect(content).not.to.match(/define.amd/); + expect(content, 'not to match', /define.amd/); done(); }); }); diff --git a/test/compiler-fixtures/foo.fixture.js b/test/compiler-fixtures/foo.fixture.js index 22c0eec948..01338701a7 100644 --- a/test/compiler-fixtures/foo.fixture.js +++ b/test/compiler-fixtures/foo.fixture.js @@ -6,6 +6,6 @@ require.extensions['.foo'] = function (module, filename) { var content; content = fs.readFileSync(filename, 'utf8'); var test = 'describe("custom compiler",function(){ it("should work",function() { ' + - 'expect(' + content + ').to.eql(1); }); });'; + 'expect(' + content + ', "to be", 1); }); });'; return module._compile(test, filename); }; diff --git a/test/compiler/test.coffee b/test/compiler/test.coffee index b8e309f515..5783da4f4a 100644 --- a/test/compiler/test.coffee +++ b/test/compiler/test.coffee @@ -3,4 +3,4 @@ obj = foo: 'bar' describe 'coffeescript', -> it 'should work', -> - expect(obj).to.eql foo: 'bar' + expect(obj, 'to equal', foo: 'bar') diff --git a/test/integration/compiler-globbing.spec.js b/test/integration/compiler-globbing.spec.js index c459a95bcf..20ea050e4d 100644 --- a/test/integration/compiler-globbing.spec.js +++ b/test/integration/compiler-globbing.spec.js @@ -1,6 +1,5 @@ 'use strict'; -var expect = require('expect.js'); var exec = require('child_process').exec; var path = require('path'); @@ -18,15 +17,18 @@ describe('globbing like --compilers', function() { return done(error); } var results = JSON.parse(stdout); - expect(results).to.have.property('tests'); + expect(results, 'to have property', 'tests'); var titles = []; for (var index = 0; index < results.tests.length; index += 1) { - expect(results.tests[index]).to.have.property('fullTitle'); + expect(results.tests[index], 'to have property', 'fullTitle'); titles.push(results.tests[index].fullTitle); } - expect(titles).to.contain('coffeescript should work'); - expect(titles).to.contain('custom compiler should work'); - expect(titles).to.have.length(2); + expect( + titles, + 'to contain', + 'coffeescript should work', + 'custom compiler should work' + ).and('to have length', 2); done(); } ); diff --git a/test/integration/diffs.spec.js b/test/integration/diffs.spec.js index 9282fc9756..44b30de1ae 100644 --- a/test/integration/diffs.spec.js +++ b/test/integration/diffs.spec.js @@ -1,14 +1,59 @@ 'use strict'; -var assert = require('assert'); var helpers = require('./helpers'); var run = helpers.runMocha; var fs = require('fs'); -var getDiffs = helpers.getDiffs; +var path = require('path'); +/** + * Returns an array of diffs corresponding to exceptions thrown from specs, + * given the plaintext output (-C) of a mocha run. + * + * @param {string} output + * returns {string[]} + */ +function getDiffs(output) { + var diffs, i, inDiff, inStackTrace; + + diffs = []; + output.split('\n').forEach(function(line) { + if (line.match(/^\s{2}\d+\)/)) { + // New spec, e.g. "1) spec title" + diffs.push([]); + i = diffs.length - 1; + inStackTrace = false; + inDiff = false; + } else if (!diffs.length || inStackTrace) { + // Haven't encountered a spec yet + // or we're in the middle of a stack trace + } else if (line.indexOf('+ expected - actual') !== -1) { + inDiff = true; + } else if (line.match(/at Context/)) { + // At the start of a stack trace + inStackTrace = true; + inDiff = false; + } else if (inDiff) { + diffs[i].push(line); + } + }); + + return diffs.map(function(diff) { + return diff + .filter(function(line) { + return line.trim().length; + }) + .join('\n'); + }); +} + +/** + * Returns content of test/integration/fixtures/diffs/output, + * post-processed for consumption by tests. + * @returns {string[]} Array of diff lines + */ function getExpectedOutput() { var output = fs - .readFileSync('test/integration/fixtures/diffs/output', 'UTF8') + .readFileSync(path.join(__dirname, 'fixtures', 'diffs', 'output'), 'UTF8') .replace(/\r\n/g, '\n'); // Diffs are delimited in file by "// DIFF" @@ -28,9 +73,13 @@ describe('diffs', function() { before(function(done) { run('diffs/diffs.fixture.js', ['-C'], function(err, res) { + if (err) { + done(err); + return; + } expected = getExpectedOutput(); diffs = getDiffs(res.output.replace(/\r\n/g, '\n')); - done(err); + done(); }); }); @@ -48,7 +97,7 @@ describe('diffs', function() { 'should display diff by data and not like an objects' ].forEach(function(title, i) { it(title, function() { - assert.equal(diffs[i], expected[i]); + expect(diffs[i], 'to be', expected[i]); }); }); }); diff --git a/test/integration/fixtures/diffs/diffs.fixture.js b/test/integration/fixtures/diffs/diffs.fixture.js index 21f65c946e..e9b01d351e 100644 --- a/test/integration/fixtures/diffs/diffs.fixture.js +++ b/test/integration/fixtures/diffs/diffs.fixture.js @@ -1,5 +1,7 @@ 'use strict'; +// assert is used because unexpected doesn't use mocha's diffs. +var assert = require('assert'); var fs = require('fs'); var cssin = fs.readFileSync('test/integration/fixtures/diffs/diffs.css.in', 'ascii'); var cssout = fs.readFileSync('test/integration/fixtures/diffs/diffs.css.out', 'ascii'); @@ -10,19 +12,19 @@ describe('diffs', function () { it('should display a diff for small strings', function () { actual = 'foo rar baz'; expected = 'foo bar baz'; - expect(actual).to.eql(expected); + assert.equal(actual, expected); }); it('should display a diff of canonicalized objects', function () { actual = { name: 'travis j', age: 23 }; expected = { age: 23, name: 'travis' }; - expect(actual).to.eql(expected); + assert.deepEqual(actual, expected); }); it('should display a diff for medium strings', function () { actual = 'foo bar baz\nfoo rar baz\nfoo bar raz'; expected = 'foo bar baz\nfoo bar baz\nfoo bar baz'; - expect(actual).to.eql(expected); + assert.equal(actual, expected); }); it('should display a diff for entire object dumps', function () { @@ -42,13 +44,13 @@ describe('diffs', function () { country: 'us' } }; - expect(actual).to.eql(expected); + assert.deepEqual(actual, expected); }); it('should display a diff for multi-line strings', function () { actual = 'one two three\nfour zzzz six\nseven eight nine'; expected = 'one two three\nfour five six\nseven eight nine'; - expect(actual).to.eql(expected); + assert.equal(actual, expected); }); it('should display a diff for entire object dumps', function () { @@ -68,17 +70,17 @@ describe('diffs', function () { country: 'us' } }; - expect(actual).to.eql(expected); + assert.deepEqual(actual, expected); }); it('should display a full-comparison with escaped special characters', function () { actual = 'one\ttab\ntwo\t\t\ttabs'; expected = 'one\ttab\ntwo\t\ttabs'; - expect(actual).to.eql(expected); + assert.equal(actual, expected); }); it('should display a word diff for large strings', function () { - expect(cssin).to.eql(cssout); + assert.equal(cssin, cssout); }); it('should work with objects', function () { @@ -96,18 +98,18 @@ describe('diffs', function () { age: 2 }; - expect(actual).to.eql(expected); + assert.deepEqual(actual, expected); }); it('should show value diffs and not be affected by commas', function () { actual = { a: 123 }; expected = { a: 123, b: 456 }; - expect(actual).to.eql(expected); + assert.deepEqual(actual, expected); }); it('should display diff by data and not like an objects', function () { actual = Buffer.from([0x01]); expected = Buffer.from([0x02]); - expect(actual).to.eql(expected); + assert.deepEqual(actual, expected); }); }); diff --git a/test/integration/fixtures/diffs/output b/test/integration/fixtures/diffs/output index bf56a96397..19a04f6777 100644 --- a/test/integration/fixtures/diffs/output +++ b/test/integration/fixtures/diffs/output @@ -58,7 +58,6 @@ - color: white; + color: #fff; } - a { - color: blue + color: blue; diff --git a/test/integration/fixtures/regression/issue-1417.fixture.js b/test/integration/fixtures/regression/issue-1417.fixture.js index 13ce053784..2f9b6074af 100644 --- a/test/integration/fixtures/regression/issue-1417.fixture.js +++ b/test/integration/fixtures/regression/issue-1417.fixture.js @@ -10,7 +10,7 @@ it('fails exactly once when a global error is thrown synchronously and done erro done(new Error('test error')); }, 1); // Not 0 - it will 'succeed', but won't test the breaking condition - throw new Error('sync error'); + throw new Error('sync error a'); }); it('fails exactly once when a global error is thrown synchronously and done completes', function (done) { @@ -18,5 +18,5 @@ it('fails exactly once when a global error is thrown synchronously and done comp done(); }, 1); // Not 0 - it will 'succeed', but won't test the breaking condition - throw new Error('sync error'); + throw new Error('sync error b'); }); diff --git a/test/integration/glob.spec.js b/test/integration/glob.spec.js index ebcd6353a6..1867cda1f7 100644 --- a/test/integration/glob.spec.js +++ b/test/integration/glob.spec.js @@ -1,6 +1,5 @@ 'use strict'; -var expect = require('expect.js'); var exec = require('child_process').exec; var path = require('path'); @@ -12,7 +11,9 @@ describe('globbing', function() { testGlob.shouldSucceed( './*.js', function(results) { - expect(results.stdout).to.contain( + expect( + results.stdout, + 'to contain', '["end",{"suites":1,"tests":1,"passes":1,"pending":0,"failures":0,' ); }, @@ -24,7 +25,9 @@ describe('globbing', function() { testGlob.shouldFail( './*-none.js', function(results) { - expect(results.stderr).to.contain( + expect( + results.stderr, + 'to contain', 'Could not find any test files matching pattern' ); }, @@ -36,10 +39,14 @@ describe('globbing', function() { testGlob.shouldSucceed( './*.js ./*-none.js', function(results) { - expect(results.stdout).to.contain( + expect( + results.stdout, + 'to contain', '["end",{"suites":1,"tests":1,"passes":1,"pending":0,"failures":0,' ); - expect(results.stderr).to.contain( + expect( + results.stderr, + 'to contain', 'Could not find any test files matching pattern' ); }, @@ -53,7 +60,9 @@ describe('globbing', function() { testGlob.shouldSucceed( '"./*.js"', function(results) { - expect(results.stdout).to.contain( + expect( + results.stdout, + 'to contain', '["end",{"suites":1,"tests":1,"passes":1,"pending":0,"failures":0,' ); }, @@ -65,7 +74,9 @@ describe('globbing', function() { testGlob.shouldFail( '"./*-none.js"', function(results) { - expect(results.stderr).to.contain( + expect( + results.stderr, + 'to contain', 'Could not find any test files matching pattern' ); }, @@ -77,10 +88,14 @@ describe('globbing', function() { testGlob.shouldSucceed( '"./*.js" "./*-none.js"', function(results) { - expect(results.stdout).to.contain( + expect( + results.stdout, + 'to contain', '["end",{"suites":1,"tests":1,"passes":1,"pending":0,"failures":0,' ); - expect(results.stderr).to.contain( + expect( + results.stderr, + 'to contain', 'Could not find any test files matching pattern' ); }, @@ -93,7 +108,9 @@ describe('globbing', function() { testGlob.shouldSucceed( '"./**/*.js"', function(results) { - expect(results.stdout).to.contain( + expect( + results.stdout, + 'to contain', '["end",{"suites":2,"tests":2,"passes":2,"pending":0,"failures":0,' ); }, @@ -105,7 +122,9 @@ describe('globbing', function() { testGlob.shouldFail( '"./**/*-none.js"', function(results) { - expect(results.stderr).to.contain( + expect( + results.stderr, + 'to contain', 'Could not find any test files matching pattern' ); }, @@ -117,10 +136,14 @@ describe('globbing', function() { testGlob.shouldSucceed( '"./**/*.js" "./**/*-none.js"', function(results) { - expect(results.stdout).to.contain( + expect( + results.stdout, + 'to contain', '["end",{"suites":2,"tests":2,"passes":2,"pending":0,"failures":0,' ); - expect(results.stderr).to.contain( + expect( + results.stderr, + 'to contain', 'Could not find any test files matching pattern' ); }, @@ -139,7 +162,7 @@ var testGlob = { }), shouldFail: execMochaWith(function shouldFailWithStderr(error, stderr) { - expect(error && error.message).to.contain(stderr); + expect(error && error.message, 'to contain', stderr); }) }; diff --git a/test/integration/helpers.js b/test/integration/helpers.js index c0f61f7487..23722ea43e 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -71,44 +71,6 @@ module.exports = { }); }, - /** - * Returns an array of diffs corresponding to exceptions thrown from specs, - * given the plaintext output (-C) of a mocha run. - * - * @param {string} output - * returns {string[]} - */ - getDiffs: function(output) { - var diffs, i, inDiff, inStackTrace; - - diffs = []; - output.split('\n').forEach(function(line) { - if (line.match(/^\s{2}\d+\)/)) { - // New spec, e.g. "1) spec title" - diffs.push([]); - i = diffs.length - 1; - inStackTrace = false; - inDiff = false; - } else if (!diffs.length || inStackTrace) { - // Haven't encountered a spec yet - // or we're in the middle of a stack trace - } else if (line.indexOf('+ expected - actual') !== -1) { - inDiff = true; - } else if (line.match(/at Context/)) { - // At the start of a stack trace - inStackTrace = true; - inDiff = false; - } else if (inDiff) { - diffs[i].push(line); - } - }); - - // Ignore empty lines before/after diff - return diffs.map(function(diff) { - return diff.slice(1, -3).join('\n'); - }); - }, - /** * regular expression used for splitting lines based on new line / dot symbol. */ diff --git a/test/integration/no-diff.spec.js b/test/integration/no-diff.spec.js index acde326f65..cc26fc24c3 100644 --- a/test/integration/no-diff.spec.js +++ b/test/integration/no-diff.spec.js @@ -11,8 +11,8 @@ describe('no-diff', function() { done(err); return; } - expect(res.output).not.to.match(/\+ expected/); - expect(res.output).not.to.match(/- actual/); + expect(res.output, 'not to match', /\+ expected/); + expect(res.output, 'not to match', /- actual/); done(); }); }); @@ -25,8 +25,8 @@ describe('no-diff', function() { done(err); return; } - expect(res.output).to.match(/\+ expected/); - expect(res.output).to.match(/- actual/); + expect(res.output, 'to match', /\+ expected/); + expect(res.output, 'to match', /- actual/); done(); }); }); diff --git a/test/integration/options.spec.js b/test/integration/options.spec.js index 3bb8ce8823..25775de615 100644 --- a/test/integration/options.spec.js +++ b/test/integration/options.spec.js @@ -1,7 +1,6 @@ 'use strict'; var path = require('path'); -var assert = require('assert'); var helpers = require('./helpers'); var run = helpers.runMochaJSON; var directInvoke = helpers.invokeMocha; @@ -20,12 +19,7 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 0); - assert.equal(res.stats.failures, 1); - - assert.equal(res.failures[0].title, 'throws an error'); - assert.equal(res.code, 1); + expect(res, 'to have failed'); done(); }); }); @@ -36,12 +30,7 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 1); - assert.equal(res.stats.failures, 0); - - assert.equal(res.passes[0].title, 'should pass'); - assert.equal(res.code, 0); + expect(res, 'to have passed'); done(); }); }); @@ -58,13 +47,11 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 1); - assert.equal(res.stats.failures, 1); - assert.equal(res.passes[0].title, 'should display this spec'); - assert.equal(res.failures[0].title, 'should only display this error'); - assert.equal(res.code, 1); + expect(res, 'to have failed') + .and('to have passed test', 'should display this spec') + .and('to have failed test', 'should only display this error') + .and('to have passed test count', 1); done(); }); }); @@ -75,12 +62,9 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 0); - assert.equal(res.stats.failures, 1); - - assert.equal(res.failures[0].title, '"before all" hook'); - assert.equal(res.code, 1); + expect(res, 'to have failed') + .and('to have failed test count', 1) + .and('to have failed test', '"before all" hook'); done(); }); }); @@ -91,12 +75,9 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 0); - assert.equal(res.stats.failures, 1); - - assert.equal(res.failures[0].title, 'should only display this error'); - assert.equal(res.code, 1); + expect(res, 'to have failed') + .and('to have failed test count', 1) + .and('to have run test', 'should only display this error'); done(); }); }); @@ -113,12 +94,10 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); - assert.equal(res.stats.failures, 0); - - assert.equal(res.passes[0].fullTitle, 'alpha should be executed first'); - assert.equal(res.code, 0); + expect(res, 'to have passed test count', 2).and( + 'to have passed test order', + 'should be executed first' + ); done(); }); }); @@ -133,12 +112,9 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); - assert.equal(res.stats.failures, 0); - - assert.equal(res.passes[0].fullTitle, 'alpha should be executed first'); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('to have passed test count', 2) + .and('to have passed test order', 'should be executed first'); done(); }); }); @@ -156,14 +132,14 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 3); - assert.equal(res.stats.failures, 0); - - assert.equal(res.passes[0].fullTitle, 'alpha should be executed first'); - assert.equal(res.passes[1].fullTitle, 'beta should be executed second'); - assert.equal(res.passes[2].fullTitle, 'theta should be executed third'); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('to have passed test count', 3) + .and( + 'to have passed test order', + 'should be executed first', + 'should be executed second', + 'should be executed third' + ); done(); }); }); @@ -180,15 +156,7 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 1); - assert.equal(res.stats.failures, 0); - - assert.equal( - res.passes[0].title, - 'should have no effect if attempted twice in the same suite' - ); - assert.equal(res.code, 0); + expect(res, 'to have passed').and('to have passed test count', 1); done(); }); }); @@ -199,15 +167,13 @@ describe('options', function() { done(err); return; } - - assert.equal(res.stats.tests, 2); - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); - assert.equal(res.stats.failures, 0); - - assert.equal(res.passes[0].title, 'should run this'); - assert.equal(res.passes[1].title, 'should run this, too'); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('to have passed test count', 2) + .and( + 'to have passed test order', + 'should run this', + 'should run this, too' + ); done(); }); }); @@ -218,15 +184,10 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 0); - assert.equal(res.stats.failures, 1); - - assert.equal( - res.failures[0].title, + expect(res, 'to have failed').and( + 'to have failed test', 'Uncaught error outside test suite' ); - assert.equal(res.code, 1); done(); }); }); @@ -240,10 +201,9 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('to have passed test count', 2) + .and('not to have pending tests'); done(); }); }); @@ -256,10 +216,9 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 4); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('to have passed test count', 4) + .and('not to have pending tests'); done(); }); }); @@ -271,10 +230,10 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 4); - assert.equal(res.stats.failures, 1); - assert.equal(res.code, 1); + expect(res, 'to have failed') + .and('to have passed test count', 4) + .and('to have failed test count', 1) + .and('not to have pending tests'); done(); }); }); @@ -288,10 +247,9 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 4); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('to have passed test count', 4) + .and('not to have pending tests'); done(); }); }); @@ -306,12 +264,10 @@ describe('options', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 0); - assert.equal(res.stats.tests, 1); - assert.equal(res.tests[0].currentRetry, 3); - assert.equal(res.stats.failures, 1); - assert.equal(res.code, 1); + expect(res, 'to have failed') + .and('not to have pending tests') + .and('not to have passed tests') + .and('to have retried test', 'should fail', 3); done(); }); }); @@ -330,7 +286,7 @@ describe('options', function() { done(err); return; } - assert.equal(res.code, 0); + expect(res, 'to have passed'); done(); }); }); @@ -341,17 +297,18 @@ describe('options', function() { done(err); return; } - assert.equal(res.code, 1); - assert.equal(res.failures[0].err.message, onlyErrorMessage); + expect(res, 'to have failed with error', onlyErrorMessage); done(); }); }); it('fails if there are tests in suites marked only', function(done) { run('options/forbid-only/only-suite.js', args, function(err, res) { - assert(!err); - assert.equal(res.code, 1); - assert.equal(res.failures[0].err.message, onlyErrorMessage); + if (err) { + done(err); + return; + } + expect(res, 'to have failed with error', onlyErrorMessage); done(); }); }); @@ -370,7 +327,7 @@ describe('options', function() { done(err); return; } - assert.equal(res.code, 0); + expect(res, 'to have passed'); done(); }); }); @@ -398,8 +355,7 @@ describe('options', function() { done(err); return; } - assert.equal(res.code, 1); - assert.equal(res.failures[0].err.message, pendingErrorMessage); + expect(res, 'to have failed with error', pendingErrorMessage); done(); } ); @@ -435,7 +391,7 @@ describe('options', function() { done(err); return; } - expect(didExit).to.equal(shouldExit); + expect(didExit, 'to be', shouldExit); done(); }); @@ -476,7 +432,7 @@ describe('options', function() { if (error) { return done(error); } - expect(result.output).to.contain('Usage:'); + expect(result.output, 'to contain', 'Usage:'); done(); }, path.join(__dirname, 'fixtures', 'options', 'help') @@ -508,11 +464,9 @@ describe('options', function() { 'test/integration/fixtures/options/exclude/fail.fixture.js' ], function(res) { - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 1); - assert.equal(res.stats.failures, 0); - assert.equal(res.passes[0].title, 'should find this test'); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('to have run test', 'should find this test') + .and('not to have pending tests'); }, done ); @@ -523,10 +477,9 @@ describe('options', function() { 'options/exclude/**/*.fixture.js', ['--exclude', '**/fail.fixture.js'], function(res) { - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('not to have pending tests') + .and('to have passed test count', 2); }, done ); @@ -542,10 +495,9 @@ describe('options', function() { 'test/integration/fixtures/options/exclude/nested/fail.fixture.js' ], function(res) { - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('not to have pending tests') + .and('to have passed test count', 2); }, done ); diff --git a/test/integration/regression.spec.js b/test/integration/regression.spec.js index 92f2223c7a..af763e2021 100644 --- a/test/integration/regression.spec.js +++ b/test/integration/regression.spec.js @@ -1,6 +1,5 @@ 'use strict'; -var assert = require('assert'); var fs = require('fs'); var path = require('path'); var run = require('./helpers').runMocha; @@ -19,11 +18,10 @@ describe('regressions', function() { done(err); return; } - assert.equal(occurences('testbody1'), 1); - assert.equal(occurences('testbody2'), 1); - assert.equal(occurences('testbody3'), 1); - - assert.equal(res.code, 1); + expect(res, 'to have failed'); + expect(occurences('testbody1'), 'to be', 1); + expect(occurences('testbody2'), 'to be', 1); + expect(occurences('testbody3'), 'to be', 1); done(); }); }); @@ -35,15 +33,9 @@ describe('regressions', function() { .replace(/^#.*$/gm, '') .split(/[\s]+/) .join(''); - assert.notEqual( - processArgv.indexOf(mochaOpts), - -1, - 'process.argv missing mocha.opts' - ); - assert.equal( - processArgv.indexOf(mochaOpts), - processArgv.lastIndexOf(mochaOpts), - 'process.argv contains duplicated mocha.opts' + expect(processArgv.indexOf(mochaOpts), 'not to be', -1).and( + 'to be', + processArgv.lastIndexOf(mochaOpts) ); }); @@ -61,7 +53,7 @@ describe('regressions', function() { done(err); return; } - assert.equal(res.code, 0, 'Custom UI should be loaded'); + expect(res, 'to have passed'); done(); }); }); @@ -76,15 +68,8 @@ describe('regressions', function() { done(err); return; } - assert.equal( - /process out of memory/.test(res.output), - false, - "fixture's process out of memory!" - ); - assert.equal( - res.code, - 0, - 'Runnable fn (it/before[Each]/after[Each]) references should be deleted to avoid memory leaks' + expect(res, 'not to contain output', 'process out of memory').and( + 'to have passed' ); done(); }); @@ -102,7 +87,7 @@ describe('regressions', function() { it('should be pending', function() {}); }); after('meta test', function() { - expect(afterWasRun).to.be.ok(); + expect(afterWasRun, 'to be', true); }); }); @@ -112,10 +97,9 @@ describe('regressions', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 0); - assert.equal(res.stats.failures, 1); - assert.equal(res.code, 1); + expect(res, 'to have failed') + .and('not to have pending tests') + .and('to have failed test count', 1); done(); }); }); @@ -127,10 +111,9 @@ describe('regressions', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 2); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('not to have pending tests') + .and('to have passed test count', 2); done(); }); }); @@ -141,10 +124,9 @@ describe('regressions', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 1); - assert.equal(res.stats.failures, 0); - assert.equal(res.code, 0); + expect(res, 'to have passed') + .and('not to have pending tests') + .and('to have passed test count', 1); done(); }); }); @@ -155,21 +137,14 @@ describe('regressions', function() { done(err); return; } - assert.equal(res.stats.pending, 0); - assert.equal(res.stats.passes, 0); - assert.equal(res.stats.failures, 2); - - assert.equal( - res.failures[0].title, - 'fails exactly once when a global error is thrown synchronously and done errors' - ); - assert.equal(res.failures[0].err.message, 'sync error'); - assert.equal( - res.failures[1].title, - 'fails exactly once when a global error is thrown synchronously and done completes' - ); - assert.equal(res.failures[1].err.message, 'sync error'); - assert.equal(res.code, 2); + expect(res, 'to have failed with errors', 'sync error a', 'sync error b') + .and('to have exit code', 2) + .and('not to have passed tests') + .and('not to have pending tests') + .and('to have failed test order', [ + 'fails exactly once when a global error is thrown synchronously and done errors', + 'fails exactly once when a global error is thrown synchronously and done completes' + ]); done(); }); }); diff --git a/test/integration/reporters.spec.js b/test/integration/reporters.spec.js index bd1e755ed8..4e95622dee 100644 --- a/test/integration/reporters.spec.js +++ b/test/integration/reporters.spec.js @@ -1,6 +1,5 @@ 'use strict'; -var assert = require('assert'); var os = require('os'); var fs = require('fs'); var crypto = require('crypto'); @@ -22,13 +21,13 @@ describe('reporters', function() { }); it('does not exceed maximum callstack (issue: 1875)', function() { - assert(res.output.indexOf('RangeError') === -1, 'Threw RangeError'); + expect(res.output, 'not to contain', 'RangeError'); }); it('contains spec src', function() { var src = ['```js', 'assert(true);', '```'].join('\n'); - assert(res.output.indexOf(src) !== -1, 'No assert found'); + expect(res.output, 'to contain', src); }); }); @@ -56,7 +55,7 @@ describe('reporters', function() { fs.unlinkSync(tmpFile); expectedOutput.forEach(function(line) { - assert(xml.indexOf(line) !== -1, 'XML did not contain ' + line); + expect(xml, 'to contain', line); }); done(err); @@ -76,7 +75,7 @@ describe('reporters', function() { done(err); return; } - assert.equal(result.code, 0); + expect(result, 'to have passed'); done(); }); }); @@ -95,7 +94,7 @@ describe('reporters', function() { done(err); return; } - assert.equal(result.code, 0); + expect(result, 'to have passed'); done(); }); }); diff --git a/test/interfaces/bdd.spec.js b/test/interfaces/bdd.spec.js index 3f9e1c4ebd..a8f3141b39 100644 --- a/test/interfaces/bdd.spec.js +++ b/test/interfaces/bdd.spec.js @@ -3,13 +3,13 @@ describe('integer primitives', function() { describe('arithmetic', function() { it('should add', function() { - expect(1 + 1).to.equal(2); - expect(2 + 2).to.equal(4); + expect(1 + 1, 'to be', 2); + expect(2 + 2, 'to be', 4); }); it('should subtract', function() { - expect(1 - 1).to.equal(0); - expect(2 - 1).to.equal(1); + expect(1 - 1, 'to be', 0); + expect(2 - 1, 'to be', 1); }); }); }); @@ -17,8 +17,8 @@ describe('integer primitives', function() { describe('integer primitives', function() { describe('arithmetic is not', function() { it('should add', function() { - expect(1 + 1).not.to.equal(3); - expect(2 + 2).not.to.equal(5); + expect(1 + 1, 'not to equal', 3); + expect(2 + 2, 'not to equal', 5); }); }); }); @@ -29,38 +29,38 @@ context('test suite', function() { }); specify('share a property', function() { - expect(this.number).to.equal(5); + expect(this.number, 'to be', 5); }); }); describe('pending suite', function() { describe.skip('this is pending suite', function() { it('should not run', function() { - expect(1 + 1).to.equal(3); + expect(1 + 1, 'to be', 3); }); }); }); describe('pending tests', function() { it.skip('should not run', function() { - expect(1 + 1).to.equal(3); + expect(1 + 1, 'to be', 3); }); }); describe('setting timeout by appending it to test', function() { var runningTest = it('enables users to call timeout on active tests', function() { - expect(1 + 1).to.equal(2); + expect(1 + 1, 'to be', 2); }).timeout(1003); var skippedTest = xit('enables users to call timeout on pending tests', function() { - expect(1 + 1).to.equal(3); + expect(1 + 1, 'to be', 3); }).timeout(1002); it('sets timeout on pending tests', function() { - expect(skippedTest._timeout).to.equal(1002); + expect(skippedTest._timeout, 'to be', 1002); }); it('sets timeout on running tests', function() { - expect(runningTest._timeout).to.equal(1003); + expect(runningTest._timeout, 'to be', 1003); }); }); diff --git a/test/interfaces/exports.spec.js b/test/interfaces/exports.spec.js index 7a5e247e59..4b84bda35f 100644 --- a/test/interfaces/exports.spec.js +++ b/test/interfaces/exports.spec.js @@ -9,7 +9,7 @@ exports.Array = { after: function() { calls.push('after'); - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'before', 'before each', 'one', @@ -32,15 +32,15 @@ exports.Array = { 'should return -1 when the value is not present': function() { calls.push('one'); - expect([1, 2, 3].indexOf(5)).to.equal(-1); - expect([1, 2, 3].indexOf(0)).to.equal(-1); + expect([1, 2, 3].indexOf(5), 'to be', -1); + expect([1, 2, 3].indexOf(0), 'to be', -1); }, 'should return the correct index when the value is present': function() { calls.push('two'); - expect([1, 2, 3].indexOf(1)).to.equal(0); - expect([1, 2, 3].indexOf(2)).to.equal(1); - expect([1, 2, 3].indexOf(3)).to.equal(2); + expect([1, 2, 3].indexOf(1), 'to be', 0); + expect([1, 2, 3].indexOf(2), 'to be', 1); + expect([1, 2, 3].indexOf(3), 'to be', 2); } } }; diff --git a/test/interfaces/qunit.spec.js b/test/interfaces/qunit.spec.js index 1a6131d825..ad5bd9f371 100644 --- a/test/interfaces/qunit.spec.js +++ b/test/interfaces/qunit.spec.js @@ -1,25 +1,20 @@ 'use strict'; -function ok(expr, msg) { - if (!expr) throw new Error(msg); -} - suite('integer primitives'); test('should add', function() { - var number = 2 + 2; - ok(number === 4); + expect(2 + 2, 'to be', 4); }); test('should decrement', function() { var number = 3; - ok(--number === 2); - ok(--number === 1); - ok(--number === 0); + expect(--number, 'to be', 2); + expect(--number, 'to be', 1); + expect(--number, 'to be', 0); }); suite('String'); test('#length', function() { - ok('foo'.length === 3); + expect('foo', 'to have length', 3); }); diff --git a/test/interfaces/tdd.spec.js b/test/interfaces/tdd.spec.js index 6cdabf0417..89de8157cd 100644 --- a/test/interfaces/tdd.spec.js +++ b/test/interfaces/tdd.spec.js @@ -5,37 +5,37 @@ suite('integer primitives', function() { var initialValue = 41; suiteSetup(function(done) { - expect(initialValue).to.eql(41); + expect(initialValue, 'to be', 41); initialValue += 1; done(); }); test('should add', function() { - expect(initialValue).to.eql(42); - expect(1 + 1).to.equal(2); - expect(2 + 2).to.equal(4); + expect(initialValue, 'to be', 42); + expect(1 + 1, 'to be', 2); + expect(2 + 2, 'to be', 4); }); test('should subtract', function() { - expect(initialValue).to.eql(42); - expect(1 - 1).to.equal(0); - expect(2 - 1).to.equal(1); + expect(initialValue, 'to be', 42); + expect(1 - 1, 'to be', 0); + expect(2 - 1, 'to be', 1); }); test.skip('should skip this test', function() { var zero = 0; - expect(zero).to.equal(1, 'this test should have been skipped'); + expect(zero, 'to be', 1); }); suite.skip('should skip this suite', function() { test('should skip this test', function() { var zero = 0; - expect(zero).to.equal(1, 'this test should have been skipped'); + expect(zero, 'to be', 1); }); }); suiteTeardown(function(done) { - expect(initialValue).to.eql(42); + expect(initialValue, 'to be', 42); done(); }); }); diff --git a/test/jsapi/index.js b/test/jsapi/index.js index 94875ede5c..9fe57b58c7 100644 --- a/test/jsapi/index.js +++ b/test/jsapi/index.js @@ -9,7 +9,7 @@ var mocha = new Mocha({ growl: true }); -global.expect = require('expect.js'); +require('../setup'); mocha.addFile('test/unit/suite.spec.js'); mocha.addFile('test/unit/runner.spec.js'); diff --git a/test/node-unit/color.spec.js b/test/node-unit/color.spec.js index 08931501ce..7f3301cb46 100644 --- a/test/node-unit/color.spec.js +++ b/test/node-unit/color.spec.js @@ -1,6 +1,5 @@ 'use strict'; -var assert = require('assert'); var childProcess = require('child_process'); var path = require('path'); @@ -16,7 +15,7 @@ describe('Mocha', function() { ) { if (err) return cb(err); - assert(stdout.indexOf('[90m') === -1); + expect(stdout, 'not to contain', '[90m'); cb(null); }); diff --git a/test/node-unit/file-utils.spec.js b/test/node-unit/file-utils.spec.js index 39ae783db9..74c30be46e 100644 --- a/test/node-unit/file-utils.spec.js +++ b/test/node-unit/file-utils.spec.js @@ -29,14 +29,16 @@ describe('file utils', function() { return this.skip(); } - expect(utils.lookupFiles(tmpDir, ['js'], false)) - .to.contain(tmpFile('mocha-utils-link.js')) - .and.contain(tmpFile('mocha-utils.js')) - .and.have.length(2); - expect(existsSync(tmpFile('mocha-utils-link.js'))).to.be(true); + expect( + utils.lookupFiles(tmpDir, ['js'], false), + 'to contain', + tmpFile('mocha-utils-link.js'), + tmpFile('mocha-utils.js') + ).and('to have length', 2); + expect(existsSync(tmpFile('mocha-utils-link.js')), 'to be', true); fs.renameSync(tmpFile('mocha-utils.js'), tmpFile('bob')); - expect(existsSync(tmpFile('mocha-utils-link.js'))).to.be(false); - expect(utils.lookupFiles(tmpDir, ['js'], false)).to.eql([]); + expect(existsSync(tmpFile('mocha-utils-link.js')), 'to be', false); + expect(utils.lookupFiles(tmpDir, ['js'], false), 'to equal', []); }); it('should accept a glob "path" value', function() { @@ -45,15 +47,15 @@ describe('file utils', function() { .map(path.normalize.bind(path)); var expectedLength = 0; - var ex = expect(res).to.contain(tmpFile('mocha-utils.js')); + var ex = expect(res, 'to contain', tmpFile('mocha-utils.js')); expectedLength++; if (symlinkSupported) { - ex = ex.and.contain(tmpFile('mocha-utils-link.js')); + ex = ex.and('to contain', tmpFile('mocha-utils-link.js')); expectedLength++; } - ex.and.have.length(expectedLength); + ex.and('to have length', expectedLength); }); it('should parse extensions from extnsions parameter', function() { @@ -61,21 +63,23 @@ describe('file utils', function() { fs.writeFileSync(nonJsFile, 'yippy skippy ying yang yow'); var res = utils.lookupFiles(tmpDir, ['txt'], false); - expect(res) - .to.contain(nonJsFile) - .and.to.have.length(1); + expect(res, 'to contain', nonJsFile).and('to have length', 1); }); it('should not require the extensions parameter when looking up a file', function() { var res = utils.lookupFiles(tmpFile('mocha-utils'), undefined, false); - expect(res).to.equal(tmpFile('mocha-utils.js')); + expect(res, 'to be', tmpFile('mocha-utils.js')); }); it('should require the extensions parameter when looking up a directory', function() { var dirLookup = function() { return utils.lookupFiles(tmpDir, undefined, false); }; - expect(dirLookup).to.throwError(); + expect( + dirLookup, + 'to throw', + 'extensions parameter required when filepath is a directory' + ); }); }); @@ -84,18 +88,20 @@ describe('file utils', function() { if (!symlinkSupported) { return this.skip(); } - expect(utils.files(tmpDir, ['js'])) - .to.contain(tmpFile('mocha-utils-link.js')) - .and.contain(tmpFile('mocha-utils.js')) - .and.have.length(2); + expect( + utils.files(tmpDir, ['js']), + 'to contain', + tmpFile('mocha-utils-link.js'), + tmpFile('mocha-utils.js') + ).and('to have length', 2); - expect(existsSync(tmpFile('mocha-utils-link.js'))).to.be(true); + expect(existsSync(tmpFile('mocha-utils-link.js')), 'to be', true); fs.renameSync(tmpFile('mocha-utils.js'), tmpFile('bob')); - expect(existsSync(tmpFile('mocha-utils-link.js'))).to.be(false); + expect(existsSync(tmpFile('mocha-utils-link.js')), 'to be', false); - expect(utils.files(tmpDir, ['js'])).to.eql([ + expect(utils.files(tmpDir, ['js']), 'to equal', [ tmpFile('mocha-utils-link.js') ]); }); diff --git a/test/node-unit/stack-trace-filter.spec.js b/test/node-unit/stack-trace-filter.spec.js index 7c9203f751..cd0eccd9ea 100644 --- a/test/node-unit/stack-trace-filter.spec.js +++ b/test/node-unit/stack-trace-filter.spec.js @@ -28,7 +28,7 @@ describe('stackTraceFilter()', function() { 'Immediate._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)', 'at processImmediate [as _immediateCallback] (timers.js:321:17)' ]; - expect(filter(stack.join('\n'))).to.equal(stack.slice(0, 3).join('\n')); + expect(filter(stack.join('\n')), 'to be', stack.slice(0, 3).join('\n')); stack = [ 'AssertionError: bar baz', @@ -44,7 +44,7 @@ describe('stackTraceFilter()', function() { 'at processImmediate [as _immediateCallback] (timers.js:321:17)' ]; - expect(filter(stack.join('\n'))).to.equal(stack.slice(0, 7).join('\n')); + expect(filter(stack.join('\n')), 'to be', stack.slice(0, 7).join('\n')); }); it('does not ignore other bower_components and components', function() { @@ -63,7 +63,7 @@ describe('stackTraceFilter()', function() { 'at file:///.../components/mochajs/mocha/2.1.0/mocha.js:4970:12', 'at next (file:///.../components/mochajs/mocha/2.1.0/mocha.js:4817:14)' ]; - expect(filter(stack.join('\n'))).to.equal(stack.slice(0, 7).join('\n')); + expect(filter(stack.join('\n')), 'to be', stack.slice(0, 7).join('\n')); }); it('should replace absolute with relative paths', function() { @@ -79,7 +79,7 @@ describe('stackTraceFilter()', function() { 'at bar (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:11:26)' ]; - expect(filter(stack.join('\n'))).to.equal(expected.join('\n')); + expect(filter(stack.join('\n')), 'to be', expected.join('\n')); }); it('should not replace absolute path which has cwd as infix', function() { @@ -95,7 +95,7 @@ describe('stackTraceFilter()', function() { 'at bar (/usr/local/dev/own/tmp/node_modules/bluebird/js/main/promise.js:11:26)' ]; - expect(filter(stack.join('\n'))).to.equal(expected.join('\n')); + expect(filter(stack.join('\n')), 'to be', expected.join('\n')); }); }); @@ -119,7 +119,7 @@ describe('stackTraceFilter()', function() { 'at next (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:284:14)', 'at Immediate._onImmediate (C:\\Users\\ishida\\src\\test\\node_modules\\mocha\\lib\\runner.js:320:5)' ]; - expect(filter(stack.join('\n'))).to.equal(stack.slice(0, 2).join('\n')); + expect(filter(stack.join('\n')), 'to be', stack.slice(0, 2).join('\n')); }); }); }); @@ -144,7 +144,7 @@ describe('stackTraceFilter()', function() { 'at localhost:3000/foo/bar/node_modules/mocha.js:4970:12', 'at next (node_modules/mocha.js:4817:14)' ]; - expect(filter(stack.join('\n'))).to.equal(stack.slice(0, 7).join('\n')); + expect(filter(stack.join('\n')), 'to be', stack.slice(0, 7).join('\n')); }); after(function() { diff --git a/test/only/bdd.spec.js b/test/only/bdd.spec.js index b317e51bed..8f38a9b7b9 100644 --- a/test/only/bdd.spec.js +++ b/test/only/bdd.spec.js @@ -2,58 +2,58 @@ describe('should only run .only test in this bdd suite', function() { it('should not run this test', function() { - expect(0).to.equal(1, 'this test should have been skipped'); + expect(0, 'to be', 1, 'this test should have been skipped'); }); it.only('should run this test', function() { - expect(0).to.equal(0, 'this .only test should run'); + expect(0, 'to be', 0, 'this .only test should run'); }); it('should run this test, not (includes the title of the .only test)', function() { - expect(0).to.equal(1, 'this test should have been skipped'); + expect(0, 'to be', 1, 'this test should have been skipped'); }); }); describe('should not run this suite', function() { it('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); it('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); it('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); }); describe.only('should run all tests in this bdd suite', function() { it('should run this test #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); it('should run this test #2', function() { - expect(1).to.equal(1); + expect(1, 'to be', 1); }); it('should run this test #3', function() { - expect('foo').to.equal('foo'); + expect('foo', 'to be', 'foo'); }); }); describe('should run only suites that marked as `only`', function() { describe.only('should run all this tdd suite', function() { it('should run this test #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); it('should run this test #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); }); describe('should not run this suite', function() { it('should run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); }); }); @@ -61,18 +61,18 @@ describe('should run only suites that marked as `only`', function() { // Nested situation describe('should not run parent tests', function() { it('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); describe('and not the child tests too', function() { it('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); describe.only('but run all the tests in this suite', function() { it('should run this test #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); it('should run this test #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); }); }); @@ -81,47 +81,47 @@ describe('should not run parent tests', function() { // mark test as `only` override the suite behavior describe.only('should run only tests that marked as `only`', function() { it('should not run this test #1', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); it.only('should run this test #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); it('should not run this test #3', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); it.only('should run this test #4', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); }); describe.only('Should run only test cases that mark as only', function() { it.only('should runt his test', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); it('should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); describe('should not run this suite', function() { it('should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); }); }); // Root Suite it.only('#Root-Suite, should run this test-case #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); it.only('#Root-Suite, should run this test-case #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); it('#Root-Suite, should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); diff --git a/test/only/global/bdd.spec.js b/test/only/global/bdd.spec.js index 759d3e6f4e..39f68dfd97 100644 --- a/test/only/global/bdd.spec.js +++ b/test/only/global/bdd.spec.js @@ -2,13 +2,13 @@ // Root-only test cases it.only('#Root-Suite, should run this bdd test-case #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); it('#Root-Suite, should not run this bdd test-case #2', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); it('#Root-Suite, should not run this bdd test-case #3', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); diff --git a/test/only/global/qunit.spec.js b/test/only/global/qunit.spec.js index 2d09c3fb9c..f60603ce8f 100644 --- a/test/only/global/qunit.spec.js +++ b/test/only/global/qunit.spec.js @@ -2,13 +2,13 @@ // Root-only test cases test.only('#Root-Suite, should run this qunit test-case #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('#Root-Suite, should not run this qunit test-case #2', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); test('#Root-Suite, should not run this qunit test-case #3', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); diff --git a/test/only/global/tdd.spec.js b/test/only/global/tdd.spec.js index 29f21c6b8d..4c2290698b 100644 --- a/test/only/global/tdd.spec.js +++ b/test/only/global/tdd.spec.js @@ -2,13 +2,13 @@ // Root-only test cases test.only('#Root-Suite, should run this tdd test-case #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('#Root-Suite, should not run this tdd test-case #2', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); test('#Root-Suite, should not run this tdd test-case #3', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); diff --git a/test/only/qunit.spec.js b/test/only/qunit.spec.js index b027602118..04a4a04c8f 100644 --- a/test/only/qunit.spec.js +++ b/test/only/qunit.spec.js @@ -2,74 +2,74 @@ // Root Suite test.only('#Root-Suite, should run this test-case #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test.only('#Root-Suite, should run this test-case #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('#Root-Suite, should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); suite('should only run .only test in this qunit suite'); test('should not run this test', function() { - expect(0).to.equal(1, 'this test should have been skipped'); + expect(0, 'to be', 1, 'this test should have been skipped'); }); test.only('should run this test', function() { - expect(0).to.equal(0, 'this .only test should run'); + expect(0, 'to be', 0, 'this .only test should run'); }); test('should run this test, not (includes the title of the .only test)', function() { - expect(0).to.equal(1, 'this test should have been skipped'); + expect(0, 'to be', 1, 'this test should have been skipped'); }); // Mark suite suite.only('should run all tests in this suite'); test('should run this test #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('should run this test #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('should run this test #3', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); // Unmark this suite suite("should not run any of this suite's tests"); test('should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); test('should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); test('should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); // Mark test as `only` override the suite behavior suite.only('should run only tests that marked as `only`'); test('should not run this test #1', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); test.only('should not run this test #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('should not run this test #3', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); test.only('should not run this test #4', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); diff --git a/test/only/tdd.spec.js b/test/only/tdd.spec.js index 981bbfeb4b..eed4e27eda 100644 --- a/test/only/tdd.spec.js +++ b/test/only/tdd.spec.js @@ -2,58 +2,58 @@ suite('should only run .only test in this tdd suite', function() { test('should not run this test', function() { - expect(0).to.equal(1, 'this test should have been skipped'); + expect(0, 'to be', 1, 'this test should have been skipped'); }); test.only('should run this test', function() { - expect(0).to.equal(0, 'this .only test should run'); + expect(0, 'to be', 0, 'this .only test should run'); }); test('should run this test, not (includes the title of the .only test)', function() { - expect(0).to.equal(1, 'this test should have been skipped'); + expect(0, 'to be', 1, 'this test should have been skipped'); }); }); suite('should not run this suite', function() { test('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); test('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); test('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); }); suite.only('should run all tests in this tdd suite', function() { test('should run this test #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('should run this test #2', function() { - expect(1).to.equal(1); + expect(1, 'to be', 1); }); test('should run this test #3', function() { - expect('foo').to.equal('foo'); + expect('foo', 'to be', 'foo'); }); }); suite('should run only suites that marked as `only`', function() { suite.only('should run all this tdd suite', function() { test('should run this test #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('should run this test #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); }); suite('should not run this suite', function() { test('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); }); }); @@ -61,18 +61,18 @@ suite('should run only suites that marked as `only`', function() { // Nested situation suite('should not run parent tests', function() { test('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); suite('and not the child tests too', function() { test('should not run this test', function() { - expect(true).to.equal(false); + expect(true, 'to be', false); }); suite.only('but run all the tests in this suite', function() { test('should run this test #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('should run this test #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); }); }); @@ -81,47 +81,47 @@ suite('should not run parent tests', function() { // mark test as `only` override the suite behavior suite.only('should run only tests that marked as `only`', function() { test('should not run this test #1', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); test.only('should run this test #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('should not run this test #3', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); test.only('should run this test #4', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); }); suite.only('Should run only test cases that mark as only', function() { test.only('should runt his test', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); suite('should not run this suite', function() { test('should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); }); }); // Root Suite test.only('#Root-Suite, should run this test-case #1', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test.only('#Root-Suite, should run this test-case #2', function() { - expect(true).to.equal(true); + expect(true, 'to be', true); }); test('#Root-Suite, should not run this test', function() { - expect(false).to.equal(true); + expect(false, 'to be', true); }); diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index dc7065309b..8ff2195f70 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -3,8 +3,7 @@ var assert = require('assert'); var Base = require('../../lib/reporters/base'); -var Assert = require('assert').AssertionError; - +var AssertionError = assert.AssertionError; var makeTest = require('./helpers').makeTest; var createElements = require('./helpers').createElements; @@ -16,56 +15,69 @@ describe('Base reporter', function() { var errOut; var test; + function list(tests) { + Base.useColors = false; + var retval = Base.list(tests); + Base.useColors = useColors; + return retval; + } + + function generateDiff(actual, expected) { + Base.useColors = false; + var retval = Base.generateDiff(actual, expected); + Base.useColors = useColors; + return retval; + } + beforeEach(function() { + useColors = Base.useColors; stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; - useColors = Base.useColors; - Base.useColors = false; }); afterEach(function() { process.stdout.write = stdoutWrite; - Base.useColors = useColors; }); describe('showDiff', function() { beforeEach(function() { - err = new Assert({actual: 'foo', expected: 'bar'}); + err = new AssertionError({actual: 'foo', expected: 'bar'}); }); it('should show diffs by default', function() { test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.match(/- actual/); - expect(errOut).to.match(/\+ expected/); + expect(errOut, 'to match', /- actual/); + expect(errOut, 'to match', /\+ expected/); }); it('should show diffs if property set to `true`', function() { err.showDiff = true; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.match(/- actual/); - expect(errOut).to.match(/\+ expected/); + expect(errOut, 'to match', /- actual/); + expect(errOut, 'to match', /\+ expected/); }); it('should not show diffs when showDiff property set to `false`', function() { err.showDiff = false; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.not.match(/- actual/); - expect(errOut).to.not.match(/\+ expected/); + expect(errOut, 'not to match', /- actual/); + expect(errOut, 'not to match', /\+ expected/); }); it('should not show diffs when expected is not defined', function() { @@ -73,23 +85,23 @@ describe('Base reporter', function() { test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.not.match(/- actual/); - expect(errOut).to.not.match(/\+ expected/); + expect(errOut, 'not to match', /- actual/); + expect(errOut, 'not to match', /\+ expected/); }); it('should not show diffs when hideDiff is set', function() { test = makeTest(err); Base.hideDiff = true; - Base.list([test]); + list([test]); Base.hideDiff = false; // Revert to original value errOut = stdout.join('\n'); - expect(errOut).to.not.match(/- actual/); - expect(errOut).to.not.match(/\+ expected/); + expect(errOut, 'not to match', /- actual/); + expect(errOut, 'not to match', /\+ expected/); }); }); @@ -103,17 +115,15 @@ describe('Base reporter', function() { err.showDiff = true; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.not.match(/"foo\\nbar"/); - expect(errOut) - .to.match(/foo/) - .and.match(/bar/); - expect(errOut).to.match(/test/); - expect(errOut).to.match(/actual/); - expect(errOut).to.match(/expected/); + expect(errOut, 'not to match', /"foo\\nbar"/); + expect(errOut, 'to match', /foo/).and('to match', /bar/); + expect(errOut, 'to match', /test/); + expect(errOut, 'to match', /actual/); + expect(errOut, 'to match', /expected/); }); }); @@ -136,9 +146,11 @@ describe('Base reporter', function() { expected = 'a bar unified diff'; Base.inlineDiffs = false; - output = Base.generateDiff(actual, expected); + output = generateDiff(actual, expected); - expect(output).to.equal( + expect( + output, + 'to be', '\n + expected - actual\n\n -a foo unified diff\n +a bar unified diff\n ' ); }); @@ -148,9 +160,11 @@ describe('Base reporter', function() { expected = 'a bar inline diff'; Base.inlineDiffs = true; - output = Base.generateDiff(actual, expected); + output = generateDiff(actual, expected); - expect(output).to.equal( + expect( + output, + 'to be', ' \n actual expected\n \n a foobar inline diff\n ' ); }); @@ -166,14 +180,14 @@ describe('Base reporter', function() { test = makeTest(err); Base.inlineDiffs = true; - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.match(/a foobar inline diff/); - expect(errOut).to.match(/test/); - expect(errOut).to.match(/actual/); - expect(errOut).to.match(/expected/); + expect(errOut, 'to match', /a foobar inline diff/); + expect(errOut, 'to match', /test/); + expect(errOut, 'to match', /actual/); + expect(errOut, 'to match', /expected/); }); it('should split lines when string has more than 4 line breaks', function() { @@ -185,19 +199,19 @@ describe('Base reporter', function() { test = makeTest(err); Base.inlineDiffs = true; - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.match(/1 \| a/); - expect(errOut).to.match(/2 \| foobar/); - expect(errOut).to.match(/3 \| inline/); - expect(errOut).to.match(/4 \| diff/); - expect(errOut).to.match(/5 \| with/); - expect(errOut).to.match(/6 \| multiple lines/); - expect(errOut).to.match(/test/); - expect(errOut).to.match(/actual/); - expect(errOut).to.match(/expected/); + expect(errOut, 'to match', /1 \| a/); + expect(errOut, 'to match', /2 \| foobar/); + expect(errOut, 'to match', /3 \| inline/); + expect(errOut, 'to match', /4 \| diff/); + expect(errOut, 'to match', /5 \| with/); + expect(errOut, 'to match', /6 \| multiple lines/); + expect(errOut, 'to match', /test/); + expect(errOut, 'to match', /actual/); + expect(errOut, 'to match', /expected/); }); }); @@ -213,7 +227,7 @@ describe('Base reporter', function() { test = makeTest(err); Base.inlineDiffs = false; - Base.list([test]); + list([test]); errOut = stdout.join('\n'); @@ -237,7 +251,7 @@ describe('Base reporter', function() { ]; regexesToMatch.forEach(function(aRegex) { - expect(errOut).to.match(aRegex); + expect(errOut, 'to match', aRegex); }); }); }); @@ -250,13 +264,13 @@ describe('Base reporter', function() { err.showDiff = true; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.match(/"key"/); - expect(errOut).to.match(/test/); - expect(errOut).to.match(/- actual/); - expect(errOut).to.match(/\+ expected/); + expect(errOut, 'to match', /"key"/); + expect(errOut, 'to match', /test/); + expect(errOut, 'to match', /- actual/); + expect(errOut, 'to match', /\+ expected/); }); it('should stringify Object.create(null)', function() { @@ -269,13 +283,13 @@ describe('Base reporter', function() { err.showDiff = true; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.match(/"hasOwnProperty"/); - expect(errOut).to.match(/test/); - expect(errOut).to.match(/- actual/); - expect(errOut).to.match(/\+ expected/); + expect(errOut, 'to match', /"hasOwnProperty"/); + expect(errOut, 'to match', /test/); + expect(errOut, 'to match', /- actual/); + expect(errOut, 'to match', /\+ expected/); }); it('should handle error messages that are not strings', function() { @@ -287,35 +301,56 @@ describe('Base reporter', function() { err.showDiff = true; test = makeTest(err); - Base.list([test]); + list([test]); + + errOut = stdout.join('\n'); + expect(errOut, 'to match', /\+true/); + expect(errOut, 'to match', /-false/); + expect(errOut, 'to match', /- actual/); + expect(errOut, 'to match', /\+ expected/); + } + }); + + it('should interpret Chai custom error messages', function() { + var chaiExpect = require('chai').expect; + try { + chaiExpect(43, 'custom error message').to.equal(42); + } catch (err) { + err.actual = 43; + err.expected = 42; + err.showDiff = true; + test = makeTest(err); + + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.match(/\+true/); - expect(errOut).to.match(/-false/); - expect(errOut).to.match(/- actual/); - expect(errOut).to.match(/\+ expected/); + expect(errOut, 'to match', /custom error message\n/) + .and('to match', /\+42/) + .and('to match', /-43/) + .and('to match', /- actual/) + .and('to match', /\+ expected/); } }); - it('should interpret chaijs custom error messages', function() { + it('should interpret assert module custom error messages', function() { try { - // expect(43, 'custom error message').to.equal(42); + assert.equal(43, 42, 'custom error message'); // AssertionError: custom error message: expected 43 to equal 42. - assert.equal(43, 42, 'custom error message: expected 43 to equal 42.'); + // assert.equal(43, 42, 'custom error message: expected 43 to equal 42.'); } catch (err) { err.actual = 43; err.expected = 42; err.showDiff = true; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n'); - expect(errOut).to.match(/custom error message\n/); - expect(errOut).to.match(/\+42/); - expect(errOut).to.match(/-43/); - expect(errOut).to.match(/- actual/); - expect(errOut).to.match(/\+ expected/); + expect(errOut, 'to match', /custom error message\n/); + expect(errOut, 'to match', /\+42/); + expect(errOut, 'to match', /-43/); + expect(errOut, 'to match', /- actual/); + expect(errOut, 'to match', /\+ expected/); } }); @@ -327,10 +362,10 @@ describe('Base reporter', function() { }; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n').trim(); - expect(errOut).to.equal('1) test title:\n Error\n foo\n bar'); + expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); it('should use the inspect() property if `message` is not set', function() { @@ -341,9 +376,9 @@ describe('Base reporter', function() { } }; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n').trim(); - expect(errOut).to.equal('1) test title:\n an error happened'); + expect(errOut, 'to be', '1) test title:\n an error happened'); }); it('should set an empty message if `message` and `inspect()` are not set', function() { @@ -351,9 +386,9 @@ describe('Base reporter', function() { showDiff: false }; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n').trim(); - expect(errOut).to.equal('1) test title:'); + expect(errOut, 'to be', '1) test title:'); }); it('should not modify stack if it does not contain message', function() { @@ -364,9 +399,9 @@ describe('Base reporter', function() { }; test = makeTest(err); - Base.list([test]); + list([test]); errOut = stdout.join('\n').trim(); - expect(errOut).to.equal('1) test title:\n Error\n foo\n bar'); + expect(errOut, 'to be', '1) test title:\n Error\n foo\n bar'); }); }); diff --git a/test/reporters/doc.spec.js b/test/reporters/doc.spec.js index b6584e004b..e3de653528 100644 --- a/test/reporters/doc.spec.js +++ b/test/reporters/doc.spec.js @@ -12,11 +12,16 @@ describe('Doc reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + describe('on suite', function() { describe('if suite root does not exist', function() { var expectedTitle = 'expectedTitle'; @@ -34,7 +39,7 @@ describe('Doc reporter', function() { '

' + expectedTitle + '

\n', '
\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); it('should escape title where necessary', function() { var suite = { @@ -50,7 +55,7 @@ describe('Doc reporter', function() { '

' + expectedTitle + '

\n', '
\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('if suite root does exist', function() { @@ -61,7 +66,7 @@ describe('Doc reporter', function() { runner = createMockRunner('suite', 'suite', null, null, suite); Doc.call(this, runner); process.stdout.write = stdoutWrite; - expect(stdout).to.be.empty(); + expect(stdout, 'to be empty'); }); }); }); @@ -76,7 +81,7 @@ describe('Doc reporter', function() { Doc.call(this, runner); process.stdout.write = stdoutWrite; var expectedArray = ['
\n', '\n']; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('if suite root does exist', function() { @@ -87,7 +92,7 @@ describe('Doc reporter', function() { runner = createMockRunner('suite end', 'suite end', null, null, suite); Doc.call(this, runner); process.stdout.write = stdoutWrite; - expect(stdout).to.be.empty(); + expect(stdout, 'to be empty'); }); }); }); @@ -110,7 +115,7 @@ describe('Doc reporter', function() { '
' + expectedTitle + '
\n', '
' + expectedBody + '
\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); it('should escape title and body where necessary', function() { var unescapedTitle = '
' + expectedTitle + '
'; @@ -129,7 +134,7 @@ describe('Doc reporter', function() { '
' + expectedEscapedTitle + '
\n', '
' + expectedEscapedBody + '
\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); @@ -162,7 +167,7 @@ describe('Doc reporter', function() { '\n', '
' + expectedError + '
\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); it('should escape title, body and error where necessary', function() { var unescapedTitle = '
' + expectedTitle + '
'; @@ -194,7 +199,7 @@ describe('Doc reporter', function() { '\n', '
' + expectedEscapedError + '
\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); diff --git a/test/reporters/dot.spec.js b/test/reporters/dot.spec.js index 701d179f37..d1232f5560 100644 --- a/test/reporters/dot.spec.js +++ b/test/reporters/dot.spec.js @@ -16,8 +16,9 @@ describe('Dot reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; useColors = Base.useColors; windowWidth = Base.window.width; @@ -28,6 +29,7 @@ describe('Dot reporter', function() { afterEach(function() { Base.useColors = useColors; Base.window.width = windowWidth; + process.stdout.write = stdoutWrite; }); describe('on start', function() { @@ -36,7 +38,7 @@ describe('Dot reporter', function() { Dot.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = ['\n']; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('on pending', function() { @@ -49,7 +51,7 @@ describe('Dot reporter', function() { Dot.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = ['\n ', Base.symbols.comma]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('if window width is equal to or less than 1', function() { @@ -58,7 +60,7 @@ describe('Dot reporter', function() { Dot.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = [Base.symbols.comma]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); @@ -79,7 +81,7 @@ describe('Dot reporter', function() { Dot.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = ['\n ', Base.symbols.dot]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); @@ -90,7 +92,7 @@ describe('Dot reporter', function() { Dot.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = [Base.symbols.dot]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('if test speed is slow', function() { @@ -100,7 +102,7 @@ describe('Dot reporter', function() { Dot.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = [Base.symbols.dot]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); @@ -120,7 +122,7 @@ describe('Dot reporter', function() { Dot.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = ['\n ', Base.symbols.bang]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('if window width is equal to or less than 1', function() { @@ -129,7 +131,7 @@ describe('Dot reporter', function() { Dot.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = [Base.symbols.bang]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); @@ -142,7 +144,7 @@ describe('Dot reporter', function() { }; Dot.call({epilogue: epilogue}, runner); process.stdout.write = stdoutWrite; - expect(epilogueCalled).to.be(true); + expect(epilogueCalled, 'to be', true); }); }); }); diff --git a/test/reporters/json-stream.spec.js b/test/reporters/json-stream.spec.js index bfd0c16b81..3c5e1831f2 100644 --- a/test/reporters/json-stream.spec.js +++ b/test/reporters/json-stream.spec.js @@ -30,11 +30,16 @@ describe('Json Stream reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + describe('on start', function() { it('should write stringified start with expected total', function() { runner = createMockRunner('start', 'start'); @@ -44,7 +49,11 @@ describe('Json Stream reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout[0]).to.eql('["start",{"total":' + expectedTotal + '}]\n'); + expect( + stdout[0], + 'to equal', + '["start",{"total":' + expectedTotal + '}]\n' + ); }); }); @@ -55,7 +64,9 @@ describe('Json Stream reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout[0]).to.eql( + expect( + stdout[0], + 'to equal', '["pass",{"title":"' + expectedTitle + '","fullTitle":"' + @@ -86,7 +97,9 @@ describe('Json Stream reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout[0]).to.eql( + expect( + stdout[0], + 'to equal', '["fail",{"title":"' + expectedTitle + '","fullTitle":"' + @@ -119,7 +132,9 @@ describe('Json Stream reporter', function() { JSONStream.call({}, runner); process.stdout.write = stdoutWrite; - expect(stdout[0]).to.eql( + expect( + stdout[0], + 'to equal', '["fail",{"title":"' + expectedTitle + '","fullTitle":"' + @@ -141,7 +156,7 @@ describe('Json Stream reporter', function() { runner = createMockRunner('end', 'end'); JSONStream.call({}, runner); process.stdout.write = stdoutWrite; - expect(stdout[0]).to.match(/end/); + expect(stdout[0], 'to match', /end/); }); }); }); diff --git a/test/reporters/json.spec.js b/test/reporters/json.spec.js index fcab2882d2..bc7406c199 100644 --- a/test/reporters/json.spec.js +++ b/test/reporters/json.spec.js @@ -29,17 +29,19 @@ describe('json reporter', function() { ); runner.run(function(failureCount) { - expect(failureCount).to.be(1); - expect(runner).to.have.property('testResults'); - expect(runner.testResults).to.have.property('failures'); - expect(runner.testResults.failures).to.be.an('array'); - expect(runner.testResults.failures).to.have.length(1); - - var failure = runner.testResults.failures[0]; - expect(failure).to.have.property('title', testTitle); - expect(failure.err.message).to.equal(error.message); - expect(failure).to.have.property('err'); - + expect(runner, 'to satisfy', { + testResults: { + failures: [ + { + title: testTitle, + err: { + message: error.message + } + } + ] + } + }); + expect(failureCount, 'to be', 1); done(); }); }); @@ -48,15 +50,16 @@ describe('json reporter', function() { suite.addTest(new Test(testTitle)); runner.run(function(failureCount) { - expect(failureCount).to.be(0); - expect(runner).to.have.property('testResults'); - expect(runner.testResults).to.have.property('pending'); - expect(runner.testResults.pending).to.be.an('array'); - expect(runner.testResults.pending).to.have.length(1); - - var pending = runner.testResults.pending[0]; - expect(pending).to.have.property('title', testTitle); - + expect(runner, 'to satisfy', { + testResults: { + pending: [ + { + title: testTitle + } + ] + } + }); + expect(failureCount, 'to be', 0); done(); }); }); @@ -76,16 +79,19 @@ describe('json reporter', function() { ); runner.run(function(failureCount) { - expect(failureCount).to.equal(1); - expect(runner).to.have.property('testResults'); - expect(runner.testResults).to.have.property('failures'); - expect(runner.testResults.failures).to.be.an(Array); - expect(runner.testResults.failures).to.have.length(1); - - var failure = runner.testResults.failures[0]; - expect(failure).to.have.property('title', testTitle); - expect(failure).to.have.property('err'); - + expect(runner, 'to satisfy', { + testResults: { + failures: [ + { + title: testTitle, + err: { + message: error.message + } + } + ] + } + }); + expect(failureCount, 'to be', 1); done(); }); }); diff --git a/test/reporters/landing.spec.js b/test/reporters/landing.spec.js index ac110e6d23..da4134ce70 100644 --- a/test/reporters/landing.spec.js +++ b/test/reporters/landing.spec.js @@ -27,8 +27,9 @@ describe('Landing reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; useColors = Base.useColors; Base.useColors = false; @@ -39,6 +40,7 @@ describe('Landing reporter', function() { afterEach(function() { Base.useColors = useColors; Base.window.width = windowWidth; + process.stdout.write = stdoutWrite; }); describe('on start', function() { @@ -50,7 +52,7 @@ describe('Landing reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout[0]).to.eql('\n\n\n '); + expect(stdout[0], 'to equal', '\n\n\n '); Base.cursor = cachedCursor; }); @@ -64,7 +66,7 @@ describe('Landing reporter', function() { Landing.call({}, runner); process.stdout.write = stdoutWrite; - expect(calledCursorHide).to.be(true); + expect(calledCursorHide, 'to be', true); Base.cursor = cachedCursor; }); @@ -82,7 +84,7 @@ describe('Landing reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('if test has not failed', function() { @@ -96,7 +98,7 @@ describe('Landing reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); @@ -120,8 +122,8 @@ describe('Landing reporter', function() { ); process.stdout.write = stdoutWrite; - expect(calledEpilogue).to.be(true); - expect(calledCursorShow).to.be(true); + expect(calledEpilogue, 'to be', true); + expect(calledCursorShow, 'to be', true); Base.cursor = cachedCursor; }); diff --git a/test/reporters/list.spec.js b/test/reporters/list.spec.js index 179e320ef5..7b9c74fb43 100644 --- a/test/reporters/list.spec.js +++ b/test/reporters/list.spec.js @@ -23,8 +23,9 @@ describe('List reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; useColors = Base.useColors; Base.useColors = false; @@ -32,6 +33,7 @@ describe('List reporter', function() { afterEach(function() { Base.useColors = useColors; + process.stdout.write = stdoutWrite; }); describe('on start and test', function() { @@ -43,7 +45,7 @@ describe('List reporter', function() { var startString = '\n'; var testString = ' ' + expectedTitle + ': '; var expectedArray = [startString, testString]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('on pending', function() { @@ -53,7 +55,7 @@ describe('List reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout[0]).to.eql(' - ' + expectedTitle + '\n'); + expect(stdout[0], 'to equal', ' - ' + expectedTitle + '\n'); }); }); describe('on pass', function() { @@ -68,7 +70,7 @@ describe('List reporter', function() { process.stdout.write = stdoutWrite; - expect(calledCursorCR).to.be(true); + expect(calledCursorCR, 'to be', true); Base.cursor = cachedCursor; }); @@ -83,7 +85,9 @@ describe('List reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout[0]).to.equal( + expect( + stdout[0], + 'to be', ' ' + expectedOkSymbol + ' ' + @@ -109,7 +113,7 @@ describe('List reporter', function() { process.stdout.write = stdoutWrite; - expect(calledCursorCR).to.be(true); + expect(calledCursorCR, 'to be', true); Base.cursor = cachedCursor; }); @@ -122,7 +126,9 @@ describe('List reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout[0]).to.equal( + expect( + stdout[0], + 'to be', ' ' + expectedErrorCount + ') ' + expectedTitle + '\n' ); @@ -147,8 +153,8 @@ describe('List reporter', function() { List.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; - expect(typeof err.actual).to.equal('string'); - expect(typeof err.expected).to.equal('string'); + expect(typeof err.actual, 'to be', 'string'); + expect(typeof err.expected, 'to be', 'string'); }); }); @@ -166,7 +172,7 @@ describe('List reporter', function() { ); process.stdout.write = stdoutWrite; - expect(calledEpilogue).to.be(true); + expect(calledEpilogue, 'to be', true); }); }); }); diff --git a/test/reporters/markdown.spec.js b/test/reporters/markdown.spec.js index 4303ef2aaf..f6fc63f119 100644 --- a/test/reporters/markdown.spec.js +++ b/test/reporters/markdown.spec.js @@ -16,11 +16,16 @@ describe('Markdown reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + describe("on 'suite'", function() { it("should write expected slugged titles on 'end' event", function() { var expectedSuite = { @@ -63,7 +68,7 @@ describe('Markdown reporter', function() { '\n ' + expectedTitle + '\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe("on 'pass'", function() { @@ -101,7 +106,7 @@ describe('Markdown reporter', function() { expectedTitle + '.\n\n```js\n' + expectedBody + '\n```\n\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); diff --git a/test/reporters/min.spec.js b/test/reporters/min.spec.js index 129a3b35d6..30b05126ec 100644 --- a/test/reporters/min.spec.js +++ b/test/reporters/min.spec.js @@ -13,11 +13,16 @@ describe('Min reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + describe('on start', function() { it('should clear screen then set cursor position', function() { runner = createMockRunner('start', 'start'); @@ -25,7 +30,7 @@ describe('Min reporter', function() { process.stdout.write = stdoutWrite; var expectedArray = ['\u001b[2J', '\u001b[1;3H']; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); @@ -43,7 +48,7 @@ describe('Min reporter', function() { ); process.stdout.write = stdoutWrite; - expect(calledEpilogue).to.be(true); + expect(calledEpilogue, 'to be', true); }); }); }); diff --git a/test/reporters/nyan.spec.js b/test/reporters/nyan.spec.js index 633a2ce4f8..1296ab1195 100644 --- a/test/reporters/nyan.spec.js +++ b/test/reporters/nyan.spec.js @@ -16,11 +16,16 @@ describe('Nyan reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + describe('on start', function() { it('should call draw', function() { calledDraw = false; @@ -36,7 +41,7 @@ describe('Nyan reporter', function() { ); process.stdout.write = stdoutWrite; - expect(calledDraw).to.be(true); + expect(calledDraw, 'to be', true); }); }); describe('on pending', function() { @@ -54,7 +59,7 @@ describe('Nyan reporter', function() { ); process.stdout.write = stdoutWrite; - expect(calledDraw).to.be(true); + expect(calledDraw, 'to be', true); }); }); describe('on pass', function() { @@ -76,7 +81,7 @@ describe('Nyan reporter', function() { ); process.stdout.write = stdoutWrite; - expect(calledDraw).to.be(true); + expect(calledDraw, 'to be', true); }); }); describe('on fail', function() { @@ -97,7 +102,7 @@ describe('Nyan reporter', function() { ); process.stdout.write = stdoutWrite; - expect(calledDraw).to.be(true); + expect(calledDraw, 'to be', true); }); }); describe('on end', function() { @@ -116,7 +121,7 @@ describe('Nyan reporter', function() { ); process.stdout.write = stdoutWrite; - expect(calledEpilogue).to.be(true); + expect(calledEpilogue, 'to be', true); }); it('should write numberOfLines amount of new lines', function() { var expectedNumberOfLines = 4; @@ -135,7 +140,7 @@ describe('Nyan reporter', function() { }); process.stdout.write = stdoutWrite; - expect(arrayOfNewlines).to.have.length(expectedNumberOfLines); + expect(arrayOfNewlines, 'to have length', expectedNumberOfLines); }); it('should call Base show', function() { var showCalled = false; @@ -154,7 +159,7 @@ describe('Nyan reporter', function() { ); process.stdout.write = stdoutWrite; - expect(showCalled).to.be(true); + expect(showCalled, 'to be', true); Base.cursor.show = cachedShow; }); }); @@ -167,11 +172,15 @@ describe('Nyan reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + describe('if tick is false', function() { it('should draw face with expected spaces, _ and ^', function() { var nyanCat = new NyanCat({on: function() {}, once: function() {}}); @@ -205,7 +214,7 @@ describe('Nyan reporter', function() { ' "" "" ', '\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('if tick is true', function() { @@ -226,7 +235,7 @@ describe('Nyan reporter', function() { cursorUp: function() {} }); - process.stdout.write = stdoutWrite; + // process.stdout.write = stdoutWrite; var expectedArray = [ '\u001b[0C', '_,------,', @@ -241,7 +250,7 @@ describe('Nyan reporter', function() { ' "" "" ', '\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); @@ -258,6 +267,10 @@ describe('Nyan reporter', function() { }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + it('should write cursor down interaction with expected number', function() { var nyanCat = new NyanCat({on: function() {}, once: function() {}}); var expectedNumber = 25; @@ -265,7 +278,7 @@ describe('Nyan reporter', function() { nyanCat.cursorDown(expectedNumber); process.stdout.write = stdoutWrite; var expectedArray = ['\u001b[' + expectedNumber + 'B']; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); @@ -276,11 +289,15 @@ describe('Nyan reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + it('should write cursor up interaction with expected number', function() { var nyanCat = new NyanCat({on: function() {}, once: function() {}}); var expectedNumber = 25; @@ -288,7 +305,7 @@ describe('Nyan reporter', function() { nyanCat.cursorUp(expectedNumber); process.stdout.write = stdoutWrite; var expectedArray = ['\u001b[' + expectedNumber + 'A']; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); @@ -310,7 +327,7 @@ describe('Nyan reporter', function() { var expectedString = 'hello'; var outputString = nyanCat.rainbowify(expectedString); - expect(outputString).to.equal(expectedString); + expect(outputString, 'to be', expectedString); }); }); describe('useColors is true', function() { @@ -340,7 +357,7 @@ describe('Nyan reporter', function() { expectedString ); - expect(outputString).to.equal(expectedRainbowifyString); + expect(outputString, 'to be', expectedRainbowifyString); }); }); }); @@ -362,7 +379,7 @@ describe('Nyan reporter', function() { trajectories: trajectories }); - expect(expectedSegment).to.equal('_'); + expect(expectedSegment, 'to be', '_'); }); it('should shift each trajectory item, if its length is greater of equal to its max width', function() { var nyanCat = new NyanCat({on: function() {}, once: function() {}}); @@ -387,7 +404,7 @@ describe('Nyan reporter', function() { trajectories: trajectories }); - expect(trajectories).to.eql(expectedTrajectories); + expect(trajectories, 'to equal', expectedTrajectories); }); }); describe('if tick is false', function() { @@ -406,23 +423,35 @@ describe('Nyan reporter', function() { trajectories: trajectories }); - expect(expectedSegment).to.eql('-'); + expect(expectedSegment, 'to equal', '-'); }); }); }); describe('drawScoreboard', function() { - it('should write scoreboard with color set with each stat', function() { - var cachedColor = Base.color; + var stdoutWrite; + var stdout; + var cachedColor; + + beforeEach(function() { + stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function(string, enc, callback) { + stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); + }; + cachedColor = Base.color; Base.color = function(type, n) { return type + n; }; - var stdout = []; - var stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { - stdout.push(string); - }; + }); + afterEach(function() { + process.stdout.write = stdoutWrite; + Base.color = cachedColor; + }); + + it('should write scoreboard with color set with each stat', function() { var passes = 2; var pending = 1; var failures = 1; @@ -444,16 +473,10 @@ describe('Nyan reporter', function() { '\n', '\n' ]; - expect(stdout).to.eql(expectedArray); - process.stdout.write = stdoutWrite; - Base.color = cachedColor; + expect(stdout, 'to equal', expectedArray); }); + it('should call cursorUp with given numberOfLines', function() { - var stdout = []; - var stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { - stdout.push(string); - }; var expectedCursorArgument = null; var expectedNumberOfLines = 1000; @@ -466,18 +489,28 @@ describe('Nyan reporter', function() { numberOfLines: expectedNumberOfLines }); - expect(expectedCursorArgument).to.equal(expectedNumberOfLines); - process.stdout.write = stdoutWrite; + expect(expectedCursorArgument, 'to be', expectedNumberOfLines); }); }); describe('drawRainbow', function() { - it('should write width, contents and newline for each trajectory', function() { - var stdout = []; - var stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + var stdoutWrite; + var stdout; + + beforeEach(function() { + stdout = []; + stdoutWrite = process.stdout.write; + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; + }); + + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + + it('should write width, contents and newline for each trajectory', function() { var expectedWidth = 444; var expectedContents = 'input'; @@ -497,15 +530,10 @@ describe('Nyan reporter', function() { expectedContents, '\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); it('should call cursorUp with given numberOfLines', function() { - var stdout = []; - var stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { - stdout.push(string); - }; var expectedCursorArgument = null; var expectedNumberOfLines = 1000; @@ -519,33 +547,32 @@ describe('Nyan reporter', function() { numberOfLines: expectedNumberOfLines }); - expect(expectedCursorArgument).to.equal(expectedNumberOfLines); - process.stdout.write = stdoutWrite; + expect(expectedCursorArgument, 'to be', expectedNumberOfLines); }); }); describe('face', function() { it('expected face:(x .x) when "failures" at least one', function() { var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 2, pending: 1, failures: 1}; - expect(nyanCat.face()).to.equal('( x .x)'); + expect(nyanCat.face(), 'to be', '( x .x)'); }); it('expected face:(x .x) when "pending" at least one and no failing', function() { var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 2, pending: 1, failures: 0}; - expect(nyanCat.face()).to.equal('( o .o)'); + expect(nyanCat.face(), 'to be', '( o .o)'); }); it('expected face:(^ .^) when "passing" only', function() { var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 1, pending: 0, failures: 0}; - expect(nyanCat.face()).to.equal('( ^ .^)'); + expect(nyanCat.face(), 'to be', '( ^ .^)'); }); it('expected face:(- .-) when otherwise', function(done) { var nyanCat = new NyanCat({on: function() {}, once: function() {}}); nyanCat.stats = {passes: 0, pending: 0, failures: 0}; - expect(nyanCat.face()).to.equal('( - .-)'); + expect(nyanCat.face(), 'to be', '( - .-)'); done(); }); }); diff --git a/test/reporters/progress.spec.js b/test/reporters/progress.spec.js index 1cca6e58d2..ef08ea5582 100644 --- a/test/reporters/progress.spec.js +++ b/test/reporters/progress.spec.js @@ -14,11 +14,16 @@ describe('Progress reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + describe('on start', function() { it('should call cursor hide', function() { var cachedCursor = Base.cursor; @@ -30,7 +35,7 @@ describe('Progress reporter', function() { Progress.call({}, runner); process.stdout.write = stdoutWrite; - expect(calledCursorHide).to.be(true); + expect(calledCursorHide, 'to be', true); Base.cursor = cachedCursor; }); @@ -54,7 +59,7 @@ describe('Progress reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout).to.eql([]); + expect(stdout, 'to equal', []); Base.cursor = cachedCursor; Base.useColors = useColors; @@ -98,8 +103,8 @@ describe('Progress reporter', function() { expectedIncomplete, expectedClose ]; - expect(calledCursorCR).to.be(true); - expect(stdout).to.eql(expectedArray); + expect(calledCursorCR, 'to be', true); + expect(stdout, 'to equal', expectedArray); Base.cursor = cachedCursor; Base.useColors = useColors; @@ -127,8 +132,8 @@ describe('Progress reporter', function() { ); process.stdout.write = stdoutWrite; - expect(calledEpilogue).to.be(true); - expect(calledCursorShow).to.be(true); + expect(calledEpilogue, 'to be', true); + expect(calledCursorShow, 'to be', true); Base.cursor = cachedCursor; }); diff --git a/test/reporters/spec.spec.js b/test/reporters/spec.spec.js index da929fb16a..2f4eee33e5 100644 --- a/test/reporters/spec.spec.js +++ b/test/reporters/spec.spec.js @@ -16,8 +16,9 @@ describe('Spec reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; useColors = Base.useColors; Base.useColors = false; @@ -25,6 +26,7 @@ describe('Spec reporter', function() { afterEach(function() { Base.useColors = useColors; + process.stdout.write = stdoutWrite; }); describe('on suite', function() { @@ -36,7 +38,7 @@ describe('Spec reporter', function() { Spec.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = [expectedTitle + '\n']; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('on pending', function() { @@ -48,7 +50,7 @@ describe('Spec reporter', function() { Spec.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = [' - ' + expectedTitle + '\n']; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('on pass', function() { @@ -74,7 +76,7 @@ describe('Spec reporter', function() { expectedDuration + 'ms)' + '\n'; - expect(stdout[0]).to.equal(expectedString); + expect(stdout[0], 'to be', expectedString); }); }); describe('if test speed is fast', function() { @@ -92,7 +94,7 @@ describe('Spec reporter', function() { process.stdout.write = stdoutWrite; var expectedString = ' ' + Base.symbols.ok + ' ' + expectedTitle + '\n'; - expect(stdout[0]).to.equal(expectedString); + expect(stdout[0], 'to be', expectedString); }); }); }); @@ -106,7 +108,7 @@ describe('Spec reporter', function() { Spec.call({epilogue: function() {}}, runner); process.stdout.write = stdoutWrite; var expectedArray = [' ' + functionCount + ') ' + expectedTitle + '\n']; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); diff --git a/test/reporters/tap.spec.js b/test/reporters/tap.spec.js index 09577838be..29463ea656 100644 --- a/test/reporters/tap.spec.js +++ b/test/reporters/tap.spec.js @@ -16,8 +16,9 @@ describe('TAP reporter', function() { beforeEach(function() { stdout = []; stdoutWrite = process.stdout.write; - process.stdout.write = function(string) { + process.stdout.write = function(string, enc, callback) { stdout.push(string); + stdoutWrite.call(process.stdout, string, enc, callback); }; test = { fullTitle: function() { @@ -27,6 +28,10 @@ describe('TAP reporter', function() { }; }); + afterEach(function() { + process.stdout.write = stdoutWrite; + }); + describe('on start', function() { it('should hand runners suite into grepTotal and log the total', function() { var expectedSuite = 'some suite'; @@ -43,8 +48,8 @@ describe('TAP reporter', function() { var expectedArray = ['1..' + expectedTotal + '\n']; process.stdout.write = stdoutWrite; - expect(stdout).to.eql(expectedArray); - expect(expectedString).to.equal(expectedSuite); + expect(stdout, 'to equal', expectedArray); + expect(expectedString, 'to be', expectedSuite); }); }); @@ -65,7 +70,7 @@ describe('TAP reporter', function() { var expectedMessage = 'ok ' + countAfterTestEnd + ' ' + expectedTitle + ' # SKIP -\n'; - expect(stdout[0]).to.eql(expectedMessage); + expect(stdout[0], 'to equal', expectedMessage); }); }); @@ -81,7 +86,7 @@ describe('TAP reporter', function() { var expectedMessage = 'ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n'; - expect(stdout[0]).to.eql(expectedMessage); + expect(stdout[0], 'to equal', expectedMessage); }); }); @@ -110,7 +115,7 @@ describe('TAP reporter', function() { 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n', ' ' + expectedStack + '\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); describe('if there is no error stack', function() { @@ -133,7 +138,7 @@ describe('TAP reporter', function() { var expectedArray = [ 'not ok ' + countAfterTestEnd + ' ' + expectedTitle + '\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); @@ -157,7 +162,7 @@ describe('TAP reporter', function() { '# pass ' + numberOfPasses + '\n', '# fail ' + numberOfFails + '\n' ]; - expect(stdout).to.eql(expectedArray); + expect(stdout, 'to equal', expectedArray); }); }); }); diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index 18a43cb882..8108c50b78 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -39,9 +39,7 @@ describe('XUnit reporter', function() { fs.createWriteStream = false; var boundXUnit = XUnit.bind({}, runner, options); - expect(boundXUnit).to.throwException( - 'file output not supported in browser' - ); + expect(boundXUnit, 'to throw', 'file output not supported in browser'); fs.createWriteStream = fsCreateWriteStream; }); }); @@ -66,8 +64,8 @@ describe('XUnit reporter', function() { }; XUnit.call(contextVariables, runner, options); - expect(expectedDirectory).to.equal(expectedOutput); - expect(contextVariables.fileStream).to.equal(expectedOutput); + expect(expectedDirectory, 'to be', expectedOutput); + expect(contextVariables.fileStream, 'to be', expectedOutput); fs.createWriteStream = fsCreateWriteStream; mkdirp.sync = mkdirpSync; @@ -117,7 +115,7 @@ describe('XUnit reporter', function() { ); var expectedCalledTests = [pendingTest, passTest, failTest]; - expect(calledTests).to.eql(expectedCalledTests); + expect(calledTests, 'to equal', expectedCalledTests); }); }); @@ -137,8 +135,8 @@ describe('XUnit reporter', function() { }; xunit.done.call({fileStream: fileStream}, expectedFailure, callback); - expect(calledEnd).to.be(true); - expect(callbackArgument).to.equal(expectedFailure); + expect(calledEnd, 'to be', true); + expect(callbackArgument, 'to be', expectedFailure); }); }); describe('if fileStream is falsy', function() { @@ -149,7 +147,7 @@ describe('XUnit reporter', function() { }; xunit.done.call({fileStream: false}, expectedFailure, callback); - expect(callbackArgument).to.equal(expectedFailure); + expect(callbackArgument, 'to be', expectedFailure); }); }); }); @@ -165,7 +163,7 @@ describe('XUnit reporter', function() { }; xunit.write.call({fileStream: fileStream}, expectedLine); - expect(expectedWrite).to.equal(expectedLine + '\n'); + expect(expectedWrite, 'to be', expectedLine + '\n'); }); }); describe('if fileStream is falsy and stdout exists', function() { @@ -180,7 +178,7 @@ describe('XUnit reporter', function() { process.stdout.write = stdoutWrite; - expect(stdout[0]).to.equal(expectedLine + '\n'); + expect(stdout[0], 'to be', expectedLine + '\n'); }); }); describe('if fileStream is falsy and stdout does not exist', function() { @@ -197,7 +195,7 @@ describe('XUnit reporter', function() { console.log = cachedConsoleLog; process = stdoutWrite; // eslint-disable-line no-native-reassign, no-global-assign - expect(stdout[0]).to.equal(expectedLine); + expect(stdout[0], 'to be', expectedLine); }); }); }); @@ -240,7 +238,7 @@ describe('XUnit reporter', function() { expectedStack + ''; - expect(expectedWrite).to.equal(expectedTag); + expect(expectedWrite, 'to be', expectedTag); }); }); describe('on test pending', function() { @@ -275,7 +273,7 @@ describe('XUnit reporter', function() { expectedTitle + '" time="1">'; - expect(expectedWrite).to.equal(expectedTag); + expect(expectedWrite, 'to be', expectedTag); }); }); describe('on test in any other state', function() { @@ -310,7 +308,7 @@ describe('XUnit reporter', function() { expectedTitle + '" time="0"/>'; - expect(expectedWrite).to.equal(expectedTag); + expect(expectedWrite, 'to be', expectedTag); }); }); }); diff --git a/test/require/require.spec.js b/test/require/require.spec.js index 8622c45e18..b5fbca95af 100644 --- a/test/require/require.spec.js +++ b/test/require/require.spec.js @@ -3,9 +3,9 @@ describe('require test', function() { it('should require args in order', function() { var req = global.required; - expect(req.indexOf('a.js')).to.equal(0); - expect(req.indexOf('b.coffee')).to.equal(1); - expect(req.indexOf('c.js')).to.equal(2); - expect(req.indexOf('d.coffee')).to.equal(3); + expect(req.indexOf('a.js'), 'to be', 0); + expect(req.indexOf('b.coffee'), 'to be', 1); + expect(req.indexOf('c.js'), 'to be', 2); + expect(req.indexOf('d.coffee'), 'to be', 3); }); }); diff --git a/test/setup.js b/test/setup.js index 0ffe34c7e5..510bf907a1 100644 --- a/test/setup.js +++ b/test/setup.js @@ -1,4 +1,6 @@ 'use strict'; -global.expect = require('expect.js'); -global.assert = require('assert'); +var unexpected = require('unexpected'); +global.expect = require('./assertions').mixinMochaAssertions( + unexpected.clone() +); diff --git a/test/unit/context.spec.js b/test/unit/context.spec.js index 78cdc28f23..209a5edb13 100644 --- a/test/unit/context.spec.js +++ b/test/unit/context.spec.js @@ -11,18 +11,23 @@ describe('Context', function() { }); it('should work', function() { - expect(this.calls).to.eql(['before', 'before two']); + expect(this.calls, 'to equal', ['before', 'before two']); this.calls.push('test'); }); after(function() { - expect(this.calls).to.eql(['before', 'before two', 'test']); + expect(this.calls, 'to equal', ['before', 'before two', 'test']); this.calls.push('after two'); }); }); after(function() { - expect(this.calls).to.eql(['before', 'before two', 'test', 'after two']); + expect(this.calls, 'to equal', [ + 'before', + 'before two', + 'test', + 'after two' + ]); }); }); @@ -38,7 +43,7 @@ describe('Context Siblings', function() { }); it('should work', function() { - expect(this.hiddenFromSibling).to.eql('This should be hidden'); + expect(this.hiddenFromSibling, 'to equal', 'This should be hidden'); }); }); @@ -48,46 +53,50 @@ describe('Context Siblings', function() { }); it('should not have value set within a sibling describe', function() { - expect('This should be hidden').not.to.eql(this.hiddenFromSibling); + expect('This should be hidden', 'not to equal', this.hiddenFromSibling); this.visibleFromTestSibling = 'Visible from test sibling'; }); it('should allow test siblings to modify shared context', function() { - expect('Visible from test sibling').to.eql(this.visibleFromTestSibling); + expect( + 'Visible from test sibling', + 'to equal', + this.visibleFromTestSibling + ); }); it('should have reset this.calls before describe', function() { - expect(this.calls).to.eql(['before', 'before sibling']); + expect(this.calls, 'to equal', ['before', 'before sibling']); }); }); after(function() { - expect(this.calls).to.eql(['before', 'before sibling']); + expect(this.calls, 'to equal', ['before', 'before sibling']); }); }); describe('methods', function() { describe('timeout()', function() { it('should return the timeout', function() { - expect(this.timeout()).to.equal(200); + expect(this.timeout(), 'to be', 200); }); }); describe('slow()', function() { it('should return the slow', function() { - expect(this.slow()).to.equal(75); + expect(this.slow(), 'to be', 75); }); }); describe('enableTimeouts()', function() { it('should return the enableTimeouts', function() { - expect(this.enableTimeouts()).to.equal(true); + expect(this.enableTimeouts(), 'to be', true); }); }); describe('retries', function() { it('should return the number of retries', function() { - expect(this.retries()).to.equal(-1); + expect(this.retries(), 'to be', -1); }); }); }); diff --git a/test/unit/grep.spec.js b/test/unit/grep.spec.js index 25e4fe9709..0b65dbbeef 100644 --- a/test/unit/grep.spec.js +++ b/test/unit/grep.spec.js @@ -6,19 +6,19 @@ describe('Mocha', function() { describe('"grep" option', function() { it('should add a RegExp to the mocha.options object', function() { var mocha = new Mocha({grep: /foo.*/}); - expect(mocha.options.grep.toString()).to.equal('/foo.*/'); + expect(mocha.options.grep, 'to equal', /foo.*/); }); it('should convert string to a RegExp', function() { var mocha = new Mocha({grep: 'foo.*'}); - expect(mocha.options.grep.toString()).to.equal('/foo.*/'); + expect(mocha.options.grep, 'to equal', /foo.*/); }); }); describe('"fgrep" option', function() { it('should escape and convert string to a RegExp', function() { var mocha = new Mocha({fgrep: 'foo.*'}); - expect(mocha.options.grep.toString()).to.equal('/foo\\.\\*/'); + expect(mocha.options.grep, 'to equal', /foo\.\*/); }); }); @@ -27,7 +27,7 @@ describe('Mocha', function() { function testGrep(mocha) { return function testGrep(grep, expected) { mocha.grep(grep); - expect(mocha.options.grep.toString()).to.equal(expected); + expect(String(mocha.options.grep), 'to be', expected); }; } @@ -52,9 +52,9 @@ describe('Mocha', function() { test('/^foo(.*)bar/g', '/^foo(.*)bar/g'); }); - it("should return it's parent Mocha object for chainability", function() { + it('should return its parent Mocha object for chainability', function() { var mocha = new Mocha(); - expect(mocha.grep()).to.equal(mocha); + expect(mocha.grep(), 'to be', mocha); }); }); diff --git a/test/unit/hook-async.spec.js b/test/unit/hook-async.spec.js index e741b53715..fc7d2b0245 100644 --- a/test/unit/hook-async.spec.js +++ b/test/unit/hook-async.spec.js @@ -9,7 +9,7 @@ describe('async', function() { after(function() { calls.push('root after all'); - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'root before all', 'before all', 'parent before', @@ -67,7 +67,7 @@ describe('async', function() { }); it('one', function(done) { - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'root before all', 'before all', 'parent before', @@ -79,7 +79,7 @@ describe('async', function() { }); it('two', function() { - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'root before all', 'before all', 'parent before', @@ -97,7 +97,7 @@ describe('async', function() { }); it('three', function() { - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'root before all', 'before all', 'parent before', diff --git a/test/unit/hook-sync-nested.spec.js b/test/unit/hook-sync-nested.spec.js index 05e9701ab7..b3cef8340c 100644 --- a/test/unit/hook-sync-nested.spec.js +++ b/test/unit/hook-sync-nested.spec.js @@ -24,12 +24,12 @@ describe('serial', function() { }); it('foo', function() { - expect(calls).to.eql(['parent before', 'parent before test foo']); + expect(calls, 'to equal', ['parent before', 'parent before test foo']); calls.push('foo'); }); it('bar', function() { - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'parent before', 'parent before test foo', 'foo', @@ -49,7 +49,7 @@ describe('serial', function() { }); it('one', function() { - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'parent before', 'parent before test foo', 'foo', @@ -68,7 +68,7 @@ describe('serial', function() { }); it('two', function() { - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'parent before', 'parent before test foo', 'foo', diff --git a/test/unit/hook-sync.spec.js b/test/unit/hook-sync.spec.js index d7a7529681..77e0e23e71 100644 --- a/test/unit/hook-sync.spec.js +++ b/test/unit/hook-sync.spec.js @@ -20,12 +20,12 @@ describe('serial', function() { }); it('one', function() { - expect(calls).to.eql(['parent before', 'before', 'before test one']); + expect(calls, 'to equal', ['parent before', 'before', 'before test one']); calls.push('one'); }); it('two', function() { - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'parent before', 'before', 'before test one', @@ -41,7 +41,7 @@ describe('serial', function() { }); it('three', function() { - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'parent before', 'before', 'before test one', @@ -73,7 +73,7 @@ describe('serial', function() { }); after(function() { - expect(calls).to.eql([ + expect(calls, 'to equal', [ 'parent before', 'before', 'before test one', diff --git a/test/unit/mocha.spec.js b/test/unit/mocha.spec.js index dc49c65081..3f7145834c 100644 --- a/test/unit/mocha.spec.js +++ b/test/unit/mocha.spec.js @@ -29,7 +29,7 @@ describe('Mocha', function() { }); mocha.suite.addTest(failingTest); mocha.run(function(failures) { - expect(failures).to.equal(1); + expect(failures, 'to be', 1); done(); }); } @@ -40,8 +40,8 @@ describe('Mocha', function() { it('should add the given file to the files array', function() { var mocha = new Mocha(blankOpts); mocha.addFile('myFile.js'); - expect(mocha.files.length).to.equal(1); - expect(mocha.files[0]).to.equal('myFile.js'); + expect(mocha.files.length, 'to be', 1); + expect(mocha.files[0], 'to be', 'myFile.js'); }); }); @@ -49,12 +49,12 @@ describe('Mocha', function() { it('should set the invert option to true', function() { var mocha = new Mocha(blankOpts); mocha.invert(); - expect(mocha.options.invert).to.equal(true); + expect(mocha.options.invert, 'to be', true); }); it('should be chainable', function() { var mocha = new Mocha(blankOpts); - expect(mocha.invert()).to.equal(mocha); + expect(mocha.invert(), 'to be', mocha); }); }); @@ -62,24 +62,24 @@ describe('Mocha', function() { it('should set the ignoreLeaks option to true when param equals true', function() { var mocha = new Mocha(blankOpts); mocha.ignoreLeaks(true); - expect(mocha.options.ignoreLeaks).to.equal(true); + expect(mocha.options.ignoreLeaks, 'to be', true); }); it('should set the ignoreLeaks option to false when param equals false', function() { var mocha = new Mocha(blankOpts); mocha.ignoreLeaks(false); - expect(mocha.options.ignoreLeaks).to.equal(false); + expect(mocha.options.ignoreLeaks, 'to be', false); }); it('should set the ignoreLeaks option to false when the param is undefined', function() { var mocha = new Mocha(blankOpts); mocha.ignoreLeaks(); - expect(mocha.options.ignoreLeaks).to.equal(false); + expect(mocha.options.ignoreLeaks, 'to be', false); }); it('should be chainable', function() { var mocha = new Mocha(blankOpts); - expect(mocha.ignoreLeaks(false)).to.equal(mocha); + expect(mocha.ignoreLeaks(false), 'to be', mocha); }); }); @@ -87,12 +87,12 @@ describe('Mocha', function() { it('should set the ignoreLeaks option to false', function() { var mocha = new Mocha(blankOpts); mocha.checkLeaks(); - expect(mocha.options.ignoreLeaks).to.equal(false); + expect(mocha.options.ignoreLeaks, 'to be', false); }); it('should be chainable', function() { var mocha = new Mocha(blankOpts); - expect(mocha.checkLeaks()).to.equal(mocha); + expect(mocha.checkLeaks(), 'to be', mocha); }); }); @@ -100,12 +100,12 @@ describe('Mocha', function() { it('should set the fullStackTrace option to true', function() { var mocha = new Mocha(blankOpts); mocha.fullTrace(); - expect(mocha.options.fullStackTrace).to.equal(true); + expect(mocha.options.fullStackTrace, 'to be', true); }); it('should be chainable', function() { var mocha = new Mocha(blankOpts); - expect(mocha.fullTrace()).to.equal(mocha); + expect(mocha.fullTrace(), 'to be', mocha); }); }); @@ -113,12 +113,12 @@ describe('Mocha', function() { it('should set the growl option to true', function() { var mocha = new Mocha(blankOpts); mocha.growl(); - expect(mocha.options.growl).to.equal(true); + expect(mocha.options.growl, 'to be', true); }); it('should be chainable', function() { var mocha = new Mocha(blankOpts); - expect(mocha.growl()).to.equal(mocha); + expect(mocha.growl(), 'to be', mocha); }); }); @@ -126,24 +126,24 @@ describe('Mocha', function() { it('should set the useInlineDiffs option to true when param equals true', function() { var mocha = new Mocha(blankOpts); mocha.useInlineDiffs(true); - expect(mocha.options.useInlineDiffs).to.equal(true); + expect(mocha.options.useInlineDiffs, 'to be', true); }); it('should set the useInlineDiffs option to false when param equals false', function() { var mocha = new Mocha(blankOpts); mocha.useInlineDiffs(false); - expect(mocha.options.useInlineDiffs).to.equal(false); + expect(mocha.options.useInlineDiffs, 'to be', false); }); it('should set the useInlineDiffs option to false when the param is undefined', function() { var mocha = new Mocha(blankOpts); mocha.useInlineDiffs(); - expect(mocha.options.useInlineDiffs).to.equal(false); + expect(mocha.options.useInlineDiffs, 'to be', false); }); it('should be chainable', function() { var mocha = new Mocha(blankOpts); - expect(mocha.useInlineDiffs()).to.equal(mocha); + expect(mocha.useInlineDiffs(), 'to be', mocha); }); }); @@ -151,7 +151,7 @@ describe('Mocha', function() { it('should set the noHighlighting option to true', function() { var mocha = new Mocha(blankOpts); mocha.noHighlighting(); - expect(mocha.options.noHighlighting).to.equal(true); + expect(mocha.options.noHighlighting, 'to be', true); }); }); @@ -159,7 +159,7 @@ describe('Mocha', function() { it('should set the allowUncaught option to true', function() { var mocha = new Mocha(blankOpts); mocha.allowUncaught(); - expect(mocha.options.allowUncaught).to.equal(true); + expect(mocha.options.allowUncaught, 'to be', true); }); }); @@ -167,16 +167,16 @@ describe('Mocha', function() { it('should set the delay option to true', function() { var mocha = new Mocha(blankOpts); mocha.delay(); - expect(mocha.options.delay).to.equal(true); + expect(mocha.options.delay, 'to be', true); }); }); describe('.bail()', function() { it('should set the suite._bail to true if there is no arguments', function() { var mocha = new Mocha({bail: false}); - expect(mocha.suite._bail).to.equal(false); + expect(mocha.suite._bail, 'to be', false); mocha.bail(); - expect(mocha.suite._bail).to.equal(true); + expect(mocha.suite._bail, 'to be', true); }); }); }); diff --git a/test/unit/ms.spec.js b/test/unit/ms.spec.js index 7cef3ce696..3f03760509 100644 --- a/test/unit/ms.spec.js +++ b/test/unit/ms.spec.js @@ -19,51 +19,51 @@ describe('.ms()', function() { }; describe('get a value that less than 1 second', function() { it('should return milliseconds representation', function() { - expect(ms(200)).to.equal('200ms'); - expect(ms(30)).to.equal('30ms'); - expect(ms(2000)).to.not.equal('2000ms'); + expect(ms(200), 'to be', '200ms'); + expect(ms(30), 'to be', '30ms'); + expect(ms(2000), 'not to be', '2000ms'); }); }); describe('seconds representation', function() { it('should return short format', function() { - expect(ms(2000)).to.equal('2s'); + expect(ms(2000), 'to be', '2s'); }); }); describe('minutes representation', function() { it('should return short format', function() { - expect(ms(time.minutes(1))).to.equal('1m'); + expect(ms(time.minutes(1)), 'to be', '1m'); }); }); describe('hours representation', function() { it('should return short format', function() { - expect(ms(time.hours(1))).to.equal('1h'); + expect(ms(time.hours(1)), 'to be', '1h'); }); }); describe('days representation', function() { it('should return short format', function() { - expect(ms(time.days(1))).to.equal('1d'); + expect(ms(time.days(1)), 'to be', '1d'); }); }); describe('Getting string value', function() { it('should return the milliseconds representation(Number)', function() { - expect(ms('1 second')).to.equal(1000); + expect(ms('1 second'), 'to be', 1000); - expect(ms('1 minute')).to.equal(time.minutes(1)); - expect(ms('6 minutes')).to.equal(time.minutes(6)); + expect(ms('1 minute'), 'to be', time.minutes(1)); + expect(ms('6 minutes'), 'to be', time.minutes(6)); - expect(ms('1 hour')).to.equal(time.hours(1)); - expect(ms('5 hours')).to.equal(time.hours(5)); + expect(ms('1 hour'), 'to be', time.hours(1)); + expect(ms('5 hours'), 'to be', time.hours(5)); - expect(ms('1 day')).to.equal(time.days(1)); - expect(ms('3 days')).to.equal(time.days(3)); + expect(ms('1 day'), 'to be', time.days(1)); + expect(ms('3 days'), 'to be', time.days(3)); - expect(ms('1 year')).to.equal(time.years(1)); - expect(ms('2 years')).to.equal(time.years(2)); + expect(ms('1 year'), 'to be', time.years(1)); + expect(ms('2 years'), 'to be', time.years(2)); }); }); }); diff --git a/test/unit/root.spec.js b/test/unit/root.spec.js index 9ad6eb0828..00040e5c32 100644 --- a/test/unit/root.spec.js +++ b/test/unit/root.spec.js @@ -8,6 +8,6 @@ before(function() { describe('root', function() { it('should be a valid suite', function() { - expect(calls).to.eql(['before']); + expect(calls, 'to equal', ['before']); }); }); diff --git a/test/unit/runnable.spec.js b/test/unit/runnable.spec.js index 90312e5110..9ea00b6d07 100644 --- a/test/unit/runnable.spec.js +++ b/test/unit/runnable.spec.js @@ -5,6 +5,19 @@ var utils = mocha.utils; var Runnable = mocha.Runnable; var Suite = mocha.Suite; +/** + * Custom assert function. + * Because of the below "poison pill", we cannot trust third-party code + * including assertion libraries, not to call the global functions we're + * poisoning--so we must make our own assertions. + * @param {*} expr - Throws if false + */ +function assert(expr) { + if (!expr) { + throw new Error('assertion failure'); + } +} + describe('Runnable(title, fn)', function() { // For every test we poison the global time-related methods. // runnable.js etc. should keep its own local copy, in order to fix GH-237. @@ -36,7 +49,7 @@ describe('Runnable(title, fn)', function() { it('should set the timeout', function() { var run = new Runnable(); run.timeout(1000); - expect(run.timeout()).to.equal(1000); + assert(run.timeout() === 1000); }); }); @@ -44,7 +57,7 @@ describe('Runnable(title, fn)', function() { it('should set disabled', function() { var run = new Runnable(); run.timeout(1e10); - expect(run.enableTimeouts()).to.equal(false); + assert(run.enableTimeouts() === false); }); }); @@ -52,7 +65,7 @@ describe('Runnable(title, fn)', function() { it('should set enabled', function() { var run = new Runnable(); run.enableTimeouts(false); - expect(run.enableTimeouts()).to.equal(false); + assert(run.enableTimeouts() === false); }); }); @@ -65,23 +78,23 @@ describe('Runnable(title, fn)', function() { it('should set the slow threshold', function() { run.slow(100); - expect(run.slow()).to.equal(100); + assert(run.slow() === 100); }); it('should not set the slow threshold if the parameter is not passed', function() { run.slow(); - expect(run.slow()).to.equal(75); + assert(run.slow() === 75); }); it('should not set the slow threshold if the parameter is undefined', function() { run.slow(undefined); - expect(run.slow()).to.equal(75); + assert(run.slow() === 75); }); }); describe('.title', function() { it('should be present', function() { - expect(new Runnable('foo').title).to.equal('foo'); + assert(new Runnable('foo').title === 'foo'); }); }); @@ -89,31 +102,33 @@ describe('Runnable(title, fn)', function() { it("returns the concatenation of the parent's title path and runnable's title", function() { var runnable = new Runnable('bar'); runnable.parent = new Suite('foo'); - expect(runnable.titlePath()).to.eql(['foo', 'bar']); + assert( + JSON.stringify(runnable.titlePath()) === JSON.stringify(['foo', 'bar']) + ); }); }); describe('when arity >= 1', function() { it('should be .async', function() { var run = new Runnable('foo', function(done) {}); - expect(run.async).to.equal(1); - expect(run.sync).to.be(false); + assert(run.async === 1); + assert(run.sync === false); }); }); describe('when arity == 0', function() { it('should be .sync', function() { var run = new Runnable('foo', function() {}); - expect(run.async).to.be.equal(0); - expect(run.sync).to.be(true); + assert(run.async === 0); + assert(run.sync === true); }); }); describe('#globals', function() { it('should allow for whitelisting globals', function(done) { var test = new Runnable('foo', function() {}); - expect(test.async).to.be.equal(0); - expect(test.sync).to.be(true); + assert(test.async === 0); + assert(test.sync === true); test.globals(['foobar']); test.run(done); }); @@ -123,7 +138,7 @@ describe('Runnable(title, fn)', function() { it('should set the number of retries', function() { var run = new Runnable(); run.retries(1); - expect(run.retries()).to.equal(1); + assert(run.retries() === 1); }); }); @@ -154,8 +169,8 @@ describe('Runnable(title, fn)', function() { } try { - expect(calls).to.equal(1); - expect(test.duration).to.be.a('number'); + assert(calls === 1); + assert(typeof test.duration === 'number'); } catch (err) { done(err); return; @@ -174,8 +189,8 @@ describe('Runnable(title, fn)', function() { }); test.run(function(err) { - expect(calls).to.equal(1); - expect(err.message).to.equal('fail'); + assert(calls === 1); + assert(err.message === 'fail'); done(); }); }); @@ -190,8 +205,13 @@ describe('Runnable(title, fn)', function() { function fail() { test.run(function() {}); } - expect(fail).to.throwError('fail'); - done(); + try { + fail(); + done(new Error('failed to throw')); + } catch (e) { + assert(e.message === 'fail'); + done(); + } }); }); }); @@ -235,9 +255,9 @@ describe('Runnable(title, fn)', function() { test.on('error', function(err) { ++errCalls; - expect(err.message).to.equal('done() called multiple times'); - expect(calls).to.equal(1); - expect(errCalls).to.equal(1); + assert(err.message === 'done() called multiple times'); + assert(calls === 1); + assert(errCalls === 1); done(); }); @@ -262,11 +282,12 @@ describe('Runnable(title, fn)', function() { test.on('error', function(err) { ++errCalls; - expect(err.message).to.equal( - "fail (and Mocha's done() called multiple times)" + assert( + err.message === + "fail (and Mocha's done() called multiple times)" ); - expect(calls).to.equal(1); - expect(errCalls).to.equal(1); + assert(calls === 1); + assert(errCalls === 1); done(); }); @@ -284,7 +305,7 @@ describe('Runnable(title, fn)', function() { }); test.run(function(err) { - expect(err.message).to.equal('fail'); + assert(err.message === 'fail'); done(); }); }); @@ -296,7 +317,7 @@ describe('Runnable(title, fn)', function() { }); test.run(function(err) { - expect(err.message).to.equal(utils.undefinedError().message); + assert(err.message === utils.undefinedError().message); done(); }); }); @@ -311,7 +332,12 @@ describe('Runnable(title, fn)', function() { function fail() { test.run(function() {}); } - expect(fail).to.throwError('fail'); + try { + fail(); + done(new Error('failed to throw')); + } catch (e) { + assert(e.message === 'fail'); + } done(); }); }); @@ -323,7 +349,7 @@ describe('Runnable(title, fn)', function() { }); test.run(function(err) { - expect(err.message).to.equal('fail'); + assert(err.message === 'fail'); done(); }); }); @@ -336,8 +362,9 @@ describe('Runnable(title, fn)', function() { }); test.run(function(err) { - expect(err.message).to.equal( - 'done() invoked with non-Error: {"error":"Test error"}' + assert( + err.message === + 'done() invoked with non-Error: {"error":"Test error"}' ); done(); }); @@ -351,9 +378,7 @@ describe('Runnable(title, fn)', function() { }); test.run(function(err) { - expect(err.message).to.equal( - 'done() invoked with non-Error: Test error' - ); + assert(err.message === 'done() invoked with non-Error: Test error'); done(); }); }); @@ -370,8 +395,8 @@ describe('Runnable(title, fn)', function() { }); test.timeout(50); test.run(function(err) { - expect(err).to.be.ok(); - expect(callCount).to.equal(1); + assert(err); + assert(callCount === 1); done(); }); }); @@ -430,7 +455,7 @@ describe('Runnable(title, fn)', function() { }); test.run(function(err) { - expect(err).to.equal(expectedErr); + assert(err === expectedErr); done(); }); }); @@ -452,7 +477,7 @@ describe('Runnable(title, fn)', function() { }); test.run(function(err) { - expect(err.message).to.equal(expectedErr.message); + assert(err.message === expectedErr.message); done(); }); }); @@ -471,8 +496,8 @@ describe('Runnable(title, fn)', function() { test.timeout(10); test.run(function(err) { - expect(err.message).to.match( - /Timeout of 10ms exceeded.*\(\/some\/path\)$/ + assert( + /Timeout of 10ms exceeded.*\(\/some\/path\)$/.test(err.message) ); done(); }); @@ -496,7 +521,7 @@ describe('Runnable(title, fn)', function() { var test = new Runnable('foo', function() {}); // runner sets the state test.run(function() { - expect(test.isFailed()).not.to.be.ok(); + assert(!test.isFailed()); }); }); @@ -505,7 +530,7 @@ describe('Runnable(title, fn)', function() { // runner sets the state test.state = 'failed'; test.run(function() { - expect(test.isFailed()).to.be.ok(); + assert(!test.isFailed()); }); }); @@ -516,7 +541,7 @@ describe('Runnable(title, fn)', function() { return true; }; test.run(function() { - expect(test.isFailed()).not.to.be.ok(); + assert(!test.isFailed()); }); }); }); diff --git a/test/unit/runner.spec.js b/test/unit/runner.spec.js index b319351044..ab002ce0b6 100644 --- a/test/unit/runner.spec.js +++ b/test/unit/runner.spec.js @@ -24,7 +24,7 @@ describe('Runner', function() { suite.addTest(new Test('im a test about bears', noop)); var newRunner = new Runner(suite); newRunner.grep(/lions/); - expect(newRunner.total).to.equal(2); + expect(newRunner.total, 'to be', 2); }); it('should update the runner.total with number of matched tests when inverted', function() { @@ -33,7 +33,7 @@ describe('Runner', function() { suite.addTest(new Test('im a test about bears', noop)); var newRunner = new Runner(suite); newRunner.grep(/lions/, true); - expect(newRunner.total).to.equal(1); + expect(newRunner.total, 'to be', 1); }); }); @@ -43,7 +43,7 @@ describe('Runner', function() { suite.addTest(new Test('im another test about lions', noop)); suite.addTest(new Test('im a test about bears', noop)); runner.grep(/lions/); - expect(runner.grepTotal(suite)).to.equal(2); + expect(runner.grepTotal(suite), 'to be', 2); }); it('should return the total number of matched tests when inverted', function() { @@ -51,31 +51,34 @@ describe('Runner', function() { suite.addTest(new Test('im another test about lions', noop)); suite.addTest(new Test('im a test about bears', noop)); runner.grep(/lions/, true); - expect(runner.grepTotal(suite)).to.equal(1); + expect(runner.grepTotal(suite), 'to be', 1); }); }); describe('.globalProps()', function() { it('should include common non enumerable globals', function() { var props = runner.globalProps(); - expect(props).to.contain('setTimeout'); - expect(props).to.contain('clearTimeout'); - expect(props).to.contain('setInterval'); - expect(props).to.contain('clearInterval'); - expect(props).to.contain('Date'); - expect(props).to.contain('XMLHttpRequest'); + expect( + props, + 'to contain', + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'Date', + 'XMLHttpRequest' + ); }); }); describe('.globals()', function() { it('should default to the known globals', function() { - expect(runner.globals().length).to.be.above(16); + expect(runner.globals().length, 'to be greater than', 16); }); it('should white-list globals', function() { runner.globals(['foo', 'bar']); - expect(runner.globals()).to.contain('foo'); - expect(runner.globals()).to.contain('bar'); + expect(runner.globals(), 'to contain', 'foo', 'bar'); }); }); @@ -101,8 +104,8 @@ describe('Runner', function() { runner.checkGlobals(); global.foo = 'bar'; runner.on('fail', function(_test, err) { - expect(_test).to.equal(test); - expect(err.message).to.equal('global leak detected: foo'); + expect(_test, 'to be', test); + expect(err.message, 'to be', 'global leak detected: foo'); delete global.foo; done(); }); @@ -130,7 +133,7 @@ describe('Runner', function() { return; } // verify that the prop isn't enumerable - expect(global.propertyIsEnumerable('XMLHttpRequest')).to.not.be.ok(); + expect(global.propertyIsEnumerable('XMLHttpRequest'), 'to be', false); // create a new runner and keep a reference to the test. var test = new Test('im a test about bears', noop); @@ -139,11 +142,11 @@ describe('Runner', function() { // make the prop enumerable again. global.XMLHttpRequest = function() {}; - expect(global.propertyIsEnumerable('XMLHttpRequest')).to.be.ok(); + expect(global.propertyIsEnumerable('XMLHttpRequest'), 'to be', true); // verify the test hasn't failed. newRunner.checkGlobals(test); - expect(test).to.not.have.key('state'); + expect(test, 'not to have key', 'state'); // clean up our global space. delete global.XMLHttpRequest; @@ -155,8 +158,8 @@ describe('Runner', function() { global.foo = 'bar'; global.bar = 'baz'; runner.on('fail', function(_test, err) { - expect(_test).to.equal(test); - expect(err.message).to.equal('global leaks detected: foo, bar'); + expect(_test, 'to be', test); + expect(err.message, 'to be', 'global leaks detected: foo, bar'); delete global.foo; delete global.bar; done(); @@ -175,7 +178,7 @@ describe('Runner', function() { // verify the test hasn't failed. runner.checkGlobals(test); - expect(test).to.not.have.key('state'); + expect(test, 'not to have key', 'state'); delete global.foo; }); @@ -189,8 +192,8 @@ describe('Runner', function() { global.foo = 'bar'; global.bar = 'baz'; runner.on('fail', function(test, err) { - expect(test.title).to.equal('im a test about lions'); - expect(err.message).to.equal('global leak detected: bar'); + expect(test.title, 'to be', 'im a test about lions'); + expect(err.message, 'to be', 'global leak detected: bar'); delete global.foo; done(); }); @@ -223,25 +226,25 @@ describe('Runner', function() { describe('.fail(test, err)', function() { it('should increment .failures', function() { - expect(runner.failures).to.equal(0); + expect(runner.failures, 'to be', 0); runner.fail(new Test('one', noop), {}); - expect(runner.failures).to.equal(1); + expect(runner.failures, 'to be', 1); runner.fail(new Test('two', noop), {}); - expect(runner.failures).to.equal(2); + expect(runner.failures, 'to be', 2); }); it('should set test.state to "failed"', function() { var test = new Test('some test', noop); runner.fail(test, 'some error'); - expect(test.state).to.equal('failed'); + expect(test.state, 'to be', 'failed'); }); it('should emit "fail"', function(done) { var test = new Test('some other test', noop); var err = {}; runner.on('fail', function(test, err) { - expect(test).to.equal(test); - expect(err).to.equal(err); + expect(test, 'to be', test); + expect(err, 'to be', err); done(); }); runner.fail(test, err); @@ -251,7 +254,9 @@ describe('Runner', function() { var test = new Test('helpful test', noop); var err = 'string'; runner.on('fail', function(test, err) { - expect(err.message).to.equal( + expect( + err.message, + 'to be', 'the string "string" was thrown, throw an Error :)' ); done(); @@ -263,7 +268,7 @@ describe('Runner', function() { var test = new Test('a test', noop); var err = new Error('an error message'); runner.on('fail', function(test, err) { - expect(err.message).to.equal('an error message'); + expect(err.message, 'to be', 'an error message'); done(); }); runner.fail(test, err); @@ -273,7 +278,7 @@ describe('Runner', function() { var test = new Test('a test', noop); var err = {message: 'an error message'}; runner.on('fail', function(test, err) { - expect(err.message).to.equal('an error message'); + expect(err.message, 'to be', 'an error message'); done(); }); runner.fail(test, err); @@ -283,7 +288,9 @@ describe('Runner', function() { var test = new Test('a test', noop); var err = {x: 1}; runner.on('fail', function(test, err) { - expect(err.message).to.equal( + expect( + err.message, + 'to be', 'the object {\n "x": 1\n} was thrown, throw an Error :)' ); done(); @@ -295,7 +302,9 @@ describe('Runner', function() { var test = new Test('a test', noop); var err = [1, 2]; runner.on('fail', function(test, err) { - expect(err.message).to.equal( + expect( + err.message, + 'to be', 'the array [\n 1\n 2\n] was thrown, throw an Error :)' ); done(); @@ -316,7 +325,7 @@ describe('Runner', function() { var test = new Test('a test', noop); runner.on('fail', function(test, err) { - expect(err.message).to.equal('not evil'); + expect(err.message, 'to be', 'not evil'); done(); }); @@ -326,11 +335,11 @@ describe('Runner', function() { describe('.failHook(hook, err)', function() { it('should increment .failures', function() { - expect(runner.failures).to.equal(0); + expect(runner.failures, 'to be', 0); runner.failHook(new Test('fail hook 1', noop), {}); - expect(runner.failures).to.equal(1); + expect(runner.failures, 'to be', 1); runner.failHook(new Test('fail hook 2', noop), {}); - expect(runner.failures).to.equal(2); + expect(runner.failures, 'to be', 2); }); it('should augment hook title with current test title', function() { @@ -338,19 +347,19 @@ describe('Runner', function() { hook.ctx = {currentTest: new Test('should behave', noop)}; runner.failHook(hook, {}); - expect(hook.title).to.equal('"before each" hook for "should behave"'); + expect(hook.title, 'to be', '"before each" hook for "should behave"'); hook.ctx.currentTest = new Test('should obey', noop); runner.failHook(hook, {}); - expect(hook.title).to.equal('"before each" hook for "should obey"'); + expect(hook.title, 'to be', '"before each" hook for "should obey"'); }); it('should emit "fail"', function(done) { var hook = new Hook(); var err = {}; runner.on('fail', function(hook, err) { - expect(hook).to.equal(hook); - expect(err).to.equal(err); + expect(hook, 'to be', hook); + expect(err, 'to be', err); done(); }); runner.failHook(hook, err); @@ -386,7 +395,7 @@ describe('Runner', function() { function fail() { newRunner.runTest(); } - expect(fail).to.throwError('allow unhandled errors'); + expect(fail, 'to throw', 'allow unhandled errors'); done(); }); }); @@ -420,7 +429,7 @@ describe('Runner', function() { err.stack = stack.join('\n'); runner.on('fail', function(hook, err) { - expect(err.stack).to.equal(stack.slice(0, 3).join('\n')); + expect(err.stack, 'to be', stack.slice(0, 3).join('\n')); done(); }); runner.failHook(hook, err); @@ -443,7 +452,7 @@ describe('Runner', function() { runner.fullStackTrace = true; runner.on('fail', function(hook, err) { - expect(err.stack).to.equal(stack.join('\n')); + expect(err.stack, 'to be', stack.join('\n')); done(); }); runner.failHook(hook, err); diff --git a/test/unit/suite.spec.js b/test/unit/suite.spec.js index 251fb208ab..29022f29ad 100644 --- a/test/unit/suite.spec.js +++ b/test/unit/suite.spec.js @@ -25,43 +25,43 @@ describe('Suite', function() { }); it('should copy the title', function() { - expect(this.suite.clone().title).to.equal('To be cloned'); + expect(this.suite.clone().title, 'to be', 'To be cloned'); }); it('should copy the timeout value', function() { - expect(this.suite.clone().timeout()).to.equal(3043); + expect(this.suite.clone().timeout(), 'to be', 3043); }); it('should copy the slow value', function() { - expect(this.suite.clone().slow()).to.equal(101); + expect(this.suite.clone().slow(), 'to be', 101); }); it('should copy the bail value', function() { - expect(this.suite.clone().bail()).to.be(true); + expect(this.suite.clone().bail(), 'to be', true); }); it('should not copy the values from the suites array', function() { - expect(this.suite.clone().suites).to.be.empty(); + expect(this.suite.clone().suites, 'to be empty'); }); it('should not copy the values from the tests array', function() { - expect(this.suite.clone().tests).to.be.empty(); + expect(this.suite.clone().tests, 'to be empty'); }); it('should not copy the values from the _beforeEach array', function() { - expect(this.suite.clone()._beforeEach).to.be.empty(); + expect(this.suite.clone()._beforeEach, 'to be empty'); }); it('should not copy the values from the _beforeAll array', function() { - expect(this.suite.clone()._beforeAll).to.be.empty(); + expect(this.suite.clone()._beforeAll, 'to be empty'); }); it('should not copy the values from the _afterEach array', function() { - expect(this.suite.clone()._afterEach).to.be.empty(); + expect(this.suite.clone()._afterEach, 'to be empty'); }); it('should not copy the values from the _afterAll array', function() { - expect(this.suite.clone()._afterAll).to.be.empty(); + expect(this.suite.clone()._afterAll, 'to be empty'); }); }); @@ -72,14 +72,14 @@ describe('Suite', function() { describe('when no argument is passed', function() { it('should return the timeout value', function() { - expect(this.suite.timeout()).to.equal(2000); + expect(this.suite.timeout(), 'to be', 2000); }); }); describe('when argument is passed', function() { it('should return the Suite object', function() { var newSuite = this.suite.timeout(5000); - expect(newSuite.timeout()).to.equal(5000); + expect(newSuite.timeout(), 'to be', 5000); }); }); }); @@ -92,20 +92,20 @@ describe('Suite', function() { describe('when given a string', function() { it('should parse it', function() { this.suite.slow('5 seconds'); - expect(this.suite.slow()).to.equal(5000); + expect(this.suite.slow(), 'to be', 5000); }); }); describe('when no argument is passed', function() { it('should return the slow value', function() { - expect(this.suite.slow()).to.equal(75); + expect(this.suite.slow(), 'to be', 75); }); }); describe('when argument is passed', function() { it('should return the Suite object', function() { var newSuite = this.suite.slow(5000); - expect(newSuite.slow()).to.equal(5000); + expect(newSuite.slow(), 'to be', 5000); }); }); }); @@ -118,14 +118,14 @@ describe('Suite', function() { describe('when no argument is passed', function() { it('should return the bail value', function() { - expect(this.suite.bail()).to.be(true); + expect(this.suite.bail(), 'to be', true); }); }); describe('when argument is passed', function() { it('should return the Suite object', function() { var newSuite = this.suite.bail(false); - expect(newSuite.bail()).to.be(false); + expect(newSuite.bail(), 'to be', false); }); }); }); @@ -140,20 +140,20 @@ describe('Suite', function() { var fn = function() {}; this.suite.beforeAll(fn); - expect(this.suite._beforeAll).to.have.length(1); + expect(this.suite._beforeAll, 'to have length', 1); var beforeAllItem = this.suite._beforeAll[0]; - expect(beforeAllItem.title).to.match(/^"before all" hook/); - expect(beforeAllItem.fn).to.equal(fn); + expect(beforeAllItem.title, 'to match', /^"before all" hook/); + expect(beforeAllItem.fn, 'to be', fn); }); it('appends title to hook', function() { var fn = function() {}; this.suite.beforeAll('test', fn); - expect(this.suite._beforeAll).to.have.length(1); + expect(this.suite._beforeAll, 'to have length', 1); var beforeAllItem = this.suite._beforeAll[0]; - expect(beforeAllItem.title).to.equal('"before all" hook: test'); - expect(beforeAllItem.fn).to.equal(fn); + expect(beforeAllItem.title, 'to be', '"before all" hook: test'); + expect(beforeAllItem.fn, 'to be', fn); }); it('uses function name if available', function() { @@ -164,8 +164,8 @@ describe('Suite', function() { function namedFn() {} this.suite.beforeAll(namedFn); var beforeAllItem = this.suite._beforeAll[0]; - expect(beforeAllItem.title).to.equal('"before all" hook: namedFn'); - expect(beforeAllItem.fn).to.equal(namedFn); + expect(beforeAllItem.title, 'to be', '"before all" hook: namedFn'); + expect(beforeAllItem.fn, 'to be', namedFn); }); }); }); @@ -180,19 +180,19 @@ describe('Suite', function() { var fn = function() {}; this.suite.afterAll(fn); - expect(this.suite._afterAll).to.have.length(1); + expect(this.suite._afterAll, 'to have length', 1); var afterAllItem = this.suite._afterAll[0]; - expect(afterAllItem.title).to.match(/^"after all" hook/); - expect(afterAllItem.fn).to.equal(fn); + expect(afterAllItem.title, 'to match', /^"after all" hook/); + expect(afterAllItem.fn, 'to be', fn); }); it('appends title to hook', function() { var fn = function() {}; this.suite.afterAll('test', fn); - expect(this.suite._afterAll).to.have.length(1); + expect(this.suite._afterAll, 'to have length', 1); var beforeAllItem = this.suite._afterAll[0]; - expect(beforeAllItem.title).to.equal('"after all" hook: test'); - expect(beforeAllItem.fn).to.equal(fn); + expect(beforeAllItem.title, 'to be', '"after all" hook: test'); + expect(beforeAllItem.fn, 'to be', fn); }); it('uses function name if available', function() { @@ -203,8 +203,8 @@ describe('Suite', function() { function namedFn() {} this.suite.afterAll(namedFn); var afterAllItem = this.suite._afterAll[0]; - expect(afterAllItem.title).to.equal('"after all" hook: namedFn'); - expect(afterAllItem.fn).to.equal(namedFn); + expect(afterAllItem.title, 'to be', '"after all" hook: namedFn'); + expect(afterAllItem.fn, 'to be', namedFn); }); }); }); @@ -219,20 +219,20 @@ describe('Suite', function() { var fn = function() {}; this.suite.beforeEach(fn); - expect(this.suite._beforeEach).to.have.length(1); + expect(this.suite._beforeEach, 'to have length', 1); var beforeEachItem = this.suite._beforeEach[0]; - expect(beforeEachItem.title).to.match(/^"before each" hook/); - expect(beforeEachItem.fn).to.equal(fn); + expect(beforeEachItem.title, 'to match', /^"before each" hook/); + expect(beforeEachItem.fn, 'to be', fn); }); it('appends title to hook', function() { var fn = function() {}; this.suite.beforeEach('test', fn); - expect(this.suite._beforeEach).to.have.length(1); + expect(this.suite._beforeEach, 'to have length', 1); var beforeAllItem = this.suite._beforeEach[0]; - expect(beforeAllItem.title).to.equal('"before each" hook: test'); - expect(beforeAllItem.fn).to.equal(fn); + expect(beforeAllItem.title, 'to be', '"before each" hook: test'); + expect(beforeAllItem.fn, 'to be', fn); }); it('uses function name if available', function() { @@ -243,8 +243,8 @@ describe('Suite', function() { function namedFn() {} this.suite.beforeEach(namedFn); var beforeEachItem = this.suite._beforeEach[0]; - expect(beforeEachItem.title).to.equal('"before each" hook: namedFn'); - expect(beforeEachItem.fn).to.equal(namedFn); + expect(beforeEachItem.title, 'to be', '"before each" hook: namedFn'); + expect(beforeEachItem.fn, 'to be', namedFn); }); }); }); @@ -259,20 +259,20 @@ describe('Suite', function() { var fn = function() {}; this.suite.afterEach(fn); - expect(this.suite._afterEach).to.have.length(1); + expect(this.suite._afterEach, 'to have length', 1); var afterEachItem = this.suite._afterEach[0]; - expect(afterEachItem.title).to.match(/^"after each" hook/); - expect(afterEachItem.fn).to.equal(fn); + expect(afterEachItem.title, 'to match', /^"after each" hook/); + expect(afterEachItem.fn, 'to be', fn); }); it('appends title to hook', function() { var fn = function() {}; this.suite.afterEach('test', fn); - expect(this.suite._afterEach).to.have.length(1); + expect(this.suite._afterEach, 'to have length', 1); var beforeAllItem = this.suite._afterEach[0]; - expect(beforeAllItem.title).to.equal('"after each" hook: test'); - expect(beforeAllItem.fn).to.equal(fn); + expect(beforeAllItem.title, 'to be', '"after each" hook: test'); + expect(beforeAllItem.fn, 'to be', fn); }); it('uses function name if available', function() { @@ -283,8 +283,8 @@ describe('Suite', function() { function namedFn() {} this.suite.afterEach(namedFn); var afterEachItem = this.suite._afterEach[0]; - expect(afterEachItem.title).to.equal('"after each" hook: namedFn'); - expect(afterEachItem.fn).to.equal(namedFn); + expect(afterEachItem.title, 'to be', '"after each" hook: namedFn'); + expect(afterEachItem.fn, 'to be', namedFn); }); }); }); @@ -299,25 +299,25 @@ describe('Suite', function() { }); it('sets the parent on the added Suite', function() { - expect(this.second.parent).to.equal(this.first); + expect(this.second.parent, 'to be', this.first); }); it('copies the timeout value', function() { - expect(this.second.timeout()).to.equal(4002); + expect(this.second.timeout(), 'to be', 4002); }); it('copies the slow value', function() { - expect(this.second.slow()).to.equal(200); + expect(this.second.slow(), 'to be', 200); }); it('adds the suite to the suites collection', function() { - expect(this.first.suites).to.have.length(1); - expect(this.first.suites[0]).to.equal(this.second); + expect(this.first.suites, 'to have length', 1); + expect(this.first.suites[0], 'to be', this.second); }); it('treats suite as pending if its parent is pending', function() { this.first.pending = true; - expect(this.second.isPending()).to.be(true); + expect(this.second.isPending(), 'to be', true); }); }); @@ -330,16 +330,16 @@ describe('Suite', function() { // }); // // it('sets the parent on the added test', function(){ - // expect(this.test.parent).to.equal(this.suite); + // expect(this.test.parent, 'to be', this.suite); // }); // // it('copies the timeout value', function(){ - // expect(this.test.timeout()).to.equal(4002); + // expect(this.test.timeout(), 'to be', 4002); // }); // // it('adds the test to the tests collection', function(){ - // expect(this.suite.tests).to.have.length(1); - // expect(this.suite.tests[0]).to.equal(this.test); + // expect(this.suite.tests, 'to have length', 1); + // expect(this.suite.tests[0], 'to be', this.test); // }); // }); @@ -350,7 +350,7 @@ describe('Suite', function() { describe('when there is no parent', function() { it('returns the suite title', function() { - expect(this.suite.fullTitle()).to.equal('A Suite'); + expect(this.suite.fullTitle(), 'to be', 'A Suite'); }); }); @@ -358,7 +358,7 @@ describe('Suite', function() { it("returns the combination of parent's and suite's title", function() { var parentSuite = new Suite('I am a parent'); parentSuite.addSuite(this.suite); - expect(this.suite.fullTitle()).to.equal('I am a parent A Suite'); + expect(this.suite.fullTitle(), 'to be', 'I am a parent A Suite'); }); }); }); @@ -370,7 +370,7 @@ describe('Suite', function() { describe('when there is no parent', function() { it('returns the suite title', function() { - expect(this.suite.titlePath()).to.eql(['A Suite']); + expect(this.suite.titlePath(), 'to equal', ['A Suite']); }); }); @@ -379,7 +379,7 @@ describe('Suite', function() { it('returns the suite title', function() { var parentSuite = new Suite(''); parentSuite.addSuite(this.suite); - expect(this.suite.titlePath()).to.eql(['A Suite']); + expect(this.suite.titlePath(), 'to equal', ['A Suite']); }); }); @@ -387,7 +387,10 @@ describe('Suite', function() { it("returns the concatenation of parent's and suite's title", function() { var parentSuite = new Suite('I am a parent'); parentSuite.addSuite(this.suite); - expect(this.suite.titlePath()).to.eql(['I am a parent', 'A Suite']); + expect(this.suite.titlePath(), 'to equal', [ + 'I am a parent', + 'A Suite' + ]); }); }); }); @@ -400,7 +403,7 @@ describe('Suite', function() { describe('when there are no nested suites or tests', function() { it('should return 0', function() { - expect(this.suite.total()).to.equal(0); + expect(this.suite.total(), 'to be', 0); }); }); @@ -408,7 +411,7 @@ describe('Suite', function() { it('should return the number', function() { this.suite.addTest(new Test('a child test')); this.suite.addTest(new Test('another child test')); - expect(this.suite.total()).to.equal(2); + expect(this.suite.total(), 'to be', 2); }); }); }); @@ -425,7 +428,7 @@ describe('Suite', function() { n++; } this.suite.eachTest(fn); - expect(n).to.equal(0); + expect(n, 'to be', 0); }); }); @@ -439,7 +442,7 @@ describe('Suite', function() { n++; } this.suite.eachTest(fn); - expect(n).to.equal(2); + expect(n, 'to be', 2); }); }); @@ -455,7 +458,7 @@ describe('Suite', function() { n++; } this.suite.eachTest(fn); - expect(n).to.equal(2); + expect(n, 'to be', 2); }); }); }); @@ -465,17 +468,17 @@ describe('Suite', function() { it("should throw an error if the title isn't a string", function() { expect(function() { new Suite(undefined, 'root'); - }).to.throwError(); + }, 'to throw'); expect(function() { new Suite(function() {}, 'root'); - }).to.throwError(); + }, 'to throw'); }); it('should not throw if the title is a string', function() { expect(function() { new Suite('Bdd suite', 'root'); - }).to.not.throwError(); + }, 'not to throw'); }); }); }); @@ -485,17 +488,17 @@ describe('Test', function() { it("should throw an error if the title isn't a string", function() { expect(function() { new Test(function() {}); - }).to.throwError(); + }, 'to throw'); expect(function() { new Test(undefined, function() {}); - }).to.throwError(); + }, 'to throw'); }); it('should not throw if the title is a string', function() { expect(function() { new Test('test-case', function() {}); - }).to.not.throwError(); + }, 'not to throw'); }); }); }); diff --git a/test/unit/test.spec.js b/test/unit/test.spec.js index 91bfc329e2..6192bf9f7f 100644 --- a/test/unit/test.spec.js +++ b/test/unit/test.spec.js @@ -18,39 +18,39 @@ describe('Test', function() { }); it('should copy the title', function() { - expect(this._test.clone().title).to.equal('To be cloned'); + expect(this._test.clone().title, 'to be', 'To be cloned'); }); it('should copy the timeout value', function() { - expect(this._test.clone().timeout()).to.equal(3043); + expect(this._test.clone().timeout(), 'to be', 3043); }); it('should copy the slow value', function() { - expect(this._test.clone().slow()).to.equal(101); + expect(this._test.clone().slow(), 'to be', 101); }); it('should copy the enableTimeouts value', function() { - expect(this._test.clone().enableTimeouts()).to.be(true); + expect(this._test.clone().enableTimeouts(), 'to be', true); }); it('should copy the retries value', function() { - expect(this._test.clone().retries()).to.equal(3); + expect(this._test.clone().retries(), 'to be', 3); }); it('should copy the currentRetry value', function() { - expect(this._test.clone().currentRetry()).to.equal(1); + expect(this._test.clone().currentRetry(), 'to be', 1); }); it('should copy the globals value', function() { - expect(this._test.clone().globals()).to.not.be.empty(); + expect(this._test.clone().globals(), 'not to be empty'); }); it('should copy the parent value', function() { - expect(this._test.clone().parent).to.equal('foo'); + expect(this._test.clone().parent, 'to be', 'foo'); }); it('should copy the file value', function() { - expect(this._test.clone().file).to.equal('bar'); + expect(this._test.clone().file, 'to be', 'bar'); }); }); @@ -60,12 +60,12 @@ describe('Test', function() { }); it('should not be pending by default', function() { - expect(this._test.isPending()).to.not.be(true); + expect(this._test.isPending(), 'not to be', true); }); it('should be pending when marked as such', function() { this._test.pending = true; - expect(this._test.isPending()).to.be(true); + expect(this._test.isPending(), 'to be', true); }); it('should be pending when its parent is pending', function() { @@ -74,7 +74,7 @@ describe('Test', function() { return true; } }; - expect(this._test.isPending()).to.be(true); + expect(this._test.isPending(), 'to be', true); }); }); }); diff --git a/test/unit/throw.spec.js b/test/unit/throw.spec.js index 46168cf44e..6aca25750c 100644 --- a/test/unit/throw.spec.js +++ b/test/unit/throw.spec.js @@ -34,8 +34,8 @@ describe('a test that throws', function() { suite.addTest(test); runner = new Runner(suite); runner.on('end', function() { - expect(runner.failures).to.equal(1); - expect(test.state).to.equal('failed'); + expect(runner.failures, 'to be', 1); + expect(test.state, 'to be', 'failed'); done(); }); runner.run(); @@ -48,8 +48,8 @@ describe('a test that throws', function() { suite.addTest(test); runner = new Runner(suite); runner.on('end', function() { - expect(runner.failures).to.equal(1); - expect(test.state).to.equal('failed'); + expect(runner.failures, 'to be', 1); + expect(test.state, 'to be', 'failed'); done(); }); runner.run(); @@ -66,8 +66,8 @@ describe('a test that throws', function() { suite.addTest(test); runner = new Runner(suite); runner.on('end', function() { - expect(runner.failures).to.equal(1); - expect(test.state).to.equal('failed'); + expect(runner.failures, 'to be', 1); + expect(test.state, 'to be', 'failed'); done(); }); runner.run(); @@ -82,8 +82,8 @@ describe('a test that throws', function() { suite.addTest(test); runner = new Runner(suite); runner.on('end', function() { - expect(runner.failures).to.equal(1); - expect(test.state).to.equal('failed'); + expect(runner.failures, 'to be', 1); + expect(test.state, 'to be', 'failed'); done(); }); runner.run(); @@ -96,8 +96,8 @@ describe('a test that throws', function() { suite.addTest(test); runner = new Runner(suite); runner.on('end', function() { - expect(runner.failures).to.equal(1); - expect(test.state).to.equal('failed'); + expect(runner.failures, 'to be', 1); + expect(test.state, 'to be', 'failed'); done(); }); runner.run(); @@ -112,8 +112,8 @@ describe('a test that throws', function() { suite.addTest(test); runner = new Runner(suite); runner.on('end', function() { - expect(runner.failures).to.equal(1); - expect(test.state).to.equal('failed'); + expect(runner.failures, 'to be', 1); + expect(test.state, 'to be', 'failed'); done(); }); runner.run(); diff --git a/test/unit/utils.spec.js b/test/unit/utils.spec.js index b65098b113..e5a68debd0 100644 --- a/test/unit/utils.spec.js +++ b/test/unit/utils.spec.js @@ -5,62 +5,76 @@ var utils = require('../../lib/utils'); describe('lib/utils', function() { describe('clean', function() { it('should remove the wrapping function declaration', function() { - expect(utils.clean('function (one, two, three) {\n//code\n}')).to.equal( + expect( + utils.clean('function (one, two, three) {\n//code\n}'), + 'to be', '//code' ); }); it('should handle newlines in the function declaration', function() { expect( - utils.clean('function (one, two, three)\n {\n//code\n}') - ).to.equal('//code'); + utils.clean('function (one, two, three)\n {\n//code\n}'), + 'to be', + '//code' + ); }); it('should remove space character indentation from the function body', function() { - expect(utils.clean(' //line1\n //line2')).to.equal( + expect( + utils.clean(' //line1\n //line2'), + 'to be', '//line1\n //line2' ); }); it('should remove tab character indentation from the function body', function() { - expect(utils.clean('\t//line1\n\t\t//line2')).to.equal( + expect( + utils.clean('\t//line1\n\t\t//line2'), + 'to be', '//line1\n\t//line2' ); }); it('should handle functions with tabs in their declarations', function() { - expect(utils.clean('function\t(\t)\t{\n//code\n}')).to.equal('//code'); + expect(utils.clean('function\t(\t)\t{\n//code\n}'), 'to be', '//code'); }); it('should handle named functions without space after name', function() { - expect(utils.clean('function withName() {\n//code\n}')).to.equal( + expect( + utils.clean('function withName() {\n//code\n}'), + 'to be', '//code' ); }); it('should handle named functions with space after name', function() { - expect(utils.clean('function withName () {\n//code\n}')).to.equal( + expect( + utils.clean('function withName () {\n//code\n}'), + 'to be', '//code' ); }); it('should handle functions with no space between the end and the closing brace', function() { - expect(utils.clean('function() {/*code*/}')).to.equal('/*code*/'); + expect(utils.clean('function() {/*code*/}'), 'to be', '/*code*/'); }); it('should handle functions with parentheses in the same line', function() { - expect(utils.clean('function() { if (true) { /* code */ } }')).to.equal( + expect( + utils.clean('function() { if (true) { /* code */ } }'), + 'to be', 'if (true) { /* code */ }' ); }); it('should handle empty functions', function() { - expect(utils.clean('function() {}')).to.equal(''); + expect(utils.clean('function() {}'), 'to be', ''); }); it('should format a single line test function', function() { var fn = ['function () {', ' var a = 1;', '}'].join('\n'); - expect(utils.clean(fn)).to.equal('var a = 1;'); + expect(utils.clean(fn), 'to be', 'var a = 1;'); }); it('should format a multi line test indented with spaces', function() { @@ -71,7 +85,7 @@ describe('lib/utils', function() { ' var b = 2;', ' var c = 3; }' ].join('\n'); - expect(utils.clean(fn)).to.equal('var a = 1;\n var b = 2;\nvar c = 3;'); + expect(utils.clean(fn), 'to be', 'var a = 1;\n var b = 2;\nvar c = 3;'); }); it('should format a multi line test indented with tabs', function() { @@ -82,7 +96,7 @@ describe('lib/utils', function() { '\t}', '}' ].join('\n'); - expect(utils.clean(fn)).to.equal('if (true) {\n\tvar a = 1;\n}'); + expect(utils.clean(fn), 'to be', 'if (true) {\n\tvar a = 1;\n}'); }); it('should format functions saved in windows style - spaces', function() { @@ -93,7 +107,7 @@ describe('lib/utils', function() { ' } while (false);', ' }' ].join('\r\n'); - expect(utils.clean(fn)).to.equal('do {\n "nothing";\n} while (false);'); + expect(utils.clean(fn), 'to be', 'do {\n "nothing";\n} while (false);'); }); it('should format functions saved in windows style - tabs', function() { @@ -106,19 +120,21 @@ describe('lib/utils', function() { '\t}', '}' ].join('\r\n'); - expect(utils.clean(fn)).to.equal( + expect( + utils.clean(fn), + 'to be', 'if (false) {\n\tvar json = {\n\t\tone : 1\n\t};\n}' ); }); it('should format es6 arrow functions', function() { var fn = ['() => {', ' var a = 1;', '}'].join('\n'); - expect(utils.clean(fn)).to.equal('var a = 1;'); + expect(utils.clean(fn), 'to be', 'var a = 1;'); }); it('should format es6 arrow functions with implicit return', function() { var fn = '() => foo()'; - expect(utils.clean(fn)).to.equal('foo()'); + expect(utils.clean(fn), 'to be', 'foo()'); }); }); @@ -127,52 +143,60 @@ describe('lib/utils', function() { it('should return an object representation of a string created with a String constructor', function() { /* eslint no-new-wrappers: off */ - expect(stringify(new String('foo'))).to.equal( + expect( + stringify(new String('foo')), + 'to be', '{\n "0": "f"\n "1": "o"\n "2": "o"\n}' ); }); it('should return Buffer with .toJSON representation', function() { - expect(stringify(Buffer.from([0x01]))).to.equal('[\n 1\n]'); - expect(stringify(Buffer.from([0x01, 0x02]))).to.equal('[\n 1\n 2\n]'); + expect(stringify(Buffer.from([0x01])), 'to be', '[\n 1\n]'); + expect(stringify(Buffer.from([0x01, 0x02])), 'to be', '[\n 1\n 2\n]'); - expect(stringify(Buffer.from('ABCD'))).to.equal( + expect( + stringify(Buffer.from('ABCD')), + 'to be', '[\n 65\n 66\n 67\n 68\n]' ); }); it('should return Date object with .toISOString() + string prefix', function() { - expect(stringify(new Date(0))).to.equal( + expect( + stringify(new Date(0)), + 'to be', '[Date: ' + new Date(0).toISOString() + ']' ); var date = new Date(); // now - expect(stringify(date)).to.equal('[Date: ' + date.toISOString() + ']'); + expect(stringify(date), 'to be', '[Date: ' + date.toISOString() + ']'); }); it('should return invalid Date object with .toString() + string prefix', function() { - expect(stringify(new Date(''))).to.equal( + expect( + stringify(new Date('')), + 'to be', '[Date: ' + new Date('').toString() + ']' ); }); describe('#Number', function() { it('should show the handle -0 situations', function() { - expect(stringify(-0)).to.eql('-0'); - expect(stringify(0)).to.eql('0'); - expect(stringify('-0')).to.eql('"-0"'); + expect(stringify(-0), 'to be', '-0'); + expect(stringify(0), 'to be', '0'); + expect(stringify('-0'), 'to be', '"-0"'); }); it('should work well with `NaN` and `Infinity`', function() { - expect(stringify(NaN)).to.equal('NaN'); - expect(stringify(Infinity)).to.equal('Infinity'); - expect(stringify(-Infinity)).to.equal('-Infinity'); + expect(stringify(NaN), 'to be', 'NaN'); + expect(stringify(Infinity), 'to be', 'Infinity'); + expect(stringify(-Infinity), 'to be', '-Infinity'); }); it('floats and ints', function() { - expect(stringify(1)).to.equal('1'); - expect(stringify(1.2)).to.equal('1.2'); - expect(stringify(1e9)).to.equal('1000000000'); + expect(stringify(1), 'to be', '1'); + expect(stringify(1.2), 'to be', '1.2'); + expect(stringify(1e9), 'to be', '1000000000'); }); }); @@ -249,7 +273,7 @@ describe('lib/utils', function() { ' "zero": -0', '}' ].join('\n'); - expect(stringify(expected)).to.equal(actual); + expect(stringify(expected), 'to be', actual); }); }); @@ -257,14 +281,16 @@ describe('lib/utils', function() { var travis = {name: 'travis', age: 24}; var travis2 = {age: 24, name: 'travis'}; - expect(stringify(travis)).to.equal(stringify(travis2)); + expect(stringify(travis), 'to be', stringify(travis2)); }); it('should handle circular structures in objects', function() { var travis = {name: 'travis'}; travis.whoami = travis; - expect(stringify(travis)).to.equal( + expect( + stringify(travis), + 'to be', '{\n "name": "travis"\n "whoami": [Circular]\n}' ); }); @@ -273,14 +299,14 @@ describe('lib/utils', function() { var travis = ['travis']; travis.push(travis); - expect(stringify(travis)).to.equal('[\n "travis"\n [Circular]\n]'); + expect(stringify(travis), 'to be', '[\n "travis"\n [Circular]\n]'); }); it('should handle circular structures in functions', function() { var travis = function() {}; travis.fn = travis; - expect(stringify(travis)).to.equal('{\n "fn": [Circular]\n}'); + expect(stringify(travis), 'to be', '{\n "fn": [Circular]\n}'); }); it('should handle various non-undefined, non-null, non-object, non-array, non-date, and non-function values', function() { @@ -288,41 +314,47 @@ describe('lib/utils', function() { var regExpObj = {regexp: regexp}; var regexpString = '/(?:)/'; - expect(stringify(regExpObj)).to.equal( + expect( + stringify(regExpObj), + 'to be', '{\n "regexp": ' + regexpString + '\n}' ); - expect(stringify(regexp)).to.equal(regexpString); + expect(stringify(regexp), 'to be', regexpString); var number = 1; var numberObj = {number: number}; var numberString = '1'; - expect(stringify(numberObj)).to.equal('{\n "number": ' + number + '\n}'); - expect(stringify(number)).to.equal(numberString); + expect(stringify(numberObj), 'to be', '{\n "number": ' + number + '\n}'); + expect(stringify(number), 'to be', numberString); var boolean = false; var booleanObj = {boolean: boolean}; var booleanString = 'false'; - expect(stringify(booleanObj)).to.equal( + expect( + stringify(booleanObj), + 'to be', '{\n "boolean": ' + boolean + '\n}' ); - expect(stringify(boolean)).to.equal(booleanString); + expect(stringify(boolean), 'to be', booleanString); var string = 'sneepy'; var stringObj = {string: string}; - expect(stringify(stringObj)).to.equal( + expect( + stringify(stringObj), + 'to be', '{\n "string": "' + string + '"\n}' ); - expect(stringify(string)).to.equal(JSON.stringify(string)); + expect(stringify(string), 'to be', JSON.stringify(string)); var nullValue = null; var nullObj = {null: null}; var nullString = '[null]'; - expect(stringify(nullObj)).to.equal('{\n "null": [null]\n}'); - expect(stringify(nullValue)).to.equal(nullString); + expect(stringify(nullObj), 'to be', '{\n "null": [null]\n}'); + expect(stringify(nullValue), 'to be', nullString); }); it('should handle arrays', function() { @@ -330,10 +362,14 @@ describe('lib/utils', function() { var arrayObj = {array: array}; var arrayString = ' "dave"\n "dave"\n "dave"\n "dave"'; - expect(stringify(arrayObj)).to.equal( + expect( + stringify(arrayObj), + 'to be', '{\n "array": [\n' + arrayString + '\n ]\n}' ); - expect(stringify(array)).to.equal( + expect( + stringify(array), + 'to be', '[' + arrayString.replace(/\s+/g, '\n ') + '\n]' ); }); @@ -343,30 +379,34 @@ describe('lib/utils', function() { var fnObj = {fn: fn}; var fnString = '[Function]'; - expect(stringify(fnObj)).to.equal('{\n "fn": ' + fnString + '\n}'); - expect(stringify(fn)).to.equal('[Function]'); + expect(stringify(fnObj), 'to be', '{\n "fn": ' + fnString + '\n}'); + expect(stringify(fn), 'to be', '[Function]'); }); it('should handle empty objects', function() { - expect(stringify({})).to.equal('{}'); - expect(stringify({foo: {}})).to.equal('{\n "foo": {}\n}'); + expect(stringify({}), 'to be', '{}'); + expect(stringify({foo: {}}), 'to be', '{\n "foo": {}\n}'); }); it('should handle empty arrays', function() { - expect(stringify([])).to.equal('[]'); - expect(stringify({foo: []})).to.equal('{\n "foo": []\n}'); + expect(stringify([]), 'to be', '[]'); + expect(stringify({foo: []}), 'to be', '{\n "foo": []\n}'); }); it('should handle non-empty arrays', function() { - expect(stringify(['a', 'b', 'c'])).to.equal('[\n "a"\n "b"\n "c"\n]'); + expect(stringify(['a', 'b', 'c']), 'to be', '[\n "a"\n "b"\n "c"\n]'); }); it('should handle empty functions (with no properties)', function() { - expect(stringify(function() {})).to.equal('[Function]'); - expect(stringify({foo: function() {}})).to.equal( + expect(stringify(function() {}), 'to be', '[Function]'); + expect( + stringify({foo: function() {}}), + 'to be', '{\n "foo": [Function]\n}' ); - expect(stringify({foo: function() {}, bar: 'baz'})).to.equal( + expect( + stringify({foo: function() {}, bar: 'baz'}), + 'to be', '{\n "bar": "baz"\n "foo": [Function]\n}' ); }); @@ -374,45 +414,59 @@ describe('lib/utils', function() { it('should handle functions w/ properties', function() { var fn = function() {}; fn.bar = 'baz'; - expect(stringify(fn)).to.equal('{\n "bar": "baz"\n}'); - expect(stringify({foo: fn})).to.equal( + expect(stringify(fn), 'to be', '{\n "bar": "baz"\n}'); + expect( + stringify({foo: fn}), + 'to be', '{\n "foo": {\n "bar": "baz"\n }\n}' ); }); it('should handle undefined values', function() { - expect(stringify({foo: undefined})).to.equal( + expect( + stringify({foo: undefined}), + 'to be', '{\n "foo": [undefined]\n}' ); - expect(stringify({foo: 'bar', baz: undefined})).to.equal( + expect( + stringify({foo: 'bar', baz: undefined}), + 'to be', '{\n "baz": [undefined]\n "foo": "bar"\n}' ); - expect(stringify()).to.equal('[undefined]'); + expect(stringify(), 'to be', '[undefined]'); }); it('should recurse', function() { - expect(stringify({foo: {bar: {baz: {quux: {herp: 'derp'}}}}})).to.equal( + expect( + stringify({foo: {bar: {baz: {quux: {herp: 'derp'}}}}}), + 'to be', '{\n "foo": {\n "bar": {\n "baz": {\n "quux": {\n "herp": "derp"\n }\n }\n }\n }\n}' ); }); it('might get confusing', function() { - expect(stringify(null)).to.equal('[null]'); + expect(stringify(null), 'to be', '[null]'); }); it('should not freak out if it sees a primitive twice', function() { - expect(stringify({foo: null, bar: null})).to.equal( + expect( + stringify({foo: null, bar: null}), + 'to be', '{\n "bar": [null]\n "foo": [null]\n}' ); - expect(stringify({foo: 1, bar: 1})).to.equal( + expect( + stringify({foo: 1, bar: 1}), + 'to be', '{\n "bar": 1\n "foo": 1\n}' ); }); it('should stringify dates', function() { var date = new Date(0); - expect(stringify(date)).to.equal('[Date: 1970-01-01T00:00:00.000Z]'); - expect(stringify({date: date})).to.equal( + expect(stringify(date), 'to be', '[Date: 1970-01-01T00:00:00.000Z]'); + expect( + stringify({date: date}), + 'to be', '{\n "date": [Date: 1970-01-01T00:00:00.000Z]\n}' ); }); @@ -426,25 +480,31 @@ describe('lib/utils', function() { } a.foo = 1; - expect(stringify(a)).to.equal('{\n "foo": 1\n}'); + expect(stringify(a), 'to be', '{\n "foo": 1\n}'); }); // In old version node.js, Symbol is not available by default. if (typeof global.Symbol === 'function') { it('should handle Symbol', function() { var symbol = Symbol('value'); - expect(stringify(symbol)).to.equal('Symbol(value)'); - expect(stringify({symbol: symbol})).to.equal( + expect(stringify(symbol), 'to be', 'Symbol(value)'); + expect( + stringify({symbol: symbol}), + 'to be', '{\n "symbol": Symbol(value)\n}' ); }); } it('should handle length properties that cannot be coerced to a number', function() { - expect(stringify({length: {nonBuiltinProperty: 0}})).to.equal( + expect( + stringify({length: {nonBuiltinProperty: 0}}), + 'to be', '{\n "length": {\n "nonBuiltinProperty": 0\n }\n}' ); - expect(stringify({length: 'a string where length should be'})).to.equal( + expect( + stringify({length: 'a string where length should be'}), + 'to be', '{\n "length": "a string where length should be"\n}' ); }); @@ -467,23 +527,23 @@ describe('lib/utils', function() { }); it('should recognize various types', function() { - expect(type({})).to.equal('object'); - expect(type([])).to.equal('array'); - expect(type(1)).to.equal('number'); - expect(type(Infinity)).to.equal('number'); - expect(type(null)).to.equal('null'); - expect(type(undefined)).to.equal('undefined'); - expect(type(new Date())).to.equal('date'); - expect(type(/foo/)).to.equal('regexp'); - expect(type('type')).to.equal('string'); - expect(type(global)).to.equal('domwindow'); - expect(type(true)).to.equal('boolean'); + expect(type({}), 'to be', 'object'); + expect(type([]), 'to be', 'array'); + expect(type(1), 'to be', 'number'); + expect(type(Infinity), 'to be', 'number'); + expect(type(null), 'to be', 'null'); + expect(type(undefined), 'to be', 'undefined'); + expect(type(new Date()), 'to be', 'date'); + expect(type(/foo/), 'to be', 'regexp'); + expect(type('type'), 'to be', 'string'); + expect(type(global), 'to be', 'domwindow'); + expect(type(true), 'to be', 'boolean'); }); describe('when toString on null or undefined stringifies window', function() { it('should recognize null and undefined', function() { - expect(type(null)).to.equal('null'); - expect(type(undefined)).to.equal('undefined'); + expect(type(null), 'to be', 'null'); + expect(type(undefined), 'to be', 'undefined'); }); }); @@ -495,13 +555,13 @@ describe('lib/utils', function() { describe('parseQuery()', function() { var parseQuery = utils.parseQuery; it('should get queryString and return key-value object', function() { - expect(parseQuery('?foo=1&bar=2&baz=3')).to.eql({ + expect(parseQuery('?foo=1&bar=2&baz=3'), 'to equal', { foo: '1', bar: '2', baz: '3' }); - expect(parseQuery('?r1=^@(?!.*\\)$)&r2=m{2}&r3=^co.*')).to.eql({ + expect(parseQuery('?r1=^@(?!.*\\)$)&r2=m{2}&r3=^co.*'), 'to equal', { r1: '^@(?!.*\\)$)', r2: 'm{2}', r3: '^co.*' @@ -509,7 +569,7 @@ describe('lib/utils', function() { }); it('should parse "+" as a space', function() { - expect(parseQuery('?grep=foo+bar')).to.eql({grep: 'foo bar'}); + expect(parseQuery('?grep=foo+bar'), 'to equal', {grep: 'foo bar'}); }); }); @@ -518,36 +578,40 @@ describe('lib/utils', function() { expect( utils.isPromise({ then: function() {} - }) - ).to.be(true); + }), + 'to be', + true + ); }); it('should return false if the value is not an object', function() { - expect(utils.isPromise(1)).to.be(false); + expect(utils.isPromise(1), 'to be', false); }); it('should return false if the value is an object w/o a "then" function', function() { - expect(utils.isPromise({})).to.be(false); + expect(utils.isPromise({}), 'to be', false); }); }); describe('escape', function() { it('replaces the usual xml suspects', function() { - expect(utils.escape('a>bc>d>')).to.be('>a>bc>d>'); - expect(utils.escape('"a"bc"d"')).to.be('"a"bc"d"'); - expect(utils.escape('<>"&')).to.be('<>"&'); + expect(utils.escape('a>bc>d>'), 'to be', '>a>bc>d>'); + expect(utils.escape('"a"bc"d"'), 'to be', '"a"bc"d"'); + expect(utils.escape('<>"&'), 'to be', '<>"&'); - expect(utils.escape('&a&bc&d&')).to.be('&a&bc&d&'); - expect(utils.escape('&<')).to.be('&amp;&lt;'); + expect(utils.escape('&a&bc&d&'), 'to be', '&a&bc&d&'); + expect(utils.escape('&<'), 'to be', '&amp;&lt;'); }); it('replaces invalid xml characters', function() { - expect(utils.escape('\x1B[32mfoo\x1B[0m')).to.be( + expect( + utils.escape('\x1B[32mfoo\x1B[0m'), + 'to be', 'foo' ); // Ensure we can handle non-trivial unicode characters as well - expect(utils.escape('💩')).to.be('💩'); + expect(utils.escape('💩'), 'to be', '💩'); }); }); });