@@ -905,20 +905,19 @@ namespace ts {
905
905
import createTestSystem = TestFSWithWatch . createWatchedSystem ;
906
906
import libFile = TestFSWithWatch . libFile ;
907
907
908
- describe ( "unittests:: Reuse program structure:: isProgramUptoDate should return true when there is no change in compiler options and " , ( ) => {
909
- function verifyProgramIsUptoDate (
908
+ describe ( "unittests:: Reuse program structure:: isProgramUptoDate" , ( ) => {
909
+ function getWhetherProgramIsUptoDate (
910
910
program : Program ,
911
911
newRootFileNames : string [ ] ,
912
912
newOptions : CompilerOptions
913
913
) {
914
- const actual = isProgramUptoDate (
914
+ return isProgramUptoDate (
915
915
program , newRootFileNames , newOptions ,
916
916
path => program . getSourceFileByPath ( path ) ! . version , /*fileExists*/ returnFalse ,
917
917
/*hasInvalidatedResolution*/ returnFalse ,
918
918
/*hasChangedAutomaticTypeDirectiveNames*/ false ,
919
919
/*projectReferences*/ undefined
920
920
) ;
921
- assert . isTrue ( actual ) ;
922
921
}
923
922
924
923
function duplicate ( options : CompilerOptions ) : CompilerOptions ;
@@ -927,134 +926,215 @@ namespace ts {
927
926
return JSON . parse ( JSON . stringify ( filesOrOptions ) ) ;
928
927
}
929
928
930
- function verifyProgramWithoutConfigFile ( system : System , rootFiles : string [ ] , options : CompilerOptions ) {
931
- const program = createWatchProgram ( createWatchCompilerHostOfFilesAndCompilerOptions ( rootFiles , options , /*watchOptions*/ undefined , system ) ) . getCurrentProgram ( ) . getProgram ( ) ;
932
- verifyProgramIsUptoDate ( program , duplicate ( rootFiles ) , duplicate ( options ) ) ;
933
- }
929
+ describe ( "should return true when there is no change in compiler options and" , ( ) => {
930
+ function verifyProgramIsUptoDate (
931
+ program : Program ,
932
+ newRootFileNames : string [ ] ,
933
+ newOptions : CompilerOptions
934
+ ) {
935
+ const actual = getWhetherProgramIsUptoDate ( program , newRootFileNames , newOptions ) ;
936
+ assert . isTrue ( actual ) ;
937
+ }
934
938
935
- function verifyProgramWithConfigFile ( system : System , configFileName : string ) {
936
- const program = createWatchProgram ( createWatchCompilerHostOfConfigFile ( configFileName , { } , /*watchOptionsToExtend*/ undefined , system ) ) . getCurrentProgram ( ) . getProgram ( ) ;
937
- const { fileNames, options } = parseConfigFileWithSystem ( configFileName , { } , /*watchOptionsToExtend*/ undefined , system , notImplemented ) ! ; // TODO: GH#18217
938
- verifyProgramIsUptoDate ( program , fileNames , options ) ;
939
- }
939
+ function verifyProgramWithoutConfigFile ( system : System , rootFiles : string [ ] , options : CompilerOptions ) {
940
+ const program = createWatchProgram ( createWatchCompilerHostOfFilesAndCompilerOptions ( rootFiles , options , /*watchOptions*/ undefined , system ) ) . getCurrentProgram ( ) . getProgram ( ) ;
941
+ verifyProgramIsUptoDate ( program , duplicate ( rootFiles ) , duplicate ( options ) ) ;
942
+ }
940
943
941
- function verifyProgram ( files : File [ ] , rootFiles : string [ ] , options : CompilerOptions , configFile : string ) {
942
- const system = createTestSystem ( files ) ;
943
- verifyProgramWithoutConfigFile ( system , rootFiles , options ) ;
944
- verifyProgramWithConfigFile ( system , configFile ) ;
945
- }
944
+ function verifyProgramWithConfigFile ( system : System , configFileName : string ) {
945
+ const program = createWatchProgram ( createWatchCompilerHostOfConfigFile ( configFileName , { } , /*watchOptionsToExtend*/ undefined , system ) ) . getCurrentProgram ( ) . getProgram ( ) ;
946
+ const { fileNames , options } = parseConfigFileWithSystem ( configFileName , { } , /*watchOptionsToExtend*/ undefined , system , notImplemented ) ! ; // TODO: GH#18217
947
+ verifyProgramIsUptoDate ( program , fileNames , options ) ;
948
+ }
946
949
947
- it ( "has empty options" , ( ) => {
948
- const file1 : File = {
949
- path : "/a/b/file1.ts" ,
950
- content : "let x = 1"
951
- } ;
952
- const file2 : File = {
953
- path : "/a/b/file2.ts" ,
954
- content : "let y = 1"
955
- } ;
956
- const configFile : File = {
957
- path : "/a/b/tsconfig.json" ,
958
- content : "{}"
959
- } ;
960
- verifyProgram ( [ file1 , file2 , libFile , configFile ] , [ file1 . path , file2 . path ] , { } , configFile . path ) ;
961
- } ) ;
950
+ function verifyProgram ( files : File [ ] , rootFiles : string [ ] , options : CompilerOptions , configFile : string ) {
951
+ const system = createTestSystem ( files ) ;
952
+ verifyProgramWithoutConfigFile ( system , rootFiles , options ) ;
953
+ verifyProgramWithConfigFile ( system , configFile ) ;
954
+ }
962
955
963
- it ( "has lib specified in the options" , ( ) => {
964
- const compilerOptions : CompilerOptions = { lib : [ "es5" , "es2015.promise" ] } ;
965
- const app : File = {
966
- path : "/src/app.ts" ,
967
- content : "var x: Promise<string>;"
968
- } ;
969
- const configFile : File = {
970
- path : "/src/tsconfig.json" ,
971
- content : JSON . stringify ( { compilerOptions } )
972
- } ;
973
- const es5Lib : File = {
974
- path : "/compiler/lib.es5.d.ts" ,
975
- content : "declare const eval: any"
976
- } ;
977
- const es2015Promise : File = {
978
- path : "/compiler/lib.es2015.promise.d.ts" ,
979
- content : "declare class Promise<T> {}"
980
- } ;
956
+ it ( "has empty options" , ( ) => {
957
+ const file1 : File = {
958
+ path : "/a/b/file1.ts" ,
959
+ content : "let x = 1"
960
+ } ;
961
+ const file2 : File = {
962
+ path : "/a/b/file2.ts" ,
963
+ content : "let y = 1"
964
+ } ;
965
+ const configFile : File = {
966
+ path : "/a/b/tsconfig.json" ,
967
+ content : "{}"
968
+ } ;
969
+ verifyProgram ( [ file1 , file2 , libFile , configFile ] , [ file1 . path , file2 . path ] , { } , configFile . path ) ;
970
+ } ) ;
981
971
982
- verifyProgram ( [ app , configFile , es5Lib , es2015Promise ] , [ app . path ] , compilerOptions , configFile . path ) ;
983
- } ) ;
972
+ it ( "has lib specified in the options" , ( ) => {
973
+ const compilerOptions : CompilerOptions = { lib : [ "es5" , "es2015.promise" ] } ;
974
+ const app : File = {
975
+ path : "/src/app.ts" ,
976
+ content : "var x: Promise<string>;"
977
+ } ;
978
+ const configFile : File = {
979
+ path : "/src/tsconfig.json" ,
980
+ content : JSON . stringify ( { compilerOptions } )
981
+ } ;
982
+ const es5Lib : File = {
983
+ path : "/compiler/lib.es5.d.ts" ,
984
+ content : "declare const eval: any"
985
+ } ;
986
+ const es2015Promise : File = {
987
+ path : "/compiler/lib.es2015.promise.d.ts" ,
988
+ content : "declare class Promise<T> {}"
989
+ } ;
990
+
991
+ verifyProgram ( [ app , configFile , es5Lib , es2015Promise ] , [ app . path ] , compilerOptions , configFile . path ) ;
992
+ } ) ;
984
993
985
- it ( "has paths specified in the options" , ( ) => {
986
- const compilerOptions : CompilerOptions = {
987
- baseUrl : "." ,
988
- paths : {
989
- "*" : [
990
- "packages/mail/data/*" ,
991
- "packages/styles/*" ,
992
- "*"
993
- ]
994
- }
995
- } ;
996
- const app : File = {
997
- path : "/src/packages/framework/app.ts" ,
998
- content : 'import classc from "module1/lib/file1";\
999
- import classD from "module3/file3";\
1000
- let x = new classc();\
1001
- let y = new classD();'
1002
- } ;
1003
- const module1 : File = {
1004
- path : "/src/packages/mail/data/module1/lib/file1.ts" ,
1005
- content : 'import classc from "module2/file2";export default classc;' ,
1006
- } ;
1007
- const module2 : File = {
1008
- path : "/src/packages/mail/data/module1/lib/module2/file2.ts" ,
1009
- content : 'class classc { method2() { return "hello"; } }\nexport default classc' ,
1010
- } ;
1011
- const module3 : File = {
1012
- path : "/src/packages/styles/module3/file3.ts" ,
1013
- content : "class classD { method() { return 10; } }\nexport default classD;"
1014
- } ;
1015
- const configFile : File = {
1016
- path : "/src/tsconfig.json" ,
1017
- content : JSON . stringify ( { compilerOptions } )
1018
- } ;
994
+ it ( "has paths specified in the options" , ( ) => {
995
+ const compilerOptions : CompilerOptions = {
996
+ baseUrl : "." ,
997
+ paths : {
998
+ "*" : [
999
+ "packages/mail/data/*" ,
1000
+ "packages/styles/*" ,
1001
+ "*"
1002
+ ]
1003
+ }
1004
+ } ;
1005
+ const app : File = {
1006
+ path : "/src/packages/framework/app.ts" ,
1007
+ content : 'import classc from "module1/lib/file1";\
1008
+ import classD from "module3/file3";\
1009
+ let x = new classc();\
1010
+ let y = new classD();'
1011
+ } ;
1012
+ const module1 : File = {
1013
+ path : "/src/packages/mail/data/module1/lib/file1.ts" ,
1014
+ content : 'import classc from "module2/file2";export default classc;' ,
1015
+ } ;
1016
+ const module2 : File = {
1017
+ path : "/src/packages/mail/data/module1/lib/module2/file2.ts" ,
1018
+ content : 'class classc { method2() { return "hello"; } }\nexport default classc' ,
1019
+ } ;
1020
+ const module3 : File = {
1021
+ path : "/src/packages/styles/module3/file3.ts" ,
1022
+ content : "class classD { method() { return 10; } }\nexport default classD;"
1023
+ } ;
1024
+ const configFile : File = {
1025
+ path : "/src/tsconfig.json" ,
1026
+ content : JSON . stringify ( { compilerOptions } )
1027
+ } ;
1028
+
1029
+ verifyProgram ( [ app , module1 , module2 , module3 , libFile , configFile ] , [ app . path ] , compilerOptions , configFile . path ) ;
1030
+ } ) ;
1019
1031
1020
- verifyProgram ( [ app , module1 , module2 , module3 , libFile , configFile ] , [ app . path ] , compilerOptions , configFile . path ) ;
1021
- } ) ;
1032
+ it ( "has include paths specified in tsconfig file" , ( ) => {
1033
+ const compilerOptions : CompilerOptions = {
1034
+ baseUrl : "." ,
1035
+ paths : {
1036
+ "*" : [
1037
+ "packages/mail/data/*" ,
1038
+ "packages/styles/*" ,
1039
+ "*"
1040
+ ]
1041
+ }
1042
+ } ;
1043
+ const app : File = {
1044
+ path : "/src/packages/framework/app.ts" ,
1045
+ content : 'import classc from "module1/lib/file1";\
1046
+ import classD from "module3/file3";\
1047
+ let x = new classc();\
1048
+ let y = new classD();'
1049
+ } ;
1050
+ const module1 : File = {
1051
+ path : "/src/packages/mail/data/module1/lib/file1.ts" ,
1052
+ content : 'import classc from "module2/file2";export default classc;' ,
1053
+ } ;
1054
+ const module2 : File = {
1055
+ path : "/src/packages/mail/data/module1/lib/module2/file2.ts" ,
1056
+ content : 'class classc { method2() { return "hello"; } }\nexport default classc' ,
1057
+ } ;
1058
+ const module3 : File = {
1059
+ path : "/src/packages/styles/module3/file3.ts" ,
1060
+ content : "class classD { method() { return 10; } }\nexport default classD;"
1061
+ } ;
1062
+ const configFile : File = {
1063
+ path : "/src/tsconfig.json" ,
1064
+ content : JSON . stringify ( { compilerOptions, include : [ "packages/**/*.ts" ] } )
1065
+ } ;
1066
+ verifyProgramWithConfigFile ( createTestSystem ( [ app , module1 , module2 , module3 , libFile , configFile ] ) , configFile . path ) ;
1067
+ } ) ;
1068
+ it ( "has the same root file names" , ( ) => {
1069
+ const module1 : File = {
1070
+ path : "/src/packages/mail/data/module1/lib/file1.ts" ,
1071
+ content : 'import classc from "module2/file2";export default classc;' ,
1072
+ } ;
1073
+ const module2 : File = {
1074
+ path : "/src/packages/mail/data/module1/lib/module2/file2.ts" ,
1075
+ content : 'class classc { method2() { return "hello"; } }\nexport default classc' ,
1076
+ } ;
1077
+ const module3 : File = {
1078
+ path : "/src/packages/styles/module3/file3.ts" ,
1079
+ content : "class classD { method() { return 10; } }\nexport default classD;"
1080
+ } ;
1081
+ const rootFiles = [ module1 . path , module2 . path , module3 . path ] ;
1082
+ const system = createTestSystem ( [ module1 , module2 , module3 ] ) ;
1083
+ const options = { } ;
1084
+ const program = createWatchProgram ( createWatchCompilerHostOfFilesAndCompilerOptions ( rootFiles , options , /*watchOptions*/ undefined , system ) ) . getCurrentProgram ( ) . getProgram ( ) ;
1085
+ verifyProgramIsUptoDate ( program , duplicate ( rootFiles ) , duplicate ( options ) ) ;
1086
+ } ) ;
1022
1087
1023
- it ( "has include paths specified in tsconfig file" , ( ) => {
1024
- const compilerOptions : CompilerOptions = {
1025
- baseUrl : "." ,
1026
- paths : {
1027
- "*" : [
1028
- "packages/mail/data/*" ,
1029
- "packages/styles/*" ,
1030
- "*"
1031
- ]
1032
- }
1033
- } ;
1034
- const app : File = {
1035
- path : "/src/packages/framework/app.ts" ,
1036
- content : 'import classc from "module1/lib/file1";\
1037
- import classD from "module3/file3";\
1038
- let x = new classc();\
1039
- let y = new classD();'
1040
- } ;
1041
- const module1 : File = {
1042
- path : "/src/packages/mail/data/module1/lib/file1.ts" ,
1043
- content : 'import classc from "module2/file2";export default classc;' ,
1044
- } ;
1045
- const module2 : File = {
1046
- path : "/src/packages/mail/data/module1/lib/module2/file2.ts" ,
1047
- content : 'class classc { method2() { return "hello"; } }\nexport default classc' ,
1048
- } ;
1049
- const module3 : File = {
1050
- path : "/src/packages/styles/module3/file3.ts" ,
1051
- content : "class classD { method() { return 10; } }\nexport default classD;"
1052
- } ;
1053
- const configFile : File = {
1054
- path : "/src/tsconfig.json" ,
1055
- content : JSON . stringify ( { compilerOptions, include : [ "packages/**/*.ts" ] } )
1056
- } ;
1057
- verifyProgramWithConfigFile ( createTestSystem ( [ app , module1 , module2 , module3 , libFile , configFile ] ) , configFile . path ) ;
1088
+ } ) ;
1089
+ describe ( "should return false when there is no change in compiler options but" , ( ) => {
1090
+ function verifyProgramIsNotUptoDate (
1091
+ program : Program ,
1092
+ newRootFileNames : string [ ] ,
1093
+ newOptions : CompilerOptions
1094
+ ) {
1095
+ const actual = getWhetherProgramIsUptoDate ( program , newRootFileNames , newOptions ) ;
1096
+ assert . isFalse ( actual ) ;
1097
+ }
1098
+ it ( "has more root file names" , ( ) => {
1099
+ const module1 : File = {
1100
+ path : "/src/packages/mail/data/module1/lib/file1.ts" ,
1101
+ content : 'import classc from "module2/file2";export default classc;' ,
1102
+ } ;
1103
+ const module2 : File = {
1104
+ path : "/src/packages/mail/data/module1/lib/module2/file2.ts" ,
1105
+ content : 'class classc { method2() { return "hello"; } }\nexport default classc' ,
1106
+ } ;
1107
+ const module3 : File = {
1108
+ path : "/src/packages/styles/module3/file3.ts" ,
1109
+ content : "class classD { method() { return 10; } }\nexport default classD;"
1110
+ } ;
1111
+ const rootFiles = [ module1 . path , module2 . path ] ;
1112
+ const newRootFiles = [ module1 . path , module2 . path , module3 . path ] ;
1113
+ const system = createTestSystem ( [ module1 , module2 , module3 ] ) ;
1114
+ const options = { } ;
1115
+ const program = createWatchProgram ( createWatchCompilerHostOfFilesAndCompilerOptions ( rootFiles , options , /*watchOptions*/ undefined , system ) ) . getCurrentProgram ( ) . getProgram ( ) ;
1116
+ verifyProgramIsNotUptoDate ( program , duplicate ( newRootFiles ) , duplicate ( options ) ) ;
1117
+ } ) ;
1118
+ it ( "has one root file replaced by another" , ( ) => {
1119
+ const module1 : File = {
1120
+ path : "/src/packages/mail/data/module1/lib/file1.ts" ,
1121
+ content : 'import classc from "module2/file2";export default classc;' ,
1122
+ } ;
1123
+ const module2 : File = {
1124
+ path : "/src/packages/mail/data/module1/lib/module2/file2.ts" ,
1125
+ content : 'class classc { method2() { return "hello"; } }\nexport default classc' ,
1126
+ } ;
1127
+ const module3 : File = {
1128
+ path : "/src/packages/styles/module3/file3.ts" ,
1129
+ content : "class classD { method() { return 10; } }\nexport default classD;"
1130
+ } ;
1131
+ const rootFiles = [ module1 . path , module2 . path ] ;
1132
+ const newRootFiles = [ module2 . path , module3 . path ] ;
1133
+ const system = createTestSystem ( [ module1 , module2 , module3 ] ) ;
1134
+ const options = { } ;
1135
+ const program = createWatchProgram ( createWatchCompilerHostOfFilesAndCompilerOptions ( rootFiles , options , /*watchOptions*/ undefined , system ) ) . getCurrentProgram ( ) . getProgram ( ) ;
1136
+ verifyProgramIsNotUptoDate ( program , duplicate ( newRootFiles ) , duplicate ( options ) ) ;
1137
+ } ) ;
1058
1138
} ) ;
1059
1139
} ) ;
1060
1140
}
0 commit comments