Skip to content

Commit 3d3977f

Browse files
committed
Migrate compileOnSave tests to vfs
1 parent 4fbc74e commit 3d3977f

File tree

3 files changed

+155
-61
lines changed

3 files changed

+155
-61
lines changed

src/harness/mocks.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/// <reference path="./core.ts" />
2-
/// <reference path="./vfs.ts" />
2+
/// <reference path="./vfs.ts" />import { debug } from "util";
3+
4+
35

46
// NOTE: The contents of this file are all exported from the namespace 'mocks'. This is to
57
// support the eventual conversion of harness into a modular system.
@@ -298,7 +300,6 @@ namespace mocks {
298300
return undefined;
299301
}
300302

301-
// TOOD: record and invoke callbacks to simulate timer events
302303
public setTimeout(callback: (...args: any[]) => void, timeout: number, ...args: any[]) {
303304
return this.timers.setTimeout(callback, timeout, ...args);
304305
}

src/harness/unittests/compileOnSave.ts

+115-28
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/// <reference path="../harness.ts" />
22
/// <reference path="./tsserverProjectSystem.ts" />
33
/// <reference path="../../server/typingsInstaller/typingsInstaller.ts" />
4+
/// <reference path="../mocks.ts" />
45

56
namespace ts.projectSystem {
67
import CommandNames = server.CommandNames;
@@ -58,6 +59,24 @@ namespace ts.projectSystem {
5859
// A compile on save affected file request using file1
5960
let moduleFile1FileListRequest: server.protocol.Request;
6061

62+
let sharedFs: vfs.VirtualFileSystem;
63+
before(() => {
64+
const fs = new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true);
65+
fs.addFile("/a/b/moduleFile1.ts", `export function Foo() { };`);
66+
fs.addFile("/a/b/file1Consumer1.ts", `import {Foo} from "./moduleFile1"; export var y = 10;`);
67+
fs.addFile("/a/b/file1Consumer2.ts", `import {Foo} from "./moduleFile1"; let z = 10;`);
68+
fs.addFile("/a/b/globalFile3.ts", `interface GlobalFoo { age: number }`);
69+
fs.addFile("/a/b/moduleFile2.ts", `export var Foo4 = 10;`);
70+
fs.addFile("/a/b/tsconfig.json", `{ compileOnSave": true }`);
71+
fs.addFile(libFile.path, libFile.content);
72+
fs.makeReadOnly();
73+
sharedFs = fs;
74+
});
75+
76+
after(() => {
77+
sharedFs = undefined;
78+
});
79+
6180
beforeEach(() => {
6281
moduleFile1 = {
6382
path: "/a/b/moduleFile1.ts",
@@ -115,7 +134,7 @@ namespace ts.projectSystem {
115134
});
116135

117136
it("should contains only itself if a module file's shape didn't change, and all files referencing it if its shape changed", () => {
118-
const host = createServerHost([moduleFile1, file1Consumer1, file1Consumer2, globalFile3, moduleFile2, configFile, libFile]);
137+
const host = new mocks.MockServerHost(sharedFs.shadow());
119138
const typingsInstaller = createTestTypingsInstaller(host);
120139
const session = createSession(host, typingsInstaller);
121140

@@ -140,7 +159,7 @@ namespace ts.projectSystem {
140159
});
141160

142161
it("should be up-to-date with the reference map changes", () => {
143-
const host = createServerHost([moduleFile1, file1Consumer1, file1Consumer2, globalFile3, moduleFile2, configFile, libFile]);
162+
const host = new mocks.MockServerHost(sharedFs.shadow());
144163
const typingsInstaller = createTestTypingsInstaller(host);
145164
const session = createSession(host, typingsInstaller);
146165

@@ -187,7 +206,7 @@ namespace ts.projectSystem {
187206
});
188207

189208
it("should be up-to-date with changes made in non-open files", () => {
190-
const host = createServerHost([moduleFile1, file1Consumer1, file1Consumer2, globalFile3, moduleFile2, configFile, libFile]);
209+
const host = new mocks.MockServerHost(sharedFs.shadow());
191210
const typingsInstaller = createTestTypingsInstaller(host);
192211
const session = createSession(host, typingsInstaller);
193212

@@ -196,29 +215,28 @@ namespace ts.projectSystem {
196215
// Send an initial compileOnSave request
197216
sendAffectedFileRequestAndCheckResult(session, moduleFile1FileListRequest, [{ projectFileName: configFile.path, files: [moduleFile1, file1Consumer1, file1Consumer2] }]);
198217

199-
file1Consumer1.content = `let y = 10;`;
200-
host.reloadFS([moduleFile1, file1Consumer1, file1Consumer2, configFile, libFile]);
201-
218+
host.vfs.writeFile(file1Consumer1.path, `let y = 10;`);
202219
session.executeCommand(changeModuleFile1ShapeRequest1);
203220
sendAffectedFileRequestAndCheckResult(session, moduleFile1FileListRequest, [{ projectFileName: configFile.path, files: [moduleFile1, file1Consumer2] }]);
204221
});
205222

206223
it("should be up-to-date with deleted files", () => {
207-
const host = createServerHost([moduleFile1, file1Consumer1, file1Consumer2, globalFile3, moduleFile2, configFile, libFile]);
224+
const host = new mocks.MockServerHost(sharedFs.shadow());
208225
const typingsInstaller = createTestTypingsInstaller(host);
209226
const session = createSession(host, typingsInstaller);
210227

211228
openFilesForSession([moduleFile1], session);
212229
sendAffectedFileRequestAndCheckResult(session, moduleFile1FileListRequest, [{ projectFileName: configFile.path, files: [moduleFile1, file1Consumer1, file1Consumer2] }]);
213230

214231
session.executeCommand(changeModuleFile1ShapeRequest1);
215-
// Delete file1Consumer2
216-
host.reloadFS([moduleFile1, file1Consumer1, configFile, libFile]);
232+
233+
host.vfs.removeFile(file1Consumer2.path);
234+
217235
sendAffectedFileRequestAndCheckResult(session, moduleFile1FileListRequest, [{ projectFileName: configFile.path, files: [moduleFile1, file1Consumer1] }]);
218236
});
219237

220238
it("should be up-to-date with newly created files", () => {
221-
const host = createServerHost([moduleFile1, file1Consumer1, file1Consumer2, globalFile3, moduleFile2, configFile, libFile]);
239+
const host = new mocks.MockServerHost(sharedFs.shadow());
222240
const typingsInstaller = createTestTypingsInstaller(host);
223241
const session = createSession(host, typingsInstaller);
224242

@@ -229,8 +247,7 @@ namespace ts.projectSystem {
229247
path: "/a/b/file1Consumer3.ts",
230248
content: `import {Foo} from "./moduleFile1"; let y = Foo();`
231249
};
232-
host.reloadFS([moduleFile1, file1Consumer1, file1Consumer2, file1Consumer3, globalFile3, configFile, libFile]);
233-
host.runQueuedTimeoutCallbacks();
250+
host.vfs.writeFile(file1Consumer3.path, file1Consumer3.content);
234251
session.executeCommand(changeModuleFile1ShapeRequest1);
235252
sendAffectedFileRequestAndCheckResult(session, moduleFile1FileListRequest, [{ projectFileName: configFile.path, files: [moduleFile1, file1Consumer1, file1Consumer2, file1Consumer3] }]);
236253
});
@@ -254,7 +271,12 @@ namespace ts.projectSystem {
254271
}`
255272
};
256273

257-
const host = createServerHost([moduleFile1, file1Consumer1, configFile, libFile]);
274+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
275+
host.vfs.addFile(moduleFile1.path, moduleFile1.content);
276+
host.vfs.addFile(file1Consumer1.path, file1Consumer1.content);
277+
host.vfs.addFile(configFile.path, configFile.content);
278+
host.vfs.addFile(libFile.path, libFile.content);
279+
258280
const typingsInstaller = createTestTypingsInstaller(host);
259281
const session = createSession(host, typingsInstaller);
260282

@@ -271,7 +293,7 @@ namespace ts.projectSystem {
271293
});
272294

273295
it("should return all files if a global file changed shape", () => {
274-
const host = createServerHost([moduleFile1, file1Consumer1, file1Consumer2, globalFile3, moduleFile2, configFile, libFile]);
296+
const host = new mocks.MockServerHost(sharedFs.shadow());
275297
const typingsInstaller = createTestTypingsInstaller(host);
276298
const session = createSession(host, typingsInstaller);
277299

@@ -297,7 +319,8 @@ namespace ts.projectSystem {
297319
content: `{}`
298320
};
299321

300-
const host = createServerHost([moduleFile1, file1Consumer1, file1Consumer2, configFile, libFile]);
322+
const host = new mocks.MockServerHost(sharedFs.shadow());
323+
host.vfs.writeFile(configFile.path, configFile.content);
301324
const typingsInstaller = createTestTypingsInstaller(host);
302325
const session = createSession(host, typingsInstaller);
303326
openFilesForSession([moduleFile1], session);
@@ -319,7 +342,10 @@ namespace ts.projectSystem {
319342
}`
320343
};
321344

322-
const host = createServerHost([moduleFile1, file1Consumer1, file1Consumer2, configFile2, configFile, libFile]);
345+
const host = new mocks.MockServerHost(sharedFs.shadow());
346+
host.vfs.writeFile(configFile.path, configFile.content);
347+
host.vfs.addFile(configFile2.path, configFile2.content);
348+
323349
const typingsInstaller = createTestTypingsInstaller(host);
324350
const session = createSession(host, typingsInstaller);
325351

@@ -338,7 +364,12 @@ namespace ts.projectSystem {
338364
}`
339365
};
340366

341-
const host = createServerHost([moduleFile1, file1Consumer1, configFile, libFile]);
367+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
368+
host.vfs.addFile(moduleFile1.path, moduleFile1.content);
369+
host.vfs.addFile(file1Consumer1.path, file1Consumer1.content);
370+
host.vfs.addFile(configFile.path, configFile.content);
371+
host.vfs.addFile(libFile.path, libFile.content);
372+
342373
const typingsInstaller = createTestTypingsInstaller(host);
343374
const session = createSession(host, typingsInstaller);
344375
openFilesForSession([moduleFile1], session);
@@ -367,7 +398,12 @@ namespace ts.projectSystem {
367398
}`
368399
};
369400

370-
const host = createServerHost([moduleFile1, file1Consumer1, configFile, libFile]);
401+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
402+
host.vfs.addFile(moduleFile1.path, moduleFile1.content);
403+
host.vfs.addFile(file1Consumer1.path, file1Consumer1.content);
404+
host.vfs.addFile(configFile.path, configFile.content);
405+
host.vfs.addFile(libFile.path, libFile.content);
406+
371407
const typingsInstaller = createTestTypingsInstaller(host);
372408
const session = createSession(host, typingsInstaller);
373409
openFilesForSession([moduleFile1], session);
@@ -389,7 +425,16 @@ namespace ts.projectSystem {
389425
path: "/a/b/file1Consumer1Consumer1.ts",
390426
content: `import {y} from "./file1Consumer1";`
391427
};
392-
const host = createServerHost([moduleFile1, file1Consumer1, file1Consumer1Consumer1, globalFile3, configFile, libFile]);
428+
429+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
430+
host.vfs.addFile(moduleFile1.path, moduleFile1.content);
431+
host.vfs.addFile(file1Consumer1.path, file1Consumer1.content);
432+
host.vfs.addFile(file1Consumer1Consumer1.path, file1Consumer1Consumer1.content);
433+
host.vfs.addFile(globalFile3.path, globalFile3.content);
434+
host.vfs.addFile(configFile.path, configFile.content);
435+
host.vfs.addFile(libFile.path, libFile.content);
436+
host.vfs.addFile(file1Consumer1Consumer1.path, file1Consumer1Consumer1.content);
437+
393438
const typingsInstaller = createTestTypingsInstaller(host);
394439
const session = createSession(host, typingsInstaller);
395440

@@ -422,7 +467,12 @@ namespace ts.projectSystem {
422467
/// <reference path="./file1.ts" />
423468
export var t2 = 10;`
424469
};
425-
const host = createServerHost([file1, file2, configFile]);
470+
471+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
472+
host.vfs.addFile(file1.path, file1.content);
473+
host.vfs.addFile(file2.path, file2.content);
474+
host.vfs.addFile(configFile.path, configFile.content);
475+
426476
const typingsInstaller = createTestTypingsInstaller(host);
427477
const session = createSession(host, typingsInstaller);
428478

@@ -438,7 +488,13 @@ namespace ts.projectSystem {
438488
const configFile1: FileOrFolder = { path: "/a/b/tsconfig.json", content: `{ "compileOnSave": true }` };
439489
const configFile2: FileOrFolder = { path: "/a/c/tsconfig.json", content: `{ "compileOnSave": true }` };
440490

441-
const host = createServerHost([file1, file2, file3, configFile1, configFile2]);
491+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
492+
host.vfs.addFile(file1.path, file1.content);
493+
host.vfs.addFile(file2.path, file2.content);
494+
host.vfs.addFile(file3.path, file3.content);
495+
host.vfs.addFile(configFile1.path, configFile1.content);
496+
host.vfs.addFile(configFile2.path, configFile2.content);
497+
442498
const session = createSession(host);
443499

444500
openFilesForSession([file1, file2, file3], session);
@@ -457,16 +513,23 @@ namespace ts.projectSystem {
457513
/// <reference path="./moduleFile1.ts" />
458514
export var x = Foo();`
459515
};
460-
const host = createServerHost([moduleFile1, referenceFile1, configFile]);
516+
517+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
518+
host.vfs.addFile(moduleFile1.path, moduleFile1.content);
519+
host.vfs.addFile(referenceFile1.path, referenceFile1.content);
520+
host.vfs.addFile(configFile.path, configFile.content);
521+
461522
const session = createSession(host);
462523

463524
openFilesForSession([referenceFile1], session);
464-
host.reloadFS([referenceFile1, configFile]);
525+
526+
host.vfs.removeFile(moduleFile1.path);
465527

466528
const request = makeSessionRequest<server.protocol.FileRequestArgs>(CommandNames.CompileOnSaveAffectedFileList, { file: referenceFile1.path });
467529
sendAffectedFileRequestAndCheckResult(session, request, [
468530
{ projectFileName: configFile.path, files: [referenceFile1] }
469531
]);
532+
470533
const requestForMissingFile = makeSessionRequest<server.protocol.FileRequestArgs>(CommandNames.CompileOnSaveAffectedFileList, { file: moduleFile1.path });
471534
sendAffectedFileRequestAndCheckResult(session, requestForMissingFile, []);
472535
});
@@ -478,10 +541,15 @@ namespace ts.projectSystem {
478541
/// <reference path="./moduleFile2.ts" />
479542
export var x = Foo();`
480543
};
481-
const host = createServerHost([referenceFile1, configFile]);
544+
545+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
546+
host.vfs.addFile(referenceFile1.path, referenceFile1.content);
547+
host.vfs.addFile(configFile.path, configFile.content);
548+
482549
const session = createSession(host);
483550

484551
openFilesForSession([referenceFile1], session);
552+
485553
const request = makeSessionRequest<server.protocol.FileRequestArgs>(CommandNames.CompileOnSaveAffectedFileList, { file: referenceFile1.path });
486554
sendAffectedFileRequestAndCheckResult(session, request, [
487555
{ projectFileName: configFile.path, files: [referenceFile1] }
@@ -502,7 +570,10 @@ namespace ts.projectSystem {
502570
path: path + ts.Extension.Ts,
503571
content: lines.join(newLine)
504572
};
505-
const host = createServerHost([f], { newLine });
573+
574+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true), /*executingFilePath*/ undefined, newLine);
575+
host.vfs.addFile(f.path, f.content);
576+
506577
const session = createSession(host);
507578
const openRequest: server.protocol.OpenRequest = {
508579
seq: 1,
@@ -536,7 +607,13 @@ namespace ts.projectSystem {
536607
path: "/a/b/tsconfig.json",
537608
content: `{}`
538609
};
539-
const host = createServerHost([file1, file2, configFile, libFile], { newLine: "\r\n" });
610+
611+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true), /*executingFilePath*/ undefined, "\r\n");
612+
host.vfs.addFile(file1.path, file1.content);
613+
host.vfs.addFile(file2.path, file2.content);
614+
host.vfs.addFile(configFile.path, configFile.content);
615+
host.vfs.addFile(libFile.path, libFile.content);
616+
540617
const typingsInstaller = createTestTypingsInstaller(host);
541618
const session = createSession(host, { typingsInstaller });
542619

@@ -564,7 +641,13 @@ namespace ts.projectSystem {
564641
content: "console.log('file3');"
565642
};
566643
const externalProjectName = "/a/b/externalproject";
567-
const host = createServerHost([file1, file2, file3, libFile]);
644+
645+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
646+
host.vfs.addFile(file1.path, file1.content);
647+
host.vfs.addFile(file2.path, file2.content);
648+
host.vfs.addFile(file3.path, file3.content);
649+
host.vfs.addFile(libFile.path, libFile.content);
650+
568651
const session = createSession(host);
569652
const projectService = session.getProjectService();
570653

@@ -596,7 +679,11 @@ namespace ts.projectSystem {
596679
content: "consonle.log('file1');"
597680
};
598681
const externalProjectName = "/root/TypeScriptProject3/TypeScriptProject3/TypeScriptProject3.csproj";
599-
const host = createServerHost([file1, libFile]);
682+
683+
const host = new mocks.MockServerHost(new vfs.VirtualFileSystem("/", /*useCaseSensitiveFileNames*/ true));
684+
host.vfs.addFile(file1.path, file1.content);
685+
host.vfs.addFile(libFile.path, libFile.content);
686+
600687
const session = createSession(host);
601688
const projectService = session.getProjectService();
602689

0 commit comments

Comments
 (0)