patchstack/renovate-package
Change ID vultoynq master
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}
1
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 hidden1
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});1
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});1
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}1
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 hidden1
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}1
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 hidden1
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 hidden1
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 hidden1
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 hidden1
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 hidden1
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;1
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}1
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}1
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});1
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 hidden1
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 hidden1
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 hidden1
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});1
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);1
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 });1
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});1
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});1
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});1
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});1
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});1
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 hidden1
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 hidden1
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 hidden1
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});1
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});1
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});1
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});1
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 }));1
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 }));1
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 }));1
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 hidden1
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});1
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});1
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});1
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});1
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);1
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);1
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 1
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";1
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);1
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);1
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});1
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 hidden1
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);1
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);1
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);1
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});1
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);1