test
Run kotatsu test suites. Optional args = suite (ctest | integration | all, default all) and cmake preset for the ctest suites (default `debug`). Runs in a forked context — test output stays out of the
SKILL.md.claude/skills/test/SKILL.md
GitHubRun the requested suites (default: all).
- Everything:
pixi run test [preset]— builds the preset and installs the npm packages, then runs ctest: zest's bootstrap stages, its runner check, thenunit_testsandsystem_tests, each from the repo root with--snapshot-dir=tests/snapshots(both are required for snapshot tests; ctest handles them for you), and beside them the integration tests, one ctest test per module (ipc_lsp_integration) that runs the module'sintegration/*.test.tson node's test runner.ctest --preset <preset> -L unit(orsystem,bootstrap,integration) runs one label. - Integration tests alone:
pixi run integration-test [preset](ctest -L integration). ctest passes each driver's path inKOTATSU_<DRIVER>(e.g.KOTATSU_LSP_STUB_SERVER); a test whose driver is unset or missing fails, it is never skipped. - Coverage (Linux and macOS):
pixi run coveragebuilds thecoveragepreset (clang source-based coverage), runs every stage with each process writing its profile intobuild/coverage/profiles/, and reports oninclude/kotatsuandsrcinbuild/coverage/report/:summary.md(lines, functions and regions per module),html/index.htmlandcoverage.lcov. Its arguments go to ctest (pixi run coverage -L unit). CI'slinux | clang | coverageleg puts the table in the job summary and uploads the report as thecoverage-reportartifact. zest runs on async, cli and support, so part of their coverage is the runner's own; code only the compiler evaluates (constexpr) never runs and counts as not covered.
Filtering tests means invoking a binary directly — replicate what ctest does (repo root, snapshot dir) and add the filter:
./build/<preset>/unit_tests --snapshot-dir=tests/snapshots --test-filter=Suite.Case
./build/<preset>/system_tests --snapshot-dir=tests/snapshots --test-filter='async_io_*'
(Suite.* and bare positional patterns also work.) Rerun integration tests by running node the way ctest does (ctest --preset <preset> -N -V -L integration prints its command and environment) — from the repo root, through pixi (the host node is not the project's), with the driver's path set (.exe on Windows) — and add a name pattern:
KOTATSU_LSP_STUB_SERVER=build/<preset>/lsp_stub_server pixi run node --import ./tests/check_npm_packages.ts --test --test-timeout=20000 --test-name-pattern='^hover_' tests/ipc/lsp/integration/requests.test.ts
Rules:
- This skill runs and reports — nothing else. Never fix code or tests from here, never skip or weaken anything, never pass
--update-snapshots(snapshot updates are a deliberate act in the main conversation). - When running a binary directly, build the preset first (the build skill); a stale test binary silently tests old code, and so does a stale driver such as
lsp_stub_server.
Report back, per suite: pass/fail and counts. For each failure: test name, file:line, the assertion message or snapshot-diff excerpt (trimmed), and the exact filter command to reproduce it.