Add test case to verify correct resolution file is picked when current resolution file is not removed but higher precedence file is created

This commit is contained in:
Sheetal Nandi 2017-09-08 15:14:03 -07:00
parent 67f9533c67
commit de28d02626
3 changed files with 57 additions and 4 deletions

View File

@ -825,7 +825,7 @@ namespace ts {
const moduleName = moduleNames[i];
// If we want to reuse resolutions more aggressively, we can refine this to check for whether the
// text of the corresponding modulenames has changed.
if (file === oldSourceFile) {
if (file === oldSourceFile && !hasInvalidatedResolution(oldSourceFile.path)) {
const oldResolvedModule = oldSourceFile && oldSourceFile.resolvedModules.get(moduleName);
if (oldResolvedModule) {
if (isTraceEnabled(options, host)) {
@ -846,7 +846,7 @@ namespace ts {
trace(host, Diagnostics.Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1, moduleName, containingFile);
}
}
else if (!hasInvalidatedResolution(oldProgramState.file.path)) {
else {
resolvesToAmbientModuleInNonModifiedFile = moduleNameResolvesToAmbientModuleInNonModifiedFile(moduleName, oldProgramState);
}

View File

@ -2306,6 +2306,59 @@ namespace ts.projectSystem {
});
assert.isFalse(hasErrorMsg);
});
it("Changed module resolution reflected when specifying files list", () => {
const file1: FileOrFolder = {
path: "/a/b/file1.ts",
content: 'import classc from "file2"'
};
const file2a: FileOrFolder = {
path: "/a/file2.ts",
content: "export classc { method2a() { return 10; } }"
};
const file2: FileOrFolder = {
path: "/a/b/file2.ts",
content: "export classc { method2() { return 10; } }"
};
const configFile: FileOrFolder = {
path: "/a/b/tsconfig.json",
content: JSON.stringify({ files: [file1.path], compilerOptions: { module: "amd" } })
};
const files = [file1, file2a, configFile, libFile];
const host = createServerHost(files);
const projectService = createProjectService(host);
projectService.openClientFile(file1.path);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
const project = projectService.configuredProjects.get(configFile.path);
assert.isDefined(project);
checkProjectActualFiles(project, map(files, file => file.path));
checkWatchedFiles(host, mapDefined(files, file => file === file1 ? undefined : file.path));
checkWatchedDirectories(host, [], /*recursive*/ false);
const watchedRecursiveDirectories = getTypeRootsFromLocation("/a/b");
watchedRecursiveDirectories.push("/a/b");
checkWatchedDirectories(host, watchedRecursiveDirectories, /*recursive*/ true);
files.push(file2);
host.reloadFS(files);
host.runQueuedTimeoutCallbacks();
watchedRecursiveDirectories.pop();
checkNumberOfProjects(projectService, { configuredProjects: 1 });
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
checkProjectActualFiles(project, mapDefined(files, file => file === file2a ? undefined : file.path));
checkWatchedFiles(host, mapDefined(files, file => file === file1 ? undefined : file.path));
checkWatchedDirectories(host, [], /*recursive*/ false);
checkWatchedDirectories(host, watchedRecursiveDirectories, /*recursive*/ true);
// On next file open the files file2a should be closed and not watched any more
projectService.openClientFile(file2.path);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
checkProjectActualFiles(project, mapDefined(files, file => file === file2a ? undefined : file.path));
checkWatchedFiles(host, [libFile.path, configFile.path]);
checkWatchedDirectories(host, [], /*recursive*/ false);
checkWatchedDirectories(host, watchedRecursiveDirectories, /*recursive*/ true);
});
});
describe("Proper errors", () => {

View File

@ -130,9 +130,9 @@ namespace ts.TestFSWithWatch {
}
export function checkFileNames(caption: string, actualFileNames: string[], expectedFileNames: string[]) {
assert.equal(actualFileNames.length, expectedFileNames.length, `${caption}: incorrect actual number of files, expected ${JSON.stringify(expectedFileNames)}, got ${actualFileNames}`);
assert.equal(actualFileNames.length, expectedFileNames.length, `${caption}: incorrect actual number of files, expected ${expectedFileNames}, got ${actualFileNames}`);
for (const f of expectedFileNames) {
assert.isTrue(contains(actualFileNames, f), `${caption}: expected to find ${f} in ${JSON.stringify(actualFileNames)}`);
assert.isTrue(contains(actualFileNames, f), `${caption}: expected to find ${f} in ${actualFileNames}`);
}
}