Skip to content

Commit 13aafa2

Browse files
committed
Update tests
1 parent 9e5e20c commit 13aafa2

File tree

2 files changed

+127
-25
lines changed

2 files changed

+127
-25
lines changed

src/harness/unittests/telemetry.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,24 @@ namespace ts.projectSystem {
1111
});
1212

1313
it("only sends an event once", () => {
14-
const file = makeFile("/a.ts");
15-
const tsconfig = makeFile("/tsconfig.json", {});
14+
const file = makeFile("/a/a.ts");
15+
const file2 = makeFile("/b.ts");
16+
const tsconfig = makeFile("/a/tsconfig.json", {});
1617

17-
const et = new EventTracker([file, tsconfig]);
18+
const et = new EventTracker([file, file2, tsconfig]);
1819
et.service.openClientFile(file.path);
19-
et.assertProjectInfoTelemetryEvent({});
20+
et.assertProjectInfoTelemetryEvent({}, tsconfig.path);
2021

2122
et.service.closeClientFile(file.path);
22-
checkNumberOfProjects(et.service, { configuredProjects: 0 });
23+
checkNumberOfProjects(et.service, { configuredProjects: 1 });
24+
25+
et.service.openClientFile(file2.path);
26+
checkNumberOfProjects(et.service, { inferredProjects: 1 });
27+
28+
assert.equal(et.getEvents().length, 0);
2329

2430
et.service.openClientFile(file.path);
25-
checkNumberOfProjects(et.service, { configuredProjects: 1 });
31+
checkNumberOfProjects(et.service, { configuredProjects: 1, inferredProjects: 1 });
2632

2733
assert.equal(et.getEvents().length, 0);
2834
});
@@ -249,9 +255,9 @@ namespace ts.projectSystem {
249255
return events;
250256
}
251257

