aboutsummaryrefslogtreecommitdiffstats
path: root/.fastfeedback/SPEED.md
blob: f22d26cf2869813c4a6a95c9bde3082dd7584589 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# SPEED — sl0ppty

All numbers measured on this box, 2026-08-14. Re-measure only if something
structural changes.

| what | command | time |
|---|---|---|
| build (incremental) | `make all -j8` | ~0.1s |
| build (clean) | `make clean && make all -j8` | ~0.15s (zig caches objects) |
| C unit tests | `./build/{input,kdl,shader}_test` | ~0.00s |
| one python test | `cd tests && python3 test_shaders.py` | 0.6–7s |
| **fast suite** | `make test` | **~5.5s** (parallel, `-j$(nproc)`) |
| fast suite, nothing changed | `make test` | ~0.02s (per-file stamps) |
| fast suite, one test touched | `make test` | ~1.1s |
| force re-run everything | `make retest` | ~5.5s |
| live suite (real ptys) | `make test-live` | ~5.7s |
| coverage (second build, gcc) | `make coverage` | ~50s |

## Notes

- `make test` runs each `tests/test_*.py` as its own make target, so they run
  in parallel and an unchanged test whose binary has not changed is skipped.
  Stamps live in `build/.pass-*`, logs in `build/.log-*`.
- Touching a **header** does rebuild the objects that include it (`-MMD -MP`).
  There is no reason to `make clean`; a clean build is 0.15s anyway.
- `test_session.py` is a *live* test (real pty) and is excluded from `make
  test` on purpose — it runs in `make test-live`.

## Writing fast tests here

`settle N` is the only thing that reads a pane's pty, but it is a **duration**,
i.e. a guess. `send` and `snapshot` are already synchronous with the app, so:

- asserting on **our own chrome** (frames, guides, shaders, hints) after a
  mouse or key event needs **no settle at all**;
- waiting for a **program's output** should use `s.until_text("...")` or
  `s.until(pred)`, which pump in 10ms steps and return the instant the
  condition holds;
- anything gated on a **real clock** (hover dwell, toast expiry) is a genuine
  wait — so configure the clock down (`hover_delay_ms 20`, `toast_ms 150`)
  rather than sleeping for the default.

Getting this wrong is what made the suite 80s. It is 5.5s now.

## Not a trap

`speedscan` flags `make test` as spinning up docker/compose. It does not —
that is a false positive from the word `compose` (as in *compositing a
screen*) appearing all over this codebase.