Language support

Generated by scripts/gen-language-support.sh from internal/lang/runner.go and internal/lang/parity.go. Do not hand-edit.

What corral does with each language’s tests. This page is rendered from the same table the code dispatches on, so it cannot list a capability the code lacks, and every gap carries the reason the code gives for it.

By language

go javascript php python ruby rust typescript
Critic must judge every test βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
List the tests βœ“ βœ“ βœ“ βœ“ βœ“ (rspec) βœ“ βœ“
Run one test alone (critic claims checked) βœ“ βœ“ βœ“ βœ“ βœ“ (rspec) βœ“ βœ“
Name the killing test βœ“ βœ“ βœ“ βœ“ βœ“ (rspec, minitest) βœ“ βœ“
Stop at the first failure βœ“ βœ“ (jest, mocha) βœ“ βœ“ βœ“ (rspec) β€” (1) βœ“ (jest, mocha)
Keep the passing part of an authored test βœ“ βœ“ βœ“ βœ“ βœ“ (rspec, minitest) β€” (2) βœ“
Coverage pre-flight βœ“ βœ“ βœ“ βœ“ βœ“ β€” (3) βœ“
Grade only the tests that run the file β€” (4) β€” (5) β€” (5) βœ“ β€” (5) β€” (5) β€” (5)
  1. nextest’s –fail-fast and libtest’s lack of one are not yet verified against a real run (runner table Phase 5)
  2. libtest –skip and nextest filtersets are not yet verified for salvage (runner table Phase 5)
  3. cargo llvm-cov is not wired yet (runner table Phase 5)
  4. per-test coverage needs a run per test; its own spec (runner table Phase 6)
  5. per-test coverage contexts per runner; its own spec (runner table Phase 6)

By runner

A language has a runner capability when any of its runners does; this is which. corral recognises the runner from the test command you pass, or from the package script it runs: composer reads composer.json and hands the runner its arguments after --; npm reads package.json and hands the runner its arguments after --; pnpm reads package.json and hands the runner its arguments after --; yarn reads package.json and hands the runner its arguments directly. A script gets the runner’s arguments only when it is one command, since a launcher appends them to the end of the script. --runner <id> names the runner when corral cannot read it. A command whose runner corral does not know (a make target) is graded exactly the same, by exit code, as its language’s default runner, except that it never gets a fail-fast flag.

runner --runner languages stop at first failure list tests run one test names the killing test salvage names flaky tests note
go test (default) go-test go -failfast βœ“ βœ“ βœ“ βœ“
gotestsum gotestsum go βœ“ βœ“ βœ“ listing and one-test runs use go test itself; the killing test is read from --- FAIL: lines, which gotestsum passes through for a failed test but was not run here
pytest (default) pytest python -x βœ“ βœ“ βœ“ βœ“
unittest unittest python --failfast βœ“ βœ“ listing and one-test runs use pytest, which collects unittest suites; they need pytest installed
jest jest javascript, typescript --bail βœ“ βœ“ βœ“ βœ“ listing and one-test runs verified on jest 30.5
mocha mocha javascript, typescript --bail βœ“ βœ“ βœ“ βœ“ listing and one-test runs verified on mocha 11.8 (listing needs mocha 9 or later)
vitest vitest javascript, typescript βœ“ βœ“ βœ“ βœ“ listing and one-test runs verified on vitest 3.2; vitest 1, 2 and 4 were not run
node --test (default) node-test javascript, typescript βœ“ βœ“ βœ“ βœ“ node has no collect-only mode, so listing RUNS the test file once on the unmutated code; verified on node 22.23 and 24.22. Through a package script, listing, one-test runs and salvage need --test to be the script’s last word, since node reads options only before the first file
rspec (default) rspec ruby --fail-fast βœ“ βœ“ βœ“ βœ“ listing and one-test runs verified on rspec-core 3.13 (one-test runs need 3.12 or later)
minitest minitest ruby βœ“ βœ“ minitest has no list mode and no full-name selector; rspec is the Ruby runner that lists and runs one test
phpunit (default) phpunit php --stop-on-failure βœ“ βœ“ βœ“ βœ“ listing and one-test runs verified on PHPUnit 11.5
cargo nextest cargo-nextest rust βœ“ βœ“ βœ“ βœ“
cargo test (default) cargo-test rust βœ“ βœ“ βœ“ βœ“ libtest has no retries; flaky tests are named when the output is nextest’s (a wrapper that runs nextest under another command)