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) βœ“
Run one test unit βœ“ βœ“ βœ“ β€” (3) βœ“ (rspec) βœ“ βœ“
Coverage pre-flight βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
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. evidence is per test through TestSelector
  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 run one test unit names the killing test salvage names flaky tests note
go test (default) go-test go -failfast βœ“ βœ“ βœ“ βœ“ βœ“ one-package runs and their go list listing verified on go 1.26
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; units are listed with go list and one package runs through gotestsum, verified on gotestsum 1.13
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, one-test and one-file 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); no unit evidence: its config’s spec list is always added to the files on its command line, so it has no one-file run
vitest vitest javascript, typescript βœ“ βœ“ βœ“ βœ“ βœ“ listing, one-test and one-file runs verified on vitest 3.2; unit evidence needs –pool=threads (vitest 3.2.7’s default forks pool wrote no worker coverage); unit evidence counted through corral’s vm source-map preload on vitest 3.2.7 and 5.0.3; 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 (listing and running one file on node 22.23 only). 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, one-test and one-file 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; no unit evidence: no listing command; Ruby falls back to name pairing under minitest
phpunit (default) phpunit php --stop-on-failure βœ“ βœ“ βœ“ βœ“ βœ“ listing, one-test and one-file runs (--list-test-files) verified on PHPUnit 11.5; other versions were not run
cargo nextest cargo-nextest rust βœ“ βœ“ βœ“ βœ“ βœ“ one-binary runs (-E 'binary_id(=...)') and their list listing verified on cargo-nextest 0.9.148; a command with its own filterset or a partition has no unit form
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); one-target runs (-p <package> with --lib, --test or --bin, in place of the command’s own package and target selection) verified on cargo 1.90; doc tests, examples and benches are no unit