Add another test to generate baseline when sample's logic config file changes declaration dir

This commit is contained in:
Sheetal Nandi
2019-02-07 10:14:38 -08:00
parent ee9d3439a1
commit 3a28fb0786
7 changed files with 818 additions and 40 deletions

View File

@@ -4,6 +4,11 @@ namespace ts {
const brackets = createBracketsMap();
const syntheticParent: TextRange = { pos: -1, end: -1 };
/*@internal*/
export function isInfoFile(file: string) {
return endsWith(file, `/${infoFile}`);
}
/*@internal*/
/**
* Iterates over the source files that are expected to have an emit output.

View File

@@ -120,7 +120,7 @@ namespace ts {
baselineRecorder.WriteLine("======================================================================");
}
function build({ fs, tick, rootNames, expectedMapFileNames, expectedTsbuildInfoFileNames, modifyFs, withoutBuildInfo, expectedDiagnostics }: {
function build({ fs, tick, rootNames, expectedMapFileNames, expectedTsbuildInfoFileNames, modifyFs, withoutBuildInfo }: {
fs: vfs.FileSystem;
tick: () => void;
rootNames: ReadonlyArray<string>;
@@ -128,7 +128,6 @@ namespace ts {
expectedTsbuildInfoFileNames: ReadonlyArray<BuildInfoSectionBaselineFiles>;
modifyFs: (fs: vfs.FileSystem) => void;
withoutBuildInfo: boolean;
expectedDiagnostics: ReadonlyArray<fakes.ExpectedDiagnostic>;
}) {
const actualReadFileMap = createMap<number>();
modifyFs(fs);
@@ -143,7 +142,7 @@ namespace ts {
if (path.startsWith("/src/")) {
actualReadFileMap.set(path, (actualReadFileMap.get(path) || 0) + 1);
}
if (withoutBuildInfo && getBaseFileName(path) === infoFile) {
if (withoutBuildInfo && isInfoFile(path)) {
return undefined;
}
return originalReadFile.call(host, path);
@@ -151,12 +150,11 @@ namespace ts {
if (withoutBuildInfo) {
const originalWriteFile = host.writeFile;
host.writeFile = (fileName, content, writeByteOrder) => {
return getBaseFileName(fileName) !== infoFile &&
return !isInfoFile(fileName) &&
originalWriteFile.call(host, fileName, content, writeByteOrder);
};
}
builder.buildAllProjects();
host.assertDiagnosticMessages(...expectedDiagnostics);
generateSourceMapBaselineFiles(fs, expectedMapFileNames);
generateBuildInfoSectionBaselineFiles(fs, expectedTsbuildInfoFileNames);
fs.makeReadonly();
@@ -174,9 +172,9 @@ namespace ts {
expectedReadFiles.forEach((expected, expectedFile) => {
const actual = actualReadFileMap.get(expectedFile);
assert.equal(actual, expected, `Mismatch in read file call number for: ${expectedFile}
Not in Actual: ${JSON.stringify(mapDefinedIterator(expectedReadFiles.keys(), f => actualReadFileMap.has(f) ? undefined : f))}
Mismatch Actual(path, actual, expected): ${JSON.stringify(mapDefinedIterator(actualReadFileMap.entries(),
([p, v]) => expectedReadFiles.get(p) !== v ? [p, v, expectedReadFiles.get(p) || 0] : undefined))}`);
Not in Actual: ${JSON.stringify(arrayFrom(mapDefinedIterator(expectedReadFiles.keys(), f => actualReadFileMap.has(f) ? undefined : f)))}
Mismatch Actual(path, actual, expected): ${JSON.stringify(arrayFrom(mapDefinedIterator(actualReadFileMap.entries(),
([p, v]) => expectedReadFiles.get(p) !== v ? [p, v, expectedReadFiles.get(p) || 0] : undefined)))}`);
});
}
@@ -218,14 +216,15 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(mapDefinedIterator(act
withoutBuildInfo: boolean;
lastProjectOutputJs: string;
initialBuild: ExpectedBuildOutputNotDifferingWithBuildInfo;
incrementalDtsChangedBuild: ExpectedBuildOutputNotDifferingWithBuildInfo;
incrementalDtsUnchangedBuild: ExpectedBuildOutputDifferingWithBuildInfo;
incrementalDtsChangedBuild?: ExpectedBuildOutputNotDifferingWithBuildInfo;
incrementalDtsUnchangedBuild?: ExpectedBuildOutputDifferingWithBuildInfo;
incrementalHeaderChangedBuild?: ExpectedBuildOutputDifferingWithBuildInfo;
}) {
describe(`${proj}:: ${scenario}${withoutBuildInfo ? " without build info" : ""}`, () => {
describe(`tsc --b ${proj}:: ${scenario}${withoutBuildInfo ? " without build info" : ""}`, () => {
let fs: vfs.FileSystem;
let actualReadFileMap: Map<number>;
let firstBuildTime: number;
let host: fakes.SolutionBuilderHost;
before(() => {
const result = build({
fs: projFs().shadow(),
@@ -235,16 +234,19 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(mapDefinedIterator(act
expectedTsbuildInfoFileNames,
modifyFs: initialBuild.modifyFs,
withoutBuildInfo,
expectedDiagnostics: initialBuild.expectedDiagnostics
});
({ fs, actualReadFileMap } = result);
({ fs, actualReadFileMap, host } = result);
firstBuildTime = time();
});
after(() => {
fs = undefined!;
actualReadFileMap = undefined!;
host = undefined!;
});
describe("initialBuild", () => {
it(`verify diagnostics`, () => {
host.assertDiagnosticMessages(...initialBuild.expectedDiagnostics);
});
it(`Generates files matching the baseline`, () => {
generateBaseline(fs, proj, scenario, "initial Build", withoutBuildInfo, projFs());
});
@@ -259,26 +261,30 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(mapDefinedIterator(act
describe(subScenario, () => {
let newFs: vfs.FileSystem;
let actualReadFileMap: Map<number>;
let host: fakes.SolutionBuilderHost;
before(() => {
assert.equal(fs.statSync(lastProjectOutputJs).mtimeMs, firstBuildTime, "First build timestamp is correct");
tick();
newFs = fs.shadow();
tick();
({ actualReadFileMap } = build({
({ actualReadFileMap, host } = build({
fs: newFs,
tick,
rootNames,
expectedMapFileNames,
expectedTsbuildInfoFileNames,
modifyFs: incrementalModifyFs,
withoutBuildInfo,
expectedDiagnostics: incrementalExpectedDiagnostics
withoutBuildInfo
}));
assert.equal(newFs.statSync(lastProjectOutputJs).mtimeMs, time(), "Second build timestamp is correct");
});
after(() => {
newFs = undefined!;
actualReadFileMap = undefined!;
host = undefined!;
});
it(`verify diagnostics`, () => {
host.assertDiagnosticMessages(...incrementalExpectedDiagnostics);
});
it(`Generates files matching the baseline`, () => {
generateBaseline(newFs, proj, scenario, subScenario, withoutBuildInfo, fs);
@@ -290,20 +296,23 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(mapDefinedIterator(act
}
});
}
if (incrementalDtsChangedBuild) {
incrementalBuild(
"incremental declaration changes",
incrementalDtsChangedBuild.modifyFs,
incrementalDtsChangedBuild.expectedDiagnostics,
incrementalDtsChangedBuild.expectedReadFiles
);
}
incrementalBuild(
"incremental declaration changes",
incrementalDtsChangedBuild.modifyFs,
incrementalDtsChangedBuild.expectedDiagnostics,
incrementalDtsChangedBuild.expectedReadFiles
);
incrementalBuild(
"incremental declaration doesnt change",
incrementalDtsUnchangedBuild.modifyFs,
(withoutBuildInfo ? incrementalDtsUnchangedBuild.withoutBuildInfo : incrementalDtsUnchangedBuild.withBuildInfo).expectedDiagnostics,
(withoutBuildInfo ? incrementalDtsUnchangedBuild.withoutBuildInfo : incrementalDtsUnchangedBuild.withBuildInfo).expectedReadFiles
);
if (incrementalDtsUnchangedBuild) {
incrementalBuild(
"incremental declaration doesnt change",
incrementalDtsUnchangedBuild.modifyFs,
(withoutBuildInfo ? incrementalDtsUnchangedBuild.withoutBuildInfo : incrementalDtsUnchangedBuild.withBuildInfo).expectedDiagnostics,
(withoutBuildInfo ? incrementalDtsUnchangedBuild.withoutBuildInfo : incrementalDtsUnchangedBuild.withBuildInfo).expectedReadFiles
);
}
if (incrementalHeaderChangedBuild) {
incrementalBuild(
@@ -327,8 +336,8 @@ Mismatch Actual(path, actual, expected): ${JSON.stringify(mapDefinedIterator(act
expectedTsbuildInfoFileNames: ReadonlyArray<BuildInfoSectionBaselineFiles>;
lastProjectOutputJs: string;
initialBuild: ExpectedBuildOutputNotDifferingWithBuildInfo;
incrementalDtsChangedBuild: ExpectedBuildOutputNotDifferingWithBuildInfo;
incrementalDtsUnchangedBuild: ExpectedBuildOutputDifferingWithBuildInfo;
incrementalDtsChangedBuild?: ExpectedBuildOutputNotDifferingWithBuildInfo;
incrementalDtsUnchangedBuild?: ExpectedBuildOutputDifferingWithBuildInfo;
incrementalHeaderChangedBuild?: ExpectedBuildOutputDifferingWithBuildInfo;
}) {
verifyTsbuildOutputWorker({ ...input, withoutBuildInfo: false });

View File

@@ -359,6 +359,16 @@ export class cNew {}`);
});
describe("emit output", () => {
const initialBuildDiagnostics: ReadonlyArray<fakes.ExpectedDiagnostic> = [
getExpectedDiagnosticForProjectsInBuild("src/core/tsconfig.json", "src/logic/tsconfig.json", "src/tests/tsconfig.json"),
[Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/core/tsconfig.json", "src/core/anotherModule.js"],
[Diagnostics.Building_project_0, "/src/core/tsconfig.json"],
[Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/logic/tsconfig.json", "src/logic/index.js"],
[Diagnostics.Building_project_0, "/src/logic/tsconfig.json"],
[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"]
];
verifyTsbuildOutput({
scenario: "sample",
projFs: () => projFs,
@@ -375,15 +385,7 @@ export class cNew {}`);
lastProjectOutputJs: "/src/tests/index.js",
initialBuild: {
modifyFs: noop,
expectedDiagnostics: [
getExpectedDiagnosticForProjectsInBuild("src/core/tsconfig.json", "src/logic/tsconfig.json", "src/tests/tsconfig.json"),
[Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/core/tsconfig.json", "src/core/anotherModule.js"],
[Diagnostics.Building_project_0, "/src/core/tsconfig.json"],
[Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/logic/tsconfig.json", "src/logic/index.js"],
[Diagnostics.Building_project_0, "/src/logic/tsconfig.json"],
[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"]
]
expectedDiagnostics: initialBuildDiagnostics
},
incrementalDtsChangedBuild: {
modifyFs: fs => appendText(fs, "/src/core/index.ts", `
@@ -425,6 +427,38 @@ class someClass { }`),
}
}
});
verifyTsbuildOutput({
scenario: "when logic config changes declaration dir",
projFs: () => projFs,
time,
tick,
proj: "sample1",
rootNames: ["/src/tests"],
expectedMapFileNames: [
"/src/core/anotherModule.d.ts.map",
"/src/core/index.d.ts.map",
"/src/logic/index.js.map"
],
expectedTsbuildInfoFileNames: emptyArray,
lastProjectOutputJs: "/src/tests/index.js",
initialBuild: {
modifyFs: noop,
expectedDiagnostics: initialBuildDiagnostics
},
incrementalDtsChangedBuild: {
modifyFs: fs => replaceText(fs, "/src/logic/tsconfig.json", `"declaration": true,`, `"declaration": true,
"declarationDir": "decls"`),
expectedDiagnostics: [
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_out_of_date_because_output_file_1_does_not_exist, "src/logic/tsconfig.json", "src/logic/decls/index.d.ts"],
[Diagnostics.Building_project_0, "/src/logic/tsconfig.json"],
[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/logic"],
[Diagnostics.Building_project_0, "/src/tests/tsconfig.json"],
]
}
});
});
});
}