All files

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
  }
]