src/stdlib/testing.panack
Green: covered; red: known zero; amber: unavailable. Blank lines are outside the executable-start-line denominator.
1 // Assertions are pure; reporting is an explicit effect at the test boundary. 2 enum TestOutcome { TestPassed, TestFailed(Str) } 3 record TestResult { name: Str, outcome: TestOutcome } 4 5 pure test_expect(name: Str, condition: Bool, reason: Str): TestResult { 6 if condition { 7 TestResult(name, TestPassed()) 8 } else { 9 TestResult(name, TestFailed(reason)) 10 } 11 } 12 13 pure test_equal_str(name: Str, actual: Str, expected: Str): TestResult { 14 test_expect(name, actual == expected, "expected ${expected}, got ${actual}") 15 } 16 17 pure test_equal_nat(name: Str, actual: Nat, expected: Nat): TestResult { 18 test_expect(name, actual == expected, "expected ${expected}, got ${actual}") 19 } 20 21 // Caller order is retained. The caller can use the returned count as its exit policy. 22 test_report(results: [TestResult]): Nat { 23 mut failures: Nat = 0 24 for result in results { 25 name = result.name 26 match result.outcome { 27 TestPassed() => { print("PASS ${name}") }, 28 TestFailed(reason) => { 29 print("FAIL ${name}: ${reason}") 30 failures = failures + 1 31 } 32 } 33 } 34 total = len(results) 35 print("tests: ${total}, failures: ${failures}") 36 failures 37 } 38
Functions
[
{
"id": "declaration/2",
"name": "test_expect",
"line": 5,
"state": "covered",
"entries": "1570"
},
{
"id": "declaration/3",
"name": "test_equal_str",
"line": 13,
"state": "covered",
"entries": "566"
},
{
"id": "declaration/4",
"name": "test_equal_nat",
"line": 17,
"state": "covered",
"entries": "126"
},
{
"id": "declaration/5",
"name": "test_report",
"line": 22,
"state": "covered",
"entries": "14"
}
]Source branch outcomes
[
{
"id": "declaration/2/tail/decision/true",
"outcome": "true",
"line": 6,
"state": "covered",
"hits": "1570"
},
{
"id": "declaration/2/tail/decision/false",
"outcome": "false",
"line": 6,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/5/statement/1/decision/body",
"outcome": "body",
"line": 24,
"state": "covered",
"hits": "1570"
},
{
"id": "declaration/5/statement/1/decision/exit",
"outcome": "exit",
"line": 24,
"state": "covered",
"hits": "14"
},
{
"id": "declaration/5/statement/1/body/tail/arm/0",
"outcome": "TestPassed",
"line": 27,
"state": "covered",
"hits": "1570"
},
{
"id": "declaration/5/statement/1/body/tail/arm/1",
"outcome": "TestFailed",
"line": 28,
"state": "zero",
"hits": "0"
}
]Reviewed declaration exclusions
[
{
"id": "declaration/0",
"reason": "enum-declaration",
"line": 2
},
{
"id": "declaration/1",
"reason": "record-declaration",
"line": 3
}
]