Skip to content

Commit 60ae299

Browse files
committed
Add test to verify when depedency and main project is open
1 parent d86aeb2 commit 60ae299

File tree

1 file changed

+106
-48
lines changed

1 file changed

+106
-48
lines changed

src/testRunner/unittests/tsserverProjectSystem.ts

Lines changed: 106 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -10758,33 +10758,34 @@ fn5();
1075810758
}]);
1075910759
}
1076010760

10761-
function verifyAllFnAction(action: (fn: number, session: TestSession) => void, session: TestSession) {
10762-
for (let fn = 1; fn <= 5; fn++) {
10763-
action(fn, session);
10764-
}
10765-
}
10766-
10761+
// Open File, expectedProjectActualFiles, action, openFileLastLine
10762+
type DocumentPositionMapperVerifier = [File, ReadonlyArray<string>, (fn: number, session: TestSession) => void, number];
1076710763
function verifyDocumentPositionMapperUpdates(
1076810764
mainScenario: string,
10769-
openFile: File,
10770-
expectedProjectActualFiles: ReadonlyArray<string>,
10771-
action: (fn: number, session: TestSession) => void,
10772-
closedInfos: ReadonlyArray<string>,
10773-
openFileLastLine: number) {
10774-
const configFile = `${getDirectoryPath(openFile.path)}/tsconfig.json`;
10775-
const openInfos = [openFile.path];
10776-
const otherWatchedFiles = [configFile];
10765+
verifier: ReadonlyArray<DocumentPositionMapperVerifier>,
10766+
closedInfos: ReadonlyArray<string>) {
10767+
10768+
const openFiles = verifier.map(v => v[0]);
10769+
const expectedProjectActualFiles = verifier.map(v => v[1]);
10770+
const actions = verifier.map(v => v[2]);
10771+
const openFileLastLines = verifier.map(v => v[3]);
10772+
10773+
const configFiles = openFiles.map(openFile => `${getDirectoryPath(openFile.path)}/tsconfig.json`);
10774+
const openInfos = openFiles.map(f => f.path);
10775+
const otherWatchedFiles = configFiles;
1077710776
function openTsFile() {
1077810777
const host = createHost(files, [mainConfig.path]);
1077910778
const session = createSession(host);
1078010779
const service = session.getProjectService();
10781-
openFilesForSession([openFile, randomFile], session);
10780+
openFilesForSession([...openFiles, randomFile], session);
1078210781
return { host, session, service };
1078310782
}
1078410783

1078510784
function checkProject(service: server.ProjectService) {
10786-
checkNumberOfProjects(service, { configuredProjects: 2 });
10787-
checkProjectActualFiles(service.configuredProjects.get(configFile)!, expectedProjectActualFiles);
10785+
checkNumberOfProjects(service, { configuredProjects: 1 + verifier.length });
10786+
configFiles.forEach((configFile, index) => {
10787+
checkProjectActualFiles(service.configuredProjects.get(configFile)!, expectedProjectActualFiles[index]);
10788+
});
1078810789
}
1078910790

1079010791
function verifyInfos(service: server.ProjectService, host: TestServerHost) {
@@ -10801,39 +10802,84 @@ fn5();
1080110802
}
1080210803
}
1080310804

