@@ -24,14 +24,13 @@ let browser = "IE";
2424let grep : string | undefined ;
2525let verbose = false ;
2626
27- interface FileTest {
27+ interface FileBasedTest {
2828 file : string ;
29- configurations ?: FileTestConfiguration [ ] ;
29+ configurations ?: FileBasedTestConfiguration [ ] ;
3030}
3131
32- interface FileTestConfiguration {
33- name : string ;
34- settings : Record < string , string > ;
32+ interface FileBasedTestConfiguration {
33+ [ setting : string ] : string ;
3534}
3635
3736function isFileSystemCaseSensitive ( ) : boolean {
@@ -669,7 +668,7 @@ function handleApiEnumerateTestFiles(req: http.ServerRequest, res: http.ServerRe
669668 try {
670669 if ( err ) return sendInternalServerError ( res , err ) ;
671670 if ( ! content ) return sendBadRequest ( res ) ;
672- const tests : ( string | FileTest ) [ ] = enumerateTestFiles ( content ) ;
671+ const tests : ( string | FileBasedTest ) [ ] = enumerateTestFiles ( content ) ;
673672 return sendJson ( res , /*statusCode*/ 200 , tests ) ;
674673 }
675674 catch ( e ) {
@@ -699,59 +698,62 @@ function enumerateTestFiles(runner: string) {
699698// Regex for parsing options in the format "@Alpha: Value of any sort"
700699const optionRegex = / ^ [ \/ ] { 2 } \s * @ ( \w + ) \s * : \s * ( [ ^ \r \n ] * ) / gm; // multiple matches on multiple lines
701700
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 > = { } ;
704703
705704 let match : RegExpExecArray ;
706- /* tslint:disable:no-null-keyword */
707705 while ( ( match = optionRegex . exec ( content ) ) !== null ) {
708- /* tslint:enable:no-null-keyword */
709706 opts [ match [ 1 ] ] = match [ 2 ] . trim ( ) ;
710707 }
711708
712709 return opts ;
713710}
714711
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 ;
718716}
719717
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 ] ) ;
742741 }
743- configurations . push ( { name, settings } ) ;
744742 }
745743 }
746744
747- return { file, configurations } ;
745+ if ( ! varyByEntries ) return undefined ;
746+
747+ const configurations : FileBasedTestConfiguration [ ] = [ ] ;
748+ computeFileBasedTestConfigurationVariations ( configurations , { } , varyByEntries , 0 ) ;
749+ return configurations ;
748750}
749751
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 } ;
755757}
756758
757759function handleApiListFiles ( req : http . ServerRequest , res : http . ServerResponse ) {
0 commit comments