Skip to content

Commit a5b756c

Browse files
committed
Add integration test setup; check for legacy/new scope duplicates
1 parent 467f699 commit a5b756c

File tree

8 files changed

+70
-2
lines changed

8 files changed

+70
-2
lines changed

packages/cursorless-engine/src/cursorlessEngine.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { ModifierStageFactoryImpl } from "./processTargets/ModifierStageFactoryI
1010
import { ScopeHandlerFactoryImpl } from "./processTargets/modifiers/scopeHandlers";
1111
import { injectIde } from "./singletons/ide.singleton";
1212
import { LanguageDefinitions } from "./languages/LanguageDefinitions";
13+
import { runIntegrationTests } from "./runIntegrationTests";
1314

1415
export function createCursorlessEngine(
1516
treeSitter: TreeSitter,
@@ -68,5 +69,7 @@ export function createCursorlessEngine(
6869
hatTokenMap,
6970
snippets,
7071
injectIde,
72+
runIntegrationTests: () =>
73+
runIntegrationTests(treeSitter, languageDefinitions),
7174
};
7275
}

packages/cursorless-engine/src/languages/getNodeMatcher.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export function getNodeMatcher(
5050
return matcher;
5151
}
5252

53-
const languageMatchers: Record<
53+
export const languageMatchers: Record<
5454
SupportedLanguageId,
5555
Record<SimpleScopeTypeType, NodeMatcher>
5656
> = {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import assert = require("assert");
2+
import { LanguageDefinitionsImpl } from "./languages/LanguageDefinitionsImpl";
3+
import { supportedLanguageIds } from "./languages/constants";
4+
import { languageMatchers } from "./languages/getNodeMatcher";
5+
import { TreeSitter } from "./typings/TreeSitter";
6+
7+
/**
8+
* Run tests that require multiple components to be instantiated, as well as a
9+
* full context, eg including tree sitter, but that are too closely tied to the
10+
* engine to be defined in cursorless-vscode-e2e
11+
*
12+
* @param treeSitter The tree sitter instance
13+
* @param languageDefinitions The language definitions instance
14+
*/
15+
export async function runIntegrationTests(
16+
treeSitter: TreeSitter,
17+
languageDefinitions: LanguageDefinitionsImpl,
18+
) {
19+
await assertNoScopesBothLegacyAndNew(treeSitter, languageDefinitions);
20+
}
21+
22+
async function assertNoScopesBothLegacyAndNew(
23+
treeSitter: TreeSitter,
24+
languageDefinitions: LanguageDefinitionsImpl,
25+
) {
26+
for (const languageId of supportedLanguageIds) {
27+
await treeSitter.loadLanguage(languageId);
28+
29+
Object.keys(languageMatchers[languageId]).map((scopeTypeType) => {
30+
assert(
31+
languageDefinitions.get(languageId)?.maybeGetLanguageScopeHandler({
32+
type: scopeTypeType,
33+
}) == null,
34+
`Scope '${scopeTypeType}' defined as both legacy and new for language ${languageId}`,
35+
);
36+
});
37+
}
38+
}

packages/cursorless-engine/src/typings/TreeSitter.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,16 @@ export interface TreeSitter {
1515
/**
1616
* Gets a language if it is loaded
1717
*
18-
* @param languageId The language id of the language to load
18+
* @param languageId The language id of the language to get
1919
* @returns The language if it is already loaded
2020
*/
2121
getLanguage(languageId: string): Language | undefined;
22+
23+
/**
24+
* Loads a language, returning true if it was successfully loaded
25+
*
26+
* @param languageId The language id of the language to load
27+
* @returns `true` if the language was successfully loaded
28+
*/
29+
loadLanguage(languageId: string): Promise<boolean>;
2230
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { getCursorlessApi } from "@cursorless/vscode-common";
2+
import { endToEndTestSetup } from "../endToEndTestSetup";
3+
4+
suite("Cursorless engine integration", async function () {
5+
endToEndTestSetup(this);
6+
7+
test("integration", async () => {
8+
const cursorlessApi = await getCursorlessApi();
9+
const { runIntegrationTests } = cursorlessApi.testHelpers!;
10+
await runIntegrationTests();
11+
});
12+
});

packages/cursorless-vscode/src/constructTestHelpers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export function constructTestHelpers(
2828
vscodeIDE: VscodeIDE,
2929
normalizedIde: NormalizedIDE,
3030
injectIde: (ide: IDE) => void,
31+
runIntegrationTests: () => Promise<void>,
3132
): TestHelpers | undefined {
3233
return {
3334
commandServerApi: commandServerApi!,
@@ -82,5 +83,6 @@ export function constructTestHelpers(
8283
},
8384

8485
hatTokenMap,
86+
runIntegrationTests,
8587
};
8688
}

packages/cursorless-vscode/src/extension.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export async function activate(
6666
hatTokenMap,
6767
snippets,
6868
injectIde,
69+
runIntegrationTests,
6970
} = createCursorlessEngine(
7071
treeSitter,
7172
normalizedIde ?? vscodeIDE,
@@ -95,6 +96,7 @@ export async function activate(
9596
vscodeIDE,
9697
normalizedIde!,
9798
injectIde,
99+
runIntegrationTests,
98100
)
99101
: undefined,
100102

@@ -131,6 +133,7 @@ function createTreeSitter(parseTreeApi: ParseTreeApi): TreeSitter {
131133
return parseTreeApi.getTreeForUri(document.uri);
132134
},
133135

136+
loadLanguage: parseTreeApi.loadLanguage,
134137
getLanguage: parseTreeApi.getLanguage,
135138
};
136139
}

packages/vscode-common/src/getExtensionApi.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ export interface TestHelpers {
4343
marks: SerializedMarks | undefined,
4444
forceRealClipboard: boolean,
4545
): Promise<TestCaseSnapshot>;
46+
47+
runIntegrationTests(): Promise<void>;
4648
}
4749

4850
export interface CursorlessApi {

0 commit comments

Comments
 (0)