Skip to content

Commit 9002da2

Browse files
committed
Add tests for ParamHintCompletionProvider
1 parent 53c7003 commit 9002da2

File tree

3 files changed

+84
-3
lines changed

3 files changed

+84
-3
lines changed

src/completionProvider.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { paramHintTrigger, returnHintTrigger, PythonType, anyClassOrFunctionName
1515
import { TypeHintSettings } from "./settings";
1616

1717

18-
abstract class CompletionProvider {
18+
export abstract class CompletionProvider {
1919

2020
protected pushTypesToItems(typeNames: PythonType[], completionItems: CompletionItem[]) {
2121
for (const typeName of typeNames) {
@@ -30,6 +30,13 @@ abstract class CompletionProvider {
3030
protected labelFor(typeName: string): string {
3131
return " " + typeName;
3232
}
33+
34+
abstract async provideCompletionItems(
35+
doc: TextDocument,
36+
pos: Position,
37+
token: CancellationToken,
38+
context: CompletionContext
39+
): Promise<CompletionList | null>;
3340
}
3441

3542
/**
@@ -113,7 +120,7 @@ export class ParamHintCompletionProvider extends CompletionProvider implements C
113120
let provide = new RegExp("^[ \t]*def", "m").test(precedingText);
114121

115122
if (!provide) {
116-
const nLinesToCheck = activePos.character > 4 ? 4 : activePos.line;
123+
const nLinesToCheck = activePos.line > 4 ? 4 : activePos.line;
117124
const range = new Range(doc.lineAt(activePos.line - nLinesToCheck).range.start, activePos);
118125
provide = new RegExp(
119126
`^[ \t]*def(?![\s\S]+(\\):|-> *${anyClassOrFunctionName}:))`,
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import * as assert from 'assert';
2+
import * as vsc from 'vscode';
3+
import { paramHintTrigger } from "../../src/python";
4+
import { CompletionProvider, ParamHintCompletionProvider } from "../../src/completionProvider";
5+
import { TypeHintSettings } from '../../src/settings';
6+
7+
suite('ParamHintCompletionProvider', () => {
8+
const provider = new ParamHintCompletionProvider(new TypeHintSettings());
9+
10+
test("provides items for first param", async () => {
11+
let param = "paramName: ";
12+
let actual = providerResult(provider, param, "\nparamName = 123");
13+
assert.notEqual(actual, null);
14+
});
15+
16+
test("provides items for non-first param", async () => {
17+
let param = "first: str, paramName: ";
18+
let actual = await providerResult(provider, param, "\nparamName = 123");
19+
assert.notEqual(actual, null);
20+
});
21+
22+
test("provides items for param on new line", async () => {
23+
let param = "\n paramName: ";
24+
let actual = await providerResult(provider, param, "\nparamName = 123");
25+
assert.notEqual(actual, null);
26+
27+
param = "\n\tparamName: ";
28+
actual = await providerResult(provider, param, "\nparamName = 123");
29+
assert.notEqual(actual, null);
30+
});
31+
32+
33+
test("does not provide items for dict keys", async () => {
34+
let expected = null;
35+
let actual = await providerResult(provider, "):\n d = { key:");
36+
assert.equal(actual, expected);
37+
});
38+
39+
test("does not provide items for ':' within strings under function def", async () => {
40+
let expected = null;
41+
let actual = await providerResult(provider, "):\n d = { key: 'val:'");
42+
assert.equal(actual, expected);
43+
});
44+
45+
test("does not provide items for end of function definition", async () => {
46+
let expected = null;
47+
let actual = await providerResult(provider, "):");
48+
assert.equal(actual, expected);
49+
});
50+
51+
});
52+
53+
const language = "python";
54+
55+
async function providerResult(
56+
provider: CompletionProvider,
57+
functionText: string,
58+
postFunctionText?: string
59+
): Promise<vsc.CompletionList | null> {
60+
let content = `def func(${functionText}`;
61+
if (postFunctionText) {
62+
content += postFunctionText;
63+
}
64+
65+
const doc = await vsc.workspace.openTextDocument({ language, content });
66+
const token = new vsc.CancellationTokenSource().token;
67+
const ctx = { triggerCharacter: paramHintTrigger, triggerKind: vsc.CompletionTriggerKind.TriggerCharacter };
68+
69+
const lines: string[] = content.split("\n");
70+
const lastLineIdx = lines.length - 1;
71+
const lastPos = new vsc.Position(lastLineIdx, lines[lastLineIdx].length);
72+
73+
return provider.provideCompletionItems(doc, lastPos, token, ctx);
74+
}

test/typeSearch/hintOfSimilarParam.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as assert from 'assert';
22
import { getErrorMessage, TestCase } from "../common";
33
import { TypeSearch } from "../../src/typeSearch";
44

5-
suite('CodeSearch.hintOfSimilarParam', function() {
5+
suite('CodeSearch.hintOfSimilarParam', () => {
66

77
test("finds lone param", () => {
88
const expected = "str";

0 commit comments

Comments
 (0)