diff --git a/docs/contributing/CONTRIBUTING.md b/docs/contributing/CONTRIBUTING.md index 903cfdfea6..16ebd4f32d 100644 --- a/docs/contributing/CONTRIBUTING.md +++ b/docs/contributing/CONTRIBUTING.md @@ -76,6 +76,8 @@ Run the `workbench.action.debug.selectandstart` command and then select See [test-case-recorder.md](./test-case-recorder.md). +It is also possible to write manual tests. When doing so, we have a convention that any test that must be run within a VSCode context (eg because it imports `"vscode"`), should be placed in a file with the suffix `.vscode.test.ts`. All other tests should end with just `.test.ts`. This allows us to run non-VSCode tests locally outside of VSCode using the `Run unit tests` launch config. These tests run much faster than the full VSCode test suite. + ## Parse tree support ### Adding a new programming language diff --git a/packages/cursorless-vscode-e2e/src/suite/backwardCompatibility.test.ts b/packages/cursorless-vscode-e2e/src/suite/backwardCompatibility.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/backwardCompatibility.test.ts rename to packages/cursorless-vscode-e2e/src/suite/backwardCompatibility.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/breakpoints.test.ts b/packages/cursorless-vscode-e2e/src/suite/breakpoints.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/breakpoints.test.ts rename to packages/cursorless-vscode-e2e/src/suite/breakpoints.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/containingTokenTwice.test.ts b/packages/cursorless-vscode-e2e/src/suite/containingTokenTwice.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/containingTokenTwice.test.ts rename to packages/cursorless-vscode-e2e/src/suite/containingTokenTwice.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/crossCellsSetSelection.test.ts b/packages/cursorless-vscode-e2e/src/suite/crossCellsSetSelection.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/crossCellsSetSelection.test.ts rename to packages/cursorless-vscode-e2e/src/suite/crossCellsSetSelection.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/cursorlessEngineIntegration.test.ts b/packages/cursorless-vscode-e2e/src/suite/cursorlessEngineIntegration.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/cursorlessEngineIntegration.test.ts rename to packages/cursorless-vscode-e2e/src/suite/cursorlessEngineIntegration.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/editNewCell.test.ts b/packages/cursorless-vscode-e2e/src/suite/editNewCell.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/editNewCell.test.ts rename to packages/cursorless-vscode-e2e/src/suite/editNewCell.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/fold.test.ts b/packages/cursorless-vscode-e2e/src/suite/fold.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/fold.test.ts rename to packages/cursorless-vscode-e2e/src/suite/fold.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/followLink.test.ts b/packages/cursorless-vscode-e2e/src/suite/followLink.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/followLink.test.ts rename to packages/cursorless-vscode-e2e/src/suite/followLink.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/groupByDocument.test.ts b/packages/cursorless-vscode-e2e/src/suite/groupByDocument.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/groupByDocument.test.ts rename to packages/cursorless-vscode-e2e/src/suite/groupByDocument.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/intraCellSetSelection.test.ts b/packages/cursorless-vscode-e2e/src/suite/intraCellSetSelection.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/intraCellSetSelection.test.ts rename to packages/cursorless-vscode-e2e/src/suite/intraCellSetSelection.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/keyboard/basic.test.ts b/packages/cursorless-vscode-e2e/src/suite/keyboard/basic.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/keyboard/basic.test.ts rename to packages/cursorless-vscode-e2e/src/suite/keyboard/basic.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/pourAcrossSplit.test.ts b/packages/cursorless-vscode-e2e/src/suite/pourAcrossSplit.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/pourAcrossSplit.test.ts rename to packages/cursorless-vscode-e2e/src/suite/pourAcrossSplit.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/prePhraseSnapshot.test.ts b/packages/cursorless-vscode-e2e/src/suite/prePhraseSnapshot.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/prePhraseSnapshot.test.ts rename to packages/cursorless-vscode-e2e/src/suite/prePhraseSnapshot.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/recorded.test.ts b/packages/cursorless-vscode-e2e/src/suite/recorded.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/recorded.test.ts rename to packages/cursorless-vscode-e2e/src/suite/recorded.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/scroll.test.ts b/packages/cursorless-vscode-e2e/src/suite/scroll.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/scroll.test.ts rename to packages/cursorless-vscode-e2e/src/suite/scroll.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/testCaseRecorder.test.ts b/packages/cursorless-vscode-e2e/src/suite/testCaseRecorder.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/testCaseRecorder.test.ts rename to packages/cursorless-vscode-e2e/src/suite/testCaseRecorder.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/toggleDecorations.test.ts b/packages/cursorless-vscode-e2e/src/suite/toggleDecorations.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/toggleDecorations.test.ts rename to packages/cursorless-vscode-e2e/src/suite/toggleDecorations.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/wrapWithSnippetAcrossSplit.test.ts b/packages/cursorless-vscode-e2e/src/suite/wrapWithSnippetAcrossSplit.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode-e2e/src/suite/wrapWithSnippetAcrossSplit.test.ts rename to packages/cursorless-vscode-e2e/src/suite/wrapWithSnippetAcrossSplit.vscode.test.ts diff --git a/packages/cursorless-vscode/src/ide/vscode/textLine.test.ts b/packages/cursorless-vscode/src/ide/vscode/textLine.vscode.test.ts similarity index 100% rename from packages/cursorless-vscode/src/ide/vscode/textLine.test.ts rename to packages/cursorless-vscode/src/ide/vscode/textLine.vscode.test.ts diff --git a/packages/test-harness/src/runners/all.ts b/packages/test-harness/src/runners/all.ts index f88af73519..d3c61c383e 100644 --- a/packages/test-harness/src/runners/all.ts +++ b/packages/test-harness/src/runners/all.ts @@ -9,5 +9,5 @@ import { runAllTestsInDir } from "../util/runAllTestsInDir"; * @returns A promise that resolves when tests have finished running */ export function run(): Promise { - return runAllTestsInDir(path.join(getCursorlessRepoRoot(), "packages")); + return runAllTestsInDir(path.join(getCursorlessRepoRoot(), "packages"), true); } diff --git a/packages/test-harness/src/runners/endToEndOnly.ts b/packages/test-harness/src/runners/endToEndOnly.ts deleted file mode 100644 index 18df6d6bdf..0000000000 --- a/packages/test-harness/src/runners/endToEndOnly.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { getCursorlessRepoRoot } from "@cursorless/common"; -import * as path from "path"; -import { runAllTestsInDir } from "../util/runAllTestsInDir"; - -/** - * Runs end-to-end VSCode tests. This function should only be called via the - * --extensionDevelopmentPath VSCode mechanism, as it includes tests that can - * only run in VSCode - * @returns A promise that resolves when tests have finished running - */ -export function run(): Promise { - return runAllTestsInDir( - path.resolve(getCursorlessRepoRoot(), "packages/cursorless-vscode-e2e"), - ); -} diff --git a/packages/test-harness/src/runners/unitTestsOnly.ts b/packages/test-harness/src/runners/unitTestsOnly.ts index ec9003a6a5..82ac3b77b3 100644 --- a/packages/test-harness/src/runners/unitTestsOnly.ts +++ b/packages/test-harness/src/runners/unitTestsOnly.ts @@ -3,14 +3,15 @@ import { getCursorlessRepoRoot } from "@cursorless/common"; import * as path from "path"; -import { runAllTestsInDirs } from "../util/runAllTestsInDir"; - -const testDirectories = ["cursorless-engine", "common"]; +import { runAllTestsInDir } from "../util/runAllTestsInDir"; +/** + * Runs all tests that don't have to be run within VSCode. + * @returns A promise that resolves when tests have finished running + */ export function run(): Promise { - return runAllTestsInDirs( - testDirectories.map((testDirectory) => - path.resolve(getCursorlessRepoRoot(), `packages/${testDirectory}`), - ), + return runAllTestsInDir( + path.join(getCursorlessRepoRoot(), "packages"), + false, ); } diff --git a/packages/test-harness/src/scripts/runTestsCI.ts b/packages/test-harness/src/scripts/runTestsCI.ts index b15c634263..0caefecf27 100644 --- a/packages/test-harness/src/scripts/runTestsCI.ts +++ b/packages/test-harness/src/scripts/runTestsCI.ts @@ -8,10 +8,7 @@ import { launchVscodeAndRunTests } from "../util/launchVscodeAndRunTests"; (async function main() { // Note that we run all tests, including unit tests, in VSCode, even though - // unit tests could be run separately. If we wanted to run unit tests - // separately, we could instead use `../runners/endToEndOnly` instead of - // `../runners/all` and then just call `await runUnitTests()` beforehand to - // run the unit tests directly, instead of as part of VSCode runner. + // unit tests could be run separately. const extensionTestsPath = path.resolve( getCursorlessRepoRoot(), "packages/test-harness/out/runners/all", diff --git a/packages/test-harness/src/util/runAllTestsInDir.ts b/packages/test-harness/src/util/runAllTestsInDir.ts index c39a6ab445..60f0dfef46 100644 --- a/packages/test-harness/src/util/runAllTestsInDir.ts +++ b/packages/test-harness/src/util/runAllTestsInDir.ts @@ -6,11 +6,17 @@ import { promisify } from "util"; const glob = promisify(globRaw); -export function runAllTestsInDir(testRoot: string) { - return runAllTestsInDirs([testRoot]); +export function runAllTestsInDir( + testRoot: string, + includeVscodeTests: boolean, +) { + return runAllTestsInDirs([testRoot], includeVscodeTests); } -export async function runAllTestsInDirs(testRoots: string[]): Promise { +export async function runAllTestsInDirs( + testRoots: string[], + includeVscodeTests: boolean, +): Promise { // Create the mocha test const mocha = new Mocha({ ui: "tdd", @@ -19,7 +25,11 @@ export async function runAllTestsInDirs(testRoots: string[]): Promise { }); for (const testRoot of testRoots) { - const files = await glob("**/**.test.js", { cwd: testRoot }); + let files = await glob("**/**.test.js", { cwd: testRoot }); + + if (!includeVscodeTests) { + files = files.filter((f) => !f.endsWith("vscode.test.js")); + } // Add files to the test suite files.forEach((f) => mocha.addFile(path.resolve(testRoot, f)));