Skip to content

Commit

Permalink
test: emit type check test
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Sep 23, 2021
1 parent 322722d commit fff46b3
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 5 deletions.
10 changes: 5 additions & 5 deletions packages/vscode-vue-languageservice/src/services/diagnostics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export function register({ sourceFiles, getCssLs, jsonLs, templateTsLs, scriptTs
const vueWorkers = new WeakMap<SourceFile, ReturnType<typeof useDiagnostics>>();
const tsWorkers = new Map<string, ReturnType<typeof useDiagnostics_ts>>();

return async (uri: string, response: (result: vscode.Diagnostic[]) => void, isCancel?: () => Promise<boolean>) => {
return async (uri: string, response?: (result: vscode.Diagnostic[]) => void, isCancel?: () => Promise<boolean>) => {

const sourceFile = sourceFiles.get(uri);
if (sourceFile) {
Expand Down Expand Up @@ -50,7 +50,7 @@ export function register({ sourceFiles, getCssLs, jsonLs, templateTsLs, scriptTs
[useScriptValidation(3), 0, []],
];

return async (response: (diags: vscode.Diagnostic[]) => void, isCancel?: () => Promise<boolean>) => {
return async (response?: (diags: vscode.Diagnostic[]) => void, isCancel?: () => Promise<boolean>) => {

scriptTsProjectVersion.value = scriptTsLs.__internal__.host.getProjectVersion?.();

Expand Down Expand Up @@ -85,7 +85,7 @@ export function register({ sourceFiles, getCssLs, jsonLs, templateTsLs, scriptTs
if (isLast || isDirty) {
isDirty = false;
lastResponse = dedupe.withDiagnostics(newErrors.concat(oldErrors));
response(lastResponse);
response?.(lastResponse);
}
}

Expand Down Expand Up @@ -182,7 +182,7 @@ export function register({ sourceFiles, getCssLs, jsonLs, templateTsLs, scriptTs
// [useScriptValidation(virtualScriptGen.textDocument, 4), 0, []], // TODO: support cancel because it's very slow
];

return async (response: (diags: vscode.Diagnostic[]) => void, isCancel?: () => Promise<boolean>) => {
return async (response?: (diags: vscode.Diagnostic[]) => void, isCancel?: () => Promise<boolean>) => {

templateTsProjectVersion.value = templateTsLs.__internal__.host.getProjectVersion?.();
scriptTsProjectVersion.value = scriptTsLs.__internal__.host.getProjectVersion?.();
Expand Down Expand Up @@ -249,7 +249,7 @@ export function register({ sourceFiles, getCssLs, jsonLs, templateTsLs, scriptTs
) {
isDirty = false;
lastResponse = dedupe.withDiagnostics(newErrors.concat(oldErrors));
response(lastResponse);
response?.(lastResponse);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<script lang="ts" setup>
defineEmits({ fooBar: (num: number) => true });
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<template>
<Comp @foo-bar="strFn"></Comp>
<Comp @fooBar="strFn"></Comp>
<Comp @foo-bar="numFn"></Comp>
<Comp @fooBar="numFn"></Comp>
<Comp @foo-bar="strFn($event)"></Comp>
<Comp @fooBar="strFn($event)"></Comp>
<Comp @foo-bar="numFn($event)"></Comp>
<Comp @fooBar="numFn($event)"></Comp>
<Comp @foo-bar="payload => strFn(payload)"></Comp>
<Comp @fooBar="payload => strFn(payload)"></Comp>
<Comp @foo-bar="payload => numFn(payload)"></Comp>
<Comp @fooBar="payload => numFn(payload)"></Comp>
</template>

<script lang="ts" setup>
import Comp from './emit_from.vue';
function strFn(_: string) { }
function numFn(_: number) { }
</script>
2 changes: 2 additions & 0 deletions packages/vscode-vue-languageservice/tests/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ import './renames/dynamicProp';
import './renames/scriptSetup_component';
import './renames/scriptSetup_element';
import './renames/scriptSetup';

import './typeChecks/emit';
41 changes: 41 additions & 0 deletions packages/vscode-vue-languageservice/tests/typeChecks/emit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import * as path from 'upath';
import { defineTypeCheck } from '../utils/defineTypeCheck';

defineTypeCheck(path.resolve(__dirname, '../../testCases/typeChecks/emit_to.vue'), [
{
start: 19,
end: 26,
source: 'ts',
code: 2322,
},
{
start: 51,
end: 57,
source: 'ts',
code: 2322,
},
{
start: 160,
end: 166,
source: 'ts',
code: 2345,
},
{
start: 199,
end: 205,
source: 'ts',
code: 2345,
},
{
start: 329,
end: 336,
source: 'ts',
code: 2345,
},
{
start: 380,
end: 387,
source: 'ts',
code: 2345,
},
]);
64 changes: 64 additions & 0 deletions packages/vscode-vue-languageservice/tests/utils/defineTypeCheck.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import type * as vscode from 'vscode-languageserver/node';
import * as path from 'upath';
import { createTester } from './createTester';
import { TextDocument } from 'vscode-languageserver-textdocument';
import * as shared from '@volar/shared';

const volarRoot = path.resolve(__dirname, '../../../..');
const testRoot = path.resolve(__dirname, '../../testCases');
const tester = createTester(testRoot);

export function defineTypeCheck(fileName: string, expectErrors: {
start: number,
end: number,
source: string,
code: number,
}[]) {

describe(`type check to ${path.relative(volarRoot, fileName)}`, () => {

const uri = shared.fsPathToUri(fileName);
const script = tester.host.getScriptSnapshot(fileName);

let errors: vscode.Diagnostic[] | undefined;

beforeAll(async () => {
errors = await tester.languageService.doValidation(uri);
});

it(`should has script snapshot`, async () => {
expect(!!script).toEqual(true);
const errors = await tester.languageService.doValidation(uri);
expect(errors?.length).toEqual(expectErrors.length);
});

it(`should has ${expectErrors.length} errors`, async () => {
const errors = await tester.languageService.doValidation(uri);
expect(errors?.length).toEqual(expectErrors.length);
});

if (script) {

const doc = TextDocument.create('', '', 0, script.getText(0, script.getLength()));

for (const expectError of expectErrors) {

const pos = doc.positionAt(expectError.start);

it(`should report ${expectError.source}(${expectError.code}) at ${path.relative(volarRoot, fileName)}:${pos.line + 1}:${pos.character + 1}`, () => {
expect(errors?.some(error => {

const start = doc.offsetAt(error.range.start);
const end = doc.offsetAt(error.range.end);

return expectError.start === start
&& expectError.end === end
&& expectError.source === error.source
&& expectError.code === error.code

})).toEqual(true);
});
}
}
});
}

0 comments on commit fff46b3

Please sign in to comment.