1 Output Format
dxtr edited this page 2026-10-18 12:07:40 +02:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Output format

Success is one line per package; failures are the only thing that gets space; the summary line is last. The example below is what the default tree-reporter prints, with color off and Unicode on.

CL-USER> (run :parser/test)

parser/test  ✗  7 passed · 2 failed · 1 error · 1 skipped   (14 ms)

✗ parser/test/parse-numbers                                    parser-test.lisp
    (is (= -1 (parse "-1")))
      (parse "-1") ⇒ 1
      differ by 2

✗ parser/test/arithmetic › expr="7/2" expected=7/2
    (is (= expected (eval-string expr)))
      expected           ⇒ 7/2
      (eval-string expr) ⇒ 3
      differ by 1/2

! parser/test/parse-unicode                                    parser-test.lisp
    TYPE-ERROR: The value "é" is not of type CHARACTER
      in (parse-char "é")
      in (parse "é" :start 0)
    output:
      | tokenizing "é"

⊘ parser/test/parse-floats — not implemented yet

FAILED: 11 tests, 7 passed, 2 failed, 1 error, 1 skipped   (14 ms)
#<SUMMARY 11 tests, 2 failed, 1 error, 1 skipped>

An all-passing run is terse:

parser/test  ✓  11 passed   (14 ms)
lexer/test   ✓  23 passed    (3 ms)
ok: 34 tests   (17 ms)

The order of the report

  1. One line per package with selected tests, in order of each package's first test: the package name, the mark (✓ when no test failed or errored, else ✗), the counts with zero categories omitted, joined by ·, and the sum of the package's durations, right-aligned.
  2. One block per result — in definition order — that has failed assertions, an error, or a skip reason. A parent that failed only through a child gets no block; the child's block follows its parent's position, depth-first, named test › child › grandchild.
  3. not run: a, b with qualified names, when any selected test has no result (after fail-fast, or a worker that died).
  4. The summary line: ok: N tests (duration) when everything passed or was skipped, else FAILED: N tests, ... with the counts, zero categories omitted.

Blocks

A block's header is the mark, the qualified name, and — for a top-level test with a known source — the file's basename, right-aligned. Then, indented:

  • Each failed assertion: the form at 4 spaces; then, at 6, one line per shown operand, source ⇒ value, the sources padded so the ⇒ aligns; then the message and explanation lines when present.
  • An error: TYPE: report at 4 spaces, then in frame for each frame of the trimmed backtrace (at most 15), each cut at 100 characters. A timeout reads SB-EXT:TIMEOUT: timed out after 2 s.
  • output: followed by the captured output, each line prefixed with | , when the capture is non-empty; then notes: in the same shape. Both appear on failure and error blocks, never on skips.
  • A skip is one line: ⊘ name — reason.

In verbose mode, a live line is printed as each top-level test finishes, with subtests nested two spaces deeper, without durations.

Marks, colors and durations

*unicode* (default t) selects ✓ ✗ ! ⊘ › ⇒ ·; NIL selects ok FAIL ERR skip > => ,.

*color* is :auto (default), t or NIL. Auto colorizes only when the stream is a terminal, NO_COLOR is unset and TERM is not dumb. With color: green for ✓ and ok:, red for ✗, ! and FAILED:, yellow for ⊘, bold for block headers, nothing else.

Values and forms print with *print-case* downcased, *package* bound to the test's package (so forms read without prefixes), *print-length* 20, *print-level* 4, *print-circle* on, and a 100-column right margin. A value longer than 400 characters is cut with ….

Durations: below 10 ms one decimal (0.4 ms), below 1 s an integer (14 ms), otherwise seconds with one decimal (1.2 s).

To get a different report, pass any reporter to run's :reporter, or ignore reporters entirely and wrap run in your own handler-bind. See Events and Reporters.