| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -889,6 +889,8 @@ changes: | |||
| 889 | 889 | number. If a nullish value is provided, each process gets its own port, | |
| 890 | 890 | incremented from the primary's `process.debugPort`. | |
| 891 | 891 | **Default:** `undefined`. | |
| 892 | + * `only`: {boolean} If truthy, the test context will only run tests that | ||
| 893 | + have the `only` option set | ||
| 892 | 894 | * `setup` {Function} A function that accepts the `TestsStream` instance | |
| 893 | 895 | and can be used to setup listeners before any tests are run. | |
| 894 | 896 | **Default:** `undefined`. | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -156,14 +156,17 @@ function filterExecArgv(arg, i, arr) { | |||
| 156 | 156 | !ArrayPrototypeSome(kFilterArgValues, (p) => arg === p || (i > 0 && arr[i - 1] === p) || StringPrototypeStartsWith(arg, `${p}=`)); | |
| 157 | 157 | } | |
| 158 | 158 | ||
| 159 | - function getRunArgs({ path, inspectPort, testNamePatterns }) { | ||
| 159 | + function getRunArgs(path, { inspectPort, testNamePatterns, only }) { | ||
| 160 | 160 | const argv = ArrayPrototypeFilter(process.execArgv, filterExecArgv); | |
| 161 | 161 | if (isUsingInspector()) { | |
| 162 | 162 | ArrayPrototypePush(argv, `--inspect-port=${getInspectPort(inspectPort)}`); | |
| 163 | 163 | } | |
| 164 | - if (testNamePatterns) { | ||
| 164 | + if (testNamePatterns != null) { | ||
| 165 | 165 | ArrayPrototypeForEach(testNamePatterns, (pattern) => ArrayPrototypePush(argv, `--test-name-pattern=${pattern}`)); | |
| 166 | 166 | } | |
| 167 | + if (only === true) { | ||
| 168 | + ArrayPrototypePush(argv, '--test-only'); | ||
| 169 | + } | ||
| 167 | 170 | ArrayPrototypePush(argv, path); | |
| 168 | 171 | ||
| 169 | 172 | return argv; | |
@@ -347,17 +350,17 @@ class FileTest extends Test { | |||
| 347 | 350 | } | |
| 348 | 351 | } | |
| 349 | 352 | ||
| 350 | - function runTestFile(path, root, inspectPort, filesWatcher, testNamePatterns) { | ||
| 353 | + function runTestFile(path, filesWatcher, opts) { | ||
| 351 | 354 | const watchMode = filesWatcher != null; | |
| 352 | - const subtest = root.createSubtest(FileTest, path, async (t) => { | ||
| 353 | - const args = getRunArgs({ __proto__: null, path, inspectPort, testNamePatterns }); | ||
| 355 | + const subtest = opts.root.createSubtest(FileTest, path, async (t) => { | ||
| 356 | + const args = getRunArgs(path, opts); | ||
| 354 | 357 | const stdio = ['pipe', 'pipe', 'pipe']; | |
| 355 | 358 | const env = { __proto__: null, ...process.env, NODE_TEST_CONTEXT: 'child-v8' }; | |
| 356 | 359 | if (watchMode) { | |
| 357 | 360 | stdio.push('ipc'); | |
| 358 | 361 | env.WATCH_REPORT_DEPENDENCIES = '1'; | |
| 359 | 362 | } | |
| 360 | - if (root.harness.shouldColorizeTestFiles) { | ||
| 363 | + if (opts.root.harness.shouldColorizeTestFiles) { | ||
| 361 | 364 | env.FORCE_COLOR = '1'; | |
| 362 | 365 | } | |
| 363 | 366 | ||
@@ -404,7 +407,7 @@ function runTestFile(path, root, inspectPort, filesWatcher, testNamePatterns) { | |||
| 404 | 407 | filesWatcher.runningProcesses.delete(path); | |
| 405 | 408 | filesWatcher.runningSubtests.delete(path); | |
| 406 | 409 | if (filesWatcher.runningSubtests.size === 0) { | |
| 407 | - root.reporter[kEmitMessage]('test:watch:drained'); | ||
| 410 | + opts.root.reporter[kEmitMessage]('test:watch:drained'); | ||
| 408 | 411 | } | |
| 409 | 412 | } | |
| 410 | 413 | ||
@@ -427,10 +430,10 @@ function runTestFile(path, root, inspectPort, filesWatcher, testNamePatterns) { | |||
| 427 | 430 | return subtest.start(); | |
| 428 | 431 | } | |
| 429 | 432 | ||
| 430 | - function watchFiles(testFiles, root, inspectPort, signal, testNamePatterns) { | ||
| 433 | + function watchFiles(testFiles, opts) { | ||
| 431 | 434 | const runningProcesses = new SafeMap(); | |
| 432 | 435 | const runningSubtests = new SafeMap(); | |
| 433 | - const watcher = new FilesWatcher({ __proto__: null, debounce: 200, mode: 'filter', signal }); | ||
| 436 | + const watcher = new FilesWatcher({ __proto__: null, debounce: 200, mode: 'filter', signal: opts.signal }); | ||
| 434 | 437 | const filesWatcher = { __proto__: null, watcher, runningProcesses, runningSubtests }; | |
| 435 | 438 | ||
| 436 | 439 | watcher.on('changed', ({ owners }) => { | |
@@ -446,19 +449,19 @@ function watchFiles(testFiles, root, inspectPort, signal, testNamePatterns) { | |||
| 446 | 449 | } | |
| 447 | 450 | if (!runningSubtests.size) { | |
| 448 | 451 | // Reset the topLevel counter | |
| 449 | - root.harness.counters.topLevel = 0; | ||
| 452 | + opts.root.harness.counters.topLevel = 0; | ||
| 450 | 453 | } | |
| 451 | 454 | await runningSubtests.get(file); | |
| 452 | - runningSubtests.set(file, runTestFile(file, root, inspectPort, filesWatcher, testNamePatterns)); | ||
| 455 | + runningSubtests.set(file, runTestFile(file, filesWatcher, opts)); | ||
| 453 | 456 | }, undefined, (error) => { | |
| 454 | 457 | triggerUncaughtException(error, true /* fromPromise */); | |
| 455 | 458 | })); | |
| 456 | 459 | }); | |
| 457 | - if (signal) { | ||
| 460 | + if (opts.signal) { | ||
| 458 | 461 | kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation; | |
| 459 | - signal.addEventListener( | ||
| 462 | + opts.signal.addEventListener( | ||
| 460 | 463 | 'abort', | |
| 461 | - () => root.postRun(), | ||
| 464 | + () => opts.root.postRun(), | ||
| 462 | 465 | { __proto__: null, once: true, [kResistStopPropagation]: true }, | |
| 463 | 466 | ); | |
| 464 | 467 | } | |
@@ -471,14 +474,17 @@ function run(options) { | |||
| 471 | 474 | options = kEmptyObject; | |
| 472 | 475 | } | |
| 473 | 476 | let { testNamePatterns, shard } = options; | |
| 474 | - const { concurrency, timeout, signal, files, inspectPort, watch, setup } = options; | ||
| 477 | + const { concurrency, timeout, signal, files, inspectPort, watch, setup, only } = options; | ||
| 475 | 478 | ||
| 476 | 479 | if (files != null) { | |
| 477 | 480 | validateArray(files, 'options.files'); | |
| 478 | 481 | } | |
| 479 | 482 | if (watch != null) { | |
| 480 | 483 | validateBoolean(watch, 'options.watch'); | |
| 481 | 484 | } | |
| 485 | + if (only != null) { | ||
| 486 | + validateBoolean(only, 'options.only'); | ||
| 487 | + } | ||
| 482 | 488 | if (shard != null) { | |
| 483 | 489 | validateObject(shard, 'options.shard'); | |
| 484 | 490 | // Avoid re-evaluating the shard object in case it's a getter | |
@@ -524,14 +530,15 @@ function run(options) { | |||
| 524 | 530 | ||
| 525 | 531 | let postRun = () => root.postRun(); | |
| 526 | 532 | let filesWatcher; | |
| 533 | + const opts = { __proto__: null, root, signal, inspectPort, testNamePatterns, only }; | ||
| 527 | 534 | if (watch) { | |
| 528 | - filesWatcher = watchFiles(testFiles, root, inspectPort, signal, testNamePatterns); | ||
| 535 | + filesWatcher = watchFiles(testFiles, opts); | ||
| 529 | 536 | postRun = undefined; | |
| 530 | 537 | } | |
| 531 | 538 | const runFiles = () => { | |
| 532 | 539 | root.harness.bootstrapComplete = true; | |
| 533 | 540 | return SafePromiseAllSettledReturnVoid(testFiles, (path) => { | |
| 534 | - const subtest = runTestFile(path, root, inspectPort, filesWatcher, testNamePatterns); | ||
| 541 | + const subtest = runTestFile(path, filesWatcher, opts); | ||
| 535 | 542 | filesWatcher?.runningSubtests.set(path, subtest); | |
| 536 | 543 | return subtest; | |
| 537 | 544 | }); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,5 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + const test = require('node:test'); | ||
| 3 | + | ||
| 4 | + test('this should be skipped'); | ||
| 5 | + test.only('this should be executed'); | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -148,6 +148,18 @@ describe('require(\'node:test\').run', { concurrency: true }, () => { | |||
| 148 | 148 | assert.strictEqual(result[5], 'ok 2 - this should be executed\n'); | |
| 149 | 149 | }); | |
| 150 | 150 | ||
| 151 | + it('should pass only to children', async () => { | ||
| 152 | + const result = await run({ | ||
| 153 | + files: [join(testFixtures, 'test_only.js')], | ||
| 154 | + only: true | ||
| 155 | + }) | ||
| 156 | + .compose(tap) | ||
| 157 | + .toArray(); | ||
| 158 | + | ||
| 159 | + assert.strictEqual(result[2], 'ok 1 - this should be skipped # SKIP \'only\' option not set\n'); | ||
| 160 | + assert.strictEqual(result[5], 'ok 2 - this should be executed\n'); | ||
| 161 | + }); | ||
| 162 | + | ||
| 151 | 163 | it('should emit "test:watch:drained" event on watch mode', async () => { | |
| 152 | 164 | const controller = new AbortController(); | |
| 153 | 165 | await run({ | |
| Back | FazBrowse Home | New Git URL |
0 commit comments