patchstack/renovate-package

Change ID vultoynq master

...
Show Latest

Reformat all files with prettier

Change does not have a description.
Reviews
No reviews.
55 files changed +4075 -3302
7
54
25
25
499
37
27
260
14
15
62
65
2
35
2
6
4
4
4
777
16
16
4
4
6
10
8
8
8
8
10
6
8
4
11
11
11
4
4
4
52
52
1480
294
11
24
578
253
200
6
142
886
198
590
526
.babelrc +2 -5
       1 line hidden  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
       1 line hidden  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```
       88 lines hidden117 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
       1 line hidden
example/example.js +13 -12
  1    import estap from '../lib';      1import estap from "../lib";  2   2  3   3const test = estap();  4   4       1 line hidden  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    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    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) {       5 lines hidden 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  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,       7 lines hidden 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  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    }       2 lines hidden 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       1 line hidden 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    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};       5 lines hidden 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(() => {       5 lines hidden 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        }       5 lines hidden 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      });       12 lines hidden 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       3 lines hidden
lib/run-test.js +14 -13
  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);       3 lines hidden 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),       7 lines hidden 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      });       2 lines hidden 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    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();       14 lines hidden 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    };       2 lines hidden 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 {       9 lines hidden 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()       17 lines hidden 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 170109 171    return defineTest;110 172  }111 173112 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 178117 179    const testOpts = {       4 lines hidden122 184      pendingTests: new Set(),123 185    };124 186125        return Promise.map(tests.keys(), testObj => {    187    return Promise.map(tests.keys(), (testObj) => {126 188      const testData = tests.get(testObj);127 189128 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 265178 266  createTest.hasTests = () => tests.size > 0;       3 lines hidden
lib/stack-filter.js +8 -6
  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    }       6 lines hidden 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)}`;       1 line hidden 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 [];       1 line hidden
lib/reporter/json.js +8 -7
  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    }       4 lines hidden
lib/reporter/tap.js +32 -30
  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       2 lines hidden 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)`);       2 lines hidden 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;       3 lines hidden
test/helpers/collect-logs.js +35 -30
       1 line hidden  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;       3 lines hidden
test/helpers/delete-set-immediate.js +1 -1
  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    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
       5 lines hidden  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   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    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);       3 lines hidden
test/integration/cb-ok.js +2 -2
  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);       3 lines hidden
test/integration/cb-throw-nonerror.js +2 -2
  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);       4 lines hidden
test/integration/index.js +453 -324
  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       9 lines hidden 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: 1101    `, '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 13109    ok 1 check some numbers > is110    ok 2 check some numbers > is111    112    1..2113    # passing 2/2114    # ok115    `, '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 13124 167ok 1 check some numbers > is125 168not ok 2 check some numbers > is       8 lines hidden134 1771..2135 178# passing 1/2 (1 failing)136 179# fail137    `, '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 13146    ok 1 check some numbers > is147    `, '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 defined150 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 13159 214ok 1 check some numbers > is160 215161 2161..1162 217# passing 1/1163 218# ok164    `, '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 13173 232ok 1 check some numbers > is174 233not ok 2 check some numbers > promise rejection       5 lines hidden180 2391..2181 240# passing 1/2 (1 failing)182 241# fail183    `, '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 13192 255ok 1 check some numbers > is193 256not ok 2 check some numbers > promise rejection       9 lines hidden203 2661..2204 267# passing 1/2 (1 failing)205 268# fail206    `, '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 13215    ok 1 check some numbers > is216    ok 2 check some numbers > is217    218    1..2219    # passing 2/2220    # ok221    `, '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 13257 336not ok 1 should pass > fail258 337  ---       7 lines hidden266 3451..1267 346# passing 0/1 (1 failing)268 347# fail269    `, '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 13278    ok 1 should pass > timeout 1279    ok 2 should pass > timeout 2280    281    1..2282    # passing 2/2283    # ok284    `, '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 13293    ok 1 should pass > timeout 1294    ok 2 should pass > timeout 2295    296    1..2297    # passing 2/2298    # ok299    `, '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 end302 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 13312    ok 1 should pass > 1313    ok 2 should pass > 2314    315    1..2316    # passing 2/2317    # ok318    `, '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 13327    ok 1 should pass > 1328    not ok 2 should pass > assertions count does not match plan329      ---330        op:       plan331        actual:   '(number) 1'332        expected: '(number) 2'333      ...334    335    1..2336    # passing 1/2 (1 failing)337    # fail338    `, '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 13347 450ok 1 should pass > 1348 451ok 2 should pass > 2       8 lines hidden357 4601..4358 461# passing 3/4 (1 failing)359 462# fail360    `, '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 13369    ok 1 should pass > pass370    ok 2 should pass > pass371    372    1..2373    # passing 2/2374    # ok375    `, '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 13384    ok 1 should pass > pass385    not ok 2 should pass > assertions count does not match plan386      ---387        op:       plan388        actual:   '(number) 1'389        expected: '(number) 2'390      ...391    392    1..2393    # passing 1/2 (1 failing)394    # fail395    `, '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 13404 519ok 1 should pass > pass405 520ok 2 should pass > pass       7 lines hidden413 5281..3414 529# passing 2/3 (1 failing)415 530# fail416    `, '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 13425    ok 1 should pass > pass426    `, '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 13435 558ok 1 throws/notThrows > throws436 559ok 2 throws/notThrows > throws       7 lines hidden444 5671..8445 568# passing 8/8446 569# ok447    `, '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 13456 583not ok 1 throws/notThrows > throws457 584  ---       58 lines hidden516 6431..8517 644# passing 0/8 (8 failing)518 645# fail519    `, '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    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    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    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    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    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    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    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    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();       2 lines hidden
test/integration/plan-promise-lt.js +4 -4
  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  });       1 line hidden
test/integration/plan-promise-ok.js +4 -4
  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();       2 lines hidden
test/integration/plan-sync-gt.js +5 -5
  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    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    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    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    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    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    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   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);       1 line hidden
test/integration/sync-fail.js +2 -2
  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    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   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  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    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  });       2 lines hidden 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    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   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    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    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   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    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    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;       4 lines hidden 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 130109 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    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();       3 lines hidden
test/unit/serial.js +81 -61
  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    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    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    });       11 lines hidden 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;       2 lines hidden 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   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 251236    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 315292    test('unknown message', t => {    316test("unknown message", (t) => {293 317  const send = tap({294 318    log() {},295 319  });296 320297      send({ type: 'other' });    321  send({ type: "other" });298 322  t.end();299 323});
test/unit/throws-tests.js +284 -242
  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 version 1 ·