@@ -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