Skip to content

Commit f4954d0

Browse files
committed
Test case for watching using fs.watch recursively
1 parent ab17600 commit f4954d0

2 files changed

Lines changed: 70 additions & 43 deletions

File tree

src/harness/unittests/tscWatchMode.ts

Lines changed: 51 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2176,49 +2176,64 @@ declare module "fs" {
21762176
}
21772177
});
21782178

2179-
it("watchingDirectories with watchFile", () => {
2180-
const projectFolder = "/a/username/project";
2181-
const projectSrcFolder = `${projectFolder}/src`;
2182-
const configFile: FileOrFolder = {
2183-
path: `${projectFolder}/tsconfig.json`,
2184-
content: "{}"
2185-
};
2186-
const file: FileOrFolder = {
2187-
path: `${projectSrcFolder}/file1.ts`,
2188-
content: ""
2189-
};
2190-
const programFiles = [file, libFile];
2191-
const files = [file, configFile, libFile];
2192-
const environmentVariables = createMap<string>();
2193-
environmentVariables.set("TSC_WATCHDIRECTORY", "RecursiveDirectoryUsingFsWatchFile");
2194-
const host = createWatchedSystem(files, { environmentVariables });
2195-
const watch = createWatchModeWithConfigFile(configFile.path, host);
2196-
// Watching config file, file, lib file and directories
2197-
const expectedWatchedFiles = files.map(f => f.path).concat(projectFolder, projectSrcFolder, `${projectFolder}/node_modules/@types`);
2179+
describe("tsc-watch when watchDirectories implementation", () => {
2180+
function verifyRenamingFileInSubFolder(usesWatchFile: boolean) {
2181+
const projectFolder = "/a/username/project";
2182+
const projectSrcFolder = `${projectFolder}/src`;
2183+
const configFile: FileOrFolder = {
2184+
path: `${projectFolder}/tsconfig.json`,
2185+
content: "{}"
2186+
};
2187+
const file: FileOrFolder = {
2188+
path: `${projectSrcFolder}/file1.ts`,
2189+
content: ""
2190+
};
2191+
const programFiles = [file, libFile];
2192+
const files = [file, configFile, libFile];
2193+
const environmentVariables = createMap<string>();
2194+
environmentVariables.set("TSC_WATCHDIRECTORY", usesWatchFile ? "RecursiveDirectoryUsingFsWatchFile" : "RecursiveDirectoryUsingNonRecursiveWatchDirectory");
2195+
const host = createWatchedSystem(files, { environmentVariables });
2196+
const watch = createWatchModeWithConfigFile(configFile.path, host);
2197+
const projectFolders = [projectFolder, projectSrcFolder, `${projectFolder}/node_modules/@types`];
2198+
// Watching files config file, file, lib file
2199+
const expectedWatchedFiles = files.map(f => f.path);
2200+
const expectedWatchedDirectories = usesWatchFile ? [] : projectFolders;
2201+
if (usesWatchFile) {
2202+
expectedWatchedFiles.push(...projectFolders);
2203+
}
21982204

2199-
verifyProgram(checkOutputErrorsInitial);
2205+
verifyProgram(checkOutputErrorsInitial);
22002206

2201-
// Rename the file:
2202-
file.path = file.path.replace("file1.ts", "file2.ts");
2203-
expectedWatchedFiles[0] = file.path;
2204-
host.reloadFS(files);
2205-
host.runQueuedTimeoutCallbacks();
2206-
verifyProgram(checkOutputErrorsIncremental);
2207+
// Rename the file:
2208+
file.path = file.path.replace("file1.ts", "file2.ts");
2209+
expectedWatchedFiles[0] = file.path;
2210+
host.reloadFS(files);
2211+
host.runQueuedTimeoutCallbacks();
2212+
verifyProgram(checkOutputErrorsIncremental);
22072213

2208-
function verifyProgram(checkOutputErrors: (host: WatchedSystem, errors: ReadonlyArray<Diagnostic>) => void) {
2209-
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
2210-
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
2214+
function verifyProgram(checkOutputErrors: (host: WatchedSystem, errors: ReadonlyArray<Diagnostic>) => void) {
2215+
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
22112216

2212-
// Watching config file, file, lib file and directories
2213-
ts.TestFSWithWatch.checkMultiMapEachKeyWithCount("watchedFiles", host.watchedFiles, expectedWatchedFiles, 1);
2217+
// Watching config file, file, lib file and directories
2218+
ts.TestFSWithWatch.checkMultiMapEachKeyWithCount("watchedFiles", host.watchedFiles, expectedWatchedFiles, 1);
2219+
ts.TestFSWithWatch.checkMultiMapEachKeyWithCount("watchedDirectories", host.watchedDirectories, expectedWatchedDirectories, 1);
22142220

2215-
checkProgramActualFiles(watch(), programFiles.map(f => f.path));
2216-
checkOutputErrors(host, emptyArray);
2221+
checkProgramActualFiles(watch(), programFiles.map(f => f.path));
2222+
checkOutputErrors(host, emptyArray);
22172223

2218-
const outputFile = changeExtension(file.path, ".js");
2219-
assert(host.fileExists(outputFile));
2220-
assert.equal(host.readFile(outputFile), file.content);
2224+
const outputFile = changeExtension(file.path, ".js");
2225+
assert(host.fileExists(outputFile));
2226+
assert.equal(host.readFile(outputFile), file.content);
2227+
}
22212228
}
2229+
2230+
it("uses watchFile when renaming file in subfolder", () => {
2231+
verifyRenamingFileInSubFolder(/*usesWatchFile*/ true);
2232+
});
2233+
2234+
it("uses non recursive watchDirectory when renaming file in subfolder", () => {
2235+
verifyRenamingFileInSubFolder(/*usesWatchFile*/ false);
2236+
});
22222237
});
22232238
});
22242239
}

