Skip to content

Commit 1c864d3

Browse files
committed
Rewrite inlay hints tests
1 parent 117ce52 commit 1c864d3

File tree

16 files changed

+352
-346
lines changed

16 files changed

+352
-346
lines changed

package.json

+8-7
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,14 @@
3131
},
3232
"pnpm": {
3333
"overrides": {
34-
"@volar/kit": "https://pkg.pr.new/volarjs/volar.js/@volar/kit@01441c3",
35-
"@volar/language-core": "https://pkg.pr.new/volarjs/volar.js/@volar/language-core@01441c3",
36-
"@volar/language-server": "https://pkg.pr.new/volarjs/volar.js/@volar/language-server@01441c3",
37-
"@volar/language-service": "https://pkg.pr.new/volarjs/volar.js/@volar/language-service@01441c3",
38-
"@volar/source-map": "https://pkg.pr.new/volarjs/volar.js/@volar/source-map@01441c3",
39-
"@volar/typescript": "https://pkg.pr.new/volarjs/volar.js/@volar/typescript@01441c3",
40-
"@volar/vscode": "https://pkg.pr.new/volarjs/volar.js/@volar/vscode@01441c3",
34+
"@volar/kit": "https://pkg.pr.new/volarjs/volar.js/@volar/kit@87ad0b2",
35+
"@volar/language-core": "https://pkg.pr.new/volarjs/volar.js/@volar/language-core@87ad0b2",
36+
"@volar/language-server": "https://pkg.pr.new/volarjs/volar.js/@volar/language-server@87ad0b2",
37+
"@volar/language-service": "https://pkg.pr.new/volarjs/volar.js/@volar/language-service@87ad0b2",
38+
"@volar/source-map": "https://pkg.pr.new/volarjs/volar.js/@volar/source-map@87ad0b2",
39+
"@volar/test-utils": "https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@87ad0b2",
40+
"@volar/typescript": "https://pkg.pr.new/volarjs/volar.js/@volar/typescript@87ad0b2",
41+
"@volar/vscode": "https://pkg.pr.new/volarjs/volar.js/@volar/vscode@87ad0b2",
4142
"volar-service-typescript": "https://pkg.pr.new/volarjs/services/volar-service-typescript@177b9ed",
4243
"inquirer": "9.2.23"
4344
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`Definitions > Destructured props 1`] = `
4+
"
5+
<script setup lang="ts">
6+
import { watch } from 'vue';
7+
8+
const { foo, bar, ...props } = defineProps<{
9+
foo: string;
10+
bar: string;
11+
baz: string;
12+
}>();
13+
14+
type foo = foo[string] & typeof [props.]foo;
15+
16+
interface foo extends (typeof [props.]foo) {
17+
foo: string;
18+
foo(foo: string): void;
19+
foo: (foo: string) => void;
20+
}
21+
22+
const obj = {
23+
foo: [props.]foo,
24+
[[props.]foo]: '',
25+
foo[: props.foo],
26+
foo(foo) { },
27+
foo: function (foo) { },
28+
get bar() { return this.foo; },
29+
set bar(val) { this.foo = val; }
30+
};
31+
32+
function func(foo) { }
33+
34+
class cls {
35+
foo: string = [props.]foo;
36+
constructor(foo) { }
37+
}
38+
39+
for (const char of [props.]foo) { }
40+
41+
try { } catch (foo) { }
42+
43+
watch(() => [props.]foo, (foo) => {
44+
console.log(foo, [props.]bar, props.baz);
45+
});
46+
</script>
47+
"
48+
`;
49+
50+
exports[`Definitions > Inline handler leading 1`] = `
51+
"
52+
<script setup lang="ts">
53+
let a = 0;
54+
</script>
55+
56+
<template>
57+
<div @click="[$event =>]a = 1"></div>
58+
</template>
59+
"
60+
`;
61+
62+
exports[`Definitions > Missing props 1`] = `
63+
"
64+
<script setup lang="ts">
65+
import Foo from './foo.vue';
66+
</script>
67+
68+
<template>
69+
<Foo[foo!]></Foo>
70+
</template>
71+
"
72+
`;
73+
74+
exports[`Definitions > Options wrapper 1`] = `
75+
"
76+
<script>
77+
export default [(await import('vue')).defineComponent(]{}[)];
78+
</script>
79+
"
80+
`;

packages/language-server/tests/completions.spec.ts

+1
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ describe('Completions', async () => {
155155

156156
async function assertCompletion(fileName: string, languageId: string, content: string, itemLabel: string) {
157157
const offset = content.indexOf('|');
158+
expect(offset).toBeGreaterThanOrEqual(0);
158159
content = content.slice(0, offset) + content.slice(offset + 1);
159160

160161
const server = await getLanguageServer();

packages/language-server/tests/definitions.spec.ts

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ describe('Definitions', async () => {
6161

6262
async function assertDefinition(fileName: string, languageId: string, content: string) {
6363
const offset = content.indexOf('|');
64+
expect(offset).toBeGreaterThanOrEqual(0);
6465
content = content.slice(0, offset) + content.slice(offset + 1);
6566

6667
const server = await getLanguageServer();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import { TextDocument } from '@volar/language-server';
2+
import { afterEach, describe, expect, it } from 'vitest';
3+
import { URI } from 'vscode-uri';
4+
import { getLanguageServer, testWorkspacePath } from './server.js';
5+
6+
describe('Definitions', async () => {
7+
8+
it('Inline handler leading', async () => {
9+
await ensureGlobalTypesHolder('tsconfigProject');
10+
await assertInlayHints('tsconfigProject/fixture.vue', 'vue', `
11+
<script setup lang="ts">
12+
let a = 0;
13+
</script>
14+
15+
<template>
16+
<div @click="a = 1"></div>
17+
</template>
18+
`);
19+
});
20+
21+
it('Missing props', async () => {
22+
await ensureGlobalTypesHolder('tsconfigProject');
23+
openDocument('tsconfigProject/foo.vue', 'vue', `
24+
<script setup lang="ts">
25+
defineProps<{
26+
foo: number;
27+
}>();
28+
</script>
29+
`);
30+
await assertInlayHints('tsconfigProject/fixture.vue', 'vue', `
31+
<script setup lang="ts">
32+
import Foo from './foo.vue';
33+
</script>
34+
35+
<template>
36+
<Foo></Foo>
37+
</template>
38+
`);
39+
});
40+
41+
it('Options wrapper', async () => {
42+
await ensureGlobalTypesHolder('tsconfigProject');
43+
await assertInlayHints('tsconfigProject/fixture.vue', 'vue', `
44+
<script>
45+
export default {};
46+
</script>
47+
`);
48+
});
49+
50+
it('Destructured props', async () => {
51+
await ensureGlobalTypesHolder('tsconfigProject');
52+
await assertInlayHints('tsconfigProject/fixture.vue', 'vue', `
53+
<script setup lang="ts">
54+
import { watch } from 'vue';
55+
56+
const { foo, bar, ...props } = defineProps<{
57+
foo: string;
58+
bar: string;
59+
baz: string;
60+
}>();
61+
62+
type foo = foo[string] & typeof foo;
63+
64+
interface foo extends (typeof foo) {
65+
foo: string;
66+
foo(foo: string): void;
67+
foo: (foo: string) => void;
68+
}
69+
70+
const obj = {
71+
foo: foo,
72+
[foo]: '',
73+
foo,
74+
foo(foo) { },
75+
foo: function (foo) { },
76+
get bar() { return this.foo; },
77+
set bar(val) { this.foo = val; }
78+
};
79+
80+
function func(foo) { }
81+
82+
class cls {
83+
foo: string = foo;
84+
constructor(foo) { }
85+
}
86+
87+
for (const char of foo) { }
88+
89+
try { } catch (foo) { }
90+
91+
watch(() => foo, (foo) => {
92+
console.log(foo, bar, props.baz);
93+
});
94+
</script>
95+
`);
96+
});
97+
98+
const openedDocuments: TextDocument[] = [];
99+
100+
afterEach(async () => {
101+
const server = await getLanguageServer();
102+
for (const document of openedDocuments) {
103+
await server.closeTextDocument(document.uri);
104+
}
105+
openedDocuments.length = 0;
106+
});
107+
108+
/**
109+
* @deprecated Remove this when #4717 fixed.
110+
*/
111+
async function ensureGlobalTypesHolder(folderName: string) {
112+
const document = await openDocument(`${folderName}/globalTypesHolder.vue`, 'vue', '');
113+
const server = await getLanguageServer();
114+
await server.sendDocumentDiagnosticRequest(document.uri);
115+
}
116+
117+
async function assertInlayHints(fileName: string, languageId: string, content: string) {
118+
const server = await getLanguageServer();
119+
let document = await openDocument(fileName, languageId, content);
120+
121+
const inlayHints = await server.sendInlayHintRequest(document.uri, { start: document.positionAt(0), end: document.positionAt(content.length) });
122+
expect(inlayHints).toBeDefined();
123+
expect(inlayHints!.length).greaterThan(0);
124+
125+
let text = document.getText();
126+
for (const hint of inlayHints!.sort((a, b) => document.offsetAt(b.position) - document.offsetAt(a.position))) {
127+
const offset = document.offsetAt(hint.position);
128+
text = text.slice(0, offset) + '[' + hint.label + ']' + text.slice(offset);
129+
}
130+
131+
expect(text).toMatchSnapshot();
132+
}
133+
134+
async function openDocument(fileName: string, languageId: string, content: string) {
135+
const server = await getLanguageServer();
136+
const uri = URI.file(`${testWorkspacePath}/${fileName}`);
137+
const document = await server.openInMemoryDocument(uri.toString(), languageId, content);
138+
if (openedDocuments.every(d => d.uri !== document.uri)) {
139+
openedDocuments.push(document);
140+
}
141+
return document;
142+
}
143+
});

packages/language-server/tests/references.spec.ts

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ describe('Definitions', async () => {
7878

7979
async function assertReferences(fileName: string, languageId: string, content: string) {
8080
const offset = content.indexOf('|');
81+
expect(offset).toBeGreaterThanOrEqual(0);
8182
content = content.slice(0, offset) + content.slice(offset + 1);
8283

8384
const server = await getLanguageServer();

packages/language-server/tests/server.ts

+13
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ export async function getLanguageServer() {
1111
if (!serverHandle) {
1212
serverHandle = startLanguageServer(require.resolve('../bin/vue-language-server.js'), testWorkspacePath);
1313
serverHandle.connection.onNotification('textDocument/publishDiagnostics', () => { });
14+
serverHandle.connection.onRequest('workspace/configuration', ({ items }) => {
15+
return items.map(({ section }) => {
16+
if (section.startsWith('vue.inlayHints.')) {
17+
return true;
18+
}
19+
return null;
20+
});
21+
});
1422

1523
await serverHandle.initialize(
1624
URI.file(testWorkspacePath).toString(),
@@ -22,6 +30,11 @@ export async function getLanguageServer() {
2230
vue: {
2331
hybridMode: false,
2432
},
33+
},
34+
{
35+
workspace: {
36+
configuration: true,
37+
},
2538
}
2639
);
2740
}

packages/language-service/tests/inlayHint.ts

-80
This file was deleted.

0 commit comments

Comments
 (0)