10804-
function verifyScenarioWithChanges(
10805+
function verifyAllFnAction(
10806+
session: TestSession,
10807+
service: server.ProjectService,
10808+
host: TestServerHost,
10809+
firstDocumentPositionMapperNotEquals?: true,
10810+
dependencyMap?: server.ScriptInfo,
10811+
documentPositionMapper?: server.ScriptInfo["documentPositionMapper"]
10812+
) {
10813+
// action
10814+
let isFirst = true;
10815+
for (const action of actions) {
10816+
for (let fn = 1; fn <= 5; fn++) {
10817+
action(fn, session);
10818+
verifyInfos(service, host);
10819+
if (isFirst) {
10820+
isFirst = false;
10821+
if (dependencyMap) {
10822+
verifyDocumentPositionMapper(service, dependencyMap, documentPositionMapper, firstDocumentPositionMapperNotEquals);
10823+
documentPositionMapper = dependencyMap.documentPositionMapper;
10824+
}
10825+
else {
10826+
dependencyMap = service.filenameToScriptInfo.get(`${dependecyLocation}/fns.d.ts.map`)!;
10827+
documentPositionMapper = dependencyMap.documentPositionMapper;
10828+
}
10829+
}
10830+
else {
10831+
verifyDocumentPositionMapper(service, dependencyMap!, documentPositionMapper);
10832+
}
10833+
}
10834+
}
10835+
return { dependencyMap: dependencyMap!, documentPositionMapper };
10836+
}
10837+
10838+
function verifyScenarioWithChangesWorker(
1080510839
change: (host: TestServerHost, session: TestSession) => void,
10806-
afterActionDocumentPositionMapperNotEquals?: true
10840+
afterActionDocumentPositionMapperNotEquals: true | undefined,
10841+
timeoutBeforeAction: boolean
1080710842
) {
1080810843
const { host, session, service } = openTsFile();
1080910844

1081010845
// Create DocumentPositionMapper
10811-
action(1, session);
10846+
actions.forEach(action => action(1, session));
1081210847
const dependencyMap = service.filenameToScriptInfo.get(`${dependecyLocation}/fns.d.ts.map`)!;
1081310848
const documentPositionMapper = dependencyMap.documentPositionMapper;
1081410849

1081510850
// change
1081610851
change(host, session);
10817-
host.runQueuedTimeoutCallbacks();
10818-
checkProject(service);
10819-
verifyDocumentPositionMapper(service, dependencyMap, documentPositionMapper);
10852+
if (timeoutBeforeAction) {
10853+
host.runQueuedTimeoutCallbacks();
10854+
checkProject(service);
10855+
verifyDocumentPositionMapper(service, dependencyMap, documentPositionMapper);
10856+
}
1082010857

1082110858
// action
10822-
verifyAllFnAction(action, session);
10823-
verifyInfos(service, host);
10824-
verifyDocumentPositionMapper(service, dependencyMap, documentPositionMapper, afterActionDocumentPositionMapperNotEquals);
10859+
verifyAllFnAction(session, service, host, afterActionDocumentPositionMapperNotEquals, dependencyMap, documentPositionMapper);
10860+
}
10861+
10862+
function verifyScenarioWithChanges(
10863+
change: (host: TestServerHost, session: TestSession) => void,
10864+
afterActionDocumentPositionMapperNotEquals?: true
10865+
) {
10866+
it("when timeout occurs before request", () => {
10867+
verifyScenarioWithChangesWorker(change, afterActionDocumentPositionMapperNotEquals, /*timeoutBeforeAction*/ true);
10868+
});
10869+
10870+
it("when timeout does not occur before request", () => {
10871+
verifyScenarioWithChangesWorker(change, afterActionDocumentPositionMapperNotEquals, /*timeoutBeforeAction*/ false);
10872+
});
1082510873
}
1082610874

1082710875
it(mainScenario, () => {
1082810876
const { host, session, service } = openTsFile();
1082910877
checkProject(service);
1083010878

1083110879
// Main scenario action
10832-
verifyAllFnAction(action, session);
10880+
const { dependencyMap, documentPositionMapper } = verifyAllFnAction(session, service, host);
1083310881
checkProject(service);
1083410882
verifyInfos(service, host);
10835-
const dependencyMap = service.filenameToScriptInfo.get(`${dependecyLocation}/fns.d.ts.map`)!;
10836-
const documentPositionMapper = dependencyMap.documentPositionMapper;
1083710883

1083810884
// Collecting at this point retains dependency.d.ts and map
1083910885
closeFilesForSession([randomFile], session);
@@ -10842,20 +10888,20 @@ fn5();
1084210888
verifyDocumentPositionMapper(service, dependencyMap, documentPositionMapper);
1084310889

1084410890
// Closing open file, removes dependencies too
10845-
closeFilesForSession([openFile, randomFile], session);
10891+
closeFilesForSession([...openFiles, randomFile], session);
1084610892
openFilesForSession([randomFile], session);
1084710893
verifyOnlyRandomInfos(service, host);
1084810894
});
1084910895

10850-
it("when usage file changes, document position mapper doesnt change", () => {
10896+
describe("when usage file changes, document position mapper doesnt change", () => {
1085110897
// Edit
10852-
verifyScenarioWithChanges((_host, session) => session.executeCommandSeq<protocol.ChangeRequest>({
10898+
verifyScenarioWithChanges((_host, session) => openFiles.forEach((openFile, index) => session.executeCommandSeq<protocol.ChangeRequest>({
1085310899
command: protocol.CommandTypes.Change,
10854-
arguments: { file: openFile.path, line: openFileLastLine, offset: 1, endLine: openFileLastLine, endOffset: 1, insertString: "const x = 10;" }
10855-
}));
10900+
arguments: { file: openFile.path, line: openFileLastLines[index], offset: 1, endLine: openFileLastLines[index], endOffset: 1, insertString: "const x = 10;" }
10901+
})));
1085610902
});
1085710903

10858-
it("when dependency file changes, document position mapper doesnt change", () => {
10904+
describe("when dependency file changes, document position mapper doesnt change", () => {
1085910905
// Edit dts to add new fn
1086010906
verifyScenarioWithChanges(host => host.writeFile(
1086110907
`${dependecyLocation}/fns.d.ts`,
@@ -10867,7 +10913,7 @@ fn5();
1086710913
));
1086810914
});
1086910915

10870-
it("when dependency file's map changes", () => {
10916+
describe("when dependency file's map changes", () => {
1087110917
// Edit map file to represent added new line
1087210918
verifyScenarioWithChanges(host => host.writeFile(
1087310919
`${dependecyLocation}/FnS.d.ts.map`,
@@ -10876,32 +10922,44 @@ fn5();
1087610922
});
1087710923
}
1087810924

10925+
const usageVerifier: DocumentPositionMapperVerifier = [
10926+
/*openFile*/ mainTs,
10927+
/*expectedProjectActualFiles*/[mainTs.path, libFile.path, mainConfig.path, `${dependecyLocation}/fns.d.ts`],
10928+
/*action*/ verifyGotoDefintinionFromMainTs,
10929+
/*openFileLastLine*/ 10
10930+
];
1087910931
describe("from project that uses dependency", () => {
1088010932
const closedInfos = [dependencyTs.path, dependencyConfig.path, libFile.path, `${dependecyLocation}/fns.d.ts`, `${dependecyLocation}/FnS.d.ts.map`];
1088110933
verifyDocumentPositionMapperUpdates(
1088210934
"can go to definition correctly",
10883-
/*openFile*/ mainTs,
10884-
/*expectedProjectActualFiles*/ [mainTs.path, libFile.path, mainConfig.path, `${dependecyLocation}/fns.d.ts`],
10885-
/*action*/ verifyGotoDefintinionFromMainTs,
10886-
closedInfos,
10887-
/*openFileLastLine*/ 10
10935+
[usageVerifier],
10936+
closedInfos
1088810937
);
1088910938
});
1089010939

10940+
const definingVerifier: DocumentPositionMapperVerifier = [
10941+
/*openFile*/ dependencyTs,
10942+
/*expectedProjectActualFiles*/[dependencyTs.path, libFile.path, dependencyConfig.path],
10943+
/*action*/ verifyRenameFromDependencyTs,
10944+
/*openFileLastLine*/ 6
10945+
];
1089110946
describe("from defining project", () => {
1089210947
const closedInfos = [libFile.path, `${dependecyLocation}/FnS.d.ts`, `${dependecyLocation}/FnS.d.ts.map`];
1089310948
verifyDocumentPositionMapperUpdates(
1089410949
"rename locations from dependency",
10895-
/*openFile*/ dependencyTs,
10896-
/*expectedProjectActualFiles*/ [dependencyTs.path, libFile.path, dependencyConfig.path],
10897-
/*action*/ verifyRenameFromDependencyTs,
10898-
closedInfos,
10899-
/*openFileLastLine*/ 6
10950+
[definingVerifier],
10951+
closedInfos
1090010952
);
1090110953
});
1090210954

10903-
// TODO: test project changes when both projects are open
10904-
// TODO: project change when dependency is not built
10955+
describe("when opening depedency and usage project", () => {
10956+
const closedInfos = [libFile.path, `${dependecyLocation}/FnS.d.ts`, `${dependecyLocation}/FnS.d.ts.map`];
10957+
verifyDocumentPositionMapperUpdates(
10958+
"goto Definition in usage and rename locations from defining project",
10959+
[definingVerifier],
10960+
closedInfos
10961+
);
10962+
});
1090510963
});
1090610964
});
1090710965

0 commit comments

Comments
 (0)