Skip to content

Commit 7051caf

Browse files
MoLowruyadorno
authored andcommitted
test_runner: make --test-name-pattern recursive
PR-URL: #48382 Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Colin Ihrig <[email protected]>
1 parent c59ae86 commit 7051caf

File tree

5 files changed

+124
-31
lines changed

5 files changed

+124
-31
lines changed

‎lib/internal/test_runner/test.js‎

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -246,16 +246,11 @@ class Test extends AsyncResource{
246246
this.timeout=timeout;
247247
}
248248

249-
if(testNamePatterns!==null){
250-
// eslint-disable-next-line no-use-before-define
251-
constmatch=thisinstanceofTestHook||ArrayPrototypeSome(
252-
testNamePatterns,
253-
(re)=>RegExpPrototypeExec(re,name)!==null,
254-
);
249+
this.name=name;
250+
this.parent=parent;
255251

256-
if(!match){
257-
skip='test name does not match pattern';
258-
}
252+
if(testNamePatterns!==null&&!this.matchesTestNamePatterns()){
253+
skip='test name does not match pattern';
259254
}
260255

261256
if(testOnlyFlag&&!this.only){
@@ -276,8 +271,6 @@ class Test extends AsyncResource{
276271
this.fn=fn;
277272
this.harness=null;// Configured on the root test by the test harness.
278273
this.mock=null;
279-
this.name=name;
280-
this.parent=parent;
281274
this.cancelled=false;
282275
this.skipped=!!skip;
283276
this.isTodo=!!todo;
@@ -302,6 +295,11 @@ class Test extends AsyncResource{
302295
}
303296
}
304297

298+
matchesTestNamePatterns(){
299+
returnArrayPrototypeSome(testNamePatterns,(re)=>RegExpPrototypeExec(re,this.name)!==null)||
300+
this.parent?.matchesTestNamePatterns();
301+
}
302+
305303
hasConcurrency(){
306304
returnthis.concurrency>this.activeSubtests;
307305
}
@@ -754,6 +752,9 @@ class TestHook extends Test{
754752
getRunArgs(){
755753
returnthis.#args;
756754
}
755+
matchesTestNamePatterns(){
756+
returntrue;
757+
}
757758
postRun(){
758759
}
759760
}
@@ -763,6 +764,10 @@ class Suite extends Test{
763764
constructor(options){
764765
super(options);
765766

767+
if(testNamePatterns!==null&&!options.skip&&!options.todo){
768+
this.fn=options.fn||this.fn;
769+
this.skipped=false;
770+
}
766771
this.runOnlySubtests=testOnlyFlag;
767772

768773
try{

‎test/fixtures/test-runner/output/name_pattern.js‎

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Flags: --no-warnings --test-name-pattern=enabled --test-name-pattern=/pattern/i
1+
// Flags: --no-warnings --test-name-pattern=enabled --test-name-pattern=yes --test-name-pattern=/pattern/i
22
'use strict';
33
constcommon=require('../../../common');
44
const{
@@ -18,7 +18,7 @@ it('top level it enabled', common.mustCall());
1818
it('top level it disabled',common.mustNotCall());
1919
it.skip('top level skipped it disabled',common.mustNotCall());
2020
it.skip('top level skipped it enabled',common.mustNotCall());
21-
describe('top level describe disabled',common.mustNotCall());
21+
describe('top level describe never disabled',common.mustCall());
2222
describe.skip('top level skipped describe disabled',common.mustNotCall());
2323
describe.skip('top level skipped describe enabled',common.mustNotCall());
2424
test('top level runs because name includes PaTtErN',common.mustCall());
@@ -38,10 +38,30 @@ describe('top level describe enabled', () =>{
3838
afterEach(common.mustCall(3));
3939
after(common.mustCall());
4040

41-
it('nested it disabled',common.mustNotCall());
41+
it('nested it not disabled',common.mustCall());
4242
it('nested it enabled',common.mustCall());
43-
describe('nested describe disabled',common.mustNotCall());
43+
describe('nested describe not disabled',common.mustCall());
4444
describe('nested describe enabled',common.mustCall(()=>{
4545
it('is enabled',common.mustCall());
4646
}));
4747
});
48+
49+
describe('yes',function(){
50+
it('no',()=>{});
51+
it('yes',()=>{});
52+
53+
describe('maybe',function(){
54+
it('no',()=>{});
55+
it('yes',()=>{});
56+
});
57+
});
58+
59+
describe('no',function(){
60+
it('no',()=>{});
61+
it('yes',()=>{});
62+
63+
describe('maybe',function(){
64+
it('no',()=>{});
65+
it('yes',()=>{});
66+
});
67+
});

‎test/fixtures/test-runner/output/name_pattern.snapshot‎

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ ok 7 - top level skipped it enabled # SKIP
3434
---
3535
duration_ms: *
3636
...
37-
# Subtest: top level describe disabled
38-
ok 8 - top level describe disabled # SKIP test name does not match pattern
37+
# Subtest: top level describe never disabled
38+
ok 8 - top level describe never disabled
3939
---
4040
duration_ms: *
4141
type: 'suite'
@@ -69,8 +69,8 @@ ok 12 - top level test enabled
6969
duration_ms: *
7070
...
7171
# Subtest: top level describe enabled
72-
# Subtest: nested it disabled
73-
ok 1 - nested it disabled # SKIP test name does not match pattern
72+
# Subtest: nested it not disabled
73+
ok 1 - nested it not disabled
7474
---
7575
duration_ms: *
7676
...
@@ -79,8 +79,8 @@ ok 12 - top level test enabled
7979
---
8080
duration_ms: *
8181
...
82-
# Subtest: nested describe disabled
83-
ok 3 - nested describe disabled # SKIP test name does not match pattern
82+
# Subtest: nested describe not disabled
83+
ok 3 - nested describe not disabled
8484
---
8585
duration_ms: *
8686
type: 'suite'
@@ -103,12 +103,80 @@ ok 13 - top level describe enabled
103103
duration_ms: *
104104
type: 'suite'
105105
...
106-
1..13
107-
# tests 13
108-
# suites 6
109-
# pass 6
106+
# Subtest: yes
107+
# Subtest: no
108+
ok 1 - no
109+
---
110+
duration_ms: *
111+
...
112+
# Subtest: yes
113+
ok 2 - yes
114+
---
115+
duration_ms: *
116+
...
117+
# Subtest: maybe
118+
# Subtest: no
119+
ok 1 - no
120+
---
121+
duration_ms: *
122+
...
123+
# Subtest: yes
124+
ok 2 - yes
125+
---
126+
duration_ms: *
127+
...
128+
1..2
129+
ok 3 - maybe
130+
---
131+
duration_ms: *
132+
type: 'suite'
133+
...
134+
1..3
135+
ok 14 - yes
136+
---
137+
duration_ms: *
138+
type: 'suite'
139+
...
140+
# Subtest: no
141+
# Subtest: no
142+
ok 1 - no # SKIP test name does not match pattern
143+
---
144+
duration_ms: *
145+
...
146+
# Subtest: yes
147+
ok 2 - yes
148+
---
149+
duration_ms: *
150+
...
151+
# Subtest: maybe
152+
# Subtest: no
153+
ok 1 - no # SKIP test name does not match pattern
154+
---
155+
duration_ms: *
156+
...
157+
# Subtest: yes
158+
ok 2 - yes
159+
---
160+
duration_ms: *
161+
...
162+
1..2
163+
ok 3 - maybe
164+
---
165+
duration_ms: *
166+
type: 'suite'
167+
...
168+
1..3
169+
ok 15 - no
170+
---
171+
duration_ms: *
172+
type: 'suite'
173+
...
174+
1..15
175+
# tests 21
176+
# suites 10
177+
# pass 13
110178
# fail 0
111179
# cancelled 0
112-
# skipped 7
180+
# skipped 8
113181
# todo 0
114182
# duration_ms *

‎test/fixtures/test-runner/output/name_pattern_with_only.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const{test } = require('node:test');
55

66
test('enabled and only',{only: true},common.mustCall(async(t)=>{
77
awaitt.test('enabled',common.mustCall());
8-
awaitt.test('disabled',common.mustNotCall());
8+
awaitt.test('disabled but parent not',common.mustCall());
99
}));
1010

1111
test('enabled but not only',common.mustNotCall());

‎test/fixtures/test-runner/output/name_pattern_with_only.snapshot‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ TAP version 13
55
---
66
duration_ms: *
77
...
8-
# Subtest: disabled
9-
ok 2 - disabled # SKIP test name does not match pattern
8+
# Subtest: disabled but parent not
9+
ok 2 - disabled but parent not
1010
---
1111
duration_ms: *
1212
...
@@ -33,9 +33,9 @@ ok 4 - not only and does not match pattern # SKIP 'only' option not set
3333
1..4
3434
# tests 6
3535
# suites 0
36-
# pass 2
36+
# pass 3
3737
# fail 0
3838
# cancelled 0
39-
# skipped 4
39+
# skipped 3
4040
# todo 0
4141
# duration_ms *

0 commit comments

Comments
(0)