From d0282b75a112a211b7f5d92c62ebf0720bf9c16a Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 13 Jun 2019 14:22:37 -0700 Subject: [PATCH] Add test to verify when source changes --- .../unittests/tsserver/projectReferences.ts | 75 ++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/src/testRunner/unittests/tsserver/projectReferences.ts b/src/testRunner/unittests/tsserver/projectReferences.ts index 1b2e90bcd4f..eb3d83e2b98 100644 --- a/src/testRunner/unittests/tsserver/projectReferences.ts +++ b/src/testRunner/unittests/tsserver/projectReferences.ts @@ -169,6 +169,8 @@ fn5(); expectedResponse: Response; expectedResponseNoMap?: Response; expectedResponseNoDts?: Response; + requestDependencyChange?: Partial; + expectedResponseDependencyChange: Response; } function gotoDefintinionFromMainTs(fn: number): SessionAction { const textSpan = usageSpan(fn); @@ -200,6 +202,11 @@ fn5(); // To import declaration definitions: [{ file: mainTs.path, ...importSpan(fn) }], textSpan + }, + expectedResponseDependencyChange: { + // Definition on fn + 1 line + definitions: [{ file: dependencyTs.path, ...declarationSpan(fn + 1) }], + textSpan } }; } @@ -227,6 +234,8 @@ fn5(); function renameFromDependencyTs(fn: number): SessionAction { const defSpan = declarationSpan(fn); const { contextStart: _, contextEnd: _1, ...triggerSpan } = defSpan; + const defSpanPlusOne = declarationSpan(fn + 1); + const { contextStart: _2, contextEnd: _3, ...triggerSpanPlusOne } = defSpanPlusOne; return { reqName: "rename", request: { @@ -246,12 +255,30 @@ fn5(); locs: [ { file: dependencyTs.path, locs: [defSpan] } ] + }, + requestDependencyChange: { + command: protocol.CommandTypes.Rename, + arguments: { file: dependencyTs.path, ...triggerSpanPlusOne.start } + }, + expectedResponseDependencyChange: { + info: { + canRename: true, + fileToRename: undefined, + displayName: `fn${fn}`, + fullDisplayName: `"${dependecyLocation}/FnS".fn${fn}`, + kind: ScriptElementKind.functionElement, + kindModifiers: "export", + triggerSpan: triggerSpanPlusOne + }, + locs: [ + { file: dependencyTs.path, locs: [defSpanPlusOne] } + ] } }; } function renameFromDependencyTsWithBothProjectsOpen(fn: number): SessionAction { - const { reqName, request, expectedResponse } = renameFromDependencyTs(fn); + const { reqName, request, expectedResponse, expectedResponseDependencyChange, requestDependencyChange } = renameFromDependencyTs(fn); const { info, locs } = expectedResponse; return { reqName, @@ -271,7 +298,21 @@ fn5(); }, // Only dependency result expectedResponseNoMap: expectedResponse, - expectedResponseNoDts: expectedResponse + expectedResponseNoDts: expectedResponse, + requestDependencyChange, + expectedResponseDependencyChange: { + info: expectedResponseDependencyChange.info, + locs: [ + expectedResponseDependencyChange.locs[0], + { + file: mainTs.path, + locs: [ + importSpan(fn), + usageSpan(fn) + ] + } + ] + } }; } @@ -633,6 +674,36 @@ fn5(); verifyMainScenarioAndScriptInfoCollectionWithNoDts, /*noDts*/ true ); + + it("when defining project source changes", () => { + const { host, session } = openTsFile(); + + // First action + firstAction(session); + + // Make change, without rebuild of solution + if (contains(openInfos, dependencyTs.path)) { + session.executeCommandSeq({ + command: protocol.CommandTypes.Change, + arguments: { + file: dependencyTs.path, line: 1, offset: 1, endLine: 1, endOffset: 1, insertString: `function fooBar() { } +`} + }); + } + else { + host.writeFile(dependencyTs.path, `function fooBar() { } +${dependencyTs.content}`); + } + host.runQueuedTimeoutCallbacks(); + + for (const actionGetter of actionGetters) { + for (let fn = 1; fn <= 5; fn++) { + const { reqName, request, requestDependencyChange, expectedResponseDependencyChange } = actionGetter(fn); + const { response } = session.executeCommandSeq(requestDependencyChange || request); + assert.deepEqual(response, expectedResponseDependencyChange, `Failed on ${reqName}`); + } + } + }); } const usageVerifier: DocumentPositionMapperVerifier = {