E83001: code coverage below threshold
What went wrong
Your code coverage is below the required threshold (80%). Tests passed, but insufficient code paths were exercised.
Worked examples
Compilable examples demonstrating this error and the correct fix:
- ek9 -q 811 (How do coverage thresholds and exit codes work in EK9?)
- ek9 -q 206 (How do I measure test coverage in EK9?)
Coverage metrics
- Method Coverage: percentage of functions/methods called
- Line Coverage: percentage of source code lines executed
- Branch Coverage: percentage of if/else, switch, loops exercised
How to fix it
- Check coverage report: `ek9 -t4 myfile.ek9` (detailed)
- Add tests for uncovered methods
- Test both branches of conditionals (true AND false)
- Test exception paths: `assertThrows Exception in funcThatThrows()`
- Test loop edge cases: empty, single, multiple items
Coverage files
.ek9/coverage-detail.json // Uncovered items only .ek9/coverage-verbose.json // Complete breakdown
Common causes
- Missing tests for certain functions
- Only testing happy path (missing error/exception cases)
- Loop bodies never entered (empty collections)
- Dead code that cannot be reached
Examples
Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.
Fails with E83001: code coverage below threshold - reported by the test runner, not the compiler, when ek9 -t greeting.ek9 runs in this project.
bad/greeting.ek9
#!ek9 defines module error.e83001.bad defines function greeting() as pure -> name as String <- result as String: `Hello, ${name}` shout() as pure -> name as String <- result as String: greeting(name).upperCase() whisper() as pure -> name as String <- result as String: greeting(name).lowerCase() padded() as pure -> name as String <- result as String: ` ${greeting(name)} `
bad/dev/tests.ek9
#!ek9 defines module error.e83001.bad.tests references error.e83001.bad::greeting defines program @Test GreetingIsKept() assert greeting("EK9") == "Hello, EK9"
$ ek9 -t greeting.ek9
ℹ️ Found 1 test:
1 assert (unit tests with assertions)
Executing 1 test...
✅ PASS error.e83001.bad.tests::GreetingIsKept [Assert] (nms)
Summary: 1 passed, 0 failed (1 total)
Types: 1 assert
Duration: nms
❌ E83001: Code coverage 25.0% is below required threshold 80%
Methods: 25.0% (1/4)
Lines: 25.0% (3/12)
Uncovered items:
3 method(s)
• error.e83001.bad::shout (./greeting.ek9:10)
• error.e83001.bad::whisper (./greeting.ek9:14)
• error.e83001.bad::padded (./greeting.ek9:18)
Use -t4 or -t5 for detailed coverage report.
ek9: coverage below the required threshold (exit 12)
Fixed: Every function has a test
good/greeting.ek9
#!ek9 defines module error.e83001.good defines function greeting() as pure -> name as String <- result as String: `Hello, ${name}` shout() as pure -> name as String <- result as String: greeting(name).upperCase() whisper() as pure -> name as String <- result as String: greeting(name).lowerCase() padded() as pure -> name as String <- result as String: ` ${greeting(name)} `
good/dev/tests.ek9
#!ek9 defines module error.e83001.good.tests references error.e83001.good::greeting error.e83001.good::padded error.e83001.good::shout error.e83001.good::whisper defines program @Test GreetingIsKept() assert greeting("EK9") == "Hello, EK9" @Test ShoutIsUpperCase() assert shout("EK9") == "HELLO, EK9" @Test WhisperIsLowerCase() assert whisper("EK9") == "hello, ek9" @Test PaddedHasSpaces() assert padded("EK9") == " Hello, EK9 "
$ ek9 -t greeting.ek9
ℹ️ Found 4 tests:
4 assert (unit tests with assertions)
Executing 4 tests...
✅ PASS error.e83001.good.tests::GreetingIsKept [Assert] (nms)
✅ PASS error.e83001.good.tests::PaddedHasSpaces [Assert] (nms)
✅ PASS error.e83001.good.tests::ShoutIsUpperCase [Assert] (nms)
✅ PASS error.e83001.good.tests::WhisperIsLowerCase [Assert] (nms)
Summary: 4 passed, 0 failed (4 total)
Types: 4 assert
Duration: nms