Skip to content

Commit c92771c

Browse files
authored
Merge pull request #6575 from dibarbet/doc_symbol_tests
Add document symbol integration tests
2 parents 6f85387 + 26fe057 commit c92771c

File tree

2 files changed

+116
-2
lines changed

2 files changed

+116
-2
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { expect, test, beforeAll, afterAll, describe } from '@jest/globals';
7+
import * as vscode from 'vscode';
8+
import * as path from 'path';
9+
import testAssetWorkspace from './testAssets/testAssetWorkspace';
10+
import { activateCSharpExtension, openFileInWorkspaceAsync } from './integrationHelpers';
11+
12+
describe(`DocumentSymbolProvider: ${testAssetWorkspace.description}`, function () {
13+
let fileUri: vscode.Uri;
14+
15+
beforeAll(async function () {
16+
await activateCSharpExtension();
17+
const relativePath = path.join('src', 'app', 'documentSymbols.cs');
18+
fileUri = await openFileInWorkspaceAsync(relativePath);
19+
});
20+
21+
afterAll(async () => {
22+
await testAssetWorkspace.cleanupWorkspace();
23+
});
24+
25+
test('Returns all elements', async function () {
26+
const symbols = await GetDocumentSymbols(fileUri);
27+
28+
expect(symbols).toHaveLength(5);
29+
30+
// Class C
31+
expect(symbols[0].name).toBe('C');
32+
expect(symbols[0].detail).toBe('Test.C');
33+
expect(symbols[0].kind).toBe(vscode.SymbolKind.Class);
34+
// The range is the entire class, but the selection range is the class name
35+
expect(symbols[0].range).toStrictEqual(new vscode.Range(new vscode.Position(4, 4), new vscode.Position(37, 5)));
36+
expect(symbols[0].selectionRange).toStrictEqual(
37+
new vscode.Range(new vscode.Position(4, 10), new vscode.Position(4, 11))
38+
);
39+
expect(symbols[0].children).toHaveLength(20);
40+
41+
// Field _f
42+
expect(symbols[0].children[0].name).toBe('_f');
43+
expect(symbols[0].children[0].kind).toBe(vscode.SymbolKind.Field);
44+
45+
// Finalize
46+
expect(symbols[0].children[3].name).toBe('Finalize');
47+
expect(symbols[0].children[3].kind).toBe(vscode.SymbolKind.Method);
48+
49+
// Ctor
50+
expect(symbols[0].children[4].name).toBe('.ctor');
51+
expect(symbols[0].children[4].kind).toBe(vscode.SymbolKind.Method);
52+
53+
// EventHandler E1
54+
expect(symbols[0].children[5].name).toBe('E1');
55+
expect(symbols[0].children[5].kind).toBe(vscode.SymbolKind.Event);
56+
57+
// explicit operator int(C c1)
58+
expect(symbols[0].children[11].name).toBe('op_Explicit');
59+
expect(symbols[0].children[11].detail).toBe('explicit operator int(C c1)');
60+
expect(symbols[0].children[11].kind).toBe(vscode.SymbolKind.Operator);
61+
62+
// implicit operator int(C c1)
63+
expect(symbols[0].children[12].name).toBe('op_Implicit');
64+
expect(symbols[0].children[12].detail).toBe('implicit operator C(int i)');
65+
expect(symbols[0].children[12].kind).toBe(vscode.SymbolKind.Operator);
66+
67+
// implicit operator int(C c1)
68+
expect(symbols[0].children[12].name).toBe('op_Implicit');
69+
expect(symbols[0].children[12].detail).toBe('implicit operator C(int i)');
70+
expect(symbols[0].children[12].kind).toBe(vscode.SymbolKind.Operator);
71+
72+
// Method M1
73+
expect(symbols[0].children[13].name).toBe('M1');
74+
expect(symbols[0].children[13].detail).toBe('M1(int i, string s, params object[] args)');
75+
expect(symbols[0].children[13].kind).toBe(vscode.SymbolKind.Method);
76+
77+
// operator !=
78+
expect(symbols[0].children[14].name).toBe('op_Inequality');
79+
expect(symbols[0].children[14].detail).toBe('operator !=(C c1, int i)');
80+
expect(symbols[0].children[14].kind).toBe(vscode.SymbolKind.Operator);
81+
82+
// Property P1
83+
expect(symbols[0].children[16].name).toBe('P1');
84+
expect(symbols[0].children[16].kind).toBe(vscode.SymbolKind.Property);
85+
86+
// Struct S
87+
expect(symbols[1].name).toBe('S');
88+
expect(symbols[1].detail).toBe('Test.S');
89+
expect(symbols[1].kind).toBe(vscode.SymbolKind.Struct);
90+
91+
// Interface I
92+
expect(symbols[2].name).toBe('I');
93+
expect(symbols[2].detail).toBe('Test.I');
94+
expect(symbols[2].kind).toBe(vscode.SymbolKind.Interface);
95+
96+
// Delegate D
97+
expect(symbols[3].name).toBe('D');
98+
expect(symbols[3].detail).toBe('Test.D');
99+
expect(symbols[3].kind).toBe(vscode.SymbolKind.Method);
100+
101+
// Enum E
102+
expect(symbols[4].name).toBe('E');
103+
expect(symbols[4].detail).toBe('Test.E');
104+
expect(symbols[4].kind).toBe(vscode.SymbolKind.Enum);
105+
});
106+
});
107+
108+
async function GetDocumentSymbols(fileUri: vscode.Uri) {
109+
return <vscode.DocumentSymbol[]>(
110+
await vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider', fileUri)
111+
);
112+
}

test/integrationTests/integrationHelpers.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,16 @@ export async function activateCSharpExtension(): Promise<void> {
5555
}
5656
}
5757

58-
export async function openFileInWorkspaceAsync(relativeFilePath: string): Promise<void> {
58+
export async function openFileInWorkspaceAsync(relativeFilePath: string): Promise<vscode.Uri> {
5959
const root = vscode.workspace.workspaceFolders![0].uri.fsPath;
6060
const filePath = path.join(root, relativeFilePath);
6161
if (!existsSync(filePath)) {
6262
throw new Error(`File ${filePath} does not exist`);
6363
}
6464

65-
await vscode.commands.executeCommand('vscode.open', vscode.Uri.file(filePath));
65+
const uri = vscode.Uri.file(filePath);
66+
await vscode.commands.executeCommand('vscode.open', uri);
67+
return uri;
6668
}
6769

6870
export function isRazorWorkspace(workspace: typeof vscode.workspace) {

0 commit comments

Comments
 (0)