@@ -24,14 +24,13 @@ let browser = "IE";
24
24
let grep : string | undefined ;
25
25
let verbose = false ;
26
26
27
- interface FileTest {
27
+ interface FileBasedTest {
28
28
file : string ;
29
- configurations ?: FileTestConfiguration [ ] ;
29
+ configurations ?: FileBasedTestConfiguration [ ] ;
30
30
}
31
31
32
- interface FileTestConfiguration {
33
- name : string ;
34
- settings : Record < string , string > ;
32
+ interface FileBasedTestConfiguration {
33
+ [ setting : string ] : string ;
35
34
}
36
35
37
36
function isFileSystemCaseSensitive ( ) : boolean {
@@ -669,7 +668,7 @@ function handleApiEnumerateTestFiles(req: http.ServerRequest, res: http.ServerRe
669
668
try {
670
669
if ( err ) return sendInternalServerError ( res , err ) ;
671
670
if ( ! content ) return sendBadRequest ( res ) ;
672
- const tests : ( string | FileTest ) [ ] = enumerateTestFiles ( content ) ;
671
+ const tests : ( string | FileBasedTest ) [ ] = enumerateTestFiles ( content ) ;
673
672
return sendJson ( res , /*statusCode*/ 200 , tests ) ;
674
673
}
675
674
catch ( e ) {
@@ -699,59 +698,62 @@ function enumerateTestFiles(runner: string) {
699
698
// Regex for parsing options in the format "@Alpha: Value of any sort"
700
699
const optionRegex = / ^ [ \/ ] { 2 } \s * @ ( \w + ) \s * : \s * ( [ ^ \r \n ] * ) / gm; // multiple matches on multiple lines
701
700
702
- function extractCompilerSettings ( content : string ) : Record < string , any > {
703
- const opts : Record < string , any > = { } ;
701
+ function extractCompilerSettings ( content : string ) : Record < string , string > {
702
+ const opts : Record < string , string > = { } ;
704
703
705
704
let match : RegExpExecArray ;
706
- /* tslint:disable:no-null-keyword */
707
705
while ( ( match = optionRegex . exec ( content ) ) !== null ) {
708
- /* tslint:enable:no-null-keyword */
709
706
opts [ match [ 1 ] ] = match [ 2 ] . trim ( ) ;
710
707
}
711
708
712
709
return opts ;
713
710
}
714
711
715
- function split ( text : string ) {
716
- const entries = text && text . split ( "," ) . map ( s => s . toLowerCase ( ) . trim ( ) ) . filter ( s => s . length > 0 ) ;
717
- return entries && entries . length > 0 ? entries : [ "" ] ;
712
+ function splitVaryBySettingValue ( text : string ) : string [ ] | undefined {
713
+ if ( ! text ) return undefined ;
714
+ const entries = text . split ( / , / ) . map ( s => s . trim ( ) . toLowerCase ( ) ) . filter ( s => s . length > 0 ) ;
715
+ return entries && entries . length > 1 ? entries : undefined ;
718
716
}
719
717
720
- function parseCompilerTestConfigurations ( file : string ) : FileTest {
721
- const content = fs . readFileSync ( path . join ( rootDir , file ) , "utf8" ) ;
722
- const settings = extractCompilerSettings ( content ) ;
723
- const scriptTargets = split ( settings . target ) ;
724
- const moduleKinds = split ( settings . module ) ;
725
- if ( scriptTargets . length <= 1 && moduleKinds . length <= 1 ) {
726
- return { file } ;
727
- }
728
-
729
- const configurations : FileTestConfiguration [ ] = [ ] ;
730
- for ( const scriptTarget of scriptTargets ) {
731
- for ( const moduleKind of moduleKinds ) {
732
- const settings : Record < string , any > = { } ;
733
- let name = "" ;
734
- if ( moduleKinds . length > 1 ) {
735
- settings . module = moduleKind ;
736
- name += `@module: ${ moduleKind || "none" } ` ;
737
- }
738
- if ( scriptTargets . length > 1 ) {
739
- settings . target = scriptTarget ;
740
- if ( name ) name += ", " ;
741
- name += `@target: ${ scriptTarget || "none" } ` ;
718
+ function computeFileBasedTestConfigurationVariations ( configurations : FileBasedTestConfiguration [ ] , variationState : FileBasedTestConfiguration , varyByEntries : [ string , string [ ] ] [ ] , offset : number ) {
719
+ if ( offset >= varyByEntries . length ) {
720
+ // make a copy of the current variation state
721
+ configurations . push ( { ...variationState } ) ;
722
+ return ;
723
+ }
724
+
725
+ const [ varyBy , entries ] = varyByEntries [ offset ] ;
726
+ for ( const entry of entries ) {
727
+ // set or overwrite the variation
728
+ variationState [ varyBy ] = entry ;
729
+ computeFileBasedTestConfigurationVariations ( configurations , variationState , varyByEntries , offset + 1 ) ;
730
+ }
731
+ }
732
+
733
+ function getFileBasedTestConfigurations ( settings : Record < string , string > , varyBy : string [ ] ) : FileBasedTestConfiguration [ ] | undefined {
734
+ let varyByEntries : [ string , string [ ] ] [ ] | undefined ;
735
+ for ( const varyByKey of varyBy ) {
736
+ if ( Object . prototype . hasOwnProperty . call ( settings , varyByKey ) ) {
737
+ const entries = splitVaryBySettingValue ( settings [ varyByKey ] ) ;
738
+ if ( entries ) {
739
+ if ( ! varyByEntries ) varyByEntries = [ ] ;
740
+ varyByEntries . push ( [ varyByKey , entries ] ) ;
742
741
}
743
- configurations . push ( { name, settings } ) ;
744
742
}
745
743
}
746
744
747
- return { file, configurations } ;
745
+ if ( ! varyByEntries ) return undefined ;
746
+
747
+ const configurations : FileBasedTestConfiguration [ ] = [ ] ;
748
+ computeFileBasedTestConfigurationVariations ( configurations , { } , varyByEntries , 0 ) ;
749
+ return configurations ;
748
750
}
749
751
750
- function parseProjectTestConfigurations ( file : string ) : FileTest {
751
- return { file, configurations : [
752
- { name : `@module: commonjs` , settings : { module : "commonjs" } } ,
753
- { name : `@ module: amd` , settings : { module : "amd" } } ,
754
- ] } ;
752
+ function parseCompilerTestConfigurations ( file : string ) : FileBasedTest {
753
+ const content = fs . readFileSync ( path . join ( rootDir , file ) , "utf8" ) ;
754
+ const settings = extractCompilerSettings ( content ) ;
755
+ const configurations = getFileBasedTestConfigurations ( settings , [ " module" , "target" ] ) ;
756
+ return { file , configurations } ;
755
757
}
756
758
757
759
function handleApiListFiles ( req : http . ServerRequest , res : http . ServerResponse ) {
0 commit comments