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