From ecb2ce429db7e3ec207d709335bb7ede5bfbd536 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Fri, 8 Mar 2019 14:16:00 -0800 Subject: [PATCH] Add tests that will verify that all rebuilding with new compiler version builds again --- src/testRunner/unittests/tsbuild/helpers.ts | 11 +++++ src/testRunner/unittests/tsbuild/outFile.ts | 19 ++++++++ src/testRunner/unittests/tsbuild/sample.ts | 53 +++++++++++---------- 3 files changed, 59 insertions(+), 24 deletions(-) diff --git a/src/testRunner/unittests/tsbuild/helpers.ts b/src/testRunner/unittests/tsbuild/helpers.ts index 0c74492db4a..496350323fc 100644 --- a/src/testRunner/unittests/tsbuild/helpers.ts +++ b/src/testRunner/unittests/tsbuild/helpers.ts @@ -3,6 +3,17 @@ namespace ts { return [Diagnostics.Projects_in_this_build_Colon_0, projects.map(p => "\r\n * " + p).join("")]; } + export function changeCompilerVersion(host: fakes.SolutionBuilderHost) { + const originalReadFile = host.readFile; + host.readFile = path => { + const value = originalReadFile.call(host, path); + if (!value || !isBuildInfoFile(path)) return value; + const buildInfo = JSON.parse(value) as BuildInfo; + buildInfo.version = fakes.version; + return getBuildInfoText(buildInfo); + }; + } + export function replaceText(fs: vfs.FileSystem, path: string, oldText: string, newText: string) { if (!fs.statSync(path).isFile()) { throw new Error(`File ${path} does not exist`); diff --git a/src/testRunner/unittests/tsbuild/outFile.ts b/src/testRunner/unittests/tsbuild/outFile.ts index ac043460283..154e42a5be8 100644 --- a/src/testRunner/unittests/tsbuild/outFile.ts +++ b/src/testRunner/unittests/tsbuild/outFile.ts @@ -438,6 +438,25 @@ namespace ts { assert.isFalse(fs.existsSync(outputFiles[project.third][ext.buildinfo]), `Expect file ${outputFiles[project.third][ext.buildinfo]} to not exist`); }); + it("rebuilds completely when version in tsbuildinfo doesnt match ts version", () => { + const fs = outFileFs.shadow(); + const host = new fakes.SolutionBuilderHost(fs); + const builder = createSolutionBuilder(host); + builder.buildAllProjects(); + host.assertDiagnosticMessages(...initialExpectedDiagnostics); + host.clearDiagnostics(); + builder.resetBuildContext(); + changeCompilerVersion(host); + builder.buildAllProjects(); + host.assertDiagnosticMessages( + // TODO:: This should build all instead + getExpectedDiagnosticForProjectsInBuild(relSources[project.first][source.config], relSources[project.second][source.config], relSources[project.third][source.config]), + [Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, relSources[project.first][source.config], relSources[project.first][source.ts][part.one], relOutputFiles[project.first][ext.js]], + [Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, relSources[project.second][source.config], relSources[project.second][source.ts][part.one], relOutputFiles[project.second][ext.js]], + [Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, relSources[project.third][source.config], relSources[project.third][source.ts][part.one], relOutputFiles[project.third][ext.js]], + ); + }); + describe("Prepend output with .tsbuildinfo", () => { // Prologues describe("Prologues", () => { diff --git a/src/testRunner/unittests/tsbuild/sample.ts b/src/testRunner/unittests/tsbuild/sample.ts index 5b3e901cd2f..c827f4499c2 100644 --- a/src/testRunner/unittests/tsbuild/sample.ts +++ b/src/testRunner/unittests/tsbuild/sample.ts @@ -168,22 +168,21 @@ namespace ts { }); describe("can detect when and what to rebuild", () => { - let fs: vfs.FileSystem; - let host: fakes.SolutionBuilderHost; - let builder: SolutionBuilder; - before(() => { - fs = projFs.shadow(); - host = new fakes.SolutionBuilderHost(fs); - builder = createSolutionBuilder(host, ["/src/tests"], { dry: false, force: false, verbose: true }); - }); - after(() => { - fs = undefined!; - host = undefined!; - builder = undefined!; - }); + function initializeWithBuild() { + const fs = projFs.shadow(); + const host = new fakes.SolutionBuilderHost(fs); + const builder = createSolutionBuilder(host, ["/src/tests"], { verbose: true }); + builder.buildAllProjects(); + host.clearDiagnostics(); + tick(); + builder.resetBuildContext(); + return { fs, host, builder }; + } it("Builds the project", () => { - host.clearDiagnostics(); + const fs = projFs.shadow(); + const host = new fakes.SolutionBuilderHost(fs); + const builder = createSolutionBuilder(host, ["/src/tests"], { verbose: true }); builder.resetBuildContext(); builder.buildAllProjects(); host.assertDiagnosticMessages( @@ -195,13 +194,11 @@ namespace ts { [Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/tests/tsconfig.json", "src/tests/index.js"], [Diagnostics.Building_project_0, "/src/tests/tsconfig.json"] ); - tick(); }); // All three projects are up to date it("Detects that all projects are up to date", () => { - host.clearDiagnostics(); - builder.resetBuildContext(); + const { host, builder } = initializeWithBuild(); builder.buildAllProjects(); host.assertDiagnosticMessages( getExpectedDiagnosticForProjectsInBuild("src/core/tsconfig.json", "src/logic/tsconfig.json", "src/tests/tsconfig.json"), @@ -209,16 +206,13 @@ namespace ts { [Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, "src/logic/tsconfig.json", "src/logic/index.ts", "src/logic/index.js"], [Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, "src/tests/tsconfig.json", "src/tests/index.ts", "src/tests/index.js"] ); - tick(); }); // Update a file in the leaf node (tests), only it should rebuild the last one it("Only builds the leaf node project", () => { - host.clearDiagnostics(); + const { fs, host, builder } = initializeWithBuild(); fs.writeFileSync("/src/tests/index.ts", "const m = 10;"); - builder.resetBuildContext(); builder.buildAllProjects(); - host.assertDiagnosticMessages( getExpectedDiagnosticForProjectsInBuild("src/core/tsconfig.json", "src/logic/tsconfig.json", "src/tests/tsconfig.json"), [Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, "src/core/tsconfig.json", "src/core/anotherModule.ts", "src/core/anotherModule.js"], @@ -226,14 +220,12 @@ namespace ts { [Diagnostics.Project_0_is_out_of_date_because_oldest_output_1_is_older_than_newest_input_2, "src/tests/tsconfig.json", "src/tests/index.js", "src/tests/index.ts"], [Diagnostics.Building_project_0, "/src/tests/tsconfig.json"] ); - tick(); }); // Update a file in the parent (without affecting types), should get fast downstream builds it("Detects type-only changes in upstream projects", () => { - host.clearDiagnostics(); + const { fs, host, builder } = initializeWithBuild(); replaceText(fs, "/src/core/index.ts", "HELLO WORLD", "WELCOME PLANET"); - builder.resetBuildContext(); builder.buildAllProjects(); host.assertDiagnosticMessages( @@ -247,6 +239,19 @@ namespace ts { [Diagnostics.Updating_output_timestamps_of_project_0, "/src/tests/tsconfig.json"] ); }); + + it("rebuilds completely when version in tsbuildinfo doesnt match ts version", () => { + const { host, builder } = initializeWithBuild(); + changeCompilerVersion(host); + builder.buildAllProjects(); + host.assertDiagnosticMessages( + // TODO:: This should build all instead + getExpectedDiagnosticForProjectsInBuild("src/core/tsconfig.json", "src/logic/tsconfig.json", "src/tests/tsconfig.json"), + [Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, "src/core/tsconfig.json", "src/core/anotherModule.ts", "src/core/anotherModule.js"], + [Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, "src/logic/tsconfig.json", "src/logic/index.ts", "src/logic/index.js"], + [Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, "src/tests/tsconfig.json", "src/tests/index.ts", "src/tests/index.js"] + ); + }); }); describe("downstream-blocked compilations", () => {