@@ -12,6 +12,10 @@ const enum CompilerTestType {
12
12
Test262
13
13
}
14
14
15
+ interface CompilerFileBasedTest extends Harness . FileBasedTest {
16
+ payload ?: Harness . TestCaseParser . TestCaseContent ;
17
+ }
18
+
15
19
class CompilerBaselineRunner extends RunnerBase {
16
20
private basePath = "tests/cases" ;
17
21
private testSuiteName : TestRunnerKind ;
@@ -42,7 +46,8 @@ class CompilerBaselineRunner extends RunnerBase {
42
46
}
43
47
44
48
public enumerateTestFiles ( ) {
45
- return this . enumerateFiles ( this . basePath , / \. t s x ? $ / , { recursive : true } ) ;
49
+ // see also: `enumerateTestFiles` in tests/webTestServer.ts
50
+ return this . enumerateFiles ( this . basePath , / \. t s x ? $ / , { recursive : true } ) . map ( CompilerTest . getConfigurations ) ;
46
51
}
47
52
48
53
public initializeTests ( ) {
@@ -52,24 +57,32 @@ class CompilerBaselineRunner extends RunnerBase {
52
57
} ) ;
53
58
54
59
// this will set up a series of describe/it blocks to run between the setup and cleanup phases
55
- const files = this . tests . length > 0 ? this . tests : this . enumerateTestFiles ( ) ;
56
- files . forEach ( file => { this . checkTestCodeOutput ( vpath . normalizeSeparators ( file ) ) ; } ) ;
60
+ const files = this . tests . length > 0 ? this . tests : Harness . IO . enumerateTestFiles ( this ) ;
61
+ files . forEach ( test => {
62
+ const file = typeof test === "string" ? test : test . file ;
63
+ this . checkTestCodeOutput ( vpath . normalizeSeparators ( file ) , typeof test === "string" ? CompilerTest . getConfigurations ( test ) : test ) ;
64
+ } ) ;
57
65
} ) ;
58
66
}
59
67
60
- public checkTestCodeOutput ( fileName : string ) {
61
- for ( const { name, payload } of CompilerTest . getConfigurations ( fileName ) ) {
62
- describe ( `${ this . testSuiteName } tests for ${ fileName } ${ name ? ` (${ name } )` : `` } ` , ( ) => {
63
- this . runSuite ( fileName , payload ) ;
68
+ public checkTestCodeOutput ( fileName : string , test ?: CompilerFileBasedTest ) {
69
+ if ( test && test . configurations ) {
70
+ test . configurations . forEach ( configuration => {
71
+ describe ( `${ this . testSuiteName } tests for ${ fileName } ${ configuration && configuration . name ? ` (${ configuration . name } )` : `` } ` , ( ) => {
72
+ this . runSuite ( fileName , test , configuration ) ;
73
+ } ) ;
64
74
} ) ;
65
75
}
76
+ describe ( `${ this . testSuiteName } tests for ${ fileName } }` , ( ) => {
77
+ this . runSuite ( fileName , test ) ;
78
+ } ) ;
66
79
}
67
80
68
- private runSuite ( fileName : string , testCaseContent : Harness . TestCaseParser . TestCaseContent ) {
81
+ private runSuite ( fileName : string , test ?: CompilerFileBasedTest , configuration ?: Harness . FileBasedTestConfiguration ) {
69
82
// Mocha holds onto the closure environment of the describe callback even after the test is done.
70
83
// Everything declared here should be cleared out in the "after" callback.
71
84
let compilerTest : CompilerTest | undefined ;
72
- before ( ( ) => { compilerTest = new CompilerTest ( fileName , testCaseContent ) ; } ) ;
85
+ before ( ( ) => { compilerTest = new CompilerTest ( fileName , test && test . payload , configuration && configuration . settings ) ; } ) ;
73
86
it ( `Correct errors for ${ fileName } ` , ( ) => { compilerTest . verifyDiagnostics ( ) ; } ) ;
74
87
it ( `Correct module resolution tracing for ${ fileName } ` , ( ) => { compilerTest . verifyModuleResolution ( ) ; } ) ;
75
88
it ( `Correct sourcemap content for ${ fileName } ` , ( ) => { compilerTest . verifySourceMapRecord ( ) ; } ) ;
@@ -97,11 +110,6 @@ class CompilerBaselineRunner extends RunnerBase {
97
110
}
98
111
}
99
112
100
- interface CompilerTestConfiguration {
101
- name : string ;
102
- payload : Harness . TestCaseParser . TestCaseContent ;
103
- }
104
-
105
113
class CompilerTest {
106
114
private fileName : string ;
107
115
private justName : string ;
@@ -116,10 +124,20 @@ class CompilerTest {
116
124
// equivalent to other files on the file system not directly passed to the compiler (ie things that are referenced by other files)
117
125
private otherFiles : Harness . Compiler . TestFile [ ] ;
118
126
119
- constructor ( fileName : string , testCaseContent : Harness . TestCaseParser . TestCaseContent ) {
127
+ constructor ( fileName : string , testCaseContent ? : Harness . TestCaseParser . TestCaseContent , configurationOverrides ?: Harness . TestCaseParser . CompilerSettings ) {
120
128
this . fileName = fileName ;
121
129
this . justName = vpath . basename ( fileName ) ;
130
+
122
131
const rootDir = fileName . indexOf ( "conformance" ) === - 1 ? "tests/cases/compiler/" : ts . getDirectoryPath ( fileName ) + "/" ;
132
+
133
+ if ( testCaseContent === undefined ) {
134
+ testCaseContent = Harness . TestCaseParser . makeUnitsFromTest ( Harness . IO . readFile ( fileName ) , fileName , rootDir ) ;
135
+ }
136
+
137
+ if ( configurationOverrides ) {
138
+ testCaseContent = { ...testCaseContent , settings : { ...testCaseContent . settings , ...configurationOverrides } } ;
139
+ }
140
+
123
141
const units = testCaseContent . testUnitData ;
124
142
this . harnessSettings = testCaseContent . settings ;
125
143
let tsConfigOptions : ts . CompilerOptions ;
@@ -174,32 +192,38 @@ class CompilerTest {
174
192
this . options = this . result . options ;
175
193
}
176
194
177
- public static getConfigurations ( fileName : string ) {
178
- const content = Harness . IO . readFile ( fileName ) ;
179
- const rootDir = fileName . indexOf ( "conformance" ) === - 1 ? "tests/cases/compiler/" : ts . getDirectoryPath ( fileName ) + "/" ;
180
- const testCaseContent = Harness . TestCaseParser . makeUnitsFromTest ( content , fileName , rootDir ) ;
181
- const configurations : CompilerTestConfiguration [ ] = [ ] ;
182
- const scriptTargets = this . _split ( testCaseContent . settings . target ) ;
183
- const moduleKinds = this . _split ( testCaseContent . settings . module ) ;
195
+ public static getConfigurations ( file : string ) : CompilerFileBasedTest {
196
+ // also see `parseCompilerTestConfigurations` in tests/webTestServer.ts
197
+ const content = Harness . IO . readFile ( file ) ;
198
+ const rootDir = file . indexOf ( "conformance" ) === - 1 ? "tests/cases/compiler/" : ts . getDirectoryPath ( file ) + "/" ;
199
+ const payload = Harness . TestCaseParser . makeUnitsFromTest ( content , file , rootDir ) ;
200
+ const settings = Harness . TestCaseParser . extractCompilerSettings ( content ) ;
201
+ const scriptTargets = CompilerTest . _split ( settings . target ) ;
202
+ const moduleKinds = CompilerTest . _split ( settings . module ) ;
203
+ if ( scriptTargets . length <= 1 && moduleKinds . length <= 1 ) {
204
+ return { file, payload } ;
205
+ }
206
+
207
+ const configurations : Harness . FileBasedTestConfiguration [ ] = [ ] ;
184
208
for ( const scriptTarget of scriptTargets ) {
185
209
for ( const moduleKind of moduleKinds ) {
210
+ const settings : Record < string , any > = { } ;
186
211
let name = "" ;
187
212
if ( moduleKinds . length > 1 ) {
213
+ settings . module = moduleKind ;
188
214
name += `@module: ${ moduleKind || "none" } ` ;
189
215
}
190
216
if ( scriptTargets . length > 1 ) {
217
+ settings . target = scriptTarget ;
191
218
if ( name ) name += ", " ;
192
219
name += `@target: ${ scriptTarget || "none" } ` ;
193
220
}
194
221
195
- const settings = { ...testCaseContent . settings } ;
196
- if ( scriptTarget ) settings . target = scriptTarget ;
197
- if ( moduleKind ) settings . module = moduleKind ;
198
- configurations . push ( { name, payload : { ...testCaseContent , settings } } ) ;
222
+ configurations . push ( { name, settings } ) ;
199
223
}
200
224
}
201
225
202
- return configurations ;
226
+ return { file , payload , configurations } ;
203
227
}
204
228
205
229
public verifyDiagnostics ( ) {
0 commit comments