• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1namespace ts.projectSystem {
2    describe("unittests:: tsserver:: getExportReferences", () => {
3        const exportVariable = "export const value = 0;";
4        const exportArrayDestructured = "export const [valueA, valueB] = [0, 1];";
5        const exportObjectDestructured = "export const { valueC, valueD: renamedD } = { valueC: 0, valueD: 1 };";
6        const exportNestedObject = "export const { nest: [valueE, { valueF }] } = { nest: [0, { valueF: 1 }] };";
7
8        const mainTs: File = {
9            path: "/main.ts",
10            content: 'import { value, valueA, valueB, valueC, renamedD, valueE, valueF } from "./mod";',
11        };
12        const modTs: File = {
13            path: "/mod.ts",
14            content: `${exportVariable}
15${exportArrayDestructured}
16${exportObjectDestructured}
17${exportNestedObject}
18`,
19        };
20        const tsconfig: File = {
21            path: "/tsconfig.json",
22            content: "{}",
23        };
24
25        function makeSampleSession() {
26            const host = createServerHost([mainTs, modTs, tsconfig]);
27            const session = createSession(host);
28            openFilesForSession([mainTs, modTs], session);
29            return session;
30        }
31
32        const referenceMainTs = (mainTs: File, text: string): protocol.ReferencesResponseItem =>
33            makeReferenceItem({
34                file: mainTs,
35                isDefinition: true,
36                lineText: mainTs.content,
37                contextText: mainTs.content,
38                text,
39            });
40
41        const referenceModTs = (
42            texts: { text: string; lineText: string; contextText?: string },
43            override: Partial<MakeReferenceItem> = {},
44        ): protocol.ReferencesResponseItem =>
45            makeReferenceItem({
46                file: modTs,
47                isDefinition: true,
48                ...texts,
49                ...override,
50            });
51
52        it("should get const variable declaration references", () => {
53            const session = makeSampleSession();
54
55            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
56                session,
57                protocol.CommandTypes.References,
58                protocolFileLocationFromSubstring(modTs, "value"),
59            );
60
61            const expectResponse = {
62                refs: [
63                    referenceModTs({ text: "value", lineText: exportVariable, contextText: exportVariable }),
64                    referenceMainTs(mainTs, "value"),
65                ],
66                symbolDisplayString: "const value: 0",
67                symbolName: "value",
68                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "value").offset,
69            };
70
71            assert.deepEqual(response, expectResponse);
72        });
73
74        it("should get array destructuring declaration references", () => {
75            const session = makeSampleSession();
76            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
77                session,
78                protocol.CommandTypes.References,
79                protocolFileLocationFromSubstring(modTs, "valueA"),
80            );
81
82            const expectResponse = {
83                refs: [
84                    referenceModTs({
85                        text: "valueA",
86                        lineText: exportArrayDestructured,
87                        contextText: exportArrayDestructured,
88                    }),
89                    referenceMainTs(mainTs, "valueA"),
90                ],
91                symbolDisplayString: "const valueA: number",
92                symbolName: "valueA",
93                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueA").offset,
94            };
95
96            assert.deepEqual(response, expectResponse);
97        });
98
99        it("should get object destructuring declaration references", () => {
100            const session = makeSampleSession();
101            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
102                session,
103                protocol.CommandTypes.References,
104                protocolFileLocationFromSubstring(modTs, "valueC"),
105            );
106            const expectResponse = {
107                refs: [
108                    referenceModTs({
109                        text: "valueC",
110                        lineText: exportObjectDestructured,
111                        contextText: exportObjectDestructured,
112                    }),
113                    referenceMainTs(mainTs, "valueC"),
114                    referenceModTs(
115                        { text: "valueC", lineText: exportObjectDestructured, contextText: "valueC: 0" },
116                        { options: { index: 1 } },
117                    ),
118                ],
119                symbolDisplayString: "const valueC: number",
120                symbolName: "valueC",
121                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueC").offset,
122            };
123
124            assert.deepEqual(response, expectResponse);
125        });
126
127        it("should get object declaration references that renames destructured property", () => {
128            const session = makeSampleSession();
129            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
130                session,
131                protocol.CommandTypes.References,
132                protocolFileLocationFromSubstring(modTs, "renamedD"),
133            );
134
135            const expectResponse = {
136                refs: [
137                    referenceModTs({
138                        text: "renamedD",
139                        lineText: exportObjectDestructured,
140                        contextText: exportObjectDestructured,
141                    }),
142                    referenceMainTs(mainTs, "renamedD"),
143                ],
144                symbolDisplayString: "const renamedD: number",
145                symbolName: "renamedD",
146                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "renamedD").offset,
147            };
148
149            assert.deepEqual(response, expectResponse);
150        });
151
152        it("should get nested object declaration references", () => {
153            const session = makeSampleSession();
154            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
155                session,
156                protocol.CommandTypes.References,
157                protocolFileLocationFromSubstring(modTs, "valueF"),
158            );
159
160            const expectResponse = {
161                refs: [
162                    referenceModTs({
163                        text: "valueF",
164                        lineText: exportNestedObject,
165                        contextText: exportNestedObject,
166                    }),
167                    referenceMainTs(mainTs, "valueF"),
168                    referenceModTs(
169                        {
170                            text: "valueF",
171                            lineText: exportNestedObject,
172                            contextText: "valueF: 1",
173                        },
174                        { options: { index: 1 } },
175                    ),
176                ],
177                symbolDisplayString: "const valueF: number",
178                symbolName: "valueF",
179                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueF").offset,
180            };
181
182            assert.deepEqual(response, expectResponse);
183        });
184    });
185}
186