diff --git a/.changeset/quiet-windows-rest.md b/.changeset/quiet-windows-rest.md new file mode 100644 index 000000000..a845151cc --- /dev/null +++ b/.changeset/quiet-windows-rest.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml index c8ae34947..0856dc7d8 100644 --- a/.github/workflows/pr-ci.yml +++ b/.github/workflows/pr-ci.yml @@ -94,8 +94,8 @@ jobs: - name: Theme contrast check run: bun run test:theme-contrast - - name: Test suite - run: bun run test + - name: Windows platform test suite + run: bun run test:windows compiled-headless-portability: name: Compiled headless portability (${{ matrix.os }}) diff --git a/package.json b/package.json index 3e596a316..75d5d3eda 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "release:version": "bun run ./scripts/release/changeset-version.ts", "prepare": "simple-git-hooks", "test": "bun run ./scripts/test/run-test-suite.ts", + "test:windows": "bun run ./scripts/test/run-test-suite.ts --group=windows && bun run ./scripts/test/run-test-suite.ts --group=windows-ui", "test:theme-contrast": "bun test packages/hunk/src/ui/themes.test.ts --test-name-pattern contrast", "test:integration": "bun run ./scripts/test/run-test-suite.ts --group=integration", "test:session-broker-node": "bun run ./scripts/test/test-session-broker-node.ts", diff --git a/scripts/test/run-test-suite.test.ts b/scripts/test/run-test-suite.test.ts index fba05335f..68a4a772c 100644 --- a/scripts/test/run-test-suite.test.ts +++ b/scripts/test/run-test-suite.test.ts @@ -55,6 +55,16 @@ describe("test suite sharding", () => { group: "integration", patterns: TEST_PATTERN_GROUPS.integration, }); + expect(resolveTestInvocation(["--group=windows", "--rerun-each=2"])).toEqual({ + forwardedArgs: ["--path-ignore-patterns=**/packages/hunk/src/ui/**", "--rerun-each=2"], + group: "windows", + patterns: TEST_PATTERN_GROUPS.windows, + }); + expect(resolveTestInvocation(["--group=windows-ui"])).toEqual({ + forwardedArgs: [], + group: "windows-ui", + patterns: TEST_PATTERN_GROUPS["windows-ui"], + }); expect(resolveTestInvocation([]).group).toBe("default"); expect(() => resolveTestInvocation(["--group=missing"])).toThrow("Unknown test group: missing"); expect(() => resolveTestInvocation(["--group=toString"])).toThrow( diff --git a/scripts/test/run-test-suite.ts b/scripts/test/run-test-suite.ts index c010716f3..816812554 100644 --- a/scripts/test/run-test-suite.ts +++ b/scripts/test/run-test-suite.ts @@ -16,11 +16,22 @@ import { availableParallelism } from "node:os"; export const TEST_PATTERN_GROUPS = { default: ["./packages", "./scripts", "./examples", "./test/cli", "./test/session"], integration: ["./test/pty"], + windows: ["./packages", "./scripts", "./examples", "./test/cli", "./test/session"], + "windows-ui": [ + "./packages/hunk/src/ui/diff/worker/highlightWorkerClient.test.ts", + "./packages/hunk/src/ui/lib/openInEditor.test.ts", + "./packages/hunk/src/ui/lib/workspaceWriteGuard.test.ts", + ], } as const; export const DEFAULT_TEST_PATTERNS = TEST_PATTERN_GROUPS.default; export type TestPatternGroup = keyof typeof TEST_PATTERN_GROUPS; +const TEST_GROUP_RUNNER_ARGS: Partial> = { + // Linux covers terminal UI semantics; Windows runs its focused UI boundaries separately. + windows: ["--path-ignore-patterns=**/packages/hunk/src/ui/**"], +}; + const MAX_AUTOMATIC_TEST_SHARDS = 2; const MAX_EXPLICIT_TEST_SHARDS = 64; const SHARD_TERMINATION_GRACE_MS = 1_000; @@ -74,7 +85,10 @@ export function resolveTestInvocation(args: string[]) { } return { - forwardedArgs: args.filter((arg) => !arg.startsWith("--group=")), + forwardedArgs: [ + ...(TEST_GROUP_RUNNER_ARGS[group] ?? []), + ...args.filter((arg) => !arg.startsWith("--group=")), + ], group, patterns: TEST_PATTERN_GROUPS[group], }; diff --git a/test/README.md b/test/README.md index b25a0844e..9cba1f02e 100644 --- a/test/README.md +++ b/test/README.md @@ -36,6 +36,7 @@ test/ | Command | Coverage | | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- | | `bun run test` | `packages/`, `scripts/`, `examples/`, `test/cli/`, and `test/session/`, as defined by `scripts/test/run-test-suite.ts` | +| `bun run test:windows` | Windows platform, process, VCS, CLI, and packaging coverage; Linux owns the terminal UI semantic suite | | `bun test ./test/review-conformance` | Shared review fixtures and registered consumer projections | | `bun run test:session-broker-node` | Real Node listener/adapter conformance using the checked-in cross-runtime fixtures | | `bun run test:integration` | PTY-backed tests under `test/pty/` | @@ -46,3 +47,7 @@ test/ The dedicated trees are not selected directly by `bun run test`, though package tests import some shared runtime fixtures. Run the commands that match the changed behavior; omission from the default suite does not mean another command covers it. + +The Windows suite omits the platform-neutral terminal UI semantic tree, which the Linux suite covers, +then runs the focused UI tests for worker startup, editor commands, and workspace path safety. Add new +UI tests to the `windows-ui` group when their behavior depends on Windows platform boundaries.