• 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: false,
36                isWriteAccess: true,
37                lineText: mainTs.content,
38                contextText: mainTs.content,
39                text,
40            });
41
42        const referenceModTs = (
43            texts: { text: string; lineText: string; contextText?: string },
44            override: Partial<MakeReferenceItem> = {},
45        ): protocol.ReferencesResponseItem =>
46            makeReferenceItem({
47                file: modTs,
48                isDefinition: true,
49                ...texts,
50                ...override,
51            });
52
53        it("should get const variable declaration references", () => {
54            const session = makeSampleSession();
55
56            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
57                session,
58                protocol.CommandTypes.References,
59                protocolFileLocationFromSubstring(modTs, "value"),
60            );
61
62            const expectResponse = {
63                refs: [
64                    referenceModTs({ text: "value", lineText: exportVariable, contextText: exportVariable }),
65                    referenceMainTs(mainTs, "value"),
66                ],
67                symbolDisplayString: "const value: 0",
68                symbolName: "value",
69                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "value").offset,
70            };
71
72            assert.deepEqual(response, expectResponse);
73        });
74
75        it("should get array destructuring declaration references", () => {
76            const session = makeSampleSession();
77            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
78                session,
79                protocol.CommandTypes.References,
80                protocolFileLocationFromSubstring(modTs, "valueA"),
81            );
82
83            const expectResponse = {
84                refs: [
85                    referenceModTs({
86                        text: "valueA",
87                        lineText: exportArrayDestructured,
88                        contextText: exportArrayDestructured,
89                    }),
90                    referenceMainTs(mainTs, "valueA"),
91                ],
92                symbolDisplayString: "const valueA: number",
93                symbolName: "valueA",
94                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueA").offset,
95            };
96
97            assert.deepEqual(response, expectResponse);
98        });
99
100        it("should get object destructuring declaration references", () => {
101            const session = makeSampleSession();
102            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
103                session,
104                protocol.CommandTypes.References,
105                protocolFileLocationFromSubstring(modTs, "valueC"),
106            );
107            const expectResponse = {
108                refs: [
109                    referenceModTs({
110                        text: "valueC",
111                        lineText: exportObjectDestructured,
112                        contextText: exportObjectDestructured,
113                    }),
114                    referenceMainTs(mainTs, "valueC"),
115                    referenceModTs(
116                        { text: "valueC", lineText: exportObjectDestructured, contextText: "valueC: 0" },
117                        {
118                            options: { index: 1 },
119                            isDefinition: false,
120                            isWriteAccess: true,
121                        }),
122                ],
123                symbolDisplayString: "const valueC: number",
124                symbolName: "valueC",
125                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueC").offset,
126            };
127
128            assert.deepEqual(response, expectResponse);
129        });
130
131        it("should get object declaration references that renames destructured property", () => {
132            const session = makeSampleSession();
133            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
134                session,
135                protocol.CommandTypes.References,
136                protocolFileLocationFromSubstring(modTs, "renamedD"),
137            );
138
139            const expectResponse = {
140                refs: [
141                    referenceModTs({
142                        text: "renamedD",
143                        lineText: exportObjectDestructured,
144                        contextText: exportObjectDestructured,
145                    }),
146                    referenceMainTs(mainTs, "renamedD"),
147                ],
148                symbolDisplayString: "const renamedD: number",
149                symbolName: "renamedD",
150                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "renamedD").offset,
151            };
152
153            assert.deepEqual(response, expectResponse);
154        });
155
156        it("should get nested object declaration references", () => {
157            const session = makeSampleSession();
158            const response = executeSessionRequest<protocol.ReferencesRequest, protocol.ReferencesResponse>(
159                session,
160                protocol.CommandTypes.References,
161                protocolFileLocationFromSubstring(modTs, "valueF"),
162            );
163
164            const expectResponse = {
165                refs: [
166                    referenceModTs({
167                        text: "valueF",
168                        lineText: exportNestedObject,
169                        contextText: exportNestedObject,
170                    }),
171                    referenceMainTs(mainTs, "valueF"),
172                    referenceModTs(
173                        {
174                            text: "valueF",
175                            lineText: exportNestedObject,
176                            contextText: "valueF: 1",
177                        },
178                        {
179                            options: { index: 1 },
180                            isDefinition: false,
181                            isWriteAccess: true,
182                        },
183                    ),
184                ],
185                symbolDisplayString: "const valueF: number",
186                symbolName: "valueF",
187                symbolStartOffset: protocolLocationFromSubstring(modTs.content, "valueF").offset,
188            };
189
190            assert.deepEqual(response, expectResponse);
191        });
192    });
193}
194