src/harness/unittests/tsserverProjectSystem.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6580,8 +6580,8 @@ namespace ts.projectSystem {
65806580
});
65816581
});
65826582

6583-
describe("WatchingDirectories with polling", () => {
6584-
it("when file is added to subfolder, completion list has new file", () => {
6583+
describe("watchDirectories implementation", () => {
6584+
function verifyCompletionListWithNewFileInSubFolder(usesWatchFile: boolean) {
65856585
const projectFolder = "/a/username/project";
65866586
const projectSrcFolder = `${projectFolder}/src`;
65876587
const configFile: FileOrFolder = {
@@ -6600,15 +6600,19 @@ namespace ts.projectSystem {
66006600
const files = [index, file1, configFile, libFile];
66016601
const fileNames = files.map(file => file.path);
66026602
// All closed files(files other than index), project folder, project/src folder and project/node_modules/@types folder
6603-
const expectedWatchedFiles = arrayToMap(fileNames.slice(1).concat(`${projectFolder}/${nodeModulesAtTypes}`), s => s, () => 1);
6603+
const expectedWatchedFiles = arrayToMap(fileNames.slice(1), s => s, () => 1);
6604+
const expectedWatchedDirectories = createMap<number>();
6605+
const mapOfDirectories = usesWatchFile ? expectedWatchedFiles : expectedWatchedDirectories;
66046606
// For failed resolution lookup and tsconfig files
6605-
expectedWatchedFiles.set(projectFolder, 2);
6607+
mapOfDirectories.set(projectFolder, 2);
66066608
// Through above recursive watches
6607-
expectedWatchedFiles.set(projectSrcFolder, 2);
6609+
mapOfDirectories.set(projectSrcFolder, 2);
6610+
// node_modules/@types folder
6611+
mapOfDirectories.set(`${projectFolder}/${nodeModulesAtTypes}`, 1);
66086612
const expectedCompletions = ["file1"];
66096613
const completionPosition = index.content.lastIndexOf('"');
66106614
const environmentVariables = createMap<string>();
6611-
environmentVariables.set("TSC_WATCHDIRECTORY", "RecursiveDirectoryUsingFsWatchFile");
6615+
environmentVariables.set("TSC_WATCHDIRECTORY", usesWatchFile ? "RecursiveDirectoryUsingFsWatchFile" : "RecursiveDirectoryUsingNonRecursiveWatchDirectory");
66126616
const host = createServerHost(files, { environmentVariables });
66136617
const projectService = createProjectService(host);
66146618
projectService.openClientFile(index.path);
@@ -6632,15 +6636,23 @@ namespace ts.projectSystem {
66326636
verifyProjectAndCompletions();
66336637

66346638
function verifyProjectAndCompletions() {
6635-
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
66366639
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
66376640

66386641
ts.TestFSWithWatch.checkMultiMapKeyCount("watchedFiles", host.watchedFiles, expectedWatchedFiles);
6642+
ts.TestFSWithWatch.checkMultiMapKeyCount("watchedDirectories", host.watchedDirectories, expectedWatchedDirectories);
66396643
checkProjectActualFiles(project, fileNames);
66406644

66416645
const completions = project.getLanguageService().getCompletionsAtPosition(index.path, completionPosition, { includeExternalModuleExports: false, includeInsertTextCompletions: false });
66426646
checkArray("Completion Entries", completions.entries.map(e => e.name), expectedCompletions);
66436647
}
6648+
}
6649+
6650+
it("uses watchFile when file is added to subfolder, completion list has new file", () => {
6651+
verifyCompletionListWithNewFileInSubFolder(/*usesWatchFile*/ true);
6652+
});
6653+
6654+
it("uses non recursive watchDirectory when file is added to subfolder, completion list has new file", () => {
6655+
verifyCompletionListWithNewFileInSubFolder(/*usesWatchFile*/ false);
66446656
});
66456657
});
66466658
}

0 commit comments

Comments
 (0)