252-
assertProjectInfoTelemetryEvent(partial: Partial<server.ProjectInfoTelemetryEventData>): void {
258+
assertProjectInfoTelemetryEvent(partial: Partial<server.ProjectInfoTelemetryEventData>, configFile?: string): void {
253259
assert.deepEqual(this.getEvent<server.ProjectInfoTelemetryEvent>(ts.server.ProjectInfoTelemetryEvent), {
254-
projectId: Harness.mockHash("/tsconfig.json"),
260+
projectId: Harness.mockHash(configFile || "/tsconfig.json"),
255261
fileStats: fileStats({ ts: 1 }),
256262
compilerOptions: {},
257263
extends: false,

src/harness/unittests/tsserverProjectSystem.ts

Lines changed: 113 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,42 @@ namespace ts.projectSystem {
958958
checkProjectActualFiles(projectService.inferredProjects[0], [file2.path, file3.path, libFile.path]);
959959
});
960960

961-
it("should close configured project after closing last open file", () => {
961+
it("should resuse same project if file is opened from the configured project that has no open files", () => {
962+
const file1 = {
963+
path: "/a/b/main.ts",
964+
content: "let x =1;"
965+
};
966+
const file2 = {
967+
path: "/a/b/main2.ts",
968+
content: "let y =1;"
969+
};
970+
const configFile: FileOrFolder = {
971+
path: "/a/b/tsconfig.json",
972+
content: `{
973+
"compilerOptions": {
974+
"target": "es6"
975+
},
976+
"files": [ "main.ts", "main2.ts" ]
977+
}`
978+
};
979+
const host = createServerHost([file1, file2, configFile, libFile]);
980+
const projectService = createProjectService(host, { useSingleInferredProject: true });
981+
projectService.openClientFile(file1.path);
982+
checkNumberOfConfiguredProjects(projectService, 1);
983+
const project = projectService.configuredProjects.get(configFile.path);
984+
985+
projectService.closeClientFile(file1.path);
986+
checkNumberOfConfiguredProjects(projectService, 1);
987+
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
988+
assert.equal(project.openRefCount, 0);
989+
990+
projectService.openClientFile(file2.path);
991+
checkNumberOfConfiguredProjects(projectService, 1);
992+
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
993+
assert.equal(project.openRefCount, 1);
994+
});
995+
996+
it("should not close configured project after closing last open file, but should be closed on next file open if its not the file from same project", () => {
962997
const file1 = {
963998
path: "/a/b/main.ts",
964999
content: "let x =1;"
@@ -976,8 +1011,14 @@ namespace ts.projectSystem {
9761011
const projectService = createProjectService(host, { useSingleInferredProject: true });
9771012
projectService.openClientFile(file1.path);
9781013
checkNumberOfConfiguredProjects(projectService, 1);
1014+
const project = projectService.configuredProjects.get(configFile.path);
9791015

9801016
projectService.closeClientFile(file1.path);
1017+
checkNumberOfConfiguredProjects(projectService, 1);
1018+
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
1019+
assert.equal(project.openRefCount, 0);
1020+
1021+
projectService.openClientFile(libFile.path);
9811022
checkNumberOfConfiguredProjects(projectService, 0);
9821023
});
9831024

@@ -1058,23 +1099,43 @@ namespace ts.projectSystem {
10581099
});
10591100

10601101
checkNumberOfProjects(projectService, { configuredProjects: 2 });
1102+
const proj1 = projectService.configuredProjects.get(config1.path);
1103+
const proj2 = projectService.configuredProjects.get(config2.path);
1104+
assert.isDefined(proj1);
1105+
assert.isDefined(proj2);
10611106

10621107
// open client file - should not lead to creation of inferred project
10631108
projectService.openClientFile(file1.path, file1.content);
10641109
checkNumberOfProjects(projectService, { configuredProjects: 2 });
1110+
assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1111+
assert.strictEqual(projectService.configuredProjects.get(config2.path), proj2);
10651112

10661113
projectService.openClientFile(file3.path, file3.content);
10671114
checkNumberOfProjects(projectService, { configuredProjects: 2, inferredProjects: 1 });
1115+
assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1116+
assert.strictEqual(projectService.configuredProjects.get(config2.path), proj2);
10681117

10691118
projectService.closeExternalProject(externalProjectName);
10701119
// open file 'file1' from configured project keeps project alive
10711120
checkNumberOfProjects(projectService, { configuredProjects: 1, inferredProjects: 1 });
1121+
assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1122+
assert.isUndefined(projectService.configuredProjects.get(config2.path));
10721123

10731124
projectService.closeClientFile(file3.path);
10741125
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1126+
assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1127+
assert.isUndefined(projectService.configuredProjects.get(config2.path));
10751128

10761129
projectService.closeClientFile(file1.path);
1077-
checkNumberOfProjects(projectService, {});
1130+
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1131+
assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1132+
assert.isUndefined(projectService.configuredProjects.get(config2.path));
1133+
1134+
projectService.openClientFile(file2.path, file2.content);
1135+
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1136+
assert.isUndefined(projectService.configuredProjects.get(config1.path));
1137+
assert.isDefined(projectService.configuredProjects.get(config2.path));
1138+
10781139
});
10791140

10801141
it("reload regular file after closing", () => {
@@ -1177,16 +1238,21 @@ namespace ts.projectSystem {
11771238
path: "/a/b/f1.ts",
11781239
content: "let x = 1"
11791240
};
1241+
const file2 = {
1242+
path: "/a/f2.ts",
1243+
content: "let x = 1"
1244+
};
11801245
const configFile = {
11811246
path: "/a/b/tsconfig.json",
11821247
content: JSON.stringify({ compilerOptions: {} })
11831248
};
11841249
const externalProjectName = "externalproject";
1185-
const host = createServerHost([file1, configFile]);
1250+
const host = createServerHost([file1, file2, libFile, configFile]);
11861251
const projectService = createProjectService(host);
11871252

11881253
projectService.openClientFile(file1.path);
11891254
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1255+
const project = projectService.configuredProjects.get(configFile.path);
11901256

11911257
projectService.openExternalProject({
11921258
rootFiles: toExternalFiles([configFile.path]),
@@ -1195,13 +1261,20 @@ namespace ts.projectSystem {
11951261
});
11961262

11971263
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1264+
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
11981265

11991266
projectService.closeExternalProject(externalProjectName);
12001267
// configured project is alive since file is still open
12011268
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1269+
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
12021270

12031271
projectService.closeClientFile(file1.path);
1204-
checkNumberOfProjects(projectService, {});
1272+
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1273+
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
1274+
1275+
projectService.openClientFile(file2.path);
1276+
checkNumberOfProjects(projectService, { inferredProjects: 1 });
1277+
assert.isUndefined(projectService.configuredProjects.get(configFile.path));
12051278
});
12061279

12071280
it("changes in closed files are reflected in project structure", () => {
@@ -1607,11 +1680,12 @@ namespace ts.projectSystem {
16071680
projectService.checkNumberOfProjects({ configuredProjects: 1 });
16081681
checkProjectActualFiles(configuredProjectAt(projectService, 0), [f1.path, config.path]);
16091682

1683+
// Should close configured project with next file open
16101684
projectService.closeClientFile(f1.path);
16111685

16121686
projectService.openClientFile(f2.path);
1613-
projectService.checkNumberOfProjects({ configuredProjects: 1, inferredProjects: 1 });
1614-
checkProjectActualFiles(configuredProjectAt(projectService, 0), [f1.path, config.path]);
1687+
projectService.checkNumberOfProjects({ inferredProjects: 1 });
1688+
assert.isUndefined(projectService.configuredProjects.get(config.path));
16151689
checkProjectActualFiles(projectService.inferredProjects[0], [f2.path]);
16161690
});
16171691

@@ -1910,15 +1984,16 @@ namespace ts.projectSystem {
19101984

19111985
projectService.openClientFile(file2.path);
19121986
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1913-
const project1 = configuredProjectAt(projectService, 0);
1987+
const project1 = projectService.configuredProjects.get(tsconfig1.path);
19141988
assert.equal(project1.openRefCount, 1, "Open ref count in project1 - 1");
19151989
assert.equal(project1.getScriptInfo(file2.path).containingProjects.length, 1, "containing projects count");
19161990

19171991
projectService.openClientFile(file1.path);
19181992
checkNumberOfProjects(projectService, { configuredProjects: 2 });
19191993
assert.equal(project1.openRefCount, 2, "Open ref count in project1 - 2");
1994+
assert.strictEqual(projectService.configuredProjects.get(tsconfig1.path), project1);
19201995

1921-
const project2 = configuredProjectAt(projectService, 1);
1996+
const project2 = projectService.configuredProjects.get(tsconfig2.path);
19221997
assert.equal(project2.openRefCount, 1, "Open ref count in project2 - 2");
19231998

19241999
assert.equal(project1.getScriptInfo(file1.path).containingProjects.length, 2, `${file1.path} containing projects count`);
@@ -1928,9 +2003,21 @@ namespace ts.projectSystem {
19282003
checkNumberOfProjects(projectService, { configuredProjects: 2 });
19292004
assert.equal(project1.openRefCount, 1, "Open ref count in project1 - 3");
19302005
assert.equal(project2.openRefCount, 1, "Open ref count in project2 - 3");
2006+
assert.strictEqual(projectService.configuredProjects.get(tsconfig1.path), project1);
2007+
assert.strictEqual(projectService.configuredProjects.get(tsconfig2.path), project2);
19312008

19322009
projectService.closeClientFile(file1.path);
1933-
checkNumberOfProjects(projectService, { configuredProjects: 0 });
2010+
checkNumberOfProjects(projectService, { configuredProjects: 2 });
2011+
assert.equal(project1.openRefCount, 0, "Open ref count in project1 - 4");
2012+
assert.equal(project2.openRefCount, 0, "Open ref count in project2 - 4");
2013+
assert.strictEqual(projectService.configuredProjects.get(tsconfig1.path), project1);
2014+
assert.strictEqual(projectService.configuredProjects.get(tsconfig2.path), project2);
2015+
2016+
projectService.openClientFile(file2.path);
2017+
checkNumberOfProjects(projectService, { configuredProjects: 1 });
2018+
assert.strictEqual(projectService.configuredProjects.get(tsconfig1.path), project1);
2019+
assert.isUndefined(projectService.configuredProjects.get(tsconfig2.path));
2020+
assert.equal(project1.openRefCount, 1, "Open ref count in project1 - 5");
19342021
});
19352022

19362023
it("language service disabled state is updated in external projects", () => {
@@ -2000,14 +2087,18 @@ namespace ts.projectSystem {
20002087
const projectService = createProjectService(host);
20012088
projectService.openClientFile(f1.path);
20022089
projectService.checkNumberOfProjects({ configuredProjects: 1 });
2090+
const project = projectService.configuredProjects.get(config.path);
20032091

20042092
projectService.closeClientFile(f1.path);
2005-
projectService.checkNumberOfProjects({});
2093+
projectService.checkNumberOfProjects({ configuredProjects: 1 });
2094+
assert.strictEqual(projectService.configuredProjects.get(config.path), project);
2095+
assert.equal(project.openRefCount, 0);
20062096

20072097
for (const f of [f1, f2, f3]) {
20082098
// There shouldnt be any script info as we closed the file that resulted in creation of it
20092099
const scriptInfo = projectService.getScriptInfoForNormalizedPath(server.toNormalizedPath(f.path));
2010-
assert.equal(scriptInfo.containingProjects.length, 0, `expect 0 containing projects for '${f.path}'`);
2100+
assert.equal(scriptInfo.containingProjects.length, 1, `expect 1 containing projects for '${f.path}'`);
2101+
assert.equal(scriptInfo.containingProjects[0], project, `expect configured project to be the only containing project for '${f.path}'`);
20112102
}
20122103
});
20132104

@@ -2551,12 +2642,18 @@ namespace ts.projectSystem {
25512642
const projectService = createProjectService(host);
25522643
projectService.openClientFile(f.path);
25532644
projectService.checkNumberOfProjects({ configuredProjects: 1 });
2645+
const project = projectService.configuredProjects.get(config.path);
2646+
assert.equal(project.openRefCount, 1);
25542647

25552648
projectService.closeClientFile(f.path);
2556-
projectService.checkNumberOfProjects({ configuredProjects: 0 });
2649+
projectService.checkNumberOfProjects({ configuredProjects: 1 });
2650+
assert.strictEqual(projectService.configuredProjects.get(config.path), project);
2651+
assert.equal(project.openRefCount, 0);
25572652

25582653
projectService.openClientFile(f.path);
25592654
projectService.checkNumberOfProjects({ configuredProjects: 1 });
2655+
assert.strictEqual(projectService.configuredProjects.get(config.path), project);
2656+
assert.equal(project.openRefCount, 1);
25602657
});
25612658
});
25622659

@@ -3237,12 +3334,10 @@ namespace ts.projectSystem {
32373334
const projectService = createProjectService(host);
32383335
projectService.openClientFile(file1.path);
32393336
host.runQueuedTimeoutCallbacks();
3240-
checkNumberOfConfiguredProjects(projectService, 1);
3337+
// Since there is no file open from configFile it would be closed
3338+
checkNumberOfConfiguredProjects(projectService, 0);
32413339
checkNumberOfInferredProjects(projectService, 1);
32423340

3243-
const configuredProject = configuredProjectAt(projectService, 0);
3244-
checkProjectActualFiles(configuredProject, [configFile.path]);
3245-
32463341
const inferredProject = projectService.inferredProjects[0];
32473342
assert.isTrue(inferredProject.containsFile(<server.NormalizedPath>file1.path));
32483343
});
@@ -3271,7 +3366,8 @@ namespace ts.projectSystem {
32713366
const projectService = createProjectService(host);
32723367

32733368
projectService.openClientFile(f.path);
3274-
projectService.checkNumberOfProjects({ configuredProjects: 1, inferredProjects: 1 });
3369+
// Since no file from the configured project is open, it would be closed immediately
3370+
projectService.checkNumberOfProjects({ configuredProjects: 0, inferredProjects: 1 });
32753371
});
32763372
});
32773373

0 commit comments

Comments
 (0)