Stack of 3
1/3Remove unused code-33
2/3Reformat all files with prettier+4075 -3302
3/3Bump version number+1 -1

patchstack/renovate-package master

...

Reformat all files with prettier

Patch does not have a description.
55 files changed+4075 -3302
  .babelrc
7
  README.md
54
  example/example.js
25
  example/serial.js
25
  lib/assert.js
499
  lib/index.js
37
  lib/run-test.js
27
  lib/runner.js
260
  lib/stack-filter.js
14
  lib/reporter/json.js
15
  lib/reporter/tap.js
62
  test/helpers/collect-logs.js
65
  test/helpers/delete-set-immediate.js
2
  test/helpers/runner-test.js
35
  test/helpers/setup-unhandled.js
2
  test/integration/cb-error.js
6
  test/integration/cb-fail.js
4
  test/integration/cb-ok.js
4
  test/integration/cb-throw-nonerror.js
4
  test/integration/index.js
777
  test/integration/manual-run-delay.js
16
  test/integration/manual-run.js
16
  test/integration/no-autorun.js
4
  test/integration/no-process-exit.js
4
  test/integration/no-set-immediate.js
6
  test/integration/plan-gt-expected.js
10
  test/integration/plan-ok.js
8
  test/integration/plan-promise-gt.js
8
  test/integration/plan-promise-lt.js
8
  test/integration/plan-promise-ok.js
8
  test/integration/plan-sync-gt.js
10
  test/integration/plan-sync-lt.js
6
  test/integration/plan-sync-ok.js
8
  test/integration/process-exit.js
4
  test/integration/promise-error.js
11
  test/integration/promise-fail.js
11
  test/integration/promise-ok.js
11
  test/integration/sync-error.js
4
  test/integration/sync-fail.js
4
  test/integration/sync-ok.js
4
  test/integration/throws-error.js
52
  test/integration/throws-ok.js
52
  test/unit/before-after-hooks.js
1480
  test/unit/cb-tests.js
294
  test/unit/create-suite.js
11
  test/unit/index.js
24
  test/unit/plan-tests.js
578
  test/unit/promise-tests.js
253
  test/unit/run-test.js
200
  test/unit/runner.js
6
  test/unit/serial.js
142
  test/unit/sync-tests.js
886
  test/unit/t-after-tests.js
198
  test/unit/tap-reporter.js
590
  test/unit/throws-tests.js
526
.babelrc+2 -5
             @@ -2,11 +2,8 @@     2      2  "presets": ["es2015"],     3      3  "env": {     4      4    "test": {     5             "plugins": [     6               "source-map-support-for-6",     7               "istanbul"     8             ],     9             "sourceMaps": "inline",            5      "plugins": ["source-map-support-for-6", "istanbul"],            6      "sourceMaps": "inline"    10      7    }    11      8  }    12      9}
README.md+27 -27
             @@ -2,27 +2,28 @@     2      2     3      3JavaScript TAP test framework highly inspired by [tape](https://www.npmjs.com/package/tape) and [AVA](https://www.npmjs.com/package/ava).     4      4     5       * **Simple:** Works in Node and browsers, simply import or require it to use. API is very similar to tape and AVA. 100% test coverage.     6       * **Concurrent:** All asynchronous tests are run concurrently. Forces to write isolated from each other test cases that don't share a global state.     7       * **Useful Features:** Synchronous and asynchronous tests, support for Promises, before/after/beforeEach/afterEach hooks, clean stacktraces.            5- **Simple:** Works in Node and browsers, simply import or require it to use. API is very similar to tape and AVA. 100% test coverage.            6- **Concurrent:** All asynchronous tests are run concurrently. Forces to write isolated from each other test cases that don't share a global state.            7- **Useful Features:** Synchronous and asynchronous tests, support for Promises, before/after/beforeEach/afterEach hooks, clean stacktraces.     8      8     9      9## USAGE    10     10    11     11```js    12       import createSuite from 'estap';    13       const test = createSuite();    14           15       test('add', t => {    16         t.is(add(1, 2), 3, '1 + 2 === 3');    17       });    18           19       test('delay promise', t => new Promise(resolve => {    20         t.pass('setting a timeout');    21         setTimeout(resolve, 1000);    22       }));    23           24       test.cb('delay callback', t => {    25         t.pass('setting a timeout');           12import createSuite from "estap";           13const test = createSuite();           14           15test("add", (t) => {           16  t.is(add(1, 2), 3, "1 + 2 === 3");           17});           18           19test("delay promise", (t) =>           20  new Promise((resolve) => {           21    t.pass("setting a timeout");           22    setTimeout(resolve, 1000);           23  }));           24           25test.cb("delay callback", (t) => {           26  t.pass("setting a timeout");    26     27  setTimeout(t.end, 1000);    27     28});    28     29```             @@ -117,23 +118,22 @@   117    118Everything runs concurrently in the same Node process/browser context. However it's possible to synchronize access to any shared resource using locks.   118    119   119    120```js   120       import { default as createSuite, createLock } from 'estap';          121import { default as createSuite, createLock } from "estap";   121    122const test = createSuite();   122    123const lock = createLock();   123    124   124       test.beforeEach('setup database', t => {   125         return lock.acquire()   126           .then(() => t.pass('resetting database...'));   127       });   128          129       test.afterEach('release database', lock.release);          125test.beforeEach("setup database", (t) => {          126  return lock.acquire().then(() => t.pass("resetting database..."));          127});          128          129test.afterEach("release database", lock.release);   130    130```   131    131   132    132### Thanks to   133    133   134       * @substack for [tape](https://www.npmjs.com/package/tape), tap-producing test harness for node and browsers, source for many ideas.   135          136       * @sindresorhus and AVA team for [AVA](https://github.com/avajs/ava), Futuristic JavaScript test runner, source for many ideas.          134- @substack for [tape](https://www.npmjs.com/package/tape), tap-producing test harness for node and browsers, source for many ideas.          135          136- @sindresorhus and AVA team for [AVA](https://github.com/avajs/ava), Futuristic JavaScript test runner, source for many ideas.   137    137   138    138### License   139    139
example/example.js+13 -12
             @@ -1,4 +1,4 @@     1       import estap from '../lib';            1import estap from "../lib";     2      2     3      3const test = estap();     4      4             @@ -6,16 +6,17 @@     6      6  return a + b;     7      7}     8      8     9       test('add', t => {    10         t.is(add(1, 2), 3, '1 + 2 === 3');    11       });    12           13       test('delay promise', t => new Promise(resolve => {    14         t.pass('setting a timeout');    15         setTimeout(resolve, 1000);    16       }));    17           18       test.cb('delay callback', t => {    19         t.pass('setting a timeout');            9test("add", (t) => {           10  t.is(add(1, 2), 3, "1 + 2 === 3");           11});           12           13test("delay promise", (t) =>           14  new Promise((resolve) => {           15    t.pass("setting a timeout");           16    setTimeout(resolve, 1000);           17  }));           18           19test.cb("delay callback", (t) => {           20  t.pass("setting a timeout");    20     21  setTimeout(t.end, 1000);    21     22});
example/serial.js+13 -12
             @@ -1,17 +1,18 @@     1       import { default as createSuite, createLock } from '../lib';            1import { default as createSuite, createLock } from "../lib";     2      2     3      3const test = createSuite();     4      4const lock = createLock();     5      5     6       test.beforeEach('setup database', t => lock.acquire()     7         .then(() => t.pass('resetting database...')));     8            9       test.afterEach('release database', lock.release);    10           11       test('use db 1', t => {    12         t.pass('use database 1');    13       });    14           15       test('use db 2', t => {    16         t.pass('use database 2');            6test.beforeEach("setup database", (t) =>            7  lock.acquire().then(() => t.pass("resetting database...")),            8);            9           10test.afterEach("release database", lock.release);           11           12test("use db 1", (t) => {           13  t.pass("use database 1");           14});           15           16test("use db 2", (t) => {           17  t.pass("use database 2");    17     18});
lib/assert.js+261 -238
             @@ -1,9 +1,9 @@     1       import deepEqual from 'deep-equal';     2       import objectAssign from 'object-assign';     3       import { extractErrorStack } from './stack-filter';            1import deepEqual from "deep-equal";            2import objectAssign from "object-assign";            3import { extractErrorStack } from "./stack-filter";     4      4     5      5function isValidPlan(value) {     6         return typeof value === 'number' && Math.floor(value) === value && value > 0;            6  return typeof value === "number" && Math.floor(value) === value && value > 0;     7      7}     8      8     9      9export default function (test, testOpts, context = null) {             @@ -15,25 +15,30 @@    15     15  const afterFns = [];    16     16    17     17  const assert = function ESTAP_ASSERT__(value, opts) {    18           if (ended && opts.op !== 'end') {           18    if (ended && opts.op !== "end") {    19     19      // throw here because it can happen later after the test completion    20             throw new Error('assertion after end');           20      throw new Error("assertion after end");    21     21    }    22     22    23     23    if (!value) {    24     24      ++testOpts.assertionCount;    25     25      ++testOpts.assertionFailed;    26             testOpts.log(objectAssign({    27               type: 'error',    28               test: test.name,    29               stack: extractErrorStack(new Error()),    30             }, opts));           26      testOpts.log(           27        objectAssign(           28          {           29            type: "error",           30            test: test.name,           31            stack: extractErrorStack(new Error()),           32          },           33          opts,           34        ),           35      );    31     36    } else {    32     37      ++count;    33     38      ++testOpts.assertionCount;    34             testOpts.log({ type: 'ok', test: test.name, message: opts.message });    35           36             if (test.type === 'cb' && count === plan) {           39      testOpts.log({ type: "ok", test: test.name, message: opts.message });           40           41      if (test.type === "cb" && count === plan) {    37     42        assertEnd();    38     43      }    39     44    }             @@ -40,15 +45,15 @@    40     45  };    41     46    42     47  function testEnd() {    43           afterFns.forEach(fn => fn());           48    afterFns.forEach((fn) => fn());    44     49    45     50    if (plan > 0 && count !== plan) {    46     51      ++testOpts.assertionCount;    47     52      ++testOpts.assertionFailed;    48     53      testOpts.log({    49               type: 'error',    50               op: 'plan',    51               message: 'assertions count does not match plan',           54        type: "error",           55        op: "plan",           56        message: "assertions count does not match plan",    52     57        actual: count,    53     58        expected: plan,    54     59        test: test.name,             @@ -62,10 +67,10 @@    62     67  }    63     68    64     69  function assertEnd(val) {    65           if (test.type !== 'cb') {    66             assert(false, {    67               message: 'only callback tests require end',    68               op: 'end',           70    if (test.type !== "cb") {           71      assert(false, {           72        message: "only callback tests require end",           73        op: "end",    69     74      });    70     75      return;    71     76    }             @@ -72,8 +77,8 @@    72     77    73     78    if (ended) {    74     79      assert(false, {    75               message: 'end called multiple times',    76               op: 'end',           80        message: "end called multiple times",           81        op: "end",    77     82      });    78     83      return;    79     84    }             @@ -82,9 +87,9 @@    82     87    83     88    if (val) {    84     89      assert(false, {    85               message: 'end value should be falsy',           90        message: "end value should be falsy",    86     91        actual: val,    87               op: 'end',           92        op: "end",    88     93      });    89     94    }    90     95             @@ -92,217 +97,235 @@    92     97    onEndHandler();    93     98  }    94     99    95         return [{    96           plan(num) {    97             if (!isValidPlan(num)) {    98               assert(false, {    99                 message: 'plan value is not a positive integer',   100                 actual: num,   101                 op: 'plan',   102               });   103               return;   104             }   105          106             if (plan > 0) {   107               assert(false, {   108                 message: 'plan can only be set once',   109                 op: 'plan',   110               });   111               return;   112             }   113          114             plan = num;   115           },   116           end: assertEnd,   117           pass(message) {   118             assert(true, {   119               message: message || 'pass',   120               actual: null,   121               expected: null,   122               op: 'fail',   123             });   124           },   125           fail(message) {   126             assert(false, {   127               message: message || 'fail',   128               actual: null,   129               expected: null,   130               op: 'fail',   131             });   132           },   133           is(actual, expected, message) {   134             assert(actual === expected, {   135               message: message || 'is',   136               actual,   137               expected,   138               op: 'is',   139             });   140           },   141           not(actual, expected, message) {   142             assert(actual !== expected, {   143               message: message || 'not',   144               actual,   145               expected,   146               op: 'not',   147             });   148           },   149           truthy(actual, message) {   150             assert(actual, {   151               message: message || 'truthy',   152               actual,   153               expected: null,   154               op: 'truthy',   155             });   156           },   157           falsy(actual, message) {   158             assert(!actual, {   159               message: message || 'falsy',   160               actual,   161               expected: null,   162               op: 'falsy',   163             });   164           },   165           true(actual, message) {   166             assert(actual === true, {   167               message: message || 'true',   168               actual,   169               expected: true,   170               op: 'true',   171             });   172           },   173           false(actual, message) {   174             assert(actual === false, {   175               message: message || 'false',   176               actual,   177               expected: false,   178               op: 'false',   179             });   180           },   181           throws(fn, expectedArg, messageArg) {   182             let expected = expectedArg;   183             let message = messageArg;   184             if (typeof expectedArg === 'string') {   185               expected = void 0;   186               message = expectedArg;   187             }   188          189             try {   190               fn();   191             } catch (err) {   192               if (typeof expected === 'undefined') {   193                 assert(true, {   194                   message: message || 'throws',   195                   actual: err.constructor,   196                   expected,   197                   op: 'throws',   198                 });   199                 return;   200               }   201          202               if (typeof expected === 'function') {   203                 assert(err instanceof expected, {   204                   message: message || 'throws',   205                   actual: err.constructor,   206                   expected,   207                   op: 'throws',   208                 });   209                 return;   210               }   211          212               if (expected instanceof RegExp) {   213                 assert(expected.test(String(err)), {   214                   message: message || 'throws',   215                   actual: String(err),   216                   expected,   217                   op: 'throws',   218                 });   219                 return;   220               }   221          222               if (Array.isArray(expected) && expected.length === 2 && (expected[1] instanceof RegExp)) {   223                 assert((err instanceof expected[0]) && expected[1].test(String(err)), {   224                   message: message || 'throws',   225                   actual: [err.constructor, String(err)],   226                   expected,   227                   op: 'throws',   228                 });   229                 return;   230               }   231          232               if (Array.isArray(expected) && expected.length === 2 && (typeof expected[1] === 'string')) {   233                 assert((err instanceof expected[0]) && expected[1] === String(err.message), {   234                   message: message || 'throws',   235                   actual: [err.constructor, String(err.message)],   236                   expected,   237                   op: 'throws',   238                 });   239                 return;   240               }   241          242               assert(false, {   243                 message: message || 'throws',   244                 op: 'throws',   245                 actual: err,   246                 expected,   247               });   248               return;   249             }   250          251             if (typeof expected === 'undefined') {   252               assert(false, {   253                 message: message || 'throws',   254                 op: 'throws',   255               });   256             } else {   257               assert(false, {   258                 message: message || 'throws',   259                 expected,   260                 op: 'throws',   261               });   262             }   263           },   264           notThrows(fn, message) {   265             try {   266               fn();          100  return [          101    {          102      plan(num) {          103        if (!isValidPlan(num)) {          104          assert(false, {          105            message: "plan value is not a positive integer",          106            actual: num,          107            op: "plan",          108          });          109          return;          110        }          111          112        if (plan > 0) {          113          assert(false, {          114            message: "plan can only be set once",          115            op: "plan",          116          });          117          return;          118        }          119          120        plan = num;          121      },          122      end: assertEnd,          123      pass(message) {   267    124        assert(true, {   268                 message: message || 'notThrows',   269                 op: 'notThrows',   270               });   271             } catch (err) {   272               assert(false, {   273                 message: message || 'notThrows',   274                 actual: err,   275                 op: 'notThrows',   276               });   277             }   278           },   279           same(actual, expected, message) {   280             assert(deepEqual(actual, expected, { strict: true }), {   281               message: message || 'same',   282               actual,   283               expected,   284               op: 'same',   285             });   286           },   287           notSame(actual, expected, message) {   288             assert(!deepEqual(actual, expected, { strict: true }), {   289               message: message || 'notSame',   290               actual,   291               expected,   292               op: 'notSame',   293             });   294           },   295           after(fn) {   296             if (typeof fn !== 'function') {   297               assert(false, {   298                 message: 'after() argument 0 is not a function',   299                 op: 'after',   300               });   301               return;   302             }   303          304             afterFns.push(fn);   305           },   306           context,   307         }, testEnd, setOnEndHandler];          125          message: message || "pass",          126          actual: null,          127          expected: null,          128          op: "fail",          129        });          130      },          131      fail(message) {          132        assert(false, {          133          message: message || "fail",          134          actual: null,          135          expected: null,          136          op: "fail",          137        });          138      },          139      is(actual, expected, message) {          140        assert(actual === expected, {          141          message: message || "is",          142          actual,          143          expected,          144          op: "is",          145        });          146      },          147      not(actual, expected, message) {          148        assert(actual !== expected, {          149          message: message || "not",          150          actual,          151          expected,          152          op: "not",          153        });          154      },          155      truthy(actual, message) {          156        assert(actual, {          157          message: message || "truthy",          158          actual,          159          expected: null,          160          op: "truthy",          161        });          162      },          163      falsy(actual, message) {          164        assert(!actual, {          165          message: message || "falsy",          166          actual,          167          expected: null,          168          op: "falsy",          169        });          170      },          171      true(actual, message) {          172        assert(actual === true, {          173          message: message || "true",          174          actual,          175          expected: true,          176          op: "true",          177        });          178      },          179      false(actual, message) {          180        assert(actual === false, {          181          message: message || "false",          182          actual,          183          expected: false,          184          op: "false",          185        });          186      },          187      throws(fn, expectedArg, messageArg) {          188        let expected = expectedArg;          189        let message = messageArg;          190        if (typeof expectedArg === "string") {          191          expected = void 0;          192          message = expectedArg;          193        }          194          195        try {          196          fn();          197        } catch (err) {          198          if (typeof expected === "undefined") {          199            assert(true, {          200              message: message || "throws",          201              actual: err.constructor,          202              expected,          203              op: "throws",          204            });          205            return;          206          }          207          208          if (typeof expected === "function") {          209            assert(err instanceof expected, {          210              message: message || "throws",          211              actual: err.constructor,          212              expected,          213              op: "throws",          214            });          215            return;          216          }          217          218          if (expected instanceof RegExp) {          219            assert(expected.test(String(err)), {          220              message: message || "throws",          221              actual: String(err),          222              expected,          223              op: "throws",          224            });          225            return;          226          }          227          228          if (          229            Array.isArray(expected) &&          230            expected.length === 2 &&          231            expected[1] instanceof RegExp          232          ) {          233            assert(          234              err instanceof expected[0] && expected[1].test(String(err)),          235              {          236                message: message || "throws",          237                actual: [err.constructor, String(err)],          238                expected,          239                op: "throws",          240              },          241            );          242            return;          243          }          244          245          if (          246            Array.isArray(expected) &&          247            expected.length === 2 &&          248            typeof expected[1] === "string"          249          ) {          250            assert(          251              err instanceof expected[0] && expected[1] === String(err.message),          252              {          253                message: message || "throws",          254                actual: [err.constructor, String(err.message)],          255                expected,          256                op: "throws",          257              },          258            );          259            return;          260          }          261          262          assert(false, {          263            message: message || "throws",          264            op: "throws",          265            actual: err,          266            expected,          267          });          268          return;          269        }          270          271        if (typeof expected === "undefined") {          272          assert(false, {          273            message: message || "throws",          274            op: "throws",          275          });          276        } else {          277          assert(false, {          278            message: message || "throws",          279            expected,          280            op: "throws",          281          });          282        }          283      },          284      notThrows(fn, message) {          285        try {          286          fn();          287          assert(true, {          288            message: message || "notThrows",          289            op: "notThrows",          290          });          291        } catch (err) {          292          assert(false, {          293            message: message || "notThrows",          294            actual: err,          295            op: "notThrows",          296          });          297        }          298      },          299      same(actual, expected, message) {          300        assert(deepEqual(actual, expected, { strict: true }), {          301          message: message || "same",          302          actual,          303          expected,          304          op: "same",          305        });          306      },          307      notSame(actual, expected, message) {          308        assert(!deepEqual(actual, expected, { strict: true }), {          309          message: message || "notSame",          310          actual,          311          expected,          312          op: "notSame",          313        });          314      },          315      after(fn) {          316        if (typeof fn !== "function") {          317          assert(false, {          318            message: "after() argument 0 is not a function",          319            op: "after",          320          });          321          return;          322        }          323          324        afterFns.push(fn);          325      },          326      context,          327    },          328    testEnd,          329    setOnEndHandler,          330  ];   308    331}
lib/index.js+20 -17
             @@ -1,13 +1,13 @@     1       import serialize from 'serialize-access';     2       import createRunner from './runner';     3       import tapReporter from './reporter/tap';     4       import { filterError } from './stack-filter';            1import serialize from "serialize-access";            2import createRunner from "./runner";            3import tapReporter from "./reporter/tap";            4import { filterError } from "./stack-filter";     5      5     6      6const runner = createRunner();     7      7const actuallyRun = runner.run;     8      8let shouldAutorun = true;     9      9    10       runner.run = opts => {           10runner.run = (opts) => {    11     11  shouldAutorun = false;    12     12  return actuallyRun(opts);    13     13};             @@ -19,7 +19,7 @@    19     19runner.tapReporter = tapReporter;    20     20    21     21function autorun() {    22         const fn = global.setImmediate || (cb => global.setTimeout(cb, 0));           22  const fn = global.setImmediate || ((cb) => global.setTimeout(cb, 0));    23     23  let done = false;    24     24  let result = false;    25     25  fn(() => {             @@ -31,8 +31,8 @@    31     31      return;    32     32    }    33     33    34           if (global.process && typeof global.process.exit === 'function') {    35             process.on('exit', code => {           34    if (global.process && typeof global.process.exit === "function") {           35      process.on("exit", (code) => {    36     36        if (code !== 0) {    37     37          return;    38     38        }             @@ -44,7 +44,7 @@    44     44        process.exit(result ? 0 : 1);    45     45      });    46     46    47             process.on('uncaughtException', err => {           47      process.on("uncaughtException", (err) => {    48     48        console.error(filterError(err));    49     49        process.exit(1);    50     50      });             @@ -63,14 +63,17 @@    63     63    }    64     64    */    65     65    66           runner.run({    67             log: tapReporter({ log: console.log.bind(console) }),    68           }).then(ok => {    69             result = ok;    70             done = true;    71           }).catch(() => {    72             // Error being thrown earlier    73           });           66    runner           67      .run({           68        log: tapReporter({ log: console.log.bind(console) }),           69      })           70      .then((ok) => {           71        result = ok;           72        done = true;           73      })           74      .catch(() => {           75        // Error being thrown earlier           76      });    74     77  });    75     78}    76     79
lib/run-test.js+14 -13
             @@ -1,6 +1,6 @@     1      1/* eslint-disable no-underscore-dangle, new-cap */     2       import Promise from 'bluebird';     3       import { extractErrorStack } from './stack-filter';            2import Promise from "bluebird";            3import { extractErrorStack } from "./stack-filter";     4      4     5      5function ESTAP_TEST__(fn, t) {     6      6  return fn(t);             @@ -10,24 +10,25 @@    10     10  if (test.skip) {    11     11    ++testOpts.testsSkipped;    12     12    testOpts.log({    13             type: 'skip',           13      type: "skip",    14     14      test: test.name,    15     15    });    16     16    return Promise.resolve();    17     17  }    18     18    19         if (test.type === 'default') {           19  if (test.type === "default") {    20     20    const res = ESTAP_TEST__(test.fn, t);    21     21    22           if (Object(res) === res && typeof res.then === 'function') {    23             return res.then(() => void end())    24               .catch(e => {           22    if (Object(res) === res && typeof res.then === "function") {           23      return res           24        .then(() => void end())           25        .catch((e) => {    25     26          ++testOpts.assertionCount;    26     27          ++testOpts.assertionFailed;    27     28          testOpts.log({    28                   type: 'error',    29                   op: 'reject',    30                   message: 'promise rejection',           29            type: "error",           30            op: "reject",           31            message: "promise rejection",    31     32            actual: e,    32     33            test: test.name,    33     34            stack: extractErrorStack(e),             @@ -41,8 +42,8 @@    41     42    return Promise.resolve();    42     43  }    43     44    44         if (test.type === 'cb') {    45           return new Promise(resolve => {           45  if (test.type === "cb") {           46    return new Promise((resolve) => {    46     47      setOnEndHandler(() => {    47     48        resolve();    48     49      });             @@ -51,5 +52,5 @@    51     52    });    52     53  }    53     54    54         throw new Error('unknown test type');           55  throw new Error("unknown test type");    55     56}
lib/runner.js+174 -86
             @@ -1,9 +1,9 @@     1       import Promise from 'bluebird';     2       import Map from 'es6-map';     3       import Set from 'es6-set';     4       import objectAssign from 'object-assign';     5       import runTest from './run-test';     6       import createAssert from './assert';            1import Promise from "bluebird";            2import Map from "es6-map";            3import Set from "es6-set";            4import objectAssign from "object-assign";            5import runTest from "./run-test";            6import createAssert from "./assert";     7      7     8      8export default function () {     9      9  const tests = new Map();             @@ -24,7 +24,7 @@    24     24    testData[test.role].push(test);    25     25  }    26     26    27         function createTest(unitName = '') {           27  function createTest(unitName = "") {    28     28    const test = {    29     29      name: String(unitName),    30     30    };             @@ -33,7 +33,7 @@    33     33      let name = defaultName;    34     34      let fn = null;    35     35    36             if (typeof a === 'string') {           36      if (typeof a === "string") {    37     37        name = a;    38     38        fn = b;    39     39      } else {             @@ -49,17 +49,17 @@    49     49        name,    50     50        fn,    51     51        type: opts.type,    52               role: opts.role || 'test',           52        role: opts.role || "test",    53     53        skip: opts.skip || false,    54     54        only: opts.only || false,    55     55      });    56     56    }    57     57    58           const defaultName = '(unnamed)';    59           const defaultNameBefore = 'before';    60           const defaultNameAfter = 'after';    61           const defaultNameBeforeEach = 'beforeEach';    62           const defaultNameAfterEach = 'afterEach';           58    const defaultName = "(unnamed)";           59    const defaultNameBefore = "before";           60    const defaultNameAfter = "after";           61    const defaultNameBeforeEach = "beforeEach";           62    const defaultNameAfterEach = "afterEach";    63     63    64     64    // test()    65     65    // test.only()             @@ -83,35 +83,97 @@    83     83    // test.after.skip()    84     84    // test.before.cb.skip()    85     85    // test.after.cb.skip()    86           const defineTest = (a, b) => setupTest(a, b, defaultName, { type: 'default' });    87           defineTest.only = (a, b) => setupTest(a, b, defaultName, { type: 'default', only: true });    88           defineTest.skip = (a, b) => setupTest(a, b, defaultName, { type: 'default', skip: true });    89           defineTest.cb = (a, b) => setupTest(a, b, defaultName, { type: 'cb' });    90           defineTest.cb.only = (a, b) => setupTest(a, b, defaultName, { type: 'cb', only: true });    91           defineTest.cb.skip = (a, b) => setupTest(a, b, defaultName, { type: 'cb', skip: true });    92           defineTest.beforeEach = (a, b) => setupTest(a, b, defaultNameBeforeEach, { type: 'default', role: 'beforeEach' });    93           defineTest.afterEach = (a, b) => setupTest(a, b, defaultNameAfterEach, { type: 'default', role: 'afterEach' });    94           defineTest.beforeEach.cb = (a, b) => setupTest(a, b, defaultNameBeforeEach, { type: 'cb', role: 'beforeEach' });    95           defineTest.afterEach.cb = (a, b) => setupTest(a, b, defaultNameAfterEach, { type: 'cb', role: 'afterEach' });    96           defineTest.before = (a, b) => setupTest(a, b, defaultNameBefore, { type: 'default', role: 'before' });    97           defineTest.after = (a, b) => setupTest(a, b, defaultNameAfter, { type: 'default', role: 'after' });    98           defineTest.before.cb = (a, b) => setupTest(a, b, defaultNameBefore, { type: 'cb', role: 'before' });    99           defineTest.after.cb = (a, b) => setupTest(a, b, defaultNameAfter, { type: 'cb', role: 'after' });   100           defineTest.beforeEach.skip = (a, b) => setupTest(a, b, defaultNameBeforeEach, { type: 'default', role: 'beforeEach', skip: true });   101           defineTest.afterEach.skip = (a, b) => setupTest(a, b, defaultNameAfterEach, { type: 'default', role: 'afterEach', skip: true });   102           defineTest.beforeEach.cb.skip = (a, b) => setupTest(a, b, defaultNameBeforeEach, { type: 'cb', role: 'beforeEach', skip: true });   103           defineTest.afterEach.cb.skip = (a, b) => setupTest(a, b, defaultNameAfterEach, { type: 'cb', role: 'afterEach', skip: true });   104           defineTest.before.skip = (a, b) => setupTest(a, b, defaultNameBefore, { type: 'default', role: 'before', skip: true });   105           defineTest.after.skip = (a, b) => setupTest(a, b, defaultNameAfter, { type: 'default', role: 'after', skip: true });   106           defineTest.before.cb.skip = (a, b) => setupTest(a, b, defaultNameBefore, { type: 'cb', role: 'before', skip: true });   107           defineTest.after.cb.skip = (a, b) => setupTest(a, b, defaultNameAfter, { type: 'cb', role: 'after', skip: true });           86    const defineTest = (a, b) =>           87      setupTest(a, b, defaultName, { type: "default" });           88    defineTest.only = (a, b) =>           89      setupTest(a, b, defaultName, { type: "default", only: true });           90    defineTest.skip = (a, b) =>           91      setupTest(a, b, defaultName, { type: "default", skip: true });           92    defineTest.cb = (a, b) => setupTest(a, b, defaultName, { type: "cb" });           93    defineTest.cb.only = (a, b) =>           94      setupTest(a, b, defaultName, { type: "cb", only: true });           95    defineTest.cb.skip = (a, b) =>           96      setupTest(a, b, defaultName, { type: "cb", skip: true });           97    defineTest.beforeEach = (a, b) =>           98      setupTest(a, b, defaultNameBeforeEach, {           99        type: "default",          100        role: "beforeEach",          101      });          102    defineTest.afterEach = (a, b) =>          103      setupTest(a, b, defaultNameAfterEach, {          104        type: "default",          105        role: "afterEach",          106      });          107    defineTest.beforeEach.cb = (a, b) =>          108      setupTest(a, b, defaultNameBeforeEach, {          109        type: "cb",          110        role: "beforeEach",          111      });          112    defineTest.afterEach.cb = (a, b) =>          113      setupTest(a, b, defaultNameAfterEach, { type: "cb", role: "afterEach" });          114    defineTest.before = (a, b) =>          115      setupTest(a, b, defaultNameBefore, { type: "default", role: "before" });          116    defineTest.after = (a, b) =>          117      setupTest(a, b, defaultNameAfter, { type: "default", role: "after" });          118    defineTest.before.cb = (a, b) =>          119      setupTest(a, b, defaultNameBefore, { type: "cb", role: "before" });          120    defineTest.after.cb = (a, b) =>          121      setupTest(a, b, defaultNameAfter, { type: "cb", role: "after" });          122    defineTest.beforeEach.skip = (a, b) =>          123      setupTest(a, b, defaultNameBeforeEach, {          124        type: "default",          125        role: "beforeEach",          126        skip: true,          127      });          128    defineTest.afterEach.skip = (a, b) =>          129      setupTest(a, b, defaultNameAfterEach, {          130        type: "default",          131        role: "afterEach",          132        skip: true,          133      });          134    defineTest.beforeEach.cb.skip = (a, b) =>          135      setupTest(a, b, defaultNameBeforeEach, {          136        type: "cb",          137        role: "beforeEach",          138        skip: true,          139      });          140    defineTest.afterEach.cb.skip = (a, b) =>          141      setupTest(a, b, defaultNameAfterEach, {          142        type: "cb",          143        role: "afterEach",          144        skip: true,          145      });          146    defineTest.before.skip = (a, b) =>          147      setupTest(a, b, defaultNameBefore, {          148        type: "default",          149        role: "before",          150        skip: true,          151      });          152    defineTest.after.skip = (a, b) =>          153      setupTest(a, b, defaultNameAfter, {          154        type: "default",          155        role: "after",          156        skip: true,          157      });          158    defineTest.before.cb.skip = (a, b) =>          159      setupTest(a, b, defaultNameBefore, {          160        type: "cb",          161        role: "before",          162        skip: true,          163      });          164    defineTest.after.cb.skip = (a, b) =>          165      setupTest(a, b, defaultNameAfter, {          166        type: "cb",          167        role: "after",          168        skip: true,          169      });   108    170   109    171    return defineTest;   110    172  }   111    173   112    174  createTest.run = (opts = {}) => {   113           if (typeof opts.log !== 'function') {   114             throw new Error('.log function required');          175    if (typeof opts.log !== "function") {          176      throw new Error(".log function required");   115    177    }   116    178   117    179    const testOpts = {             @@ -122,57 +184,83 @@   122    184      pendingTests: new Set(),   123    185    };   124    186   125           return Promise.map(tests.keys(), testObj => {          187    return Promise.map(tests.keys(), (testObj) => {   126    188      const testData = tests.get(testObj);   127    189   128    190      return Promise.resolve()   129               .then(() => Promise.mapSeries(testData.before, test => runTest(createAssert(test, testOpts), test, testOpts)))   130               .then(() => Promise.map(testData.test, test => {   131                 const context = {};   132                 function setupHookTest(hookTest) {   133                   return objectAssign({}, hookTest, {   134                     name: `${test.name} > ${hookTest.name}`,   135                     skip: test.skip || hookTest.skip,   136                   });   137                 }   138          139                 if (onlyTestCount > 0 && !test.only) {   140                   return Promise.resolve();   141                 }   142          143                 return Promise.resolve()   144                   .then(() => (Promise.mapSeries(testData.beforeEach, hookTest => {   145                     const updatedTest = setupHookTest(hookTest);   146                     return runTest(createAssert(updatedTest, testOpts, context), updatedTest, testOpts);   147                   })))   148                   .then(() => runTest(createAssert(test, testOpts, context), test, testOpts))   149                   .then(() => (Promise.mapSeries(testData.afterEach, hookTest => {   150                     const updatedTest = setupHookTest(hookTest);   151                     return runTest(createAssert(updatedTest, testOpts, context), updatedTest, testOpts);   152                   })));   153               }))   154               .then(() => Promise.mapSeries(testData.after, test => runTest(createAssert(test, testOpts), test, testOpts)));   155           }).then(() => {   156             const total = testOpts.assertionCount + testOpts.testsSkipped;   157             testOpts.log({   158               type: 'done',   159               count: total,   160               ok: testOpts.assertionCount - testOpts.assertionFailed,   161               error: testOpts.assertionFailed,   162               skip: testOpts.testsSkipped,   163               only: onlyTestCount,   164             });   165             if (testOpts.assertionFailed > 0 || onlyTestCount > 0) {   166               return Promise.resolve(false);   167             }   168          169             return Promise.resolve(true);   170           }).catch(err => {   171             setTimeout(() => {   172               throw err;   173             }, 0);   174             return Promise.reject();   175           });          191        .then(() =>          192          Promise.mapSeries(testData.before, (test) =>          193            runTest(createAssert(test, testOpts), test, testOpts),          194          ),          195        )          196        .then(() =>          197          Promise.map(testData.test, (test) => {          198            const context = {};          199            function setupHookTest(hookTest) {          200              return objectAssign({}, hookTest, {          201                name: `${test.name} > ${hookTest.name}`,          202                skip: test.skip || hookTest.skip,          203              });          204            }          205          206            if (onlyTestCount > 0 && !test.only) {          207              return Promise.resolve();          208            }          209          210            return Promise.resolve()          211              .then(() =>          212                Promise.mapSeries(testData.beforeEach, (hookTest) => {          213                  const updatedTest = setupHookTest(hookTest);          214                  return runTest(          215                    createAssert(updatedTest, testOpts, context),          216                    updatedTest,          217                    testOpts,          218                  );          219                }),          220              )          221              .then(() =>          222                runTest(createAssert(test, testOpts, context), test, testOpts),          223              )          224              .then(() =>          225                Promise.mapSeries(testData.afterEach, (hookTest) => {          226                  const updatedTest = setupHookTest(hookTest);          227                  return runTest(          228                    createAssert(updatedTest, testOpts, context),          229                    updatedTest,          230                    testOpts,          231                  );          232                }),          233              );          234          }),          235        )          236        .then(() =>          237          Promise.mapSeries(testData.after, (test) =>          238            runTest(createAssert(test, testOpts), test, testOpts),          239          ),          240        );          241    })          242      .then(() => {          243        const total = testOpts.assertionCount + testOpts.testsSkipped;          244        testOpts.log({          245          type: "done",          246          count: total,          247          ok: testOpts.assertionCount - testOpts.assertionFailed,          248          error: testOpts.assertionFailed,          249          skip: testOpts.testsSkipped,          250          only: onlyTestCount,          251        });          252        if (testOpts.assertionFailed > 0 || onlyTestCount > 0) {          253          return Promise.resolve(false);          254        }          255          256        return Promise.resolve(true);          257      })          258      .catch((err) => {          259        setTimeout(() => {          260          throw err;          261        }, 0);          262        return Promise.reject();          263      });   176    264  };   177    265   178    266  createTest.hasTests = () => tests.size > 0;
lib/stack-filter.js+8 -6
             @@ -1,14 +1,14 @@     1       import objectInspect from 'object-inspect';            1import objectInspect from "object-inspect";     2      2     3      3function filterImpl(stack) {     4         const lines = String(stack).split('\n');            4  const lines = String(stack).split("\n");     5      5  const filtered = [];     6      6  for (let i = 0; i < lines.length; ++i) {     7           if (lines[i].indexOf('ESTAP_TEST__') >= 0) {            7    if (lines[i].indexOf("ESTAP_TEST__") >= 0) {     8      8      break;     9      9    }    10     10    11           if (lines[i].indexOf('ESTAP_ASSERT__') >= 0) {           11    if (lines[i].indexOf("ESTAP_ASSERT__") >= 0) {    12     12      i++;    13     13      continue;    14     14    }             @@ -21,7 +21,7 @@    21     21    22     22export function filterError(err) {    23     23  if (err instanceof Error) {    24           return filterImpl(err.stack).join('\n');           24    return filterImpl(err.stack).join("\n");    25     25  }    26     26    27     27  return `Uncaught exception: ${objectInspect(err)}`;             @@ -29,7 +29,9 @@    29     29    30     30export function extractErrorStack(err) {    31     31  if (err instanceof Error) {    32           return filterImpl(err.stack).map(s => s.trim()).slice(1);           32    return filterImpl(err.stack)           33      .map((s) => s.trim())           34      .slice(1);    33     35  }    34     36    35     37  return [];
lib/reporter/json.js+8 -7
             @@ -1,11 +1,12 @@     1      1export default function ({ log }) {     2         return obj => {     3           if (obj.type === 'error') {     4             log(JSON.stringify(obj, null, 2)     5               .replace(/"(actual)":/gm, '"$1"  :')     6               .replace(/"(op)":/gm, '"$1"      :')     7               .replace(/"(type)":/gm, '"$1"    :')     8               .replace(/"(message)":/gm, '"$1" :')            2  return (obj) => {            3    if (obj.type === "error") {            4      log(            5        JSON.stringify(obj, null, 2)            6          .replace(/"(actual)":/gm, '"$1"  :')            7          .replace(/"(op)":/gm, '"$1"      :')            8          .replace(/"(type)":/gm, '"$1"    :')            9          .replace(/"(message)":/gm, '"$1" :'),     9     10      );    10     11      return;    11     12    }
lib/reporter/tap.js+32 -30
             @@ -1,8 +1,8 @@     1       import YAML from 'yamljs';     2       import objectInspect from 'object-inspect';            1import YAML from "yamljs";            2import objectInspect from "object-inspect";     3      3     4      4function inspect(obj) {     5         if (typeof obj === 'string') {            5  if (typeof obj === "string") {     6      6    return `(string) ${obj}`;     7      7  }     8      8             @@ -11,61 +11,63 @@    11     11    12     12export default function ({ log }) {    13     13  let assertionCount = 0;    14         log('TAP version 13');    15           16         return obj => {    17           if (obj.type === 'ok') {           14  log("TAP version 13");           15           16  return (obj) => {           17    if (obj.type === "ok") {    18     18      log(`ok ${++assertionCount} ${obj.test} > ${obj.message}`);    19     19      return;    20     20    }    21     21    22           if (obj.type === 'error') {           22    if (obj.type === "error") {    23     23      log(`not ok ${++assertionCount} ${obj.test} > ${obj.message}`);    24             log('  ---');           24      log("  ---");    25     25    26     26      const yamlData = {};    27     27    28             if ({}.hasOwnProperty.call(obj, 'op')) {           28      if ({}.hasOwnProperty.call(obj, "op")) {    29     29        yamlData.op = obj.op;    30     30      }    31     31    32             if ({}.hasOwnProperty.call(obj, 'actual')) {           32      if ({}.hasOwnProperty.call(obj, "actual")) {    33     33        yamlData.actual = inspect(obj.actual);    34     34      }    35     35    36             if ({}.hasOwnProperty.call(obj, 'expected')) {           36      if ({}.hasOwnProperty.call(obj, "expected")) {    37     37        yamlData.expected = inspect(obj.expected);    38     38      }    39     39    40             if ({}.hasOwnProperty.call(obj, 'stack') && obj.stack.length > 0) {           40      if ({}.hasOwnProperty.call(obj, "stack") && obj.stack.length > 0) {    41     41        yamlData.stack = obj.stack;    42     42      }    43     43    44     44      const yaml = YAML.stringify(yamlData, 2, 2)    45               .replace(/^actual:\s/m, 'actual:   ')    46               .replace(/^op:\s/m, 'op:       ')    47               .replace(/^at:\s/m, 'at:       ')    48               .split('\n')           45        .replace(/^actual:\s/m, "actual:   ")           46        .replace(/^op:\s/m, "op:       ")           47        .replace(/^at:\s/m, "at:       ")           48        .split("\n")    49     49        .slice(0, -1)    50               .map(v => `    ${v}`)    51               .join('\n');           50        .map((v) => `    ${v}`)           51        .join("\n");    52     52    53     53      log(yaml);    54             log('  ...');    55             return;    56           }    57           58           if (obj.type === 'done') {    59             log('');           54      log("  ...");           55      return;           56    }           57           58    if (obj.type === "done") {           59      log("");    60     60      log(`1..${assertionCount}`);    61     61    62     62      if (obj.error > 0) {    63     63        if (obj.skip > 0) {    64                 log(`# passing ${obj.ok}/${obj.count} (${obj.error} failing, ${obj.skip} skipping)`);           64          log(           65            `# passing ${obj.ok}/${obj.count} (${obj.error} failing, ${obj.skip} skipping)`,           66          );    65     67        } else {    66     68          log(`# passing ${obj.ok}/${obj.count} (${obj.error} failing)`);    67     69        }    68               log('# fail');           70        log("# fail");    69     71      } else {    70     72        if (obj.skip > 0) {    71     73          log(`# passing ${obj.ok}/${obj.count} (${obj.skip} skipping)`);             @@ -74,9 +76,9 @@    74     76        }    75     77    76     78        if (obj.only) {    77                 log('# ok (but not running all the tests)');    78               } else {    79                 log('# ok');           79          log("# ok (but not running all the tests)");           80        } else {           81          log("# ok");    80     82        }    81     83      }    82     84      return;
test/helpers/collect-logs.js+35 -30
             @@ -2,41 +2,46 @@     2      2  const logs = [];     3      3  let finished = false;     4      4     5         return obj => {            5  return (obj) => {     6      6    if (finished) {     7             throw new Error('unexpected log output');     8           }     9           10           if (obj.type === 'error') {            7      throw new Error("unexpected log output");            8    }            9           10    if (obj.type === "error") {    11     11      let skip = false;    12             obj.stack = obj.stack.map(v => {    13               if (skip) {    14                 return null;    15               }    16           17               if (v.indexOf('timers.js') >= 0) {    18                 return null;    19               }    20           21               if (v.indexOf('bluebird') >= 0) {    22                 return null;    23               }    24           25               if (v.indexOf('http://localhost') >= 0) {    26                 return 'at <test>';    27               }    28           29               if (v.indexOf('From previous event:') >= 0) {    30                 skip = true;    31                 return null;    32               }    33           34               return v.replace(/at\s(.+)\/test\/unit\/[a-z-]+\.js:\d+:\d+\)?/, 'at <test>');    35             }).filter(Boolean);           12      obj.stack = obj.stack           13        .map((v) => {           14          if (skip) {           15            return null;           16          }           17           18          if (v.indexOf("timers.js") >= 0) {           19            return null;           20          }           21           22          if (v.indexOf("bluebird") >= 0) {           23            return null;           24          }           25           26          if (v.indexOf("http://localhost") >= 0) {           27            return "at <test>";           28          }           29           30          if (v.indexOf("From previous event:") >= 0) {           31            skip = true;           32            return null;           33          }           34           35          return v.replace(           36            /at\s(.+)\/test\/unit\/[a-z-]+\.js:\d+:\d+\)?/,           37            "at <test>",           38          );           39        })           40        .filter(Boolean);    36     41    }    37     42    38     43    logs.push(obj);    39           if (obj.type === 'done') {           44    if (obj.type === "done") {    40     45      finished = true;    41     46      done(logs);    42     47      return;
test/helpers/delete-set-immediate.js+1 -1
             @@ -1,4 +1,4 @@     1      1// bluebird doesn't work without setImmediate in node     2       import 'bluebird';            2import "bluebird";     3      3     4      4global.setImmediate = void 0;
test/helpers/runner-test.js+20 -15
             @@ -1,25 +1,30 @@     1       import test from 'tape';     2       import estap from '../../lib';     3       import collectLogs from './collect-logs';            1import test from "tape";            2import estap from "../../lib";            3import collectLogs from "./collect-logs";     4      4     5      5export default function (name, fn, out, result, opts = {}) {     6      6  const def = opts.only ? test.only.bind(test) : test;     7         def(name, assert => {            7  def(name, (assert) => {     8      8    assert.plan(2);     9      9    const runner = estap.createRunner();    10     10    11     11    fn(runner, assert);    12     12    13           runner.run({    14             log: collectLogs(logs => {    15               assert.same(logs, out, 'output');    16             }),    17           })    18           .then(res => {    19             assert.is(res, result, result ? 'test result true' : 'test result false');    20           })    21           .catch(() => {    22             assert.is(result, null, 'test result error');    23           });           13    runner           14      .run({           15        log: collectLogs((logs) => {           16          assert.same(logs, out, "output");           17        }),           18      })           19      .then((res) => {           20        assert.is(           21          res,           22          result,           23          result ? "test result true" : "test result false",           24        );           25      })           26      .catch(() => {           27        assert.is(result, null, "test result error");           28      });    24     29  });    25     30}
test/helpers/setup-unhandled.js+1 -1
             @@ -6,5 +6,5 @@     6      6    };     7      7  }     8      8     9         process.once('uncaughtException', fn);            9  process.once("uncaughtException", fn);    10     10}
test/integration/cb-error.js+3 -3
             @@ -1,13 +1,13 @@     1      1/* eslint-disable no-unreachable */     2       import estap from '../../lib';            2import estap from "../../lib";     3      3     4      4const test = estap();     5      5     6       test.cb('check some numbers', t => {            6test.cb("check some numbers", (t) => {     7      7  setTimeout(() => {     8      8    t.end();     9      9  }, 1);    10     10  t.is(10, 10);    11         throw new Error('this is an error');           11  throw new Error("this is an error");    12     12  t.is(10 + 11, 20);    13     13});
test/integration/cb-fail.js+2 -2
             @@ -1,8 +1,8 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test.cb('check some numbers', t => {            5test.cb("check some numbers", (t) => {     6      6  setTimeout(() => {     7      7    t.is(10, 10);     8      8    t.is(10 + 11, 20);
test/integration/cb-ok.js+2 -2
             @@ -1,8 +1,8 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test.cb('check some numbers', t => {            5test.cb("check some numbers", (t) => {     6      6  setTimeout(() => {     7      7    t.is(10, 10);     8      8    t.is(10 + 10, 20);
test/integration/cb-throw-nonerror.js+2 -2
             @@ -1,9 +1,9 @@     1      1/* eslint-disable no-throw-literal, no-unreachable */     2       import estap from '../../lib';            2import estap from "../../lib";     3      3     4      4const test = estap();     5      5     6       test.cb('check some numbers', t => {            6test.cb("check some numbers", (t) => {     7      7  setTimeout(() => {     8      8    t.end();     9      9  }, 1);
test/integration/index.js+453 -324
             @@ -1,62 +1,81 @@     1       import { execFile } from 'child_process';     2       import path from 'path';     3       import test from 'tape';     4            5       const babelNode = path.resolve(__dirname, '../../node_modules/babel-cli/bin/babel-node.js');            1import { execFile } from "child_process";            2import path from "path";            3import test from "tape";            4            5const babelNode = path.resolve(            6  __dirname,            7  "../../node_modules/babel-cli/bin/babel-node.js",            8);     6      9     7     10function execTest(fileName, fn) {     8     11  function fixOutput(s) {     9           if (s === '') {           12    if (s === "") {    10     13      return s;    11     14    }    12     15    13           return '\n' + s.split('\n').map(l => {    14             if (l.indexOf('      - \'at ') === 0) {    15               if (l.indexOf(fileName) >= 0) {    16                 return '      - \'at <testcallsite>\'';    17               }    18           19               return '      - \'at <callsite>\'';    20             }    21           22             if (l.indexOf('    at ') === 0) {    23               if (l.indexOf(fileName) >= 0) {    24                 return '    at <testcallsite>';    25               }    26           27               return '    at <callsite>';    28             }    29           30             return l;    31           }).join('\n');           16    return (           17      "\n" +           18      s           19        .split("\n")           20        .map((l) => {           21          if (l.indexOf("      - 'at ") === 0) {           22            if (l.indexOf(fileName) >= 0) {           23              return "      - 'at <testcallsite>'";           24            }           25           26            return "      - 'at <callsite>'";           27          }           28           29          if (l.indexOf("    at ") === 0) {           30            if (l.indexOf(fileName) >= 0) {           31              return "    at <testcallsite>";           32            }           33           34            return "    at <callsite>";           35          }           36           37          return l;           38        })           39        .join("\n")           40    );    32     41  }    33         test(fileName, t => {    34           execFile(babelNode, [path.resolve(__dirname, `${fileName}`)], (err, stdout, stderr) => {    35             const out = fixOutput(stdout);    36             const outErr = fixOutput(stderr);    37             fn(t, err, out, outErr);    38           });           42  test(fileName, (t) => {           43    execFile(           44      babelNode,           45      [path.resolve(__dirname, `${fileName}`)],           46      (err, stdout, stderr) => {           47        const out = fixOutput(stdout);           48        const outErr = fixOutput(stderr);           49        fn(t, err, out, outErr);           50      },           51    );    39     52  });    40     53}    41     54    42       execTest('cb-ok.js', (t, err, stdout, stderr) => {    43         t.error(err, 'ok');    44         t.is(stdout, `    45       TAP version 13    46       ok 1 check some numbers > is    47       ok 2 check some numbers > is    48           49       1..2    50       # passing 2/2    51       # ok    52       `, 'stdout');    53         t.is(stderr, '', 'stderr');    54         t.end();    55       });    56           57       execTest('cb-fail.js', (t, err, stdout, stderr) => {    58         t.ok(err, 'errored');    59         t.is(stdout, `           55execTest("cb-ok.js", (t, err, stdout, stderr) => {           56  t.error(err, "ok");           57  t.is(           58    stdout,           59    `           60TAP version 13           61ok 1 check some numbers > is           62ok 2 check some numbers > is           63           641..2           65# passing 2/2           66# ok           67`,           68    "stdout",           69  );           70  t.is(stderr, "", "stderr");           71  t.end();           72});           73           74execTest("cb-fail.js", (t, err, stdout, stderr) => {           75  t.ok(err, "errored");           76  t.is(           77    stdout,           78    `    60     79TAP version 13    61     80ok 1 check some numbers > is    62     81not ok 2 check some numbers > is             @@ -72,54 +91,78 @@    72     911..2    73     92# passing 1/2 (1 failing)    74     93# fail    75       `, 'stdout');    76         t.is(stderr, '', 'stderr');    77         t.end();    78       });    79           80       execTest('cb-error.js', (t, err, stdout, stderr) => {    81         t.ok(err, 'errored');    82         t.is(stdout, `    83       TAP version 13    84       ok 1 check some numbers > is    85       `, 'stdout');    86         t.is(stderr, `           94`,           95    "stdout",           96  );           97  t.is(stderr, "", "stderr");           98  t.end();           99});          100          101execTest("cb-error.js", (t, err, stdout, stderr) => {          102  t.ok(err, "errored");          103  t.is(          104    stdout,          105    `          106TAP version 13          107ok 1 check some numbers > is          108`,          109    "stdout",          110  );          111  t.is(          112    stderr,          113    `    87    114Error: this is an error    88    115    at <testcallsite>    89       `, 'stderr');    90         t.end();    91       });    92           93       execTest('cb-throw-nonerror.js', (t, err, stdout, stderr) => {    94         t.ok(err, 'errored');    95         t.is(stdout, `    96       TAP version 13    97       ok 1 check some numbers > is    98       `, 'stdout');    99         t.is(stderr, `          116`,          117    "stderr",          118  );          119  t.end();          120});          121          122execTest("cb-throw-nonerror.js", (t, err, stdout, stderr) => {          123  t.ok(err, "errored");          124  t.is(          125    stdout,          126    `          127TAP version 13          128ok 1 check some numbers > is          129`,          130    "stdout",          131  );          132  t.is(          133    stderr,          134    `   100    135Uncaught exception: 1   101       `, 'stderr');   102         t.end();   103       });   104          105       execTest('sync-ok.js', (t, err, stdout, stderr) => {   106         t.error(err, 'ok');   107         t.is(stdout, `   108       TAP version 13   109       ok 1 check some numbers > is   110       ok 2 check some numbers > is   111          112       1..2   113       # passing 2/2   114       # ok   115       `, 'stdout');   116         t.is(stderr, '', 'stderr');   117         t.end();   118       });   119          120       execTest('sync-fail.js', (t, err, stdout, stderr) => {   121         t.ok(err, 'errored');   122         t.is(stdout, `          136`,          137    "stderr",          138  );          139  t.end();          140});          141          142execTest("sync-ok.js", (t, err, stdout, stderr) => {          143  t.error(err, "ok");          144  t.is(          145    stdout,          146    `          147TAP version 13          148ok 1 check some numbers > is          149ok 2 check some numbers > is          150          1511..2          152# passing 2/2          153# ok          154`,          155    "stdout",          156  );          157  t.is(stderr, "", "stderr");          158  t.end();          159});          160          161execTest("sync-fail.js", (t, err, stdout, stderr) => {          162  t.ok(err, "errored");          163  t.is(          164    stdout,          165    `   123    166TAP version 13   124    167ok 1 check some numbers > is   125    168not ok 2 check some numbers > is             @@ -134,27 +177,39 @@   134    1771..2   135    178# passing 1/2 (1 failing)   136    179# fail   137       `, 'stdout');   138         t.is(stderr, '', 'stderr');   139         t.end();   140       });   141          142       execTest('sync-error.js', (t, err, stdout, stderr) => {   143         t.ok(err, 'errored');   144         t.is(stdout, `   145       TAP version 13   146       ok 1 check some numbers > is   147       `, 'stdout');   148         t.is(stderr, `          180`,          181    "stdout",          182  );          183  t.is(stderr, "", "stderr");          184  t.end();          185});          186          187execTest("sync-error.js", (t, err, stdout, stderr) => {          188  t.ok(err, "errored");          189  t.is(          190    stdout,          191    `          192TAP version 13          193ok 1 check some numbers > is          194`,          195    "stdout",          196  );          197  t.is(          198    stderr,          199    `   149    200ReferenceError: thisIsAnError is not defined   150    201    at <testcallsite>   151       `, 'stderr');   152         t.end();   153       });   154          155       execTest('promise-ok.js', (t, err, stdout, stderr) => {   156         t.error(err, 'ok');   157         t.is(stdout, `          202`,          203    "stderr",          204  );          205  t.end();          206});          207          208execTest("promise-ok.js", (t, err, stdout, stderr) => {          209  t.error(err, "ok");          210  t.is(          211    stdout,          212    `   158    213TAP version 13   159    214ok 1 check some numbers > is   160    215             @@ -161,14 +216,18 @@   161    2161..1   162    217# passing 1/1   163    218# ok   164       `, 'stdout');   165         t.is(stderr, '', 'stderr');   166         t.end();   167       });   168          169       execTest('promise-fail.js', (t, err, stdout, stderr) => {   170         t.ok(err, 'errored');   171         t.is(stdout, `          219`,          220    "stdout",          221  );          222  t.is(stderr, "", "stderr");          223  t.end();          224});          225          226execTest("promise-fail.js", (t, err, stdout, stderr) => {          227  t.ok(err, "errored");          228  t.is(          229    stdout,          230    `   172    231TAP version 13   173    232ok 1 check some numbers > is   174    233not ok 2 check some numbers > promise rejection             @@ -180,14 +239,18 @@   180    2391..2   181    240# passing 1/2 (1 failing)   182    241# fail   183       `, 'stdout');   184         t.is(stderr, '', 'stderr');   185         t.end();   186       });   187          188       execTest('promise-error.js', (t, err, stdout, stderr) => {   189         t.ok(err, 'errored');   190         t.is(stdout, `          242`,          243    "stdout",          244  );          245  t.is(stderr, "", "stderr");          246  t.end();          247});          248          249execTest("promise-error.js", (t, err, stdout, stderr) => {          250  t.ok(err, "errored");          251  t.is(          252    stdout,          253    `   191    254TAP version 13   192    255ok 1 check some numbers > is   193    256not ok 2 check some numbers > promise rejection             @@ -203,56 +266,72 @@   203    2661..2   204    267# passing 1/2 (1 failing)   205    268# fail   206       `, 'stdout');   207         t.is(stderr, '', 'stderr');   208         t.end();   209       });   210          211       execTest('no-set-immediate.js', (t, err, stdout, stderr) => {   212         t.error(err, 'ok');   213         t.is(stdout, `   214       TAP version 13   215       ok 1 check some numbers > is   216       ok 2 check some numbers > is   217          218       1..2   219       # passing 2/2   220       # ok   221       `, 'stdout');   222         t.is(stderr, '', 'stderr');   223         t.end();   224       });   225          226       execTest('no-autorun.js', (t, err, stdout, stderr) => {   227         t.error(err, 'ok');   228         t.is(stdout, '', 'stdout');   229         t.is(stderr, '', 'stderr');   230         t.end();   231       });   232          233       execTest('manual-run.js', (t, err, stdout, stderr) => {   234         t.error(err, 'ok');   235         t.is(stdout, `   236       { type: 'ok', test: 'should pass', message: 'pass' }   237       { type: 'done', count: 1, ok: 1, error: 0, skip: 0, only: 0 }   238       `, 'stdout');   239         t.is(stderr, '', 'stderr');   240         t.end();   241       });   242          243       execTest('manual-run-delay.js', (t, err, stdout, stderr) => {   244         t.error(err, 'ok');   245         t.is(stdout, `   246       { type: 'ok', test: 'should pass', message: 'pass' }   247       { type: 'done', count: 1, ok: 1, error: 0, skip: 0, only: 0 }   248       `, 'stdout');   249         t.is(stderr, '', 'stderr');   250         t.end();   251       });   252          253       execTest('no-process-exit.js', (t, err, stdout, stderr) => {   254         t.error(err, 'no error despite test failure');   255         t.is(stdout, `          269`,          270    "stdout",          271  );          272  t.is(stderr, "", "stderr");          273  t.end();          274});          275          276execTest("no-set-immediate.js", (t, err, stdout, stderr) => {          277  t.error(err, "ok");          278  t.is(          279    stdout,          280    `          281TAP version 13          282ok 1 check some numbers > is          283ok 2 check some numbers > is          284          2851..2          286# passing 2/2          287# ok          288`,          289    "stdout",          290  );          291  t.is(stderr, "", "stderr");          292  t.end();          293});          294          295execTest("no-autorun.js", (t, err, stdout, stderr) => {          296  t.error(err, "ok");          297  t.is(stdout, "", "stdout");          298  t.is(stderr, "", "stderr");          299  t.end();          300});          301          302execTest("manual-run.js", (t, err, stdout, stderr) => {          303  t.error(err, "ok");          304  t.is(          305    stdout,          306    `          307{ type: 'ok', test: 'should pass', message: 'pass' }          308{ type: 'done', count: 1, ok: 1, error: 0, skip: 0, only: 0 }          309`,          310    "stdout",          311  );          312  t.is(stderr, "", "stderr");          313  t.end();          314});          315          316execTest("manual-run-delay.js", (t, err, stdout, stderr) => {          317  t.error(err, "ok");          318  t.is(          319    stdout,          320    `          321{ type: 'ok', test: 'should pass', message: 'pass' }          322{ type: 'done', count: 1, ok: 1, error: 0, skip: 0, only: 0 }          323`,          324    "stdout",          325  );          326  t.is(stderr, "", "stderr");          327  t.end();          328});          329          330execTest("no-process-exit.js", (t, err, stdout, stderr) => {          331  t.error(err, "no error despite test failure");          332  t.is(          333    stdout,          334    `   256    335TAP version 13   257    336not ok 1 should pass > fail   258    337  ---             @@ -266,83 +345,107 @@   266    3451..1   267    346# passing 0/1 (1 failing)   268    347# fail   269       `, 'stdout');   270         t.is(stderr, '', 'stderr');   271         t.end();   272       });   273          274       execTest('plan-ok.js', (t, err, stdout, stderr) => {   275         t.error(err, 'ok');   276         t.is(stdout, `   277       TAP version 13   278       ok 1 should pass > timeout 1   279       ok 2 should pass > timeout 2   280          281       1..2   282       # passing 2/2   283       # ok   284       `, 'stdout');   285         t.is(stderr, '', 'stderr');   286         t.end();   287       });   288          289       execTest('plan-gt-expected.js', (t, err, stdout, stderr) => {   290         t.ok(err, 'errored');   291         t.is(stdout, `   292       TAP version 13   293       ok 1 should pass > timeout 1   294       ok 2 should pass > timeout 2   295          296       1..2   297       # passing 2/2   298       # ok   299       `, 'stdout');   300         t.is(stderr, `          348`,          349    "stdout",          350  );          351  t.is(stderr, "", "stderr");          352  t.end();          353});          354          355execTest("plan-ok.js", (t, err, stdout, stderr) => {          356  t.error(err, "ok");          357  t.is(          358    stdout,          359    `          360TAP version 13          361ok 1 should pass > timeout 1          362ok 2 should pass > timeout 2          363          3641..2          365# passing 2/2          366# ok          367`,          368    "stdout",          369  );          370  t.is(stderr, "", "stderr");          371  t.end();          372});          373          374execTest("plan-gt-expected.js", (t, err, stdout, stderr) => {          375  t.ok(err, "errored");          376  t.is(          377    stdout,          378    `          379TAP version 13          380ok 1 should pass > timeout 1          381ok 2 should pass > timeout 2          382          3831..2          384# passing 2/2          385# ok          386`,          387    "stdout",          388  );          389  t.is(          390    stderr,          391    `   301    392Error: assertion after end   302    393    at <testcallsite>   303    394    at <callsite>   304       `, 'stderr');   305         t.end();   306       });   307          308       execTest('plan-sync-ok.js', (t, err, stdout, stderr) => {   309         t.error(err, 'ok');   310         t.is(stdout, `   311       TAP version 13   312       ok 1 should pass > 1   313       ok 2 should pass > 2   314          315       1..2   316       # passing 2/2   317       # ok   318       `, 'stdout');   319         t.is(stderr, '', 'stderr');   320         t.end();   321       });   322          323       execTest('plan-sync-lt.js', (t, err, stdout, stderr) => {   324         t.ok(err, 'errored');   325         t.is(stdout, `   326       TAP version 13   327       ok 1 should pass > 1   328       not ok 2 should pass > assertions count does not match plan   329         ---   330           op:       plan   331           actual:   '(number) 1'   332           expected: '(number) 2'   333         ...   334          335       1..2   336       # passing 1/2 (1 failing)   337       # fail   338       `, 'stdout');   339         t.is(stderr, '', 'stderr');   340         t.end();   341       });   342          343       execTest('plan-sync-gt.js', (t, err, stdout, stderr) => {   344         t.ok(err, 'errored');   345         t.is(stdout, `          395`,          396    "stderr",          397  );          398  t.end();          399});          400          401execTest("plan-sync-ok.js", (t, err, stdout, stderr) => {          402  t.error(err, "ok");          403  t.is(          404    stdout,          405    `          406TAP version 13          407ok 1 should pass > 1          408ok 2 should pass > 2          409          4101..2          411# passing 2/2          412# ok          413`,          414    "stdout",          415  );          416  t.is(stderr, "", "stderr");          417  t.end();          418});          419          420execTest("plan-sync-lt.js", (t, err, stdout, stderr) => {          421  t.ok(err, "errored");          422  t.is(          423    stdout,          424    `          425TAP version 13          426ok 1 should pass > 1          427not ok 2 should pass > assertions count does not match plan          428  ---          429    op:       plan          430    actual:   '(number) 1'          431    expected: '(number) 2'          432  ...          433          4341..2          435# passing 1/2 (1 failing)          436# fail          437`,          438    "stdout",          439  );          440  t.is(stderr, "", "stderr");          441  t.end();          442});          443          444execTest("plan-sync-gt.js", (t, err, stdout, stderr) => {          445  t.ok(err, "errored");          446  t.is(          447    stdout,          448    `   346    449TAP version 13   347    450ok 1 should pass > 1   348    451ok 2 should pass > 2             @@ -357,49 +460,61 @@   357    4601..4   358    461# passing 3/4 (1 failing)   359    462# fail   360       `, 'stdout');   361         t.is(stderr, '', 'stderr');   362         t.end();   363       });   364          365       execTest('plan-promise-ok.js', (t, err, stdout, stderr) => {   366         t.error(err, 'ok');   367         t.is(stdout, `   368       TAP version 13   369       ok 1 should pass > pass   370       ok 2 should pass > pass   371          372       1..2   373       # passing 2/2   374       # ok   375       `, 'stdout');   376         t.is(stderr, '', 'stderr');   377         t.end();   378       });   379          380       execTest('plan-promise-lt.js', (t, err, stdout, stderr) => {   381         t.ok(err, 'errored');   382         t.is(stdout, `   383       TAP version 13   384       ok 1 should pass > pass   385       not ok 2 should pass > assertions count does not match plan   386         ---   387           op:       plan   388           actual:   '(number) 1'   389           expected: '(number) 2'   390         ...   391          392       1..2   393       # passing 1/2 (1 failing)   394       # fail   395       `, 'stdout');   396         t.is(stderr, '', 'stderr');   397         t.end();   398       });   399          400       execTest('plan-promise-gt.js', (t, err, stdout, stderr) => {   401         t.ok(err, 'errored');   402         t.is(stdout, `          463`,          464    "stdout",          465  );          466  t.is(stderr, "", "stderr");          467  t.end();          468});          469          470execTest("plan-promise-ok.js", (t, err, stdout, stderr) => {          471  t.error(err, "ok");          472  t.is(          473    stdout,          474    `          475TAP version 13          476ok 1 should pass > pass          477ok 2 should pass > pass          478          4791..2          480# passing 2/2          481# ok          482`,          483    "stdout",          484  );          485  t.is(stderr, "", "stderr");          486  t.end();          487});          488          489execTest("plan-promise-lt.js", (t, err, stdout, stderr) => {          490  t.ok(err, "errored");          491  t.is(          492    stdout,          493    `          494TAP version 13          495ok 1 should pass > pass          496not ok 2 should pass > assertions count does not match plan          497  ---          498    op:       plan          499    actual:   '(number) 1'          500    expected: '(number) 2'          501  ...          502          5031..2          504# passing 1/2 (1 failing)          505# fail          506`,          507    "stdout",          508  );          509  t.is(stderr, "", "stderr");          510  t.end();          511});          512          513execTest("plan-promise-gt.js", (t, err, stdout, stderr) => {          514  t.ok(err, "errored");          515  t.is(          516    stdout,          517    `   403    518TAP version 13   404    519ok 1 should pass > pass   405    520ok 2 should pass > pass             @@ -413,24 +528,32 @@   413    5281..3   414    529# passing 2/3 (1 failing)   415    530# fail   416       `, 'stdout');   417         t.is(stderr, '', 'stderr');   418         t.end();   419       });   420          421       execTest('process-exit.js', (t, err, stdout, stderr) => {   422         t.ok(err, 'errored');   423         t.is(stdout, `   424       TAP version 13   425       ok 1 should pass > pass   426       `, 'stdout');   427         t.is(stderr, '', 'stderr');   428         t.end();   429       });   430          431       execTest('throws-ok.js', (t, err, stdout, stderr) => {   432         t.error(err, 'ok');   433         t.is(stdout, `          531`,          532    "stdout",          533  );          534  t.is(stderr, "", "stderr");          535  t.end();          536});          537          538execTest("process-exit.js", (t, err, stdout, stderr) => {          539  t.ok(err, "errored");          540  t.is(          541    stdout,          542    `          543TAP version 13          544ok 1 should pass > pass          545`,          546    "stdout",          547  );          548  t.is(stderr, "", "stderr");          549  t.end();          550});          551          552execTest("throws-ok.js", (t, err, stdout, stderr) => {          553  t.error(err, "ok");          554  t.is(          555    stdout,          556    `   434    557TAP version 13   435    558ok 1 throws/notThrows > throws   436    559ok 2 throws/notThrows > throws             @@ -444,14 +567,18 @@   444    5671..8   445    568# passing 8/8   446    569# ok   447       `, 'stdout');   448         t.is(stderr, '', 'stderr');   449         t.end();   450       });   451          452       execTest('throws-error.js', (t, err, stdout, stderr) => {   453         t.ok(err, 'errored');   454         t.is(stdout, `          570`,          571    "stdout",          572  );          573  t.is(stderr, "", "stderr");          574  t.end();          575});          576          577execTest("throws-error.js", (t, err, stdout, stderr) => {          578  t.ok(err, "errored");          579  t.is(          580    stdout,          581    `   455    582TAP version 13   456    583not ok 1 throws/notThrows > throws   457    584  ---             @@ -516,7 +643,9 @@   516    6431..8   517    644# passing 0/8 (8 failing)   518    645# fail   519       `, 'stdout');   520         t.is(stderr, '', 'stderr');          646`,          647    "stdout",          648  );          649  t.is(stderr, "", "stderr");   521    650  t.end();   522    651});
test/integration/manual-run-delay.js+9 -7
             @@ -1,16 +1,18 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4estap.disableAutorun();     5      5     6       test('should pass', t => {            6test("should pass", (t) => {     7      7  t.pass();     8      8});     9      9    10     10setTimeout(() => {    11         estap.run({    12           log: console.log.bind(console),    13         }).catch(err => {    14           throw err;    15         });           11  estap           12    .run({           13      log: console.log.bind(console),           14    })           15    .catch((err) => {           16      throw err;           17    });    16     18}, 1000);
test/integration/manual-run.js+9 -7
             @@ -1,13 +1,15 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('should pass', t => {            5test("should pass", (t) => {     6      6  t.pass();     7      7});     8      8     9       estap.run({    10         log: console.log.bind(console),    11       }).catch(err => {    12         throw err;    13       });            9estap           10  .run({           11    log: console.log.bind(console),           12  })           13  .catch((err) => {           14    throw err;           15  });
test/integration/no-autorun.js+2 -2
             @@ -1,8 +1,8 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4estap.disableAutorun();     5      5     6       test('should pass', t => {            6test("should pass", (t) => {     7      7  t.pass();     8      8});
test/integration/no-process-exit.js+2 -2
             @@ -1,8 +1,8 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4global.process.exit = void 0;     5      5     6       test('should pass', t => {            6test("should pass", (t) => {     7      7  t.fail();     8      8});
test/integration/no-set-immediate.js+3 -3
             @@ -1,9 +1,9 @@     1       import '../helpers/delete-set-immediate';     2       import estap from '../../lib';            1import "../helpers/delete-set-immediate";            2import estap from "../../lib";     3      3     4      4const test = estap();     5      5     6       test('check some numbers', t => {            6test("check some numbers", (t) => {     7      7  t.is(10, 10);     8      8  t.is(10 + 10, 20);     9      9});
test/integration/plan-gt-expected.js+5 -5
             @@ -1,19 +1,19 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test.cb('should pass', t => {            5test.cb("should pass", (t) => {     6      6  t.plan(2);     7      7     8      8  setTimeout(() => {     9           t.pass('timeout 1');            9    t.pass("timeout 1");    10     10  }, 10);    11     11    12     12  setTimeout(() => {    13           t.pass('timeout 2');           13    t.pass("timeout 2");    14     14  }, 100);    15     15    16     16  setTimeout(() => {    17           t.pass('timeout 3');           17    t.pass("timeout 3");    18     18  }, 110);    19     19});
test/integration/plan-ok.js+4 -4
             @@ -1,15 +1,15 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test.cb('should pass', t => {            5test.cb("should pass", (t) => {     6      6  t.plan(2);     7      7     8      8  setTimeout(() => {     9           t.pass('timeout 1');            9    t.pass("timeout 1");    10     10  }, 10);    11     11    12     12  setTimeout(() => {    13           t.pass('timeout 2');           13    t.pass("timeout 2");    14     14  }, 100);    15     15});
test/integration/plan-promise-gt.js+4 -4
             @@ -1,12 +1,12 @@     1       import Promise from 'bluebird';     2       import estap from '../../lib';            1import Promise from "bluebird";            2import estap from "../../lib";     3      3     4      4const test = estap();     5      5     6       test('should pass', t => {            6test("should pass", (t) => {     7      7  t.plan(1);     8      8     9         return new Promise(resolve => {            9  return new Promise((resolve) => {    10     10    t.pass();    11     11    t.pass();    12     12    resolve();
test/integration/plan-promise-lt.js+4 -4
             @@ -1,12 +1,12 @@     1       import Promise from 'bluebird';     2       import estap from '../../lib';            1import Promise from "bluebird";            2import estap from "../../lib";     3      3     4      4const test = estap();     5      5     6       test('should pass', t => {            6test("should pass", (t) => {     7      7  t.plan(2);     8      8     9         return new Promise(resolve => {            9  return new Promise((resolve) => {    10     10    t.pass();    11     11    resolve();    12     12  });
test/integration/plan-promise-ok.js+4 -4
             @@ -1,12 +1,12 @@     1       import Promise from 'bluebird';     2       import estap from '../../lib';            1import Promise from "bluebird";            2import estap from "../../lib";     3      3     4      4const test = estap();     5      5     6       test('should pass', t => {            6test("should pass", (t) => {     7      7  t.plan(2);     8      8     9         return new Promise(resolve => {            9  return new Promise((resolve) => {    10     10    t.pass();    11     11    t.pass();    12     12    resolve();
test/integration/plan-sync-gt.js+5 -5
             @@ -1,10 +1,10 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('should pass', t => {            5test("should pass", (t) => {     6      6  t.plan(2);     7         t.pass('1');     8         t.pass('2');     9         t.pass('3');            7  t.pass("1");            8  t.pass("2");            9  t.pass("3");    10     10});
test/integration/plan-sync-lt.js+3 -3
             @@ -1,8 +1,8 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('should pass', t => {            5test("should pass", (t) => {     6      6  t.plan(2);     7         t.pass('1');            7  t.pass("1");     8      8});
test/integration/plan-sync-ok.js+4 -4
             @@ -1,9 +1,9 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('should pass', t => {            5test("should pass", (t) => {     6      6  t.plan(2);     7         t.pass('1');     8         t.pass('2');            7  t.pass("1");            8  t.pass("2");     9      9});
test/integration/process-exit.js+2 -2
             @@ -1,8 +1,8 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('should pass', t => {            5test("should pass", (t) => {     6      6  t.pass();     7      7  process.exit(0);     8      8});
test/integration/promise-error.js+6 -5
             @@ -1,8 +1,9 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('check some numbers', t => (new Promise(() => {     6         t.is(10, 10);     7         throw new Error('not expecting it');     8       })));            5test("check some numbers", (t) =>            6  new Promise(() => {            7    t.is(10, 10);            8    throw new Error("not expecting it");            9  }));
test/integration/promise-fail.js+6 -5
             @@ -1,8 +1,9 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('check some numbers', t => (new Promise((resolve, reject) => {     6         t.is(10, 10);     7         setTimeout(() => reject(), 1);     8       })));            5test("check some numbers", (t) =>            6  new Promise((resolve, reject) => {            7    t.is(10, 10);            8    setTimeout(() => reject(), 1);            9  }));
test/integration/promise-ok.js+6 -5
             @@ -1,8 +1,9 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('check some numbers', t => (new Promise(resolve => {     6         t.is(10, 10);     7         setTimeout(() => resolve(), 1);     8       })));            5test("check some numbers", (t) =>            6  new Promise((resolve) => {            7    t.is(10, 10);            8    setTimeout(() => resolve(), 1);            9  }));
test/integration/sync-error.js+2 -2
             @@ -1,9 +1,9 @@     1      1/* eslint-disable no-undef */     2       import estap from '../../lib';            2import estap from "../../lib";     3      3     4      4const test = estap();     5      5     6       test('check some numbers', t => {            6test("check some numbers", (t) => {     7      7  t.is(10, 10);     8      8  thisIsAnError();     9      9  t.is(10 + 10, 20);
test/integration/sync-fail.js+2 -2
             @@ -1,8 +1,8 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('check some numbers', t => {            5test("check some numbers", (t) => {     6      6  t.is(10, 10);     7      7  t.is(10 + 10, 42);     8      8});
test/integration/sync-ok.js+2 -2
             @@ -1,8 +1,8 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('check some numbers', t => {            5test("check some numbers", (t) => {     6      6  t.is(10, 10);     7      7  t.is(10 + 10, 20);     8      8});
test/integration/throws-error.js+34 -18
             @@ -1,28 +1,44 @@     1      1/* eslint-disable no-throw-literal */     2       import estap from '../../lib';            2import estap from "../../lib";     3      3     4      4const test = estap();     5      5     6       test('throws/notThrows', t => {            6test("throws/notThrows", (t) => {     7      7  t.throws(() => {});     8      8     9      9  t.throws(() => {}, Error);    10     10    11         t.throws(() => {    12           throw 'ABC';    13         }, Error, 'throws check type');    14           15         t.throws(() => {    16           throw new Error('zzz');    17         }, [Error, /hello-world/], 'throws check type regex');    18           19         t.throws(() => {    20           throw new TypeError('hello-world');    21         }, [RangeError, 'hello-world'], 'throws check type str');    22           23         t.throws(() => {    24           throw new Error('hello-w0rld');    25         }, /hello-world/, 'throws check regex');           11  t.throws(           12    () => {           13      throw "ABC";           14    },           15    Error,           16    "throws check type",           17  );           18           19  t.throws(           20    () => {           21      throw new Error("zzz");           22    },           23    [Error, /hello-world/],           24    "throws check type regex",           25  );           26           27  t.throws(           28    () => {           29      throw new TypeError("hello-world");           30    },           31    [RangeError, "hello-world"],           32    "throws check type str",           33  );           34           35  t.throws(           36    () => {           37      throw new Error("hello-w0rld");           38    },           39    /hello-world/,           40    "throws check regex",           41  );    26     42    27     43  t.notThrows(() => {    28     44    throw new Error();             @@ -29,5 +45,5 @@    29     45  });    30     46  t.notThrows(() => {    31     47    throw new Error();    32         }, 'oh no');           48  }, "oh no");    33     49});
test/integration/throws-ok.js+34 -18
             @@ -1,8 +1,8 @@     1       import estap from '../../lib';            1import estap from "../../lib";     2      2     3      3const test = estap();     4      4     5       test('throws/notThrows', t => {            5test("throws/notThrows", (t) => {     6      6  t.throws(() => {     7      7    throw new Error();     8      8  });             @@ -11,22 +11,38 @@    11     11    throw new Error();    12     12  }, Error);    13     13    14         t.throws(() => {    15           throw new Error();    16         }, Error, 'throws check type');    17           18         t.throws(() => {    19           throw new Error('hello-world');    20         }, [Error, /hello-world/], 'throws check type regex');    21           22         t.throws(() => {    23           throw new Error('hello-world');    24         }, [Error, 'hello-world'], 'throws check type str');    25           26         t.throws(() => {    27           throw new Error('hello-world');    28         }, /hello-world/, 'throws check regex');           14  t.throws(           15    () => {           16      throw new Error();           17    },           18    Error,           19    "throws check type",           20  );           21           22  t.throws(           23    () => {           24      throw new Error("hello-world");           25    },           26    [Error, /hello-world/],           27    "throws check type regex",           28  );           29           30  t.throws(           31    () => {           32      throw new Error("hello-world");           33    },           34    [Error, "hello-world"],           35    "throws check type str",           36  );           37           38  t.throws(           39    () => {           40      throw new Error("hello-world");           41    },           42    /hello-world/,           43    "throws check regex",           44  );    29     45    30     46  t.notThrows(() => {});    31         t.notThrows(() => {}, 'nothing to throw');           47  t.notThrows(() => {}, "nothing to throw");    32     48});
test/unit/before-after-hooks.js+807 -673
             @@ -1,673 +1,807 @@     1       import runnerTest from '../helpers/runner-test';     2            3       runnerTest('before/after hooks', runner => {     4         const defineTest = runner();     5            6         defineTest.before(t => {     7           t.pass('before2');     8         });     9           10         defineTest.after(t => {    11           t.pass('after2');    12         });    13           14         defineTest.beforeEach(t => {    15           t.pass('beforeEach');    16         });    17           18         defineTest.afterEach(t => {    19           t.pass('afterEach');    20         });    21           22         defineTest.beforeEach(t => {    23           t.pass('other beforeEach');    24         });    25           26         defineTest.afterEach(t => {    27           t.pass('other afterEach');    28         });    29           30         defineTest.before(t => {    31           t.pass('before');    32         });    33           34         defineTest.after(t => {    35           t.pass('after');    36         });    37           38         defineTest('first', t => {    39           t.is(1, 1);    40         });    41           42         defineTest('second', t => {    43           t.is(2, 2);    44         });    45           46         defineTest('third', t => {    47           t.is(3, 3);    48         });    49       }, [    50         { type: 'ok', test: 'before', message: 'before2' },    51         { type: 'ok', test: 'before', message: 'before' },    52         { type: 'ok', test: 'first > beforeEach', message: 'beforeEach' },    53         { type: 'ok', test: 'second > beforeEach', message: 'beforeEach' },    54         { type: 'ok', test: 'third > beforeEach', message: 'beforeEach' },    55         { type: 'ok', test: 'first > beforeEach', message: 'other beforeEach' },    56         { type: 'ok', test: 'second > beforeEach', message: 'other beforeEach' },    57         { type: 'ok', test: 'third > beforeEach', message: 'other beforeEach' },    58         { type: 'ok', test: 'first', message: 'is' },    59         { type: 'ok', test: 'second', message: 'is' },    60         { type: 'ok', test: 'third', message: 'is' },    61         { type: 'ok', test: 'first > afterEach', message: 'afterEach' },    62         { type: 'ok', test: 'second > afterEach', message: 'afterEach' },    63         { type: 'ok', test: 'third > afterEach', message: 'afterEach' },    64         { type: 'ok', test: 'first > afterEach', message: 'other afterEach' },    65         { type: 'ok', test: 'second > afterEach', message: 'other afterEach' },    66         { type: 'ok', test: 'third > afterEach', message: 'other afterEach' },    67         { type: 'ok', test: 'after', message: 'after2' },    68         { type: 'ok', test: 'after', message: 'after' },    69         { type: 'done', count: 19, ok: 19, error: 0, skip: 0, only: 0 },    70       ], true);    71           72       runnerTest('before/after hooks multiple files', runner => {    73         const defineTest = runner();    74           75         defineTest.before(t => {    76           t.pass('before2');    77         });    78           79         defineTest.after(t => {    80           t.pass('after2');    81         });    82           83         defineTest.beforeEach(t => {    84           t.pass('beforeEach');    85         });    86           87         defineTest.afterEach(t => {    88           t.pass('afterEach');    89         });    90           91         defineTest.beforeEach(t => {    92           t.pass('other beforeEach');    93         });    94           95         defineTest.afterEach(t => {    96           t.pass('other afterEach');    97         });    98           99         defineTest.before(t => {   100           t.pass('before');   101         });   102          103         defineTest.after(t => {   104           t.pass('after');   105         });   106          107         defineTest('first', t => {   108           t.is(1, 1);   109         });   110          111         defineTest('second', t => {   112           t.is(2, 2);   113         });   114          115         defineTest('third', t => {   116           t.is(3, 3);   117         });   118          119         const defineTestOther = runner();   120          121         defineTestOther.before(t => {   122           t.pass('file2 before2');   123         });   124          125         defineTestOther.after(t => {   126           t.pass('file2 after2');   127         });   128          129         defineTestOther.beforeEach(t => {   130           t.pass('file2 beforeEach');   131         });   132          133         defineTestOther.afterEach(t => {   134           t.pass('file2 afterEach');   135         });   136          137         defineTestOther.beforeEach(t => {   138           t.pass('file2 other beforeEach');   139         });   140          141         defineTestOther.afterEach(t => {   142           t.pass('file2 other afterEach');   143         });   144          145         defineTestOther.before(t => {   146           t.pass('file2 before');   147         });   148          149         defineTestOther.after(t => {   150           t.pass('file2 after');   151         });   152          153         defineTestOther('file2 first', t => {   154           t.is(1, 1);   155         });   156          157         defineTestOther('file2 second', t => {   158           t.is(2, 2);   159         });   160          161         defineTestOther('file2 third', t => {   162           t.is(3, 3);   163         });   164       }, [   165         { type: 'ok', test: 'before', message: 'before2' },   166         { type: 'ok', test: 'before', message: 'file2 before2' },   167         { type: 'ok', test: 'before', message: 'before' },   168         { type: 'ok', test: 'before', message: 'file2 before' },   169         { type: 'ok', test: 'first > beforeEach', message: 'beforeEach' },   170         { type: 'ok', test: 'second > beforeEach', message: 'beforeEach' },   171         { type: 'ok', test: 'third > beforeEach', message: 'beforeEach' },   172         { type: 'ok', test: 'file2 first > beforeEach', message: 'file2 beforeEach' },   173         { type: 'ok', test: 'file2 second > beforeEach', message: 'file2 beforeEach' },   174         { type: 'ok', test: 'file2 third > beforeEach', message: 'file2 beforeEach' },   175         { type: 'ok', test: 'first > beforeEach', message: 'other beforeEach' },   176         { type: 'ok', test: 'second > beforeEach', message: 'other beforeEach' },   177         { type: 'ok', test: 'third > beforeEach', message: 'other beforeEach' },   178         { type: 'ok', test: 'file2 first > beforeEach', message: 'file2 other beforeEach' },   179         { type: 'ok', test: 'file2 second > beforeEach', message: 'file2 other beforeEach' },   180         { type: 'ok', test: 'file2 third > beforeEach', message: 'file2 other beforeEach' },   181         { type: 'ok', test: 'first', message: 'is' },   182         { type: 'ok', test: 'second', message: 'is' },   183         { type: 'ok', test: 'third', message: 'is' },   184         { type: 'ok', test: 'file2 first', message: 'is' },   185         { type: 'ok', test: 'file2 second', message: 'is' },   186         { type: 'ok', test: 'file2 third', message: 'is' },   187         { type: 'ok', test: 'first > afterEach', message: 'afterEach' },   188         { type: 'ok', test: 'second > afterEach', message: 'afterEach' },   189         { type: 'ok', test: 'third > afterEach', message: 'afterEach' },   190         { type: 'ok', test: 'file2 first > afterEach', message: 'file2 afterEach' },   191         { type: 'ok', test: 'file2 second > afterEach', message: 'file2 afterEach' },   192         { type: 'ok', test: 'file2 third > afterEach', message: 'file2 afterEach' },   193         { type: 'ok', test: 'first > afterEach', message: 'other afterEach' },   194         { type: 'ok', test: 'second > afterEach', message: 'other afterEach' },   195         { type: 'ok', test: 'third > afterEach', message: 'other afterEach' },   196         { type: 'ok', test: 'file2 first > afterEach', message: 'file2 other afterEach' },   197         { type: 'ok', test: 'file2 second > afterEach', message: 'file2 other afterEach' },   198         { type: 'ok', test: 'file2 third > afterEach', message: 'file2 other afterEach' },   199         { type: 'ok', test: 'after', message: 'after2' },   200         { type: 'ok', test: 'after', message: 'file2 after2' },   201         { type: 'ok', test: 'after', message: 'after' },   202         { type: 'ok', test: 'after', message: 'file2 after' },   203         { type: 'done', count: 38, ok: 38, error: 0, skip: 0, only: 0 },   204       ], true);   205          206       runnerTest('before/after cb hooks', runner => {   207         const defineTest = runner();   208          209         defineTest.before.cb(t => {   210           t.pass('before2');   211           setTimeout(t.end, 10);   212         });   213          214         defineTest.after.cb(t => {   215           t.pass('after2');   216           setTimeout(t.end, 10);   217         });   218          219         defineTest.beforeEach.cb(t => {   220           t.pass('beforeEach');   221           setTimeout(t.end, 10);   222         });   223          224         defineTest.afterEach.cb(t => {   225           t.pass('afterEach');   226           setTimeout(t.end, 10);   227         });   228          229         defineTest.beforeEach.cb(t => {   230           t.pass('other beforeEach');   231           setTimeout(t.end, 10);   232         });   233          234         defineTest.afterEach.cb(t => {   235           t.pass('other afterEach');   236           setTimeout(t.end, 10);   237         });   238          239         defineTest.before.cb(t => {   240           t.pass('before');   241           setTimeout(t.end, 10);   242         });   243          244         defineTest.after.cb(t => {   245           t.pass('after');   246           setTimeout(t.end, 10);   247         });   248          249         defineTest('first', t => {   250           t.is(1, 1);   251         });   252       }, [   253         { type: 'ok', test: 'before', message: 'before2' },   254         { type: 'ok', test: 'before', message: 'before' },   255         { type: 'ok', test: 'first > beforeEach', message: 'beforeEach' },   256         { type: 'ok', test: 'first > beforeEach', message: 'other beforeEach' },   257         { type: 'ok', test: 'first', message: 'is' },   258         { type: 'ok', test: 'first > afterEach', message: 'afterEach' },   259         { type: 'ok', test: 'first > afterEach', message: 'other afterEach' },   260         { type: 'ok', test: 'after', message: 'after2' },   261         { type: 'ok', test: 'after', message: 'after' },   262         { type: 'done', count: 9, ok: 9, error: 0, skip: 0, only: 0 },   263       ], true);   264          265       runnerTest('before/after hooks names', runner => {   266         const defineTest = runner();   267          268         defineTest.before('start database', t => {   269           t.pass('db running');   270         });   271          272         defineTest.after('stop database', t => {   273           t.pass('db stopped');   274         });   275          276         defineTest.beforeEach('create database', t => {   277           t.pass('db created');   278         });   279          280         defineTest.beforeEach('apply migrations', t => {   281           t.pass('migrations ok');   282         });   283          284         defineTest.afterEach('rollback migrations', t => {   285           t.pass('undo migrations ok');   286         });   287          288         defineTest.afterEach('drop database', t => {   289           t.pass('db dropped');   290         });   291          292         defineTest('first', t => {   293           t.is(1, 1);   294         });   295          296         defineTest('second', t => {   297           t.is(2, 2);   298         });   299          300         defineTest('third', t => {   301           t.is(3, 3);   302         });   303       }, [   304         { type: 'ok', test: 'start database', message: 'db running' },   305         { type: 'ok', test: 'first > create database', message: 'db created' },   306         { type: 'ok', test: 'second > create database', message: 'db created' },   307         { type: 'ok', test: 'third > create database', message: 'db created' },   308         { type: 'ok', test: 'first > apply migrations', message: 'migrations ok' },   309         { type: 'ok', test: 'second > apply migrations', message: 'migrations ok' },   310         { type: 'ok', test: 'third > apply migrations', message: 'migrations ok' },   311         { type: 'ok', test: 'first', message: 'is' },   312         { type: 'ok', test: 'second', message: 'is' },   313         { type: 'ok', test: 'third', message: 'is' },   314         { type: 'ok', test: 'first > rollback migrations', message: 'undo migrations ok' },   315         { type: 'ok', test: 'second > rollback migrations', message: 'undo migrations ok' },   316         { type: 'ok', test: 'third > rollback migrations', message: 'undo migrations ok' },   317         { type: 'ok', test: 'first > drop database', message: 'db dropped' },   318         { type: 'ok', test: 'second > drop database', message: 'db dropped' },   319         { type: 'ok', test: 'third > drop database', message: 'db dropped' },   320         { type: 'ok', test: 'stop database', message: 'db stopped' },   321         { type: 'done', count: 17, ok: 17, error: 0, skip: 0, only: 0 },   322       ], true);   323          324       runnerTest('before/after hooks skip', runner => {   325         const defineTest = runner();   326          327         defineTest.before.skip('start database', t => {   328           t.pass('db running');   329         });   330          331         defineTest.after.skip('stop database', t => {   332           t.pass('db stopped');   333         });   334          335         defineTest.beforeEach.skip('create database', t => {   336           t.pass('db created');   337         });   338          339         defineTest.beforeEach.skip('apply migrations', t => {   340           t.pass('migrations ok');   341         });   342          343         defineTest.afterEach.skip('rollback migrations', t => {   344           t.pass('undo migrations ok');   345         });   346          347         defineTest.afterEach.skip('drop database', t => {   348           t.pass('db dropped');   349         });   350          351         defineTest('first', t => {   352           t.is(1, 1);   353         });   354          355         defineTest('second', t => {   356           t.is(2, 2);   357         });   358          359         defineTest('third', t => {   360           t.is(3, 3);   361         });   362       }, [   363         { type: 'skip', test: 'start database' },   364         { type: 'skip', test: 'first > create database' },   365         { type: 'skip', test: 'second > create database' },   366         { type: 'skip', test: 'third > create database' },   367         { type: 'skip', test: 'first > apply migrations' },   368         { type: 'skip', test: 'second > apply migrations' },   369         { type: 'skip', test: 'third > apply migrations' },   370         { type: 'ok', test: 'first', message: 'is' },   371         { type: 'ok', test: 'second', message: 'is' },   372         { type: 'ok', test: 'third', message: 'is' },   373         { type: 'skip', test: 'first > rollback migrations' },   374         { type: 'skip', test: 'second > rollback migrations' },   375         { type: 'skip', test: 'third > rollback migrations' },   376         { type: 'skip', test: 'first > drop database' },   377         { type: 'skip', test: 'second > drop database' },   378         { type: 'skip', test: 'third > drop database' },   379         { type: 'skip', test: 'stop database' },   380         { type: 'done', count: 17, ok: 3, error: 0, skip: 14, only: 0 },   381       ], true);   382          383       runnerTest('before/after test skip', runner => {   384         const defineTest = runner();   385          386         defineTest.before('start database', t => {   387           t.pass('db running');   388         });   389          390         defineTest.after('stop database', t => {   391           t.pass('db stopped');   392         });   393          394         defineTest.beforeEach('create database', t => {   395           t.pass('db created');   396         });   397          398         defineTest.beforeEach('apply migrations', t => {   399           t.pass('migrations ok');   400         });   401          402         defineTest.afterEach('rollback migrations', t => {   403           t.pass('undo migrations ok');   404         });   405          406         defineTest.afterEach('drop database', t => {   407           t.pass('db dropped');   408         });   409          410         defineTest.skip('first', t => {   411           t.is(1, 1);   412         });   413          414         defineTest('second', t => {   415           t.is(2, 2);   416         });   417          418         defineTest.skip('third', t => {   419           t.is(3, 3);   420         });   421       }, [   422         { type: 'ok', test: 'start database', message: 'db running' },   423         { type: 'skip', test: 'first > create database' },   424         { type: 'ok', test: 'second > create database', message: 'db created' },   425         { type: 'skip', test: 'third > create database' },   426         { type: 'skip', test: 'first > apply migrations' },   427         { type: 'ok', test: 'second > apply migrations', message: 'migrations ok' },   428         { type: 'skip', test: 'third > apply migrations' },   429         { type: 'skip', test: 'first' },   430         { type: 'ok', test: 'second', message: 'is' },   431         { type: 'skip', test: 'third' },   432         { type: 'skip', test: 'first > rollback migrations' },   433         { type: 'ok', test: 'second > rollback migrations', message: 'undo migrations ok' },   434         { type: 'skip', test: 'third > rollback migrations' },   435         { type: 'skip', test: 'first > drop database' },   436         { type: 'ok', test: 'second > drop database', message: 'db dropped' },   437         { type: 'skip', test: 'third > drop database' },   438         { type: 'ok', test: 'stop database', message: 'db stopped' },   439         { type: 'done', count: 17, ok: 7, error: 0, skip: 10, only: 0 },   440       ], true);   441          442       runnerTest('before/after test cb skip', runner => {   443         const defineTest = runner();   444          445         defineTest.before.cb.skip('start database', t => {   446           t.pass('db running');   447         });   448          449         defineTest.after.cb.skip('stop database', t => {   450           t.pass('db stopped');   451         });   452          453         defineTest.beforeEach.cb.skip('create database', t => {   454           t.pass('db created');   455           t.end();   456         });   457          458         defineTest.beforeEach.cb.skip('apply migrations', t => {   459           t.pass('migrations ok');   460           t.end();   461         });   462          463         defineTest.afterEach.cb.skip('rollback migrations', t => {   464           t.pass('undo migrations ok');   465           t.end();   466         });   467          468         defineTest.afterEach.cb.skip('drop database', t => {   469           t.pass('db dropped');   470           t.end();   471         });   472          473         defineTest.cb.skip('first', t => {   474           t.is(1, 1);   475           t.end();   476         });   477          478         defineTest('second', t => {   479           t.is(2, 2);   480         });   481          482         defineTest.cb.skip('third', t => {   483           t.is(3, 3);   484           t.end();   485         });   486       }, [   487         { type: 'skip', test: 'start database' },   488         { type: 'skip', test: 'first > create database' },   489         { type: 'skip', test: 'second > create database' },   490         { type: 'skip', test: 'third > create database' },   491         { type: 'skip', test: 'first > apply migrations' },   492         { type: 'skip', test: 'second > apply migrations' },   493         { type: 'skip', test: 'third > apply migrations' },   494         { type: 'skip', test: 'first' },   495         { type: 'ok', test: 'second', message: 'is' },   496         { type: 'skip', test: 'third' },   497         { type: 'skip', test: 'first > rollback migrations' },   498         { type: 'skip', test: 'second > rollback migrations' },   499         { type: 'skip', test: 'third > rollback migrations' },   500         { type: 'skip', test: 'first > drop database' },   501         { type: 'skip', test: 'second > drop database' },   502         { type: 'skip', test: 'third > drop database' },   503         { type: 'skip', test: 'stop database' },   504         { type: 'done', count: 17, ok: 1, error: 0, skip: 16, only: 0 },   505       ], true);   506          507       runnerTest('before/after hooks & only tests', runner => {   508         const defineTest = runner();   509          510         defineTest.before('start database', t => {   511           t.pass('db running');   512         });   513          514         defineTest.after('stop database', t => {   515           t.pass('db stopped');   516         });   517          518         defineTest.beforeEach('create database', t => {   519           t.pass('db created');   520         });   521          522         defineTest.beforeEach('apply migrations', t => {   523           t.pass('migrations ok');   524         });   525          526         defineTest.afterEach('rollback migrations', t => {   527           t.pass('undo migrations ok');   528         });   529          530         defineTest.afterEach('drop database', t => {   531           t.pass('db dropped');   532         });   533          534         defineTest.only('first', t => {   535           t.is(1, 1);   536         });   537          538         defineTest.only('second', t => {   539           t.is(2, 2);   540         });   541          542         defineTest('third', t => {   543           t.is(3, 3);   544         });   545       }, [   546         { type: 'ok', test: 'start database', message: 'db running' },   547         { type: 'ok', test: 'first > create database', message: 'db created' },   548         { type: 'ok', test: 'second > create database', message: 'db created' },   549         { type: 'ok', test: 'first > apply migrations', message: 'migrations ok' },   550         { type: 'ok', test: 'second > apply migrations', message: 'migrations ok' },   551         { type: 'ok', test: 'first', message: 'is' },   552         { type: 'ok', test: 'second', message: 'is' },   553         { type: 'ok', test: 'first > rollback migrations', message: 'undo migrations ok' },   554         { type: 'ok', test: 'second > rollback migrations', message: 'undo migrations ok' },   555         { type: 'ok', test: 'first > drop database', message: 'db dropped' },   556         { type: 'ok', test: 'second > drop database', message: 'db dropped' },   557         { type: 'ok', test: 'stop database', message: 'db stopped' },   558         { type: 'done', count: 12, ok: 12, error: 0, skip: 0, only: 2 },   559       ], false);   560          561       runnerTest('before/after hooks & cb only test', runner => {   562         const defineTest = runner();   563          564         defineTest.before('start database', t => {   565           t.pass('db running');   566         });   567          568         defineTest.after('stop database', t => {   569           t.pass('db stopped');   570         });   571          572         defineTest.beforeEach('create database', t => {   573           t.pass('db created');   574         });   575          576         defineTest.beforeEach('apply migrations', t => {   577           t.pass('migrations ok');   578         });   579          580         defineTest.afterEach('rollback migrations', t => {   581           t.pass('undo migrations ok');   582         });   583          584         defineTest.afterEach('drop database', t => {   585           t.pass('db dropped');   586         });   587          588         defineTest.cb.only('first', t => {   589           t.is(1, 1);   590           setTimeout(t.end, 100);   591         });   592          593         defineTest.only('second', t => {   594           t.is(2, 2);   595         });   596          597         defineTest('third', t => {   598           t.is(3, 3);   599         });   600       }, [   601         { type: 'ok', test: 'start database', message: 'db running' },   602         { type: 'ok', test: 'first > create database', message: 'db created' },   603         { type: 'ok', test: 'second > create database', message: 'db created' },   604         { type: 'ok', test: 'first > apply migrations', message: 'migrations ok' },   605         { type: 'ok', test: 'second > apply migrations', message: 'migrations ok' },   606         { type: 'ok', test: 'first', message: 'is' },   607         { type: 'ok', test: 'second', message: 'is' },   608         { type: 'ok', test: 'second > rollback migrations', message: 'undo migrations ok' },   609         { type: 'ok', test: 'second > drop database', message: 'db dropped' },   610         { type: 'ok', test: 'first > rollback migrations', message: 'undo migrations ok' },   611         { type: 'ok', test: 'first > drop database', message: 'db dropped' },   612         { type: 'ok', test: 'stop database', message: 'db stopped' },   613         { type: 'done', count: 12, ok: 12, error: 0, skip: 0, only: 2 },   614       ], false);   615          616       runnerTest('before/after hooks serial', runner => {   617         const defineTest = runner();   618          619         defineTest.before('start database', t => {   620           t.pass('db running');   621         });   622          623         defineTest.after('stop database', t => {   624           t.pass('db stopped');   625         });   626          627         defineTest.beforeEach('create database', t => {   628           t.pass('db created');   629         });   630          631         defineTest.beforeEach('apply migrations', t => {   632           t.pass('migrations ok');   633         });   634          635         defineTest.afterEach('rollback migrations', t => {   636           t.pass('undo migrations ok');   637         });   638          639         defineTest.afterEach('drop database', t => {   640           t.pass('db dropped');   641         });   642          643         defineTest('first', t => {   644           t.is(1, 1);   645         });   646          647         defineTest('second', t => {   648           t.is(2, 2);   649         });   650          651         defineTest('third', t => {   652           t.is(3, 3);   653         });   654       }, [   655         { type: 'ok', test: 'start database', message: 'db running' },   656         { type: 'ok', test: 'first > create database', message: 'db created' },   657         { type: 'ok', test: 'second > create database', message: 'db created' },   658         { type: 'ok', test: 'third > create database', message: 'db created' },   659         { type: 'ok', test: 'first > apply migrations', message: 'migrations ok' },   660         { type: 'ok', test: 'second > apply migrations', message: 'migrations ok' },   661         { type: 'ok', test: 'third > apply migrations', message: 'migrations ok' },   662         { type: 'ok', test: 'first', message: 'is' },   663         { type: 'ok', test: 'second', message: 'is' },   664         { type: 'ok', test: 'third', message: 'is' },   665         { type: 'ok', test: 'first > rollback migrations', message: 'undo migrations ok' },   666         { type: 'ok', test: 'second > rollback migrations', message: 'undo migrations ok' },   667         { type: 'ok', test: 'third > rollback migrations', message: 'undo migrations ok' },   668         { type: 'ok', test: 'first > drop database', message: 'db dropped' },   669         { type: 'ok', test: 'second > drop database', message: 'db dropped' },   670         { type: 'ok', test: 'third > drop database', message: 'db dropped' },   671         { type: 'ok', test: 'stop database', message: 'db stopped' },   672         { type: 'done', count: 17, ok: 17, error: 0, skip: 0, only: 0 },   673       ], true);            1import runnerTest from "../helpers/runner-test";            2            3runnerTest(            4  "before/after hooks",            5  (runner) => {            6    const defineTest = runner();            7            8    defineTest.before((t) => {            9      t.pass("before2");           10    });           11           12    defineTest.after((t) => {           13      t.pass("after2");           14    });           15           16    defineTest.beforeEach((t) => {           17      t.pass("beforeEach");           18    });           19           20    defineTest.afterEach((t) => {           21      t.pass("afterEach");           22    });           23           24    defineTest.beforeEach((t) => {           25      t.pass("other beforeEach");           26    });           27           28    defineTest.afterEach((t) => {           29      t.pass("other afterEach");           30    });           31           32    defineTest.before((t) => {           33      t.pass("before");           34    });           35           36    defineTest.after((t) => {           37      t.pass("after");           38    });           39           40    defineTest("first", (t) => {           41      t.is(1, 1);           42    });           43           44    defineTest("second", (t) => {           45      t.is(2, 2);           46    });           47           48    defineTest("third", (t) => {           49      t.is(3, 3);           50    });           51  },           52  [           53    { type: "ok", test: "before", message: "before2" },           54    { type: "ok", test: "before", message: "before" },           55    { type: "ok", test: "first > beforeEach", message: "beforeEach" },           56    { type: "ok", test: "second > beforeEach", message: "beforeEach" },           57    { type: "ok", test: "third > beforeEach", message: "beforeEach" },           58    { type: "ok", test: "first > beforeEach", message: "other beforeEach" },           59    { type: "ok", test: "second > beforeEach", message: "other beforeEach" },           60    { type: "ok", test: "third > beforeEach", message: "other beforeEach" },           61    { type: "ok", test: "first", message: "is" },           62    { type: "ok", test: "second", message: "is" },           63    { type: "ok", test: "third", message: "is" },           64    { type: "ok", test: "first > afterEach", message: "afterEach" },           65    { type: "ok", test: "second > afterEach", message: "afterEach" },           66    { type: "ok", test: "third > afterEach", message: "afterEach" },           67    { type: "ok", test: "first > afterEach", message: "other afterEach" },           68    { type: "ok", test: "second > afterEach", message: "other afterEach" },           69    { type: "ok", test: "third > afterEach", message: "other afterEach" },           70    { type: "ok", test: "after", message: "after2" },           71    { type: "ok", test: "after", message: "after" },           72    { type: "done", count: 19, ok: 19, error: 0, skip: 0, only: 0 },           73  ],           74  true,           75);           76           77runnerTest(           78  "before/after hooks multiple files",           79  (runner) => {           80    const defineTest = runner();           81           82    defineTest.before((t) => {           83      t.pass("before2");           84    });           85           86    defineTest.after((t) => {           87      t.pass("after2");           88    });           89           90    defineTest.beforeEach((t) => {           91      t.pass("beforeEach");           92    });           93           94    defineTest.afterEach((t) => {           95      t.pass("afterEach");           96    });           97           98    defineTest.beforeEach((t) => {           99      t.pass("other beforeEach");          100    });          101          102    defineTest.afterEach((t) => {          103      t.pass("other afterEach");          104    });          105          106    defineTest.before((t) => {          107      t.pass("before");          108    });          109          110    defineTest.after((t) => {          111      t.pass("after");          112    });          113          114    defineTest("first", (t) => {          115      t.is(1, 1);          116    });          117          118    defineTest("second", (t) => {          119      t.is(2, 2);          120    });          121          122    defineTest("third", (t) => {          123      t.is(3, 3);          124    });          125          126    const defineTestOther = runner();          127          128    defineTestOther.before((t) => {          129      t.pass("file2 before2");          130    });          131          132    defineTestOther.after((t) => {          133      t.pass("file2 after2");          134    });          135          136    defineTestOther.beforeEach((t) => {          137      t.pass("file2 beforeEach");          138    });          139          140    defineTestOther.afterEach((t) => {          141      t.pass("file2 afterEach");          142    });          143          144    defineTestOther.beforeEach((t) => {          145      t.pass("file2 other beforeEach");          146    });          147          148    defineTestOther.afterEach((t) => {          149      t.pass("file2 other afterEach");          150    });          151          152    defineTestOther.before((t) => {          153      t.pass("file2 before");          154    });          155          156    defineTestOther.after((t) => {          157      t.pass("file2 after");          158    });          159          160    defineTestOther("file2 first", (t) => {          161      t.is(1, 1);          162    });          163          164    defineTestOther("file2 second", (t) => {          165      t.is(2, 2);          166    });          167          168    defineTestOther("file2 third", (t) => {          169      t.is(3, 3);          170    });          171  },          172  [          173    { type: "ok", test: "before", message: "before2" },          174    { type: "ok", test: "before", message: "file2 before2" },          175    { type: "ok", test: "before", message: "before" },          176    { type: "ok", test: "before", message: "file2 before" },          177    { type: "ok", test: "first > beforeEach", message: "beforeEach" },          178    { type: "ok", test: "second > beforeEach", message: "beforeEach" },          179    { type: "ok", test: "third > beforeEach", message: "beforeEach" },          180    {          181      type: "ok",          182      test: "file2 first > beforeEach",          183      message: "file2 beforeEach",          184    },          185    {          186      type: "ok",          187      test: "file2 second > beforeEach",          188      message: "file2 beforeEach",          189    },          190    {          191      type: "ok",          192      test: "file2 third > beforeEach",          193      message: "file2 beforeEach",          194    },          195    { type: "ok", test: "first > beforeEach", message: "other beforeEach" },          196    { type: "ok", test: "second > beforeEach", message: "other beforeEach" },          197    { type: "ok", test: "third > beforeEach", message: "other beforeEach" },          198    {          199      type: "ok",          200      test: "file2 first > beforeEach",          201      message: "file2 other beforeEach",          202    },          203    {          204      type: "ok",          205      test: "file2 second > beforeEach",          206      message: "file2 other beforeEach",          207    },          208    {          209      type: "ok",          210      test: "file2 third > beforeEach",          211      message: "file2 other beforeEach",          212    },          213    { type: "ok", test: "first", message: "is" },          214    { type: "ok", test: "second", message: "is" },          215    { type: "ok", test: "third", message: "is" },          216    { type: "ok", test: "file2 first", message: "is" },          217    { type: "ok", test: "file2 second", message: "is" },          218    { type: "ok", test: "file2 third", message: "is" },          219    { type: "ok", test: "first > afterEach", message: "afterEach" },          220    { type: "ok", test: "second > afterEach", message: "afterEach" },          221    { type: "ok", test: "third > afterEach", message: "afterEach" },          222    { type: "ok", test: "file2 first > afterEach", message: "file2 afterEach" },          223    {          224      type: "ok",          225      test: "file2 second > afterEach",          226      message: "file2 afterEach",          227    },          228    { type: "ok", test: "file2 third > afterEach", message: "file2 afterEach" },          229    { type: "ok", test: "first > afterEach", message: "other afterEach" },          230    { type: "ok", test: "second > afterEach", message: "other afterEach" },          231    { type: "ok", test: "third > afterEach", message: "other afterEach" },          232    {          233      type: "ok",          234      test: "file2 first > afterEach",          235      message: "file2 other afterEach",          236    },          237    {          238      type: "ok",          239      test: "file2 second > afterEach",          240      message: "file2 other afterEach",          241    },          242    {          243      type: "ok",          244      test: "file2 third > afterEach",          245      message: "file2 other afterEach",          246    },          247    { type: "ok", test: "after", message: "after2" },          248    { type: "ok", test: "after", message: "file2 after2" },          249    { type: "ok", test: "after", message: "after" },          250    { type: "ok", test: "after", message: "file2 after" },          251    { type: "done", count: 38, ok: 38, error: 0, skip: 0, only: 0 },          252  ],          253  true,          254);          255          256runnerTest(          257  "before/after cb hooks",          258  (runner) => {          259    const defineTest = runner();          260          261    defineTest.before.cb((t) => {          262      t.pass("before2");          263      setTimeout(t.end, 10);          264    });          265          266    defineTest.after.cb((t) => {          267      t.pass("after2");          268      setTimeout(t.end, 10);          269    });          270          271    defineTest.beforeEach.cb((t) => {          272      t.pass("beforeEach");          273      setTimeout(t.end, 10);          274    });          275          276    defineTest.afterEach.cb((t) => {          277      t.pass("afterEach");          278      setTimeout(t.end, 10);          279    });          280          281    defineTest.beforeEach.cb((t) => {          282      t.pass("other beforeEach");          283      setTimeout(t.end, 10);          284    });          285          286    defineTest.afterEach.cb((t) => {          287      t.pass("other afterEach");          288      setTimeout(t.end, 10);          289    });          290          291    defineTest.before.cb((t) => {          292      t.pass("before");          293      setTimeout(t.end, 10);          294    });          295          296    defineTest.after.cb((t) => {          297      t.pass("after");          298      setTimeout(t.end, 10);          299    });          300          301    defineTest("first", (t) => {          302      t.is(1, 1);          303    });          304  },          305  [          306    { type: "ok", test: "before", message: "before2" },          307    { type: "ok", test: "before", message: "before" },          308    { type: "ok", test: "first > beforeEach", message: "beforeEach" },          309    { type: "ok", test: "first > beforeEach", message: "other beforeEach" },          310    { type: "ok", test: "first", message: "is" },          311    { type: "ok", test: "first > afterEach", message: "afterEach" },          312    { type: "ok", test: "first > afterEach", message: "other afterEach" },          313    { type: "ok", test: "after", message: "after2" },          314    { type: "ok", test: "after", message: "after" },          315    { type: "done", count: 9, ok: 9, error: 0, skip: 0, only: 0 },          316  ],          317  true,          318);          319          320runnerTest(          321  "before/after hooks names",          322  (runner) => {          323    const defineTest = runner();          324          325    defineTest.before("start database", (t) => {          326      t.pass("db running");          327    });          328          329    defineTest.after("stop database", (t) => {          330      t.pass("db stopped");          331    });          332          333    defineTest.beforeEach("create database", (t) => {          334      t.pass("db created");          335    });          336          337    defineTest.beforeEach("apply migrations", (t) => {          338      t.pass("migrations ok");          339    });          340          341    defineTest.afterEach("rollback migrations", (t) => {          342      t.pass("undo migrations ok");          343    });          344          345    defineTest.afterEach("drop database", (t) => {          346      t.pass("db dropped");          347    });          348          349    defineTest("first", (t) => {          350      t.is(1, 1);          351    });          352          353    defineTest("second", (t) => {          354      t.is(2, 2);          355    });          356          357    defineTest("third", (t) => {          358      t.is(3, 3);          359    });          360  },          361  [          362    { type: "ok", test: "start database", message: "db running" },          363    { type: "ok", test: "first > create database", message: "db created" },          364    { type: "ok", test: "second > create database", message: "db created" },          365    { type: "ok", test: "third > create database", message: "db created" },          366    { type: "ok", test: "first > apply migrations", message: "migrations ok" },          367    { type: "ok", test: "second > apply migrations", message: "migrations ok" },          368    { type: "ok", test: "third > apply migrations", message: "migrations ok" },          369    { type: "ok", test: "first", message: "is" },          370    { type: "ok", test: "second", message: "is" },          371    { type: "ok", test: "third", message: "is" },          372    {          373      type: "ok",          374      test: "first > rollback migrations",          375      message: "undo migrations ok",          376    },          377    {          378      type: "ok",          379      test: "second > rollback migrations",          380      message: "undo migrations ok",          381    },          382    {          383      type: "ok",          384      test: "third > rollback migrations",          385      message: "undo migrations ok",          386    },          387    { type: "ok", test: "first > drop database", message: "db dropped" },          388    { type: "ok", test: "second > drop database", message: "db dropped" },          389    { type: "ok", test: "third > drop database", message: "db dropped" },          390    { type: "ok", test: "stop database", message: "db stopped" },          391    { type: "done", count: 17, ok: 17, error: 0, skip: 0, only: 0 },          392  ],          393  true,          394);          395          396runnerTest(          397  "before/after hooks skip",          398  (runner) => {          399    const defineTest = runner();          400          401    defineTest.before.skip("start database", (t) => {          402      t.pass("db running");          403    });          404          405    defineTest.after.skip("stop database", (t) => {          406      t.pass("db stopped");          407    });          408          409    defineTest.beforeEach.skip("create database", (t) => {          410      t.pass("db created");          411    });          412          413    defineTest.beforeEach.skip("apply migrations", (t) => {          414      t.pass("migrations ok");          415    });          416          417    defineTest.afterEach.skip("rollback migrations", (t) => {          418      t.pass("undo migrations ok");          419    });          420          421    defineTest.afterEach.skip("drop database", (t) => {          422      t.pass("db dropped");          423    });          424          425    defineTest("first", (t) => {          426      t.is(1, 1);          427    });          428          429    defineTest("second", (t) => {          430      t.is(2, 2);          431    });          432          433    defineTest("third", (t) => {          434      t.is(3, 3);          435    });          436  },          437  [          438    { type: "skip", test: "start database" },          439    { type: "skip", test: "first > create database" },          440    { type: "skip", test: "second > create database" },          441    { type: "skip", test: "third > create database" },          442    { type: "skip", test: "first > apply migrations" },          443    { type: "skip", test: "second > apply migrations" },          444    { type: "skip", test: "third > apply migrations" },          445    { type: "ok", test: "first", message: "is" },          446    { type: "ok", test: "second", message: "is" },          447    { type: "ok", test: "third", message: "is" },          448    { type: "skip", test: "first > rollback migrations" },          449    { type: "skip", test: "second > rollback migrations" },          450    { type: "skip", test: "third > rollback migrations" },          451    { type: "skip", test: "first > drop database" },          452    { type: "skip", test: "second > drop database" },          453    { type: "skip", test: "third > drop database" },          454    { type: "skip", test: "stop database" },          455    { type: "done", count: 17, ok: 3, error: 0, skip: 14, only: 0 },          456  ],          457  true,          458);          459          460runnerTest(          461  "before/after test skip",          462  (runner) => {          463    const defineTest = runner();          464          465    defineTest.before("start database", (t) => {          466      t.pass("db running");          467    });          468          469    defineTest.after("stop database", (t) => {          470      t.pass("db stopped");          471    });          472          473    defineTest.beforeEach("create database", (t) => {          474      t.pass("db created");          475    });          476          477    defineTest.beforeEach("apply migrations", (t) => {          478      t.pass("migrations ok");          479    });          480          481    defineTest.afterEach("rollback migrations", (t) => {          482      t.pass("undo migrations ok");          483    });          484          485    defineTest.afterEach("drop database", (t) => {          486      t.pass("db dropped");          487    });          488          489    defineTest.skip("first", (t) => {          490      t.is(1, 1);          491    });          492          493    defineTest("second", (t) => {          494      t.is(2, 2);          495    });          496          497    defineTest.skip("third", (t) => {          498      t.is(3, 3);          499    });          500  },          501  [          502    { type: "ok", test: "start database", message: "db running" },          503    { type: "skip", test: "first > create database" },          504    { type: "ok", test: "second > create database", message: "db created" },          505    { type: "skip", test: "third > create database" },          506    { type: "skip", test: "first > apply migrations" },          507    { type: "ok", test: "second > apply migrations", message: "migrations ok" },          508    { type: "skip", test: "third > apply migrations" },          509    { type: "skip", test: "first" },          510    { type: "ok", test: "second", message: "is" },          511    { type: "skip", test: "third" },          512    { type: "skip", test: "first > rollback migrations" },          513    {          514      type: "ok",          515      test: "second > rollback migrations",          516      message: "undo migrations ok",          517    },          518    { type: "skip", test: "third > rollback migrations" },          519    { type: "skip", test: "first > drop database" },          520    { type: "ok", test: "second > drop database", message: "db dropped" },          521    { type: "skip", test: "third > drop database" },          522    { type: "ok", test: "stop database", message: "db stopped" },          523    { type: "done", count: 17, ok: 7, error: 0, skip: 10, only: 0 },          524  ],          525  true,          526);          527          528runnerTest(          529  "before/after test cb skip",          530  (runner) => {          531    const defineTest = runner();          532          533    defineTest.before.cb.skip("start database", (t) => {          534      t.pass("db running");          535    });          536          537    defineTest.after.cb.skip("stop database", (t) => {          538      t.pass("db stopped");          539    });          540          541    defineTest.beforeEach.cb.skip("create database", (t) => {          542      t.pass("db created");          543      t.end();          544    });          545          546    defineTest.beforeEach.cb.skip("apply migrations", (t) => {          547      t.pass("migrations ok");          548      t.end();          549    });          550          551    defineTest.afterEach.cb.skip("rollback migrations", (t) => {          552      t.pass("undo migrations ok");          553      t.end();          554    });          555          556    defineTest.afterEach.cb.skip("drop database", (t) => {          557      t.pass("db dropped");          558      t.end();          559    });          560          561    defineTest.cb.skip("first", (t) => {          562      t.is(1, 1);          563      t.end();          564    });          565          566    defineTest("second", (t) => {          567      t.is(2, 2);          568    });          569          570    defineTest.cb.skip("third", (t) => {          571      t.is(3, 3);          572      t.end();          573    });          574  },          575  [          576    { type: "skip", test: "start database" },          577    { type: "skip", test: "first > create database" },          578    { type: "skip", test: "second > create database" },          579    { type: "skip", test: "third > create database" },          580    { type: "skip", test: "first > apply migrations" },          581    { type: "skip", test: "second > apply migrations" },          582    { type: "skip", test: "third > apply migrations" },          583    { type: "skip", test: "first" },          584    { type: "ok", test: "second", message: "is" },          585    { type: "skip", test: "third" },          586    { type: "skip", test: "first > rollback migrations" },          587    { type: "skip", test: "second > rollback migrations" },          588    { type: "skip", test: "third > rollback migrations" },          589    { type: "skip", test: "first > drop database" },          590    { type: "skip", test: "second > drop database" },          591    { type: "skip", test: "third > drop database" },          592    { type: "skip", test: "stop database" },          593    { type: "done", count: 17, ok: 1, error: 0, skip: 16, only: 0 },          594  ],          595  true,          596);          597          598runnerTest(          599  "before/after hooks & only tests",          600  (runner) => {          601    const defineTest = runner();          602          603    defineTest.before("start database", (t) => {          604      t.pass("db running");          605    });          606          607    defineTest.after("stop database", (t) => {          608      t.pass("db stopped");          609    });          610          611    defineTest.beforeEach("create database", (t) => {          612      t.pass("db created");          613    });          614          615    defineTest.beforeEach("apply migrations", (t) => {          616      t.pass("migrations ok");          617    });          618          619    defineTest.afterEach("rollback migrations", (t) => {          620      t.pass("undo migrations ok");          621    });          622          623    defineTest.afterEach("drop database", (t) => {          624      t.pass("db dropped");          625    });          626          627    defineTest.only("first", (t) => {          628      t.is(1, 1);          629    });          630          631    defineTest.only("second", (t) => {          632      t.is(2, 2);          633    });          634          635    defineTest("third", (t) => {          636      t.is(3, 3);          637    });          638  },          639  [          640    { type: "ok", test: "start database", message: "db running" },          641    { type: "ok", test: "first > create database", message: "db created" },          642    { type: "ok", test: "second > create database", message: "db created" },          643    { type: "ok", test: "first > apply migrations", message: "migrations ok" },          644    { type: "ok", test: "second > apply migrations", message: "migrations ok" },          645    { type: "ok", test: "first", message: "is" },          646    { type: "ok", test: "second", message: "is" },          647    {          648      type: "ok",          649      test: "first > rollback migrations",          650      message: "undo migrations ok",          651    },          652    {          653      type: "ok",          654      test: "second > rollback migrations",          655      message: "undo migrations ok",          656    },          657    { type: "ok", test: "first > drop database", message: "db dropped" },          658    { type: "ok", test: "second > drop database", message: "db dropped" },          659    { type: "ok", test: "stop database", message: "db stopped" },          660    { type: "done", count: 12, ok: 12, error: 0, skip: 0, only: 2 },          661  ],          662  false,          663);          664          665runnerTest(          666  "before/after hooks & cb only test",          667  (runner) => {          668    const defineTest = runner();          669          670    defineTest.before("start database", (t) => {          671      t.pass("db running");          672    });          673          674    defineTest.after("stop database", (t) => {          675      t.pass("db stopped");          676    });          677          678    defineTest.beforeEach("create database", (t) => {          679      t.pass("db created");          680    });          681          682    defineTest.beforeEach("apply migrations", (t) => {          683      t.pass("migrations ok");          684    });          685          686    defineTest.afterEach("rollback migrations", (t) => {          687      t.pass("undo migrations ok");          688    });          689          690    defineTest.afterEach("drop database", (t) => {          691      t.pass("db dropped");          692    });          693          694    defineTest.cb.only("first", (t) => {          695      t.is(1, 1);          696      setTimeout(t.end, 100);          697    });          698          699    defineTest.only("second", (t) => {          700      t.is(2, 2);          701    });          702          703    defineTest("third", (t) => {          704      t.is(3, 3);          705    });          706  },          707  [          708    { type: "ok", test: "start database", message: "db running" },          709    { type: "ok", test: "first > create database", message: "db created" },          710    { type: "ok", test: "second > create database", message: "db created" },          711    { type: "ok", test: "first > apply migrations", message: "migrations ok" },          712    { type: "ok", test: "second > apply migrations", message: "migrations ok" },          713    { type: "ok", test: "first", message: "is" },          714    { type: "ok", test: "second", message: "is" },          715    {          716      type: "ok",          717      test: "second > rollback migrations",          718      message: "undo migrations ok",          719    },          720    { type: "ok", test: "second > drop database", message: "db dropped" },          721    {          722      type: "ok",          723      test: "first > rollback migrations",          724      message: "undo migrations ok",          725    },          726    { type: "ok", test: "first > drop database", message: "db dropped" },          727    { type: "ok", test: "stop database", message: "db stopped" },          728    { type: "done", count: 12, ok: 12, error: 0, skip: 0, only: 2 },          729  ],          730  false,          731);          732          733runnerTest(          734  "before/after hooks serial",          735  (runner) => {          736    const defineTest = runner();          737          738    defineTest.before("start database", (t) => {          739      t.pass("db running");          740    });          741          742    defineTest.after("stop database", (t) => {          743      t.pass("db stopped");          744    });          745          746    defineTest.beforeEach("create database", (t) => {          747      t.pass("db created");          748    });          749          750    defineTest.beforeEach("apply migrations", (t) => {          751      t.pass("migrations ok");          752    });          753          754    defineTest.afterEach("rollback migrations", (t) => {          755      t.pass("undo migrations ok");          756    });          757          758    defineTest.afterEach("drop database", (t) => {          759      t.pass("db dropped");          760    });          761          762    defineTest("first", (t) => {          763      t.is(1, 1);          764    });          765          766    defineTest("second", (t) => {          767      t.is(2, 2);          768    });          769          770    defineTest("third", (t) => {          771      t.is(3, 3);          772    });          773  },          774  [          775    { type: "ok", test: "start database", message: "db running" },          776    { type: "ok", test: "first > create database", message: "db created" },          777    { type: "ok", test: "second > create database", message: "db created" },          778    { type: "ok", test: "third > create database", message: "db created" },          779    { type: "ok", test: "first > apply migrations", message: "migrations ok" },          780    { type: "ok", test: "second > apply migrations", message: "migrations ok" },          781    { type: "ok", test: "third > apply migrations", message: "migrations ok" },          782    { type: "ok", test: "first", message: "is" },          783    { type: "ok", test: "second", message: "is" },          784    { type: "ok", test: "third", message: "is" },          785    {          786      type: "ok",          787      test: "first > rollback migrations",          788      message: "undo migrations ok",          789    },          790    {          791      type: "ok",          792      test: "second > rollback migrations",          793      message: "undo migrations ok",          794    },          795    {          796      type: "ok",          797      test: "third > rollback migrations",          798      message: "undo migrations ok",          799    },          800    { type: "ok", test: "first > drop database", message: "db dropped" },          801    { type: "ok", test: "second > drop database", message: "db dropped" },          802    { type: "ok", test: "third > drop database", message: "db dropped" },          803    { type: "ok", test: "stop database", message: "db stopped" },          804    { type: "done", count: 17, ok: 17, error: 0, skip: 0, only: 0 },          805  ],          806  true,          807);
test/unit/cb-tests.js+162 -132
             @@ -1,133 +1,163 @@     1      1/* eslint-disable no-throw-literal */     2       import setupUnhandled from '../helpers/setup-unhandled';     3       import runnerTest from '../helpers/runner-test';     4            5       runnerTest('empty cb test', runner => {     6         const defineTest = runner();     7            8         defineTest.cb('first', t => {     9           t.end();    10         });    11       }, [    12         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },    13       ], true);    14           15       runnerTest('empty cb test with timer', runner => {    16         const defineTest = runner();    17           18         defineTest.cb('first', t => {    19           setTimeout(t.end, 100);    20         });    21       }, [    22         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },    23       ], true);    24           25       runnerTest('does not catch cb test error', (runner, assert) => {    26         const defineTest = runner();    27           28         function unhandledHandler(err) {    29           assert.equal(err, 1, 'caught');    30         }    31           32         defineTest.before(() => {    33           setupUnhandled(unhandledHandler);    34         });    35           36         defineTest.cb('first', () => {    37           throw 1;    38         });    39       }, [    40         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },    41       ], null);    42           43       runnerTest('does not catch cb test error object', (runner, assert) => {    44         const defineTest = runner();    45           46         function unhandledHandler(err) {    47           assert.equal(err.message, 'other error', 'caught');    48         }    49           50         defineTest.before(() => {    51           setupUnhandled(unhandledHandler);    52         });    53           54         defineTest.cb('first', () => {    55           throw new Error('other error');    56         });    57       }, [    58         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },    59       ], null);    60           61       runnerTest('empty cb test with timer and assertions', runner => {    62         const defineTest = runner();    63           64         defineTest.cb('first', t => {    65           t.is(10, 10, 'a1');    66           setTimeout(() => {    67             t.is(-5, -5, 'a2');    68             t.end();    69           }, 100);    70         });    71       }, [    72         { type: 'ok', test: 'first', message: 'a1' },    73         { type: 'ok', test: 'first', message: 'a2' },    74         { type: 'done', count: 2, ok: 2, error: 0, skip: 0, only: 0 },    75       ], true);    76           77       runnerTest('cb test cannot end multiple times', runner => {    78         const defineTest = runner();    79           80         defineTest.cb('first', t => {    81           t.is(10, 10, 'a1');    82           t.end();    83           t.end();    84         });    85       }, [    86         { type: 'ok', test: 'first', message: 'a1' },    87         { type: 'error',    88           test: 'first',    89           message: 'end called multiple times',    90           op: 'end',    91           stack: [    92             'at <test>',    93           ],    94         },    95         { type: 'done', count: 2, ok: 1, error: 1, skip: 0, only: 0 },    96       ], false);    97           98       runnerTest('cb test end with an error', runner => {    99         const defineTest = runner();   100          101         defineTest.cb('first', t => {   102           t.is(10, 10, 'a1');   103           t.end(true);   104         });   105       }, [   106         { type: 'ok', test: 'first', message: 'a1' },   107         { type: 'error',   108           test: 'first',   109           message: 'end value should be falsy',   110           op: 'end',   111           actual: true,   112           stack: [   113             'at <test>',   114           ],   115         },   116         { type: 'done', count: 2, ok: 1, error: 1, skip: 0, only: 0 },   117       ], false);   118          119       runnerTest('cb test assertion after end', (runner, assert) => {   120         assert.plan(3);   121         const defineTest = runner();   122          123         defineTest.cb('first', t => {   124           t.is(10, 10, 'a1');   125           t.end();   126           assert.throws(() => {   127             t.is(10, 10, 'a2');   128           });   129         });   130       }, [   131         { type: 'ok', test: 'first', message: 'a1' },   132         { type: 'done', count: 1, ok: 1, error: 0, skip: 0, only: 0 },   133       ], true);            2import setupUnhandled from "../helpers/setup-unhandled";            3import runnerTest from "../helpers/runner-test";            4            5runnerTest(            6  "empty cb test",            7  (runner) => {            8    const defineTest = runner();            9           10    defineTest.cb("first", (t) => {           11      t.end();           12    });           13  },           14  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],           15  true,           16);           17           18runnerTest(           19  "empty cb test with timer",           20  (runner) => {           21    const defineTest = runner();           22           23    defineTest.cb("first", (t) => {           24      setTimeout(t.end, 100);           25    });           26  },           27  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],           28  true,           29);           30           31runnerTest(           32  "does not catch cb test error",           33  (runner, assert) => {           34    const defineTest = runner();           35           36    function unhandledHandler(err) {           37      assert.equal(err, 1, "caught");           38    }           39           40    defineTest.before(() => {           41      setupUnhandled(unhandledHandler);           42    });           43           44    defineTest.cb("first", () => {           45      throw 1;           46    });           47  },           48  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],           49  null,           50);           51           52runnerTest(           53  "does not catch cb test error object",           54  (runner, assert) => {           55    const defineTest = runner();           56           57    function unhandledHandler(err) {           58      assert.equal(err.message, "other error", "caught");           59    }           60           61    defineTest.before(() => {           62      setupUnhandled(unhandledHandler);           63    });           64           65    defineTest.cb("first", () => {           66      throw new Error("other error");           67    });           68  },           69  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],           70  null,           71);           72           73runnerTest(           74  "empty cb test with timer and assertions",           75  (runner) => {           76    const defineTest = runner();           77           78    defineTest.cb("first", (t) => {           79      t.is(10, 10, "a1");           80      setTimeout(() => {           81        t.is(-5, -5, "a2");           82        t.end();           83      }, 100);           84    });           85  },           86  [           87    { type: "ok", test: "first", message: "a1" },           88    { type: "ok", test: "first", message: "a2" },           89    { type: "done", count: 2, ok: 2, error: 0, skip: 0, only: 0 },           90  ],           91  true,           92);           93           94runnerTest(           95  "cb test cannot end multiple times",           96  (runner) => {           97    const defineTest = runner();           98           99    defineTest.cb("first", (t) => {          100      t.is(10, 10, "a1");          101      t.end();          102      t.end();          103    });          104  },          105  [          106    { type: "ok", test: "first", message: "a1" },          107    {          108      type: "error",          109      test: "first",          110      message: "end called multiple times",          111      op: "end",          112      stack: ["at <test>"],          113    },          114    { type: "done", count: 2, ok: 1, error: 1, skip: 0, only: 0 },          115  ],          116  false,          117);          118          119runnerTest(          120  "cb test end with an error",          121  (runner) => {          122    const defineTest = runner();          123          124    defineTest.cb("first", (t) => {          125      t.is(10, 10, "a1");          126      t.end(true);          127    });          128  },          129  [          130    { type: "ok", test: "first", message: "a1" },          131    {          132      type: "error",          133      test: "first",          134      message: "end value should be falsy",          135      op: "end",          136      actual: true,          137      stack: ["at <test>"],          138    },          139    { type: "done", count: 2, ok: 1, error: 1, skip: 0, only: 0 },          140  ],          141  false,          142);          143          144runnerTest(          145  "cb test assertion after end",          146  (runner, assert) => {          147    assert.plan(3);          148    const defineTest = runner();          149          150    defineTest.cb("first", (t) => {          151      t.is(10, 10, "a1");          152      t.end();          153      assert.throws(() => {          154        t.is(10, 10, "a2");          155      });          156    });          157  },          158  [          159    { type: "ok", test: "first", message: "a1" },          160    { type: "done", count: 1, ok: 1, error: 0, skip: 0, only: 0 },          161  ],          162  true,          163);
test/unit/create-suite.js+5 -6
             @@ -1,9 +1,8 @@     1       import test from 'tape';     2       import { createSuite } from '../../lib';     3            4       test('create suite', t => {            1import test from "tape";            2import { createSuite } from "../../lib";            3            4test("create suite", (t) => {     5      5  const suite = createSuite();     6         suite('t1', () => {});            6  suite("t1", () => {});     7      7  t.end();     8      8});     9       
test/unit/index.js+12 -12
             @@ -1,12 +1,12 @@     1       import './sync-tests';     2       import './before-after-hooks';     3       import './promise-tests';     4       import './cb-tests';     5       import './plan-tests';     6       import './tap-reporter';     7       import './run-test';     8       import './runner';     9       import './serial';    10       import './create-suite';    11       import './throws-tests';    12       import './t-after-tests';            1import "./sync-tests";            2import "./before-after-hooks";            3import "./promise-tests";            4import "./cb-tests";            5import "./plan-tests";            6import "./tap-reporter";            7import "./run-test";            8import "./runner";            9import "./serial";           10import "./create-suite";           11import "./throws-tests";           12import "./t-after-tests";
test/unit/plan-tests.js+321 -257
             @@ -1,258 +1,322 @@     1      1/* eslint-disable no-constant-condition */     2       import Promise from 'bluebird';     3       import runnerTest from '../helpers/runner-test';     4            5       runnerTest('sync test plan', runner => {     6         const defineTest = runner();     7            8         defineTest('first', t => {     9           t.plan(2);    10           t.pass('a1');    11           t.pass('a2');    12         });    13       }, [    14         { type: 'ok', test: 'first', message: 'a1' },    15         { type: 'ok', test: 'first', message: 'a2' },    16         { type: 'done', count: 2, ok: 2, error: 0, skip: 0, only: 0 },    17       ], true);    18           19       runnerTest('cb test plan', runner => {    20         const defineTest = runner();    21           22         defineTest.cb('first', t => {    23           t.plan(2);    24           t.pass('a1');    25           t.pass('a2');    26         });    27       }, [    28         { type: 'ok', test: 'first', message: 'a1' },    29         { type: 'ok', test: 'first', message: 'a2' },    30         { type: 'done', count: 2, ok: 2, error: 0, skip: 0, only: 0 },    31       ], true);    32           33       runnerTest('promise test plan', runner => {    34         const defineTest = runner();    35           36         defineTest('first', t => {    37           t.plan(2);    38           39           return new Promise(resolve => {    40             t.pass('a1');    41             t.pass('a2');    42             resolve();    43           });    44         });    45       }, [    46         { type: 'ok', test: 'first', message: 'a1' },    47         { type: 'ok', test: 'first', message: 'a2' },    48         { type: 'done', count: 2, ok: 2, error: 0, skip: 0, only: 0 },    49       ], true);    50           51       runnerTest('sync test plan < count', runner => {    52         const defineTest = runner();    53           54         defineTest('first', t => {    55           t.plan(2);    56           if (false) {    57             t.pass('a1');    58           }    59           t.pass('a2');    60         });    61       }, [    62         { type: 'ok', test: 'first', message: 'a2' },    63         { type: 'error',    64           test: 'first',    65           message: 'assertions count does not match plan',    66           op: 'plan',    67           actual: 1,    68           expected: 2,    69           stack: [],    70         },    71         { type: 'done', count: 2, ok: 1, error: 1, skip: 0, only: 0 },    72       ], false);    73           74       runnerTest('sync test plan > count', runner => {    75         const defineTest = runner();    76           77         defineTest('first', t => {    78           t.plan(3);    79           t.pass('a1');    80           t.pass('a2');    81         });    82       }, [    83         { type: 'ok', test: 'first', message: 'a1' },    84         { type: 'ok', test: 'first', message: 'a2' },    85         { type: 'error',    86           test: 'first',    87           message: 'assertions count does not match plan',    88           op: 'plan',    89           actual: 2,    90           expected: 3,    91           stack: [],    92         },    93         { type: 'done', count: 3, ok: 2, error: 1, skip: 0, only: 0 },    94       ], false);    95           96       runnerTest('cb test plan < count', runner => {    97         const defineTest = runner();    98           99         defineTest.cb('first', t => {   100           t.plan(2);   101           if (false) {   102             t.pass('a1');   103           }   104           t.pass('a2');   105           t.end();   106         });   107       }, [   108         { type: 'ok', test: 'first', message: 'a2' },   109         { type: 'error',   110           test: 'first',   111           message: 'assertions count does not match plan',   112           op: 'plan',   113           actual: 1,   114           expected: 2,   115           stack: [],   116         },   117         { type: 'done', count: 2, ok: 1, error: 1, skip: 0, only: 0 },   118       ], false);   119          120       runnerTest('cb test plan > count', runner => {   121         const defineTest = runner();   122          123         defineTest.cb('first', t => {   124           t.plan(3);   125           t.pass('a1');   126           t.pass('a2');   127           t.end();   128         });   129       }, [   130         { type: 'ok', test: 'first', message: 'a1' },   131         { type: 'ok', test: 'first', message: 'a2' },   132         { type: 'error',   133           test: 'first',   134           message: 'assertions count does not match plan',   135           op: 'plan',   136           actual: 2,   137           expected: 3,   138           stack: [],   139         },   140         { type: 'done', count: 3, ok: 2, error: 1, skip: 0, only: 0 },   141       ], false);   142          143       runnerTest('promise test plan < count', runner => {   144         const defineTest = runner();   145          146         defineTest('first', t => {   147           t.plan(2);   148          149           return new Promise(resolve => {   150             if (false) {   151               t.pass('a1');   152             }   153             t.pass('a2');   154             resolve();   155           });   156         });   157       }, [   158         { type: 'ok', test: 'first', message: 'a2' },   159         { type: 'error',   160           test: 'first',   161           message: 'assertions count does not match plan',   162           op: 'plan',   163           actual: 1,   164           expected: 2,   165           stack: [],   166         },   167         { type: 'done', count: 2, ok: 1, error: 1, skip: 0, only: 0 },   168       ], false);   169          170       runnerTest('promise test plan > count', runner => {   171         const defineTest = runner();   172          173         defineTest('first', t => {   174           t.plan(3);   175           return new Promise(resolve => {   176             t.pass('a1');   177             t.pass('a2');   178             resolve();   179           });   180         });   181       }, [   182         { type: 'ok', test: 'first', message: 'a1' },   183         { type: 'ok', test: 'first', message: 'a2' },   184         { type: 'error',   185           test: 'first',   186           message: 'assertions count does not match plan',   187           op: 'plan',   188           actual: 2,   189           expected: 3,   190           stack: [],   191         },   192         { type: 'done', count: 3, ok: 2, error: 1, skip: 0, only: 0 },   193       ], false);   194          195       runnerTest('plan invalid value', runner => {   196         const defineTest = runner();   197          198         defineTest('first', t => {   199           t.plan(3.14);   200         });   201       }, [   202         { type: 'error',   203           test: 'first',   204           message: 'plan value is not a positive integer',   205           op: 'plan',   206           actual: 3.14,   207           stack: [   208             'at <test>',   209           ],   210         },   211         { type: 'done', count: 1, ok: 0, error: 1, skip: 0, only: 0 },   212       ], false);   213          214       runnerTest('plan not a number', runner => {   215         const defineTest = runner();   216          217         defineTest('first', t => {   218           t.plan('abc');   219         });   220       }, [   221         { type: 'error',   222           test: 'first',   223           message: 'plan value is not a positive integer',   224           op: 'plan',   225           actual: 'abc',   226           stack: [   227             'at <test>',   228           ],   229         },   230         { type: 'done', count: 1, ok: 0, error: 1, skip: 0, only: 0 },   231       ], false);   232          233       runnerTest('plan set multiple times', runner => {   234         const defineTest = runner();   235          236         defineTest('first', t => {   237           t.plan(3);   238           t.plan(4);   239         });   240       }, [   241         { type: 'error',   242           test: 'first',   243           message: 'plan can only be set once',   244           op: 'plan',   245           stack: [   246             'at <test>',   247           ],   248         },   249         { type: 'error',   250           test: 'first',   251           message: 'assertions count does not match plan',   252           op: 'plan',   253           actual: 0,   254           expected: 3,   255           stack: [],   256         },   257         { type: 'done', count: 2, ok: 0, error: 2, skip: 0, only: 0 },   258       ], false);            2import Promise from "bluebird";            3import runnerTest from "../helpers/runner-test";            4            5runnerTest(            6  "sync test plan",            7  (runner) => {            8    const defineTest = runner();            9           10    defineTest("first", (t) => {           11      t.plan(2);           12      t.pass("a1");           13      t.pass("a2");           14    });           15  },           16  [           17    { type: "ok", test: "first", message: "a1" },           18    { type: "ok", test: "first", message: "a2" },           19    { type: "done", count: 2, ok: 2, error: 0, skip: 0, only: 0 },           20  ],           21  true,           22);           23           24runnerTest(           25  "cb test plan",           26  (runner) => {           27    const defineTest = runner();           28           29    defineTest.cb("first", (t) => {           30      t.plan(2);           31      t.pass("a1");           32      t.pass("a2");           33    });           34  },           35  [           36    { type: "ok", test: "first", message: "a1" },           37    { type: "ok", test: "first", message: "a2" },           38    { type: "done", count: 2, ok: 2, error: 0, skip: 0, only: 0 },           39  ],           40  true,           41);           42           43runnerTest(           44  "promise test plan",           45  (runner) => {           46    const defineTest = runner();           47           48    defineTest("first", (t) => {           49      t.plan(2);           50           51      return new Promise((resolve) => {           52        t.pass("a1");           53        t.pass("a2");           54        resolve();           55      });           56    });           57  },           58  [           59    { type: "ok", test: "first", message: "a1" },           60    { type: "ok", test: "first", message: "a2" },           61    { type: "done", count: 2, ok: 2, error: 0, skip: 0, only: 0 },           62  ],           63  true,           64);           65           66runnerTest(           67  "sync test plan < count",           68  (runner) => {           69    const defineTest = runner();           70           71    defineTest("first", (t) => {           72      t.plan(2);           73      if (false) {           74        t.pass("a1");           75      }           76      t.pass("a2");           77    });           78  },           79  [           80    { type: "ok", test: "first", message: "a2" },           81    {           82      type: "error",           83      test: "first",           84      message: "assertions count does not match plan",           85      op: "plan",           86      actual: 1,           87      expected: 2,           88      stack: [],           89    },           90    { type: "done", count: 2, ok: 1, error: 1, skip: 0, only: 0 },           91  ],           92  false,           93);           94           95runnerTest(           96  "sync test plan > count",           97  (runner) => {           98    const defineTest = runner();           99          100    defineTest("first", (t) => {          101      t.plan(3);          102      t.pass("a1");          103      t.pass("a2");          104    });          105  },          106  [          107    { type: "ok", test: "first", message: "a1" },          108    { type: "ok", test: "first", message: "a2" },          109    {          110      type: "error",          111      test: "first",          112      message: "assertions count does not match plan",          113      op: "plan",          114      actual: 2,          115      expected: 3,          116      stack: [],          117    },          118    { type: "done", count: 3, ok: 2, error: 1, skip: 0, only: 0 },          119  ],          120  false,          121);          122          123runnerTest(          124  "cb test plan < count",          125  (runner) => {          126    const defineTest = runner();          127          128    defineTest.cb("first", (t) => {          129      t.plan(2);          130      if (false) {          131        t.pass("a1");          132      }          133      t.pass("a2");          134      t.end();          135    });          136  },          137  [          138    { type: "ok", test: "first", message: "a2" },          139    {          140      type: "error",          141      test: "first",          142      message: "assertions count does not match plan",          143      op: "plan",          144      actual: 1,          145      expected: 2,          146      stack: [],          147    },          148    { type: "done", count: 2, ok: 1, error: 1, skip: 0, only: 0 },          149  ],          150  false,          151);          152          153runnerTest(          154  "cb test plan > count",          155  (runner) => {          156    const defineTest = runner();          157          158    defineTest.cb("first", (t) => {          159      t.plan(3);          160      t.pass("a1");          161      t.pass("a2");          162      t.end();          163    });          164  },          165  [          166    { type: "ok", test: "first", message: "a1" },          167    { type: "ok", test: "first", message: "a2" },          168    {          169      type: "error",          170      test: "first",          171      message: "assertions count does not match plan",          172      op: "plan",          173      actual: 2,          174      expected: 3,          175      stack: [],          176    },          177    { type: "done", count: 3, ok: 2, error: 1, skip: 0, only: 0 },          178  ],          179  false,          180);          181          182runnerTest(          183  "promise test plan < count",          184  (runner) => {          185    const defineTest = runner();          186          187    defineTest("first", (t) => {          188      t.plan(2);          189          190      return new Promise((resolve) => {          191        if (false) {          192          t.pass("a1");          193        }          194        t.pass("a2");          195        resolve();          196      });          197    });          198  },          199  [          200    { type: "ok", test: "first", message: "a2" },          201    {          202      type: "error",          203      test: "first",          204      message: "assertions count does not match plan",          205      op: "plan",          206      actual: 1,          207      expected: 2,          208      stack: [],          209    },          210    { type: "done", count: 2, ok: 1, error: 1, skip: 0, only: 0 },          211  ],          212  false,          213);          214          215runnerTest(          216  "promise test plan > count",          217  (runner) => {          218    const defineTest = runner();          219          220    defineTest("first", (t) => {          221      t.plan(3);          222      return new Promise((resolve) => {          223        t.pass("a1");          224        t.pass("a2");          225        resolve();          226      });          227    });          228  },          229  [          230    { type: "ok", test: "first", message: "a1" },          231    { type: "ok", test: "first", message: "a2" },          232    {          233      type: "error",          234      test: "first",          235      message: "assertions count does not match plan",          236      op: "plan",          237      actual: 2,          238      expected: 3,          239      stack: [],          240    },          241    { type: "done", count: 3, ok: 2, error: 1, skip: 0, only: 0 },          242  ],          243  false,          244);          245          246runnerTest(          247  "plan invalid value",          248  (runner) => {          249    const defineTest = runner();          250          251    defineTest("first", (t) => {          252      t.plan(3.14);          253    });          254  },          255  [          256    {          257      type: "error",          258      test: "first",          259      message: "plan value is not a positive integer",          260      op: "plan",          261      actual: 3.14,          262      stack: ["at <test>"],          263    },          264    { type: "done", count: 1, ok: 0, error: 1, skip: 0, only: 0 },          265  ],          266  false,          267);          268          269runnerTest(          270  "plan not a number",          271  (runner) => {          272    const defineTest = runner();          273          274    defineTest("first", (t) => {          275      t.plan("abc");          276    });          277  },          278  [          279    {          280      type: "error",          281      test: "first",          282      message: "plan value is not a positive integer",          283      op: "plan",          284      actual: "abc",          285      stack: ["at <test>"],          286    },          287    { type: "done", count: 1, ok: 0, error: 1, skip: 0, only: 0 },          288  ],          289  false,          290);          291          292runnerTest(          293  "plan set multiple times",          294  (runner) => {          295    const defineTest = runner();          296          297    defineTest("first", (t) => {          298      t.plan(3);          299      t.plan(4);          300    });          301  },          302  [          303    {          304      type: "error",          305      test: "first",          306      message: "plan can only be set once",          307      op: "plan",          308      stack: ["at <test>"],          309    },          310    {          311      type: "error",          312      test: "first",          313      message: "assertions count does not match plan",          314      op: "plan",          315      actual: 0,          316      expected: 3,          317      stack: [],          318    },          319    { type: "done", count: 2, ok: 0, error: 2, skip: 0, only: 0 },          320  ],          321  false,          322);
test/unit/promise-tests.js+145 -108
             @@ -1,108 +1,145 @@     1       import Promise from 'bluebird';     2       import runnerTest from '../helpers/runner-test';     3            4       runnerTest('promise test', runner => {     5         const defineTest = runner();     6            7         defineTest('first', () => Promise.resolve(true));     8       }, [     9         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },    10       ], true);    11           12       runnerTest('promise test with assertions', runner => {    13         const defineTest = runner();    14           15         defineTest('first', t => new Promise(resolve => {    16           t.is(10, 10, 'a1');    17           setTimeout(() => {    18             t.is(20, 20, 'a2');    19             setTimeout(() => {    20               t.is(30, 30, 'a3');    21               resolve();    22             }, 100);    23           }, 100);    24         }));    25       }, [    26         { type: 'ok', test: 'first', message: 'a1' },    27         { type: 'ok', test: 'first', message: 'a2' },    28         { type: 'ok', test: 'first', message: 'a3' },    29         { type: 'done', count: 3, ok: 3, error: 0, skip: 0, only: 0 },    30       ], true);    31           32       runnerTest('promise rejection with non-error', runner => {    33         const defineTest = runner();    34           35         defineTest('first', t => new Promise((resolve, reject) => {    36           t.is(10, 10, 'a1');    37           setTimeout(() => {    38             t.is(20, 20, 'a2');    39             setTimeout(() => {    40               t.is(30, 30, 'a3');    41               reject(false);    42             }, 100);    43           }, 100);    44         }));    45       }, [    46         { type: 'ok', test: 'first', message: 'a1' },    47         { type: 'ok', test: 'first', message: 'a2' },    48         { type: 'ok', test: 'first', message: 'a3' },    49         { type: 'error',    50           test: 'first',    51           message: 'promise rejection',    52           op: 'reject',    53           actual: false,    54           stack: [],    55         },    56         { type: 'done', count: 4, ok: 3, error: 1, skip: 0, only: 0 },    57       ], false);    58           59       runnerTest('promise rejection with error object', runner => {    60         const defineTest = runner();    61           62         defineTest('first', t => new Promise((resolve, reject) => {    63           t.is(10, 10, 'a1');    64           setTimeout(() => {    65             t.is(20, 20, 'a2');    66             setTimeout(() => {    67               t.is(30, 30, 'a3');    68               reject(new Error('oh no'));    69             }, 100);    70           }, 100);    71         }));    72       }, [    73         { type: 'ok', test: 'first', message: 'a1' },    74         { type: 'ok', test: 'first', message: 'a2' },    75         { type: 'ok', test: 'first', message: 'a3' },    76         { type: 'error',    77           test: 'first',    78           message: 'promise rejection',    79           op: 'reject',    80           actual: new Error('oh no'),    81           stack: [    82             'at <test>',    83           ],    84         },    85         { type: 'done', count: 4, ok: 3, error: 1, skip: 0, only: 0 },    86       ], false);    87           88       runnerTest('promise catches error', runner => {    89         const defineTest = runner();    90           91         defineTest('first', () => new Promise(() => {    92           /* eslint-disable no-undef, new-cap */    93           ERROR_CALL();    94           /* eslint-enable no-undef, new-cap */    95         }));    96       }, [    97         { type: 'error',    98           test: 'first',    99           message: 'promise rejection',   100           actual: new ReferenceError('ERROR_CALL is not defined'),   101           op: 'reject',   102           stack: [   103             'at <test>',   104             'at <test>',   105           ],   106         },   107         { type: 'done', count: 1, ok: 0, error: 1, skip: 0, only: 0 },   108       ], false);            1import Promise from "bluebird";            2import runnerTest from "../helpers/runner-test";            3            4runnerTest(            5  "promise test",            6  (runner) => {            7    const defineTest = runner();            8            9    defineTest("first", () => Promise.resolve(true));           10  },           11  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],           12  true,           13);           14           15runnerTest(           16  "promise test with assertions",           17  (runner) => {           18    const defineTest = runner();           19           20    defineTest(           21      "first",           22      (t) =>           23        new Promise((resolve) => {           24          t.is(10, 10, "a1");           25          setTimeout(() => {           26            t.is(20, 20, "a2");           27            setTimeout(() => {           28              t.is(30, 30, "a3");           29              resolve();           30            }, 100);           31          }, 100);           32        }),           33    );           34  },           35  [           36    { type: "ok", test: "first", message: "a1" },           37    { type: "ok", test: "first", message: "a2" },           38    { type: "ok", test: "first", message: "a3" },           39    { type: "done", count: 3, ok: 3, error: 0, skip: 0, only: 0 },           40  ],           41  true,           42);           43           44runnerTest(           45  "promise rejection with non-error",           46  (runner) => {           47    const defineTest = runner();           48           49    defineTest(           50      "first",           51      (t) =>           52        new Promise((resolve, reject) => {           53          t.is(10, 10, "a1");           54          setTimeout(() => {           55            t.is(20, 20, "a2");           56            setTimeout(() => {           57              t.is(30, 30, "a3");           58              reject(false);           59            }, 100);           60          }, 100);           61        }),           62    );           63  },           64  [           65    { type: "ok", test: "first", message: "a1" },           66    { type: "ok", test: "first", message: "a2" },           67    { type: "ok", test: "first", message: "a3" },           68    {           69      type: "error",           70      test: "first",           71      message: "promise rejection",           72      op: "reject",           73      actual: false,           74      stack: [],           75    },           76    { type: "done", count: 4, ok: 3, error: 1, skip: 0, only: 0 },           77  ],           78  false,           79);           80           81runnerTest(           82  "promise rejection with error object",           83  (runner) => {           84    const defineTest = runner();           85           86    defineTest(           87      "first",           88      (t) =>           89        new Promise((resolve, reject) => {           90          t.is(10, 10, "a1");           91          setTimeout(() => {           92            t.is(20, 20, "a2");           93            setTimeout(() => {           94              t.is(30, 30, "a3");           95              reject(new Error("oh no"));           96            }, 100);           97          }, 100);           98        }),           99    );          100  },          101  [          102    { type: "ok", test: "first", message: "a1" },          103    { type: "ok", test: "first", message: "a2" },          104    { type: "ok", test: "first", message: "a3" },          105    {          106      type: "error",          107      test: "first",          108      message: "promise rejection",          109      op: "reject",          110      actual: new Error("oh no"),          111      stack: ["at <test>"],          112    },          113    { type: "done", count: 4, ok: 3, error: 1, skip: 0, only: 0 },          114  ],          115  false,          116);          117          118runnerTest(          119  "promise catches error",          120  (runner) => {          121    const defineTest = runner();          122          123    defineTest(          124      "first",          125      () =>          126        new Promise(() => {          127          /* eslint-disable no-undef, new-cap */          128          ERROR_CALL();          129          /* eslint-enable no-undef, new-cap */          130        }),          131    );          132  },          133  [          134    {          135      type: "error",          136      test: "first",          137      message: "promise rejection",          138      actual: new ReferenceError("ERROR_CALL is not defined"),          139      op: "reject",          140      stack: ["at <test>", "at <test>"],          141    },          142    { type: "done", count: 1, ok: 0, error: 1, skip: 0, only: 0 },          143  ],          144  false,          145);
test/unit/run-test.js+113 -87
             @@ -1,82 +1,99 @@     1       import test from 'tape';     2       import Promise from 'bluebird';     3       import runTest from '../../lib/run-test';     4            5       test('run test sync', t => {            1import test from "tape";            2import Promise from "bluebird";            3import runTest from "../../lib/run-test";            4            5test("run test sync", (t) => {     6      6  t.plan(2);     7      7  const assertObj = {};     8      8  function end() {}     9      9  function setOnEndHandler() {}    10     10    11         runTest([assertObj, end, setOnEndHandler], {    12           type: 'default',    13           fn(a) {    14             t.equal(a, assertObj);    15           },    16         }, {    17         }).then(() => {    18           t.pass();    19         }).catch(err => {    20           t.error(err);    21         });    22       });    23           24       test('run test promise', t => {    25         t.plan(3);    26         const assertObj = {};    27         function end() {}    28         function setOnEndHandler() {}    29           30         runTest([assertObj, end, setOnEndHandler], {    31           type: 'default',    32           fn(a) {    33             t.equal(a, assertObj);    34             return new Promise(resolve => {    35               t.pass();    36               setTimeout(resolve, 100);    37             });    38           },    39         }, {    40         }).then(() => {    41           t.pass();    42         }).catch(err => {    43           t.error(err);    44         });    45       });    46           47       test('run test promise reject', t => {           11  runTest(           12    [assertObj, end, setOnEndHandler],           13    {           14      type: "default",           15      fn(a) {           16        t.equal(a, assertObj);           17      },           18    },           19    {},           20  )           21    .then(() => {           22      t.pass();           23    })           24    .catch((err) => {           25      t.error(err);           26    });           27});           28           29test("run test promise", (t) => {           30  t.plan(3);           31  const assertObj = {};           32  function end() {}           33  function setOnEndHandler() {}           34           35  runTest(           36    [assertObj, end, setOnEndHandler],           37    {           38      type: "default",           39      fn(a) {           40        t.equal(a, assertObj);           41        return new Promise((resolve) => {           42          t.pass();           43          setTimeout(resolve, 100);           44        });           45      },           46    },           47    {},           48  )           49    .then(() => {           50      t.pass();           51    })           52    .catch((err) => {           53      t.error(err);           54    });           55});           56           57test("run test promise reject", (t) => {    48     58  t.plan(4);    49     59  const assertObj = {};    50     60  function end() {}    51     61  function setOnEndHandler() {}    52     62    53         runTest([assertObj, end, setOnEndHandler], {    54           type: 'default',    55           fn(a) {    56             t.equal(a, assertObj);    57             return new Promise((resolve, reject) => {    58               t.pass();    59               setTimeout(reject, 100, 'abc');    60             });    61           },    62         }, {    63           log(v) {    64             t.same(v, { type: 'error',    65               op: 'reject',    66               message: 'promise rejection',    67               actual: 'abc',    68               test: undefined,    69               stack: [],    70             });    71           },    72         }).then(() => {    73           t.pass();    74         }).catch(err => {    75           t.error(err);    76         });    77       });    78           79       test('run test cb', t => {           63  runTest(           64    [assertObj, end, setOnEndHandler],           65    {           66      type: "default",           67      fn(a) {           68        t.equal(a, assertObj);           69        return new Promise((resolve, reject) => {           70          t.pass();           71          setTimeout(reject, 100, "abc");           72        });           73      },           74    },           75    {           76      log(v) {           77        t.same(v, {           78          type: "error",           79          op: "reject",           80          message: "promise rejection",           81          actual: "abc",           82          test: undefined,           83          stack: [],           84        });           85      },           86    },           87  )           88    .then(() => {           89      t.pass();           90    })           91    .catch((err) => {           92      t.error(err);           93    });           94});           95           96test("run test cb", (t) => {    80     97  t.plan(3);    81     98  const assertObj = {};    82     99  let onEnd = null;             @@ -87,29 +104,38 @@    87    104    t.pass();    88    105  }    89    106    90         runTest([assertObj, end, setOnEndHandler], {    91           type: 'cb',    92           fn(a) {    93             t.equal(a, assertObj);    94             onEnd();    95           },    96         }, {    97         }).then(() => {    98           t.pass();    99         }).catch(err => {   100           t.error(err);   101         });   102       });   103          104       test('run test unknown type', t => {          107  runTest(          108    [assertObj, end, setOnEndHandler],          109    {          110      type: "cb",          111      fn(a) {          112        t.equal(a, assertObj);          113        onEnd();          114      },          115    },          116    {},          117  )          118    .then(() => {          119      t.pass();          120    })          121    .catch((err) => {          122      t.error(err);          123    });          124});          125          126test("run test unknown type", (t) => {   105    127  const assertObj = {};   106    128  function end() {}   107    129  function setOnEndHandler() {}   108    130   109    131  t.throws(() => {   110           runTest([assertObj, end, setOnEndHandler], {   111             type: 'other',   112           }, {});          132    runTest(          133      [assertObj, end, setOnEndHandler],          134      {          135        type: "other",          136      },          137      {},          138    );   113    139  });   114    140  t.end();   115    141});
test/unit/runner.js+3 -3
             @@ -1,7 +1,7 @@     1       import test from 'tape';     2       import createRunner from '../../lib/runner';            1import test from "tape";            2import createRunner from "../../lib/runner";     3      3     4       test('runner no opts', t => {            4test("runner no opts", (t) => {     5      5  const runner = createRunner();     6      6  t.throws(() => {     7      7    runner.run();
test/unit/serial.js+81 -61
             @@ -1,61 +1,81 @@     1       import runnerTest from '../helpers/runner-test';     2       import { createLock } from '../../lib';     3            4       runnerTest('tests serial', runner => {     5         const lock = createLock();     6         const defineTest = runner();     7            8         defineTest.before('start database', t => {     9           t.pass('db running');    10         });    11           12         defineTest.after('stop database', t => {    13           t.pass('db stopped');    14         });    15           16         defineTest.beforeEach('create database', t => lock.acquire()    17           .then(() => t.pass('db created')));    18           19         defineTest.beforeEach('apply migrations', t => {    20           t.pass('migrations ok');    21         });    22           23         defineTest.afterEach('rollback migrations', t => {    24           t.pass('undo migrations ok');    25         });    26           27         defineTest.afterEach('drop database', t => Promise.resolve()    28           .then(() => t.pass('db dropped'))    29           .then(lock.release));    30           31         defineTest('first', t => {    32           t.is(1, 1);    33         });    34           35         defineTest('second', t => {    36           t.is(2, 2);    37         });    38           39         defineTest('third', t => {    40           t.is(3, 3);    41         });    42       }, [    43         { type: 'ok', test: 'start database', message: 'db running' },    44         { type: 'ok', test: 'first > create database', message: 'db created' },    45         { type: 'ok', test: 'first > apply migrations', message: 'migrations ok' },    46         { type: 'ok', test: 'first', message: 'is' },    47         { type: 'ok', test: 'first > rollback migrations', message: 'undo migrations ok' },    48         { type: 'ok', test: 'first > drop database', message: 'db dropped' },    49         { type: 'ok', test: 'second > create database', message: 'db created' },    50         { type: 'ok', test: 'second > apply migrations', message: 'migrations ok' },    51         { type: 'ok', test: 'second', message: 'is' },    52         { type: 'ok', test: 'second > rollback migrations', message: 'undo migrations ok' },    53         { type: 'ok', test: 'second > drop database', message: 'db dropped' },    54         { type: 'ok', test: 'third > create database', message: 'db created' },    55         { type: 'ok', test: 'third > apply migrations', message: 'migrations ok' },    56         { type: 'ok', test: 'third', message: 'is' },    57         { type: 'ok', test: 'third > rollback migrations', message: 'undo migrations ok' },    58         { type: 'ok', test: 'third > drop database', message: 'db dropped' },    59         { type: 'ok', test: 'stop database', message: 'db stopped' },    60         { type: 'done', count: 17, ok: 17, error: 0, skip: 0, only: 0 },    61       ], true);            1import runnerTest from "../helpers/runner-test";            2import { createLock } from "../../lib";            3            4runnerTest(            5  "tests serial",            6  (runner) => {            7    const lock = createLock();            8    const defineTest = runner();            9           10    defineTest.before("start database", (t) => {           11      t.pass("db running");           12    });           13           14    defineTest.after("stop database", (t) => {           15      t.pass("db stopped");           16    });           17           18    defineTest.beforeEach("create database", (t) =>           19      lock.acquire().then(() => t.pass("db created")),           20    );           21           22    defineTest.beforeEach("apply migrations", (t) => {           23      t.pass("migrations ok");           24    });           25           26    defineTest.afterEach("rollback migrations", (t) => {           27      t.pass("undo migrations ok");           28    });           29           30    defineTest.afterEach("drop database", (t) =>           31      Promise.resolve()           32        .then(() => t.pass("db dropped"))           33        .then(lock.release),           34    );           35           36    defineTest("first", (t) => {           37      t.is(1, 1);           38    });           39           40    defineTest("second", (t) => {           41      t.is(2, 2);           42    });           43           44    defineTest("third", (t) => {           45      t.is(3, 3);           46    });           47  },           48  [           49    { type: "ok", test: "start database", message: "db running" },           50    { type: "ok", test: "first > create database", message: "db created" },           51    { type: "ok", test: "first > apply migrations", message: "migrations ok" },           52    { type: "ok", test: "first", message: "is" },           53    {           54      type: "ok",           55      test: "first > rollback migrations",           56      message: "undo migrations ok",           57    },           58    { type: "ok", test: "first > drop database", message: "db dropped" },           59    { type: "ok", test: "second > create database", message: "db created" },           60    { type: "ok", test: "second > apply migrations", message: "migrations ok" },           61    { type: "ok", test: "second", message: "is" },           62    {           63      type: "ok",           64      test: "second > rollback migrations",           65      message: "undo migrations ok",           66    },           67    { type: "ok", test: "second > drop database", message: "db dropped" },           68    { type: "ok", test: "third > create database", message: "db created" },           69    { type: "ok", test: "third > apply migrations", message: "migrations ok" },           70    { type: "ok", test: "third", message: "is" },           71    {           72      type: "ok",           73      test: "third > rollback migrations",           74      message: "undo migrations ok",           75    },           76    { type: "ok", test: "third > drop database", message: "db dropped" },           77    { type: "ok", test: "stop database", message: "db stopped" },           78    { type: "done", count: 17, ok: 17, error: 0, skip: 0, only: 0 },           79  ],           80  true,           81);
test/unit/sync-tests.js+487 -399
             @@ -1,399 +1,487 @@     1       import runnerTest from '../helpers/runner-test';     2       import setupUnhandled from '../helpers/setup-unhandled';     3            4       runnerTest('empty runner', () => {     5       }, [     6         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },     7       ], true);     8            9       runnerTest('one empty test', runner => {    10         const defineTest = runner();    11           12         defineTest('first', () => {    13         });    14       }, [    15         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },    16       ], true);    17           18       runnerTest('one test and assert', runner => {    19         const defineTest = runner();    20           21         defineTest('first', t => {    22           t.is(1, 1);    23         });    24       }, [    25         { type: 'ok', test: 'first', message: 'is' },    26         { type: 'done', count: 1, ok: 1, error: 0, skip: 0, only: 0 },    27       ], true);    28           29       runnerTest('one unnamed test and assert', runner => {    30         const defineTest = runner();    31           32         defineTest(t => {    33           t.is(1, 1);    34         });    35       }, [    36         { type: 'ok', test: '(unnamed)', message: 'is' },    37         { type: 'done', count: 1, ok: 1, error: 0, skip: 0, only: 0 },    38       ], true);    39           40       runnerTest('one test and few asserts', runner => {    41         const defineTest = runner();    42           43         defineTest('first', t => {    44           t.is(1, 1);    45           t.is(10, 10);    46           t.is('abc', 'abc');    47           t.same([1, 2, 3], [1, 2, 1 + 2]);    48         });    49       }, [    50         { type: 'ok', test: 'first', message: 'is' },    51         { type: 'ok', test: 'first', message: 'is' },    52         { type: 'ok', test: 'first', message: 'is' },    53         { type: 'ok', test: 'first', message: 'same' },    54         { type: 'done', count: 4, ok: 4, error: 0, skip: 0, only: 0 },    55       ], true);    56           57       runnerTest('all kinds of passing assertions', runner => {    58         const defineTest = runner();    59           60         defineTest('first', t => {    61           t.is(1, 1);    62           t.not(1, 2);    63           t.same([1, 2, 3], [1, 2, 1 + 2]);    64           t.notSame([1, 2, 4], [1, 2, 1 + 2]);    65           t.truthy(1);    66           t.truthy('ok');    67           t.truthy(true);    68           t.truthy({});    69           t.truthy([]);    70           t.falsy('');    71           t.falsy(false);    72           t.falsy(0);    73           t.pass();    74           t.true(true);    75           t.false(false);    76         });    77       }, [    78         { type: 'ok', test: 'first', message: 'is' },    79         { type: 'ok', test: 'first', message: 'not' },    80         { type: 'ok', test: 'first', message: 'same' },    81         { type: 'ok', test: 'first', message: 'notSame' },    82         { type: 'ok', test: 'first', message: 'truthy' },    83         { type: 'ok', test: 'first', message: 'truthy' },    84         { type: 'ok', test: 'first', message: 'truthy' },    85         { type: 'ok', test: 'first', message: 'truthy' },    86         { type: 'ok', test: 'first', message: 'truthy' },    87         { type: 'ok', test: 'first', message: 'falsy' },    88         { type: 'ok', test: 'first', message: 'falsy' },    89         { type: 'ok', test: 'first', message: 'falsy' },    90         { type: 'ok', test: 'first', message: 'pass' },    91         { type: 'ok', test: 'first', message: 'true' },    92         { type: 'ok', test: 'first', message: 'false' },    93         { type: 'done', count: 15, ok: 15, error: 0, skip: 0, only: 0 },    94       ], true);    95           96       runnerTest('all kinds of passing assertions with messages', runner => {    97         const defineTest = runner();    98           99         defineTest('first', t => {   100           t.is(1, 1, 'a1');   101           t.not(1, 2, 'a2');   102           t.same([1, 2, 3], [1, 2, 1 + 2], 'a3');   103           t.notSame([1, 2, 4], [1, 2, 1 + 2], 'a4');   104           t.truthy(1, 'a5');   105           t.truthy('ok', 'a6');   106           t.truthy(true, 'a7');   107           t.truthy({}, 'a8');   108           t.truthy([], 'a9');   109           t.falsy('', 'a10');   110           t.falsy(false, 'a11');   111           t.falsy(0, 'a12');   112           t.pass('a13');   113           t.true(true, 'a14');   114           t.false(false, 'a15');   115         });   116       }, [   117         { type: 'ok', test: 'first', message: 'a1' },   118         { type: 'ok', test: 'first', message: 'a2' },   119         { type: 'ok', test: 'first', message: 'a3' },   120         { type: 'ok', test: 'first', message: 'a4' },   121         { type: 'ok', test: 'first', message: 'a5' },   122         { type: 'ok', test: 'first', message: 'a6' },   123         { type: 'ok', test: 'first', message: 'a7' },   124         { type: 'ok', test: 'first', message: 'a8' },   125         { type: 'ok', test: 'first', message: 'a9' },   126         { type: 'ok', test: 'first', message: 'a10' },   127         { type: 'ok', test: 'first', message: 'a11' },   128         { type: 'ok', test: 'first', message: 'a12' },   129         { type: 'ok', test: 'first', message: 'a13' },   130         { type: 'ok', test: 'first', message: 'a14' },   131         { type: 'ok', test: 'first', message: 'a15' },   132         { type: 'done', count: 15, ok: 15, error: 0, skip: 0, only: 0 },   133       ], true);   134          135       runnerTest('few passing tests', runner => {   136         const defineTest = runner();   137          138         defineTest('first', t => {   139           t.is(1, 1);   140         });   141          142         defineTest('second', t => {   143           t.not({ a: 10, b: 20 }, { a: 10, b: 20 });   144           t.same({ a: 10, b: 20 }, { a: 10, b: 20 });   145         });   146          147         defineTest('third', t => {   148           t.pass();   149         });   150       }, [   151         { type: 'ok', test: 'first', message: 'is' },   152         { type: 'ok', test: 'second', message: 'not' },   153         { type: 'ok', test: 'second', message: 'same' },   154         { type: 'ok', test: 'third', message: 'pass' },   155         { type: 'done', count: 4, ok: 4, error: 0, skip: 0, only: 0 },   156       ], true);   157          158       runnerTest('single failing test', runner => {   159         const defineTest = runner();   160          161         defineTest('first', t => {   162           t.fail('this should fail');   163         });   164       }, [   165         { type: 'error',   166           test: 'first',   167           message: 'this should fail',   168           op: 'fail',   169           actual: null,   170           expected: null,   171           stack: ['at <test>'],   172         },   173         { type: 'done', count: 1, ok: 0, error: 1, skip: 0, only: 0 },   174       ], false);   175          176       runnerTest('other failing tests', runner => {   177         const defineTest = runner();   178          179         defineTest('first', t => {   180           t.true(false);   181           t.false(true);   182         });   183       }, [   184         { type: 'error',   185           test: 'first',   186           message: 'true',   187           op: 'true',   188           actual: false,   189           expected: true,   190           stack: ['at <test>'],   191         },   192         { type: 'error',   193           test: 'first',   194           message: 'false',   195           op: 'false',   196           actual: true,   197           expected: false,   198           stack: ['at <test>'],   199         },   200         { type: 'done', count: 2, ok: 0, error: 2, skip: 0, only: 0 },   201       ], false);   202          203       runnerTest('single failing test without message', runner => {   204         const defineTest = runner();   205          206         defineTest('first', t => {   207           t.fail();   208         });   209       }, [   210         { type: 'error',   211           test: 'first',   212           message: 'fail',   213           op: 'fail',   214           actual: null,   215           expected: null,   216           stack: ['at <test>'],   217         },   218         { type: 'done', count: 1, ok: 0, error: 1, skip: 0, only: 0 },   219       ], false);   220          221       runnerTest('single failing test with actual and expected values', runner => {   222         const defineTest = runner();   223          224         defineTest('first', t => {   225           t.is('hello', 'hell0', 'should be equal for sure');   226         });   227       }, [   228         { type: 'error',   229           test: 'first',   230           message: 'should be equal for sure',   231           op: 'is',   232           actual: 'hello',   233           expected: 'hell0',   234           stack: ['at <test>'],   235         },   236         { type: 'done', count: 1, ok: 0, error: 1, skip: 0, only: 0 },   237       ], false);   238          239       runnerTest('single failing test with multiple failing assertions', runner => {   240         const defineTest = runner();   241          242         defineTest('first', t => {   243           t.fail('first fail');   244           t.fail('second fail');   245           t.fail('third fail');   246         });   247       }, [   248         { type: 'error',   249           test: 'first',   250           message: 'first fail',   251           op: 'fail',   252           actual: null,   253           expected: null,   254           stack: ['at <test>'],   255         },   256         { type: 'error',   257           test: 'first',   258           message: 'second fail',   259           op: 'fail',   260           actual: null,   261           expected: null,   262           stack: ['at <test>'],   263         },   264         { type: 'error',   265           test: 'first',   266           message: 'third fail',   267           op: 'fail',   268           actual: null,   269           expected: null,   270           stack: ['at <test>'],   271         },   272         { type: 'done', count: 3, ok: 0, error: 3, skip: 0, only: 0 },   273       ], false);   274          275       runnerTest('does not catch unhandled exceptions (non errors)', (runner, assert) => {   276         const defineTest = runner();   277          278         function unhandledHandler(err) {   279           assert.equal(err, 1, 'caught');   280         }   281          282         defineTest.before(() => {   283           setupUnhandled(unhandledHandler);   284         });   285          286         defineTest('first', () => {   287           /* eslint-disable no-throw-literal */   288           throw 1;   289           /* eslint-enable no-throw-literal */   290         });   291       }, [   292         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },   293       ], null);   294          295       runnerTest('does not catch unhandled exceptions (error objects)', (runner, assert) => {   296         const defineTest = runner();   297          298         function unhandledHandler(err) {   299           assert.equal(err.message, 'something is wrong', 'caught');   300         }   301          302         defineTest.before(() => {   303           setupUnhandled(unhandledHandler);   304         });   305          306         defineTest('first', () => {   307           (() => {   308             (() => {   309               throw new Error('something is wrong');   310             })();   311           })();   312         });   313       }, [   314         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },   315       ], null);   316          317       runnerTest('does not catch runtime errors', (runner, assert) => {   318         const defineTest = runner();   319          320         function unhandledHandler(err) {   321           assert.equal(err.message, 'ERROR_CALL is not defined', 'caught');   322         }   323          324         defineTest.before(() => {   325           setupUnhandled(unhandledHandler);   326         });   327          328         defineTest('first', () => {   329           (() => {   330             (() => {   331               /* eslint-disable no-undef, new-cap */   332               ERROR_CALL();   333               /* eslint-enable no-undef, new-cap */   334             })();   335           })();   336         });   337       }, [   338         { type: 'done', count: 0, ok: 0, error: 0, skip: 0, only: 0 },   339       ], null);   340          341       runnerTest('multiple failing tests', runner => {   342         const defineTest = runner();   343          344         defineTest('first', t => {   345           t.fail('first fail');   346         });   347          348         defineTest('second', t => {   349           t.fail('second fail');   350         });   351          352         defineTest('third', t => {   353           t.fail('third fail');   354         });   355       }, [   356         { type: 'error',   357           test: 'first',   358           message: 'first fail',   359           op: 'fail',   360           actual: null,   361           expected: null,   362           stack: ['at <test>'],   363         },   364         { type: 'error',   365           test: 'second',   366           message: 'second fail',   367           op: 'fail',   368           actual: null,   369           expected: null,   370           stack: ['at <test>'],   371         },   372         { type: 'error',   373           test: 'third',   374           message: 'third fail',   375           op: 'fail',   376           actual: null,   377           expected: null,   378           stack: ['at <test>'],   379         },   380         { type: 'done', count: 3, ok: 0, error: 3, skip: 0, only: 0 },   381       ], false);   382          383       runnerTest('sync test end() error', runner => {   384         const defineTest = runner();   385          386         defineTest('first', t => {   387           t.end();   388         });   389       }, [   390         { type: 'error',   391           test: 'first',   392           message: 'only callback tests require end',   393           op: 'end',   394           stack: [   395             'at <test>',   396           ],   397         },   398         { type: 'done', count: 1, ok: 0, error: 1, skip: 0, only: 0 },   399       ], false);            1import runnerTest from "../helpers/runner-test";            2import setupUnhandled from "../helpers/setup-unhandled";            3            4runnerTest(            5  "empty runner",            6  () => {},            7  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],            8  true,            9);           10           11runnerTest(           12  "one empty test",           13  (runner) => {           14    const defineTest = runner();           15           16    defineTest("first", () => {});           17  },           18  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],           19  true,           20);           21           22runnerTest(           23  "one test and assert",           24  (runner) => {           25    const defineTest = runner();           26           27    defineTest("first", (t) => {           28      t.is(1, 1);           29    });           30  },           31  [           32    { type: "ok", test: "first", message: "is" },           33    { type: "done", count: 1, ok: 1, error: 0, skip: 0, only: 0 },           34  ],           35  true,           36);           37           38runnerTest(           39  "one unnamed test and assert",           40  (runner) => {           41    const defineTest = runner();           42           43    defineTest((t) => {           44      t.is(1, 1);           45    });           46  },           47  [           48    { type: "ok", test: "(unnamed)", message: "is" },           49    { type: "done", count: 1, ok: 1, error: 0, skip: 0, only: 0 },           50  ],           51  true,           52);           53           54runnerTest(           55  "one test and few asserts",           56  (runner) => {           57    const defineTest = runner();           58           59    defineTest("first", (t) => {           60      t.is(1, 1);           61      t.is(10, 10);           62      t.is("abc", "abc");           63      t.same([1, 2, 3], [1, 2, 1 + 2]);           64    });           65  },           66  [           67    { type: "ok", test: "first", message: "is" },           68    { type: "ok", test: "first", message: "is" },           69    { type: "ok", test: "first", message: "is" },           70    { type: "ok", test: "first", message: "same" },           71    { type: "done", count: 4, ok: 4, error: 0, skip: 0, only: 0 },           72  ],           73  true,           74);           75           76runnerTest(           77  "all kinds of passing assertions",           78  (runner) => {           79    const defineTest = runner();           80           81    defineTest("first", (t) => {           82      t.is(1, 1);           83      t.not(1, 2);           84      t.same([1, 2, 3], [1, 2, 1 + 2]);           85      t.notSame([1, 2, 4], [1, 2, 1 + 2]);           86      t.truthy(1);           87      t.truthy("ok");           88      t.truthy(true);           89      t.truthy({});           90      t.truthy([]);           91      t.falsy("");           92      t.falsy(false);           93      t.falsy(0);           94      t.pass();           95      t.true(true);           96      t.false(false);           97    });           98  },           99  [          100    { type: "ok", test: "first", message: "is" },          101    { type: "ok", test: "first", message: "not" },          102    { type: "ok", test: "first", message: "same" },          103    { type: "ok", test: "first", message: "notSame" },          104    { type: "ok", test: "first", message: "truthy" },          105    { type: "ok", test: "first", message: "truthy" },          106    { type: "ok", test: "first", message: "truthy" },          107    { type: "ok", test: "first", message: "truthy" },          108    { type: "ok", test: "first", message: "truthy" },          109    { type: "ok", test: "first", message: "falsy" },          110    { type: "ok", test: "first", message: "falsy" },          111    { type: "ok", test: "first", message: "falsy" },          112    { type: "ok", test: "first", message: "pass" },          113    { type: "ok", test: "first", message: "true" },          114    { type: "ok", test: "first", message: "false" },          115    { type: "done", count: 15, ok: 15, error: 0, skip: 0, only: 0 },          116  ],          117  true,          118);          119          120runnerTest(          121  "all kinds of passing assertions with messages",          122  (runner) => {          123    const defineTest = runner();          124          125    defineTest("first", (t) => {          126      t.is(1, 1, "a1");          127      t.not(1, 2, "a2");          128      t.same([1, 2, 3], [1, 2, 1 + 2], "a3");          129      t.notSame([1, 2, 4], [1, 2, 1 + 2], "a4");          130      t.truthy(1, "a5");          131      t.truthy("ok", "a6");          132      t.truthy(true, "a7");          133      t.truthy({}, "a8");          134      t.truthy([], "a9");          135      t.falsy("", "a10");          136      t.falsy(false, "a11");          137      t.falsy(0, "a12");          138      t.pass("a13");          139      t.true(true, "a14");          140      t.false(false, "a15");          141    });          142  },          143  [          144    { type: "ok", test: "first", message: "a1" },          145    { type: "ok", test: "first", message: "a2" },          146    { type: "ok", test: "first", message: "a3" },          147    { type: "ok", test: "first", message: "a4" },          148    { type: "ok", test: "first", message: "a5" },          149    { type: "ok", test: "first", message: "a6" },          150    { type: "ok", test: "first", message: "a7" },          151    { type: "ok", test: "first", message: "a8" },          152    { type: "ok", test: "first", message: "a9" },          153    { type: "ok", test: "first", message: "a10" },          154    { type: "ok", test: "first", message: "a11" },          155    { type: "ok", test: "first", message: "a12" },          156    { type: "ok", test: "first", message: "a13" },          157    { type: "ok", test: "first", message: "a14" },          158    { type: "ok", test: "first", message: "a15" },          159    { type: "done", count: 15, ok: 15, error: 0, skip: 0, only: 0 },          160  ],          161  true,          162);          163          164runnerTest(          165  "few passing tests",          166  (runner) => {          167    const defineTest = runner();          168          169    defineTest("first", (t) => {          170      t.is(1, 1);          171    });          172          173    defineTest("second", (t) => {          174      t.not({ a: 10, b: 20 }, { a: 10, b: 20 });          175      t.same({ a: 10, b: 20 }, { a: 10, b: 20 });          176    });          177          178    defineTest("third", (t) => {          179      t.pass();          180    });          181  },          182  [          183    { type: "ok", test: "first", message: "is" },          184    { type: "ok", test: "second", message: "not" },          185    { type: "ok", test: "second", message: "same" },          186    { type: "ok", test: "third", message: "pass" },          187    { type: "done", count: 4, ok: 4, error: 0, skip: 0, only: 0 },          188  ],          189  true,          190);          191          192runnerTest(          193  "single failing test",          194  (runner) => {          195    const defineTest = runner();          196          197    defineTest("first", (t) => {          198      t.fail("this should fail");          199    });          200  },          201  [          202    {          203      type: "error",          204      test: "first",          205      message: "this should fail",          206      op: "fail",          207      actual: null,          208      expected: null,          209      stack: ["at <test>"],          210    },          211    { type: "done", count: 1, ok: 0, error: 1, skip: 0, only: 0 },          212  ],          213  false,          214);          215          216runnerTest(          217  "other failing tests",          218  (runner) => {          219    const defineTest = runner();          220          221    defineTest("first", (t) => {          222      t.true(false);          223      t.false(true);          224    });          225  },          226  [          227    {          228      type: "error",          229      test: "first",          230      message: "true",          231      op: "true",          232      actual: false,          233      expected: true,          234      stack: ["at <test>"],          235    },          236    {          237      type: "error",          238      test: "first",          239      message: "false",          240      op: "false",          241      actual: true,          242      expected: false,          243      stack: ["at <test>"],          244    },          245    { type: "done", count: 2, ok: 0, error: 2, skip: 0, only: 0 },          246  ],          247  false,          248);          249          250runnerTest(          251  "single failing test without message",          252  (runner) => {          253    const defineTest = runner();          254          255    defineTest("first", (t) => {          256      t.fail();          257    });          258  },          259  [          260    {          261      type: "error",          262      test: "first",          263      message: "fail",          264      op: "fail",          265      actual: null,          266      expected: null,          267      stack: ["at <test>"],          268    },          269    { type: "done", count: 1, ok: 0, error: 1, skip: 0, only: 0 },          270  ],          271  false,          272);          273          274runnerTest(          275  "single failing test with actual and expected values",          276  (runner) => {          277    const defineTest = runner();          278          279    defineTest("first", (t) => {          280      t.is("hello", "hell0", "should be equal for sure");          281    });          282  },          283  [          284    {          285      type: "error",          286      test: "first",          287      message: "should be equal for sure",          288      op: "is",          289      actual: "hello",          290      expected: "hell0",          291      stack: ["at <test>"],          292    },          293    { type: "done", count: 1, ok: 0, error: 1, skip: 0, only: 0 },          294  ],          295  false,          296);          297          298runnerTest(          299  "single failing test with multiple failing assertions",          300  (runner) => {          301    const defineTest = runner();          302          303    defineTest("first", (t) => {          304      t.fail("first fail");          305      t.fail("second fail");          306      t.fail("third fail");          307    });          308  },          309  [          310    {          311      type: "error",          312      test: "first",          313      message: "first fail",          314      op: "fail",          315      actual: null,          316      expected: null,          317      stack: ["at <test>"],          318    },          319    {          320      type: "error",          321      test: "first",          322      message: "second fail",          323      op: "fail",          324      actual: null,          325      expected: null,          326      stack: ["at <test>"],          327    },          328    {          329      type: "error",          330      test: "first",          331      message: "third fail",          332      op: "fail",          333      actual: null,          334      expected: null,          335      stack: ["at <test>"],          336    },          337    { type: "done", count: 3, ok: 0, error: 3, skip: 0, only: 0 },          338  ],          339  false,          340);          341          342runnerTest(          343  "does not catch unhandled exceptions (non errors)",          344  (runner, assert) => {          345    const defineTest = runner();          346          347    function unhandledHandler(err) {          348      assert.equal(err, 1, "caught");          349    }          350          351    defineTest.before(() => {          352      setupUnhandled(unhandledHandler);          353    });          354          355    defineTest("first", () => {          356      /* eslint-disable no-throw-literal */          357      throw 1;          358      /* eslint-enable no-throw-literal */          359    });          360  },          361  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],          362  null,          363);          364          365runnerTest(          366  "does not catch unhandled exceptions (error objects)",          367  (runner, assert) => {          368    const defineTest = runner();          369          370    function unhandledHandler(err) {          371      assert.equal(err.message, "something is wrong", "caught");          372    }          373          374    defineTest.before(() => {          375      setupUnhandled(unhandledHandler);          376    });          377          378    defineTest("first", () => {          379      (() => {          380        (() => {          381          throw new Error("something is wrong");          382        })();          383      })();          384    });          385  },          386  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],          387  null,          388);          389          390runnerTest(          391  "does not catch runtime errors",          392  (runner, assert) => {          393    const defineTest = runner();          394          395    function unhandledHandler(err) {          396      assert.equal(err.message, "ERROR_CALL is not defined", "caught");          397    }          398          399    defineTest.before(() => {          400      setupUnhandled(unhandledHandler);          401    });          402          403    defineTest("first", () => {          404      (() => {          405        (() => {          406          /* eslint-disable no-undef, new-cap */          407          ERROR_CALL();          408          /* eslint-enable no-undef, new-cap */          409        })();          410      })();          411    });          412  },          413  [{ type: "done", count: 0, ok: 0, error: 0, skip: 0, only: 0 }],          414  null,          415);          416          417runnerTest(          418  "multiple failing tests",          419  (runner) => {          420    const defineTest = runner();          421          422    defineTest("first", (t) => {          423      t.fail("first fail");          424    });          425          426    defineTest("second", (t) => {          427      t.fail("second fail");          428    });          429          430    defineTest("third", (t) => {          431      t.fail("third fail");          432    });          433  },          434  [          435    {          436      type: "error",          437      test: "first",          438      message: "first fail",          439      op: "fail",          440      actual: null,          441      expected: null,          442      stack: ["at <test>"],          443    },          444    {          445      type: "error",          446      test: "second",          447      message: "second fail",          448      op: "fail",          449      actual: null,          450      expected: null,          451      stack: ["at <test>"],          452    },          453    {          454      type: "error",          455      test: "third",          456      message: "third fail",          457      op: "fail",          458      actual: null,          459      expected: null,          460      stack: ["at <test>"],          461    },          462    { type: "done", count: 3, ok: 0, error: 3, skip: 0, only: 0 },          463  ],          464  false,          465);          466          467runnerTest(          468  "sync test end() error",          469  (runner) => {          470    const defineTest = runner();          471          472    defineTest("first", (t) => {          473      t.end();          474    });          475  },          476  [          477    {          478      type: "error",          479      test: "first",          480      message: "only callback tests require end",          481      op: "end",          482      stack: ["at <test>"],          483    },          484    { type: "done", count: 1, ok: 0, error: 1, skip: 0, only: 0 },          485  ],          486  false,          487);
test/unit/t-after-tests.js+105 -93
             @@ -1,34 +1,39 @@     1       import test from 'tape';     2       import runnerTest from '../helpers/runner-test';     3       import estap from '../../lib';     4            5       runnerTest('t.after() sync', runner => {     6         const defineTest = runner();     7            8         defineTest('first', t => {     9           t.after(() => {    10             t.is(2, 2, 'after ok');    11           });    12           13           t.after(() => {    14             t.is(3, 3, 'after ok 2');    15           });    16           17           t.is(1, 1, 'check ok');    18         });    19       }, [    20         { type: 'ok', test: 'first', message: 'check ok' },    21         { type: 'ok', test: 'first', message: 'after ok' },    22         { type: 'ok', test: 'first', message: 'after ok 2' },    23         { type: 'done', count: 3, ok: 3, error: 0, skip: 0, only: 0 },    24       ], true);    25           26       test('t.after() callback', t => {    27         const runner = estap.createRunner();    28         const suite = runner();    29         let count = 0;    30           31         suite.cb('first', assert => {            1import test from "tape";            2import runnerTest from "../helpers/runner-test";            3import estap from "../../lib";            4            5runnerTest(            6  "t.after() sync",            7  (runner) => {            8    const defineTest = runner();            9           10    defineTest("first", (t) => {           11      t.after(() => {           12        t.is(2, 2, "after ok");           13      });           14           15      t.after(() => {           16        t.is(3, 3, "after ok 2");           17      });           18           19      t.is(1, 1, "check ok");           20    });           21  },           22  [           23    { type: "ok", test: "first", message: "check ok" },           24    { type: "ok", test: "first", message: "after ok" },           25    { type: "ok", test: "first", message: "after ok 2" },           26    { type: "done", count: 3, ok: 3, error: 0, skip: 0, only: 0 },           27  ],           28  true,           29);           30           31test("t.after() callback", (t) => {           32  const runner = estap.createRunner();           33  const suite = runner();           34  let count = 0;           35           36  suite.cb("first", (assert) => {    32     37    assert.after(() => {    33     38      ++count;    34     39    });             @@ -46,36 +51,37 @@    46     51    }, 10);    47     52  });    48     53    49         runner.run({    50           log: () => {},    51         })    52         .then(res => {    53           t.ok(res);    54           t.is(count, 2);    55           t.end();    56         })    57         .catch(err => {    58           t.fail(err);    59         });    60       });    61           62       test('t.after() promise', t => {    63         const runner = estap.createRunner();    64         const suite = runner();    65         let count = 0;    66           67         suite('first', assert => {    68           assert.after(() => {    69             ++count;    70           });    71           72           assert.after(() => {    73             ++count;    74           });    75           76           count = 0;    77           78           return new Promise(resolve => {           54  runner           55    .run({           56      log: () => {},           57    })           58    .then((res) => {           59      t.ok(res);           60      t.is(count, 2);           61      t.end();           62    })           63    .catch((err) => {           64      t.fail(err);           65    });           66});           67           68test("t.after() promise", (t) => {           69  const runner = estap.createRunner();           70  const suite = runner();           71  let count = 0;           72           73  suite("first", (assert) => {           74    assert.after(() => {           75      ++count;           76    });           77           78    assert.after(() => {           79      ++count;           80    });           81           82    count = 0;           83           84    return new Promise((resolve) => {    79     85      setTimeout(() => {    80     86        assert.true(true);    81     87        count = 0;             @@ -84,35 +90,41 @@    84     90    });    85     91  });    86     92    87         runner.run({    88           log: () => {},    89         })    90         .then(res => {    91           t.ok(res);    92           t.is(count, 2);    93           t.end();    94         })    95         .catch(err => {    96           t.fail(err);    97         });    98       });    99          100       runnerTest('t.after() not a function', runner => {   101         const defineTest = runner();   102          103         defineTest('first', t => {   104           t.after(10);   105          106           t.is(1, 1, 'check ok');   107         });   108       }, [   109         {   110           type: 'error',   111           test: 'first',   112           message: 'after() argument 0 is not a function',   113           op: 'after',   114           stack: ['at <test>'],   115         },   116         { type: 'ok', test: 'first', message: 'check ok' },   117         { type: 'done', count: 2, ok: 1, error: 1, skip: 0, only: 0 },   118       ], false);           93  runner           94    .run({           95      log: () => {},           96    })           97    .then((res) => {           98      t.ok(res);           99      t.is(count, 2);          100      t.end();          101    })          102    .catch((err) => {          103      t.fail(err);          104    });          105});          106          107runnerTest(          108  "t.after() not a function",          109  (runner) => {          110    const defineTest = runner();          111          112    defineTest("first", (t) => {          113      t.after(10);          114          115      t.is(1, 1, "check ok");          116    });          117  },          118  [          119    {          120      type: "error",          121      test: "first",          122      message: "after() argument 0 is not a function",          123      op: "after",          124      stack: ["at <test>"],          125    },          126    { type: "ok", test: "first", message: "check ok" },          127    { type: "done", count: 2, ok: 1, error: 1, skip: 0, only: 0 },          128  ],          129  false,          130);
test/unit/tap-reporter.js+307 -283
             @@ -1,299 +1,323 @@     1      1/* eslint-disable no-useless-concat */     2       import test from 'tape';     3       import tap from '../../lib/reporter/tap';     4            5       test('done message ok', t => {     6         let i = 0;     7         const send = tap({     8           log(v) {     9             i++;    10             if (i === 1) t.equal(v, 'TAP version 13');    11             if (i === 2) t.equal(v, '');    12             if (i === 3) t.equal(v, '1..0');    13             if (i === 4) t.equal(v, '# passing 10/10');    14             if (i === 5) {    15               t.equal(v, '# ok');    16               t.end();    17             }    18           },    19         });    20           21         send({ type: 'done', ok: 10, error: 0, count: 10 });    22       });    23           24       test('done message ok + only', t => {    25         let i = 0;    26         const send = tap({    27           log(v) {    28             i++;    29             if (i === 1) t.equal(v, 'TAP version 13');    30             if (i === 2) t.equal(v, '');    31             if (i === 3) t.equal(v, '1..0');    32             if (i === 4) t.equal(v, '# passing 10/10');    33             if (i === 5) {    34               t.equal(v, '# ok (but not running all the tests)');    35               t.end();    36             }    37           },    38         });    39           40         send({ type: 'done', ok: 10, error: 0, count: 10, only: 1 });    41       });    42           43       test('done message ok + skip', t => {    44         let i = 0;    45         const send = tap({    46           log(v) {    47             i++;    48             if (i === 1) t.equal(v, 'TAP version 13');    49             if (i === 2) t.equal(v, '');    50             if (i === 3) t.equal(v, '1..0');    51             if (i === 4) t.equal(v, '# passing 10/12 (2 skipping)');    52             if (i === 5) {    53               t.equal(v, '# ok');    54               t.end();    55             }    56           },    57         });    58           59         send({ type: 'done', ok: 10, error: 0, count: 12, skip: 2 });    60       });    61           62       test('done message fail', t => {    63         let i = 0;    64         const send = tap({    65           log(v) {    66             i++;    67             if (i === 1) t.equal(v, 'TAP version 13');    68             if (i === 2) t.equal(v, '');    69             if (i === 3) t.equal(v, '1..0');    70             if (i === 4) t.equal(v, '# passing 10/14 (4 failing)');    71             if (i === 5) {    72               t.equal(v, '# fail');    73               t.end();    74             }    75           },    76         });    77           78         send({ type: 'done', ok: 10, error: 4, count: 14 });    79       });    80           81       test('done message fail + skip', t => {    82         let i = 0;    83         const send = tap({    84           log(v) {    85             i++;    86             if (i === 1) t.equal(v, 'TAP version 13');    87             if (i === 2) t.equal(v, '');    88             if (i === 3) t.equal(v, '1..0');    89             if (i === 4) t.equal(v, '# passing 10/18 (4 failing, 4 skipping)');    90             if (i === 5) {    91               t.equal(v, '# fail');    92               t.end();    93             }    94           },    95         });    96           97         send({ type: 'done', ok: 10, error: 4, count: 18, skip: 4 });    98       });    99          100       test('passing test message', t => {   101         let i = 0;   102         const send = tap({   103           log(v) {   104             i++;   105             if (i === 1) t.equal(v, 'TAP version 13');   106             if (i === 2) t.equal(v, 'ok 1 test-name > message');   107             if (i === 3) t.equal(v, 'ok 2 test-name > message 2');   108             if (i === 4) {   109               t.equal(v, 'ok 3 test-name 2 > message 3');   110               t.end();   111             }   112           },   113         });   114          115         send({ type: 'ok', test: 'test-name', message: 'message' });   116         send({ type: 'ok', test: 'test-name', message: 'message 2' });   117         send({ type: 'ok', test: 'test-name 2', message: 'message 3' });   118       });   119          120       test('failing test message', t => {   121         let i = 0;   122         const send = tap({   123           log(v) {   124             i++;   125             if (i === 1) t.equal(v, 'TAP version 13');   126             if (i === 2) t.equal(v, 'not ok 1 test-name > message');   127             if (i === 3) t.equal(v, '  ---');   128             if (i === 4) t.equal(v, '');   129             if (i === 5) {   130               t.equal(v, '  ...');   131               t.end();   132             }   133           },   134         });   135          136         send({ type: 'error', test: 'test-name', message: 'message' });   137       });   138          139       test('failing test message + actual', t => {   140         let i = 0;   141         const send = tap({   142           log(v) {   143             i++;   144             if (i === 1) t.equal(v, 'TAP version 13');   145             if (i === 2) t.equal(v, 'not ok 1 test-name > message');   146             if (i === 3) t.equal(v, '  ---');   147             if (i === 4) t.equal(v, '    actual:   \'(number) 10\'');   148             if (i === 5) {   149               t.equal(v, '  ...');   150               t.end();   151             }   152           },   153         });   154          155         send({ type: 'error', test: 'test-name', message: 'message', actual: 10 });   156       });   157          158       test('failing test message + actual expected (numbers)', t => {   159         let i = 0;   160         const send = tap({   161           log(v) {   162             i++;   163             if (i === 1) t.equal(v, 'TAP version 13');   164             if (i === 2) t.equal(v, 'not ok 1 test-name > message');   165             if (i === 3) t.equal(v, '  ---');   166             if (i === 4) {   167               t.equal(v, '    actual:   \'(number) 10\'' + '\n' +   168                          '    expected: \'(number) 20\'');   169             }   170             if (i === 5) {   171               t.equal(v, '  ...');   172               t.end();   173             }   174           },   175         });   176          177         send({ type: 'error', test: 'test-name', message: 'message', actual: 10, expected: 20 });   178       });   179          180       test('failing test message + actual expected (strings)', t => {   181         let i = 0;   182         const send = tap({   183           log(v) {   184             i++;   185             if (i === 1) t.equal(v, 'TAP version 13');   186             if (i === 2) t.equal(v, 'not ok 1 test-name > message');   187             if (i === 3) t.equal(v, '  ---');   188             if (i === 4) {   189               t.equal(v, '    actual:   \'(string) rollercoaster\'' + '\n' +   190                          '    expected: \'(string) r0llercoaster\'');   191             }   192             if (i === 5) {   193               t.equal(v, '  ...');   194               t.end();   195             }   196           },   197         });   198          199         send({   200           type: 'error',   201           test: 'test-name',   202           message: 'message',   203           actual: 'rollercoaster',   204           expected: 'r0llercoaster',   205         });   206       });   207          208       test('failing test message + actual expected (undefined null)', t => {   209         let i = 0;   210         const send = tap({   211           log(v) {   212             i++;   213             if (i === 1) t.equal(v, 'TAP version 13');   214             if (i === 2) t.equal(v, 'not ok 1 test-name > message');   215             if (i === 3) t.equal(v, '  ---');   216             if (i === 4) {   217               t.equal(v, '    actual:   \'(object) null\'' + '\n' +   218                          '    expected: \'(undefined) undefined\'');   219             }   220             if (i === 5) {   221               t.equal(v, '  ...');   222               t.end();   223             }   224           },   225         });   226          227         send({   228           type: 'error',   229           test: 'test-name',   230           message: 'message',            2import test from "tape";            3import tap from "../../lib/reporter/tap";            4            5test("done message ok", (t) => {            6  let i = 0;            7  const send = tap({            8    log(v) {            9      i++;           10      if (i === 1) t.equal(v, "TAP version 13");           11      if (i === 2) t.equal(v, "");           12      if (i === 3) t.equal(v, "1..0");           13      if (i === 4) t.equal(v, "# passing 10/10");           14      if (i === 5) {           15        t.equal(v, "# ok");           16        t.end();           17      }           18    },           19  });           20           21  send({ type: "done", ok: 10, error: 0, count: 10 });           22});           23           24test("done message ok + only", (t) => {           25  let i = 0;           26  const send = tap({           27    log(v) {           28      i++;           29      if (i === 1) t.equal(v, "TAP version 13");           30      if (i === 2) t.equal(v, "");           31      if (i === 3) t.equal(v, "1..0");           32      if (i === 4) t.equal(v, "# passing 10/10");           33      if (i === 5) {           34        t.equal(v, "# ok (but not running all the tests)");           35        t.end();           36      }           37    },           38  });           39           40  send({ type: "done", ok: 10, error: 0, count: 10, only: 1 });           41});           42           43test("done message ok + skip", (t) => {           44  let i = 0;           45  const send = tap({           46    log(v) {           47      i++;           48      if (i === 1) t.equal(v, "TAP version 13");           49      if (i === 2) t.equal(v, "");           50      if (i === 3) t.equal(v, "1..0");           51      if (i === 4) t.equal(v, "# passing 10/12 (2 skipping)");           52      if (i === 5) {           53        t.equal(v, "# ok");           54        t.end();           55      }           56    },           57  });           58           59  send({ type: "done", ok: 10, error: 0, count: 12, skip: 2 });           60});           61           62test("done message fail", (t) => {           63  let i = 0;           64  const send = tap({           65    log(v) {           66      i++;           67      if (i === 1) t.equal(v, "TAP version 13");           68      if (i === 2) t.equal(v, "");           69      if (i === 3) t.equal(v, "1..0");           70      if (i === 4) t.equal(v, "# passing 10/14 (4 failing)");           71      if (i === 5) {           72        t.equal(v, "# fail");           73        t.end();           74      }           75    },           76  });           77           78  send({ type: "done", ok: 10, error: 4, count: 14 });           79});           80           81test("done message fail + skip", (t) => {           82  let i = 0;           83  const send = tap({           84    log(v) {           85      i++;           86      if (i === 1) t.equal(v, "TAP version 13");           87      if (i === 2) t.equal(v, "");           88      if (i === 3) t.equal(v, "1..0");           89      if (i === 4) t.equal(v, "# passing 10/18 (4 failing, 4 skipping)");           90      if (i === 5) {           91        t.equal(v, "# fail");           92        t.end();           93      }           94    },           95  });           96           97  send({ type: "done", ok: 10, error: 4, count: 18, skip: 4 });           98});           99          100test("passing test message", (t) => {          101  let i = 0;          102  const send = tap({          103    log(v) {          104      i++;          105      if (i === 1) t.equal(v, "TAP version 13");          106      if (i === 2) t.equal(v, "ok 1 test-name > message");          107      if (i === 3) t.equal(v, "ok 2 test-name > message 2");          108      if (i === 4) {          109        t.equal(v, "ok 3 test-name 2 > message 3");          110        t.end();          111      }          112    },          113  });          114          115  send({ type: "ok", test: "test-name", message: "message" });          116  send({ type: "ok", test: "test-name", message: "message 2" });          117  send({ type: "ok", test: "test-name 2", message: "message 3" });          118});          119          120test("failing test message", (t) => {          121  let i = 0;          122  const send = tap({          123    log(v) {          124      i++;          125      if (i === 1) t.equal(v, "TAP version 13");          126      if (i === 2) t.equal(v, "not ok 1 test-name > message");          127      if (i === 3) t.equal(v, "  ---");          128      if (i === 4) t.equal(v, "");          129      if (i === 5) {          130        t.equal(v, "  ...");          131        t.end();          132      }          133    },          134  });          135          136  send({ type: "error", test: "test-name", message: "message" });          137});          138          139test("failing test message + actual", (t) => {          140  let i = 0;          141  const send = tap({          142    log(v) {          143      i++;          144      if (i === 1) t.equal(v, "TAP version 13");          145      if (i === 2) t.equal(v, "not ok 1 test-name > message");          146      if (i === 3) t.equal(v, "  ---");          147      if (i === 4) t.equal(v, "    actual:   '(number) 10'");          148      if (i === 5) {          149        t.equal(v, "  ...");          150        t.end();          151      }          152    },          153  });          154          155  send({ type: "error", test: "test-name", message: "message", actual: 10 });          156});          157          158test("failing test message + actual expected (numbers)", (t) => {          159  let i = 0;          160  const send = tap({          161    log(v) {          162      i++;          163      if (i === 1) t.equal(v, "TAP version 13");          164      if (i === 2) t.equal(v, "not ok 1 test-name > message");          165      if (i === 3) t.equal(v, "  ---");          166      if (i === 4) {          167        t.equal(          168          v,          169          "    actual:   '(number) 10'" + "\n" + "    expected: '(number) 20'",          170        );          171      }          172      if (i === 5) {          173        t.equal(v, "  ...");          174        t.end();          175      }          176    },          177  });          178          179  send({          180    type: "error",          181    test: "test-name",          182    message: "message",          183    actual: 10,          184    expected: 20,          185  });          186});          187          188test("failing test message + actual expected (strings)", (t) => {          189  let i = 0;          190  const send = tap({          191    log(v) {          192      i++;          193      if (i === 1) t.equal(v, "TAP version 13");          194      if (i === 2) t.equal(v, "not ok 1 test-name > message");          195      if (i === 3) t.equal(v, "  ---");          196      if (i === 4) {          197        t.equal(          198          v,          199          "    actual:   '(string) rollercoaster'" +          200            "\n" +          201            "    expected: '(string) r0llercoaster'",          202        );          203      }          204      if (i === 5) {          205        t.equal(v, "  ...");          206        t.end();          207      }          208    },          209  });          210          211  send({          212    type: "error",          213    test: "test-name",          214    message: "message",          215    actual: "rollercoaster",          216    expected: "r0llercoaster",          217  });          218});          219          220test("failing test message + actual expected (undefined null)", (t) => {          221  let i = 0;          222  const send = tap({          223    log(v) {          224      i++;          225      if (i === 1) t.equal(v, "TAP version 13");          226      if (i === 2) t.equal(v, "not ok 1 test-name > message");          227      if (i === 3) t.equal(v, "  ---");          228      if (i === 4) {          229        t.equal(          230          v,          231          "    actual:   '(object) null'" +          232            "\n" +          233            "    expected: '(undefined) undefined'",          234        );          235      }          236      if (i === 5) {          237        t.equal(v, "  ...");          238        t.end();          239      }          240    },          241  });          242          243  send({          244    type: "error",          245    test: "test-name",          246    message: "message",   231    247    actual: null,   232    248    expected: void 0,   233    249  });   234    250});   235    251   236       test('failing test message + actual expected (errors)', t => {   237         let i = 0;   238         const send = tap({   239           log(v) {   240             i++;   241             if (i === 1) t.equal(v, 'TAP version 13');   242             if (i === 2) t.equal(v, 'not ok 1 test-name > message');   243             if (i === 3) t.equal(v, '  ---');   244             if (i === 4) {   245               t.equal(v, '    actual:   \'(object) [Error: this is an error]\'' + '\n' +   246                          '    expected: \'(object) [TypeError: this is another error]\'');   247             }   248             if (i === 5) {   249               t.equal(v, '  ...');   250               t.end();   251             }   252           },   253         });   254          255         send({   256           type: 'error',   257           test: 'test-name',   258           message: 'message',   259           actual: new Error('this is an error'),   260           expected: new TypeError('this is another error'),   261         });   262       });   263          264       test('failing test message + actual expected (objects)', t => {   265         let i = 0;   266         const send = tap({   267           log(v) {   268             i++;   269             if (i === 1) t.equal(v, 'TAP version 13');   270             if (i === 2) t.equal(v, 'not ok 1 test-name > message');   271             if (i === 3) t.equal(v, '  ---');   272             if (i === 4) {   273               t.equal(v, '    actual:   \'(object) { key: \'\'value\'\' }\'' + '\n' +   274                          '    expected: \'(object) { otherKey: 10 }\'');   275             }   276             if (i === 5) {   277               t.equal(v, '  ...');   278               t.end();   279             }   280           },   281         });   282          283         send({   284           type: 'error',   285           test: 'test-name',   286           message: 'message',   287           actual: { key: 'value' },          252test("failing test message + actual expected (errors)", (t) => {          253  let i = 0;          254  const send = tap({          255    log(v) {          256      i++;          257      if (i === 1) t.equal(v, "TAP version 13");          258      if (i === 2) t.equal(v, "not ok 1 test-name > message");          259      if (i === 3) t.equal(v, "  ---");          260      if (i === 4) {          261        t.equal(          262          v,          263          "    actual:   '(object) [Error: this is an error]'" +          264            "\n" +          265            "    expected: '(object) [TypeError: this is another error]'",          266        );          267      }          268      if (i === 5) {          269        t.equal(v, "  ...");          270        t.end();          271      }          272    },          273  });          274          275  send({          276    type: "error",          277    test: "test-name",          278    message: "message",          279    actual: new Error("this is an error"),          280    expected: new TypeError("this is another error"),          281  });          282});          283          284test("failing test message + actual expected (objects)", (t) => {          285  let i = 0;          286  const send = tap({          287    log(v) {          288      i++;          289      if (i === 1) t.equal(v, "TAP version 13");          290      if (i === 2) t.equal(v, "not ok 1 test-name > message");          291      if (i === 3) t.equal(v, "  ---");          292      if (i === 4) {          293        t.equal(          294          v,          295          "    actual:   '(object) { key: ''value'' }'" +          296            "\n" +          297            "    expected: '(object) { otherKey: 10 }'",          298        );          299      }          300      if (i === 5) {          301        t.equal(v, "  ...");          302        t.end();          303      }          304    },          305  });          306          307  send({          308    type: "error",          309    test: "test-name",          310    message: "message",          311    actual: { key: "value" },   288    312    expected: { otherKey: 10 },   289    313  });   290    314});   291    315   292       test('unknown message', t => {          316test("unknown message", (t) => {   293    317  const send = tap({   294    318    log() {},   295    319  });   296    320   297         send({ type: 'other' });          321  send({ type: "other" });   298    322  t.end();   299    323});
test/unit/throws-tests.js+284 -242
             @@ -1,246 +1,288 @@     1      1/* eslint-disable no-throw-literal */     2       import runnerTest from '../helpers/runner-test';            2import runnerTest from "../helpers/runner-test";     3      3     4      4const errObj = new Error();     5      5     6       runnerTest('throws', runner => {     7         const defineTest = runner();     8            9         defineTest('first', t => {    10           t.throws(() => {    11             throw new Error();    12           }, Error);    13           14           t.throws(() => {    15             throw new Error();    16           }, Error, 'should throw this error');    17           18           t.throws(() => {    19             throw 1;    20           });    21           22           t.throws(() => {    23             throw new Error();    24           }, TypeError);    25           26           t.throws(() => {    27           }, TypeError, 'doesn\'t really throw');    28           29           t.throws(() => {    30             const x = null;    31             x.abc();    32           }, TypeError, 'real type error');    33           34           t.throws(() => {    35             const x = null;    36             x.abc();    37           });    38           39           t.throws(() => {    40             const x = null;    41             x.abc();    42           }, [TypeError, 'Cannot read property \'abc\' of null']);    43           44           t.throws(() => {    45             const x = null;    46             x.abc();    47           }, [TypeError, /abc/]);    48           49           t.throws(() => {    50             const x = null;    51             x.abc();    52           }, [TypeError, 'Cannot read property \'abc\' of null'], 'type and message');    53           54           t.throws(() => {    55             const x = null;    56             x.abc();    57           }, [TypeError, /abc/], 'type and message regex');    58           59           t.throws(() => {    60             const x = null;    61             x.abc();    62           }, [RangeError, 'Cannot read property \'abc\' of null'], 'type and message');    63           64           t.throws(() => {    65             const x = null;    66             x.abc();    67           }, [RangeError, /abc/], 'type and message regex');    68           69           t.throws(() => {    70             const x = null;    71             x.abc();    72           }, [TypeError, 'Cannot read property \'def\' of null'], 'type and message');    73           74           t.throws(() => {    75             const x = null;    76             x.abc();    77           }, [TypeError, /def/], 'type and message regex');    78           79           t.throws(() => {    80             const x = null;    81             x.abc();    82           }, /abc/);    83           84           t.throws(() => {    85             const x = null;    86             x.abc();    87           }, /abc/, 'regex only ok');    88           89           t.throws(() => {    90             const x = null;    91             x.abc();    92           }, /def/, 'regex only fail');    93           94           t.throws(() => {    95             throw errObj;    96           }, 33, 'unknown argument');    97           98           t.throws(() => {    99             throw errObj;   100           }, 44);   101          102           t.throws(() => {   103             throw errObj;   104           }, 'message only');   105         });   106       }, [   107         { type: 'ok', test: 'first', message: 'throws' },   108         { type: 'ok', test: 'first', message: 'should throw this error' },   109         { type: 'ok', test: 'first', message: 'throws' },   110         { type: 'error',   111           test: 'first',   112           message: 'throws',   113           actual: Error,   114           expected: TypeError,   115           op: 'throws',   116           stack: [   117             'at <test>',   118           ],   119         },   120         { type: 'error',   121           test: 'first',   122           message: 'doesn\'t really throw',   123           expected: TypeError,   124           op: 'throws',   125           stack: [   126             'at <test>',   127           ],   128         },   129         { type: 'ok', test: 'first', message: 'real type error' },   130         { type: 'ok', test: 'first', message: 'throws' },   131         { type: 'ok', test: 'first', message: 'throws' },   132         { type: 'ok', test: 'first', message: 'throws' },   133         { type: 'ok', test: 'first', message: 'type and message' },   134         { type: 'ok', test: 'first', message: 'type and message regex' },   135         { type: 'error',   136           test: 'first',   137           message: 'type and message',   138           actual: [TypeError, 'Cannot read property \'abc\' of null'],   139           expected: [RangeError, 'Cannot read property \'abc\' of null'],   140           op: 'throws',   141           stack: [   142             'at <test>',   143           ],   144         },   145         { type: 'error',   146           test: 'first',   147           message: 'type and message regex',   148           actual: [TypeError, 'TypeError: Cannot read property \'abc\' of null'],   149           expected: [RangeError, /abc/],   150           op: 'throws',   151           stack: [   152             'at <test>',   153           ],   154         },   155         { type: 'error',   156           test: 'first',   157           message: 'type and message',   158           actual: [TypeError, 'Cannot read property \'abc\' of null'],   159           expected: [TypeError, 'Cannot read property \'def\' of null'],   160           op: 'throws',   161           stack: [   162             'at <test>',   163           ],   164         },   165         { type: 'error',   166           test: 'first',   167           message: 'type and message regex',   168           actual: [TypeError, 'TypeError: Cannot read property \'abc\' of null'],   169           expected: [TypeError, /def/],   170           op: 'throws',   171           stack: [   172             'at <test>',   173           ],   174         },   175         { type: 'ok', test: 'first', message: 'throws' },   176         { type: 'ok', test: 'first', message: 'regex only ok' },   177         { type: 'error',   178           test: 'first',   179           message: 'regex only fail',   180           actual: 'TypeError: Cannot read property \'abc\' of null',   181           expected: /def/,   182           op: 'throws',   183           stack: [   184             'at <test>',   185           ],   186         },   187         { type: 'error',   188           test: 'first',   189           message: 'unknown argument',   190           actual: errObj,   191           expected: 33,   192           op: 'throws',   193           stack: [   194             'at <test>',   195           ],   196         },   197         { type: 'error',   198           test: 'first',   199           message: 'throws',   200           actual: errObj,   201           expected: 44,   202           op: 'throws',   203           stack: [   204             'at <test>',   205           ],   206         },   207         { type: 'ok', test: 'first', message: 'message only' },   208         { type: 'done', count: 21, ok: 12, error: 9, skip: 0, only: 0 },   209       ], false);   210          211       runnerTest('notThrows', runner => {   212         const defineTest = runner();   213          214         defineTest('first', t => {   215           t.notThrows(() => {});   216           t.notThrows(() => {}, 'should be fine');   217           t.notThrows(() => {   218             throw errObj;   219           });   220           t.notThrows(() => {   221             throw errObj;   222           }, 'that is an error');   223         });   224       }, [   225         { type: 'ok', test: 'first', message: 'notThrows' },   226         { type: 'ok', test: 'first', message: 'should be fine' },   227         { type: 'error',   228           test: 'first',   229           message: 'notThrows',   230           actual: errObj,   231           op: 'notThrows',   232           stack: [   233             'at <test>',   234           ],   235         },   236         { type: 'error',   237           test: 'first',   238           message: 'that is an error',   239           actual: errObj,   240           op: 'notThrows',   241           stack: [   242             'at <test>',   243           ],   244         },   245         { type: 'done', count: 4, ok: 2, error: 2, skip: 0, only: 0 },   246       ], false);            6runnerTest(            7  "throws",            8  (runner) => {            9    const defineTest = runner();           10           11    defineTest("first", (t) => {           12      t.throws(() => {           13        throw new Error();           14      }, Error);           15           16      t.throws(           17        () => {           18          throw new Error();           19        },           20        Error,           21        "should throw this error",           22      );           23           24      t.throws(() => {           25        throw 1;           26      });           27           28      t.throws(() => {           29        throw new Error();           30      }, TypeError);           31           32      t.throws(() => {}, TypeError, "doesn't really throw");           33           34      t.throws(           35        () => {           36          const x = null;           37          x.abc();           38        },           39        TypeError,           40        "real type error",           41      );           42           43      t.throws(() => {           44        const x = null;           45        x.abc();           46      });           47           48      t.throws(() => {           49        const x = null;           50        x.abc();           51      }, [TypeError, "Cannot read property 'abc' of null"]);           52           53      t.throws(() => {           54        const x = null;           55        x.abc();           56      }, [TypeError, /abc/]);           57           58      t.throws(           59        () => {           60          const x = null;           61          x.abc();           62        },           63        [TypeError, "Cannot read property 'abc' of null"],           64        "type and message",           65      );           66           67      t.throws(           68        () => {           69          const x = null;           70          x.abc();           71        },           72        [TypeError, /abc/],           73        "type and message regex",           74      );           75           76      t.throws(           77        () => {           78          const x = null;           79          x.abc();           80        },           81        [RangeError, "Cannot read property 'abc' of null"],           82        "type and message",           83      );           84           85      t.throws(           86        () => {           87          const x = null;           88          x.abc();           89        },           90        [RangeError, /abc/],           91        "type and message regex",           92      );           93           94      t.throws(           95        () => {           96          const x = null;           97          x.abc();           98        },           99        [TypeError, "Cannot read property 'def' of null"],          100        "type and message",          101      );          102          103      t.throws(          104        () => {          105          const x = null;          106          x.abc();          107        },          108        [TypeError, /def/],          109        "type and message regex",          110      );          111          112      t.throws(() => {          113        const x = null;          114        x.abc();          115      }, /abc/);          116          117      t.throws(          118        () => {          119          const x = null;          120          x.abc();          121        },          122        /abc/,          123        "regex only ok",          124      );          125          126      t.throws(          127        () => {          128          const x = null;          129          x.abc();          130        },          131        /def/,          132        "regex only fail",          133      );          134          135      t.throws(          136        () => {          137          throw errObj;          138        },          139        33,          140        "unknown argument",          141      );          142          143      t.throws(() => {          144        throw errObj;          145      }, 44);          146          147      t.throws(() => {          148        throw errObj;          149      }, "message only");          150    });          151  },          152  [          153    { type: "ok", test: "first", message: "throws" },          154    { type: "ok", test: "first", message: "should throw this error" },          155    { type: "ok", test: "first", message: "throws" },          156    {          157      type: "error",          158      test: "first",          159      message: "throws",          160      actual: Error,          161      expected: TypeError,          162      op: "throws",          163      stack: ["at <test>"],          164    },          165    {          166      type: "error",          167      test: "first",          168      message: "doesn't really throw",          169      expected: TypeError,          170      op: "throws",          171      stack: ["at <test>"],          172    },          173    { type: "ok", test: "first", message: "real type error" },          174    { type: "ok", test: "first", message: "throws" },          175    { type: "ok", test: "first", message: "throws" },          176    { type: "ok", test: "first", message: "throws" },          177    { type: "ok", test: "first", message: "type and message" },          178    { type: "ok", test: "first", message: "type and message regex" },          179    {          180      type: "error",          181      test: "first",          182      message: "type and message",          183      actual: [TypeError, "Cannot read property 'abc' of null"],          184      expected: [RangeError, "Cannot read property 'abc' of null"],          185      op: "throws",          186      stack: ["at <test>"],          187    },          188    {          189      type: "error",          190      test: "first",          191      message: "type and message regex",          192      actual: [TypeError, "TypeError: Cannot read property 'abc' of null"],          193      expected: [RangeError, /abc/],          194      op: "throws",          195      stack: ["at <test>"],          196    },          197    {          198      type: "error",          199      test: "first",          200      message: "type and message",          201      actual: [TypeError, "Cannot read property 'abc' of null"],          202      expected: [TypeError, "Cannot read property 'def' of null"],          203      op: "throws",          204      stack: ["at <test>"],          205    },          206    {          207      type: "error",          208      test: "first",          209      message: "type and message regex",          210      actual: [TypeError, "TypeError: Cannot read property 'abc' of null"],          211      expected: [TypeError, /def/],          212      op: "throws",          213      stack: ["at <test>"],          214    },          215    { type: "ok", test: "first", message: "throws" },          216    { type: "ok", test: "first", message: "regex only ok" },          217    {          218      type: "error",          219      test: "first",          220      message: "regex only fail",          221      actual: "TypeError: Cannot read property 'abc' of null",          222      expected: /def/,          223      op: "throws",          224      stack: ["at <test>"],          225    },          226    {          227      type: "error",          228      test: "first",          229      message: "unknown argument",          230      actual: errObj,          231      expected: 33,          232      op: "throws",          233      stack: ["at <test>"],          234    },          235    {          236      type: "error",          237      test: "first",          238      message: "throws",          239      actual: errObj,          240      expected: 44,          241      op: "throws",          242      stack: ["at <test>"],          243    },          244    { type: "ok", test: "first", message: "message only" },          245    { type: "done", count: 21, ok: 12, error: 9, skip: 0, only: 0 },          246  ],          247  false,          248);          249          250runnerTest(          251  "notThrows",          252  (runner) => {          253    const defineTest = runner();          254          255    defineTest("first", (t) => {          256      t.notThrows(() => {});          257      t.notThrows(() => {}, "should be fine");          258      t.notThrows(() => {          259        throw errObj;          260      });          261      t.notThrows(() => {          262        throw errObj;          263      }, "that is an error");          264    });          265  },          266  [          267    { type: "ok", test: "first", message: "notThrows" },          268    { type: "ok", test: "first", message: "should be fine" },          269    {          270      type: "error",          271      test: "first",          272      message: "notThrows",          273      actual: errObj,          274      op: "notThrows",          275      stack: ["at <test>"],          276    },          277    {          278      type: "error",          279      test: "first",          280      message: "that is an error",          281      actual: errObj,          282      op: "notThrows",          283      stack: ["at <test>"],          284    },          285    { type: "done", count: 4, ok: 2, error: 2, skip: 0, only: 0 },          286  ],          287  false,          288);
patcher created patch version 1