@@ -260,6 +260,42 @@ interface Symbol {
260260 sys . writeFile ( `${ buildInfoPath } .baseline.txt` , text ) ;
261261 }
262262
263+ interface VerifyIncrementalCorrectness {
264+ scenario : TscCompile [ "scenario" ] ;
265+ subScenario : TscCompile [ "subScenario" ] ;
266+ commandLineArgs : TscCompile [ "commandLineArgs" ] ;
267+ modifyFs : TscCompile [ "modifyFs" ] ;
268+ incrementalModifyFs : TscIncremental [ "modifyFs" ] ;
269+ tick : ( ) => void ;
270+ baseFs : vfs . FileSystem ;
271+ newSys : TscCompileSystem ;
272+ }
273+ function verifyIncrementalCorrectness ( input : ( ) => VerifyIncrementalCorrectness ) {
274+ it ( `Verify emit output file text is same when built clean` , ( ) => {
275+ const {
276+ scenario, subScenario, commandLineArgs,
277+ modifyFs, incrementalModifyFs,
278+ tick, baseFs, newSys
279+ } = input ( ) ;
280+ const sys = tscCompile ( {
281+ scenario,
282+ subScenario,
283+ fs : ( ) => baseFs . makeReadonly ( ) ,
284+ commandLineArgs,
285+ modifyFs : fs => {
286+ tick ( ) ;
287+ if ( modifyFs ) modifyFs ( fs ) ;
288+ incrementalModifyFs ( fs ) ;
289+ } ,
290+ } ) ;
291+ for ( const outputFile of arrayFrom ( sys . writtenFiles . keys ( ) ) ) {
292+ const expectedText = sys . readFile ( outputFile ) ;
293+ const actualText = newSys . readFile ( outputFile ) ;
294+ assert . equal ( actualText , expectedText , `File: ${ outputFile } ` ) ;
295+ }
296+ } ) ;
297+ }
298+
263299 export interface TscIncremental {
264300 buildKind : BuildKind ;
265301 modifyFs : ( fs : vfs . FileSystem ) => void ;
@@ -351,30 +387,120 @@ interface Symbol {
351387 newSys = undefined ! ;
352388 } ) ;
353389 verifyTscBaseline ( ( ) => newSys ) ;
354- it ( `Verify emit output file text is same when built clean` , ( ) => {
355- const sys = tscCompile ( {
356- scenario,
357- subScenario,
358- fs : ( ) => baseFs . makeReadonly ( ) ,
359- commandLineArgs,
360- modifyFs : fs => {
361- tick ( ) ;
362- if ( modifyFs ) modifyFs ( fs ) ;
363- incrementalModifyFs ( fs ) ;
364- } ,
365- } ) ;
366-
367- for ( const outputFile of arrayFrom ( sys . writtenFiles . keys ( ) ) ) {
368- const expectedText = sys . readFile ( outputFile ) ;
369- const actualText = newSys . readFile ( outputFile ) ;
370- assert . equal ( actualText , expectedText , `File: ${ outputFile } ` ) ;
371- }
372- } ) ;
390+ verifyIncrementalCorrectness ( ( ) => ( {
391+ scenario,
392+ subScenario,
393+ baseFs,
394+ newSys,
395+ commandLineArgs,
396+ incrementalModifyFs,
397+ modifyFs,
398+ tick
399+ } ) ) ;
373400 } ) ;
374401 }
375402 } ) ;
376403 }
377404
405+ export function verifyTscSerializedIncrementalEdits ( input : VerifyTsBuildInput ) {
406+ verifyTscSerializedIncrementalEditsWorker ( input ) ;
407+ if ( input . baselineIncremental ) {
408+ verifyTscSerializedIncrementalEditsWorker ( {
409+ ...input ,
410+ subScenario : `${ input . subScenario } with incremental` ,
411+ commandLineArgs : [ ...input . commandLineArgs , "--incremental" ] ,
412+ } ) ;
413+ }
414+ }
415+ function verifyTscSerializedIncrementalEditsWorker ( {
416+ subScenario, fs, scenario, commandLineArgs,
417+ baselineSourceMap, modifyFs, baselineReadFileCalls, baselinePrograms,
418+ incrementalScenarios
419+ } : VerifyTsBuildInputWorker ) {
420+ describe ( `tsc ${ commandLineArgs . join ( " " ) } ${ scenario } :: ${ subScenario } serializedEdits` , ( ) => {
421+ Debug . assert ( ! ! incrementalScenarios . length , `${ scenario } /${ subScenario } :: No incremental scenarios, you probably want to use verifyTsc instead.` ) ;
422+ let tick : ( ) => void ;
423+ let sys : TscCompileSystem ;
424+ let baseFs : vfs . FileSystem ;
425+ let incrementalSys : TscCompileSystem [ ] ;
426+ before ( ( ) => {
427+ ( { fs : baseFs , tick } = getFsWithTime ( fs ( ) ) ) ;
428+ sys = tscCompile ( {
429+ scenario,
430+ subScenario,
431+ fs : ( ) => baseFs . makeReadonly ( ) ,
432+ commandLineArgs,
433+ modifyFs : fs => {
434+ if ( modifyFs ) modifyFs ( fs ) ;
435+ tick ( ) ;
436+ } ,
437+ baselineSourceMap,
438+ baselineReadFileCalls,
439+ baselinePrograms
440+ } ) ;
441+ incrementalScenarios . forEach ( (
442+ { buildKind, modifyFs, subScenario : incrementalSubScenario , commandLineArgs : incrementalCommandLineArgs } ,
443+ index
444+ ) => {
445+ Debug . assert ( buildKind !== BuildKind . Initial , "Incremental edit cannot be initial compilation" ) ;
446+ tick ( ) ;
447+ ( incrementalSys || ( incrementalSys = [ ] ) ) . push ( tscCompile ( {
448+ scenario,
449+ subScenario : incrementalSubScenario || subScenario ,
450+ buildKind,
451+ fs : ( ) => index === 0 ? sys . vfs : incrementalSys [ index - 1 ] . vfs ,
452+ commandLineArgs : incrementalCommandLineArgs || commandLineArgs ,
453+ modifyFs : fs => {
454+ tick ( ) ;
455+ modifyFs ( fs ) ;
456+ tick ( ) ;
457+ } ,
458+ baselineSourceMap,
459+ baselineReadFileCalls,
460+ baselinePrograms
461+ } ) ) ;
462+ } ) ;
463+ } ) ;
464+ after ( ( ) => {
465+ baseFs = undefined ! ;
466+ sys = undefined ! ;
467+ tick = undefined ! ;
468+ incrementalSys = undefined ! ;
469+ } ) ;
470+ describe ( "serializedBuilde" , ( ) => {
471+ verifyTscBaseline ( ( ) => ( {
472+ baseLine : ( ) => {
473+ const { file, text } = sys . baseLine ( ) ;
474+ const texts : string [ ] = [ text ] ;
475+ incrementalSys . forEach ( ( sys , index ) => {
476+ const incrementalScenario = incrementalScenarios [ index ] ;
477+ texts . push ( "" ) ;
478+ texts . push ( `Change:: ${ incrementalScenario . subScenario || incrementalScenario . buildKind } ` ) ;
479+ texts . push ( sys . baseLine ( ) . text ) ;
480+ } ) ;
481+ return { file, text : texts . join ( "\r\n" ) } ;
482+ }
483+ } ) ) ;
484+ } ) ;
485+ describe ( "incremental correctness" , ( ) => {
486+ incrementalScenarios . forEach ( ( _ , index ) => verifyIncrementalCorrectness ( ( ) => ( {
487+ scenario,
488+ subScenario,
489+ baseFs,
490+ newSys : incrementalSys [ index ] ,
491+ commandLineArgs,
492+ incrementalModifyFs : fs => {
493+ for ( let i = 0 ; i <= index ; i ++ ) {
494+ incrementalScenarios [ i ] . modifyFs ( fs ) ;
495+ }
496+ } ,
497+ modifyFs,
498+ tick
499+ } ) ) ) ;
500+ } ) ;
501+ } ) ;
502+ }
503+
378504 export function enableStrict ( fs : vfs . FileSystem , path : string ) {
379505 replaceText ( fs , path , `"strict": false` , `"strict": true` ) ;
380506 }
0 commit comments