asset slice + testing initiative: fixed assets, property/mutation/fuzz testing, docs

This commit is contained in:
swaits committed 2026-10-11 02:25:49 +00:00
1 parent d36d718be0
commit 50c45e5229
1 file changed
+27 -6
+27 -6
View File
@@ -26,13 +26,34 @@ recomputing the goldens *by hand from accounting principles* and documenting
the recomputation in the commit. This is the seed of everything below. the recomputation in the commit. This is the seed of everything below.
**Layer 2 — Property tests (live now, growing).** **Layer 2 — Property tests (live now, growing).**
`random_balanced_journals_preserve_invariants` posts hundreds of random `crates/ledger-core/tests/properties.rs` uses `proptest` (with shrinking)
balanced entries and asserts the accounting laws still hold: trial balance to assert the accounting laws over hundreds of random inputs: trial balance
balances, the accounting equation holds, and the sum of all account movements always balances, the accounting equation holds, reversals restore zero,
is exactly zero. New invariants get new properties. (Later: graduate to posted entries are immutable and JSON-round-trip clean, and depreciation
`proptest` with shrinking.) schedules are exact to the penny. This layer caught a real bug on its second
case: partial first/final months in different-length calendar months don't
complement, so the lifetime total drifted by cents (fixed with the
final-month true-up in `depreciation_schedule`).
**Layer 3 — GnuCash diff harness (roadmap phase 3).** A `ledger-oracle` crate **Layer 3 — Mutation testing (live now).** `cargo mutants -p ledger-core`
(228 mutants as of 2026-10-10: 159 caught, 28 unviable, 2 timeouts from
induced infinite loops, 39 missed). Every *missed* mutant is triaged:
real gaps get new tests (this pass added parent-account validation,
wrong-typed asset links, zero-proceeds disposal, two-asset ids, 1-month
life, `Money` arithmetic, `is_balance_sheet`, `movements()`), equivalent
mutants are documented as such (e.g. `days_held > 0` vs `>=`: the zero
case is unreachable), and untestable-by-construction mutants are noted
(e.g. `TrialBalance::balanced -> true`: the engine cannot produce an
unbalanced ledger to falsify it).
**Layer 4 — Fuzzing (live now).** `cargo fuzz` targets in `fuzz/`
(nightly, libfuzzer): `fuzz_journal_line` (journal parsing never panics;
canonical form is a fixed point), `fuzz_entry_validate` (a validated entry
always balances exactly), `fuzz_op_sequence` (arbitrary op sequences via
`arbitrary`; the trial balance always balances). 11.5M execs, zero crashes
as of 2026-10-10. Corpora persist in `fuzz/corpus/` for regression.
**Layer 5 — GnuCash diff harness (roadmap phase 3).** A `ledger-oracle` crate
will run fixture books through our engine and through GnuCash headless, then will run fixture books through our engine and through GnuCash headless, then
diff `snapshot()` output automatically — `cargo xtask oracle`. This is the diff `snapshot()` output automatically — `cargo xtask oracle`. This is the
direct analog of storytold's `cargo xtask corpus` / `oracle_diff`. Note the direct analog of storytold's `cargo xtask corpus` / `oracle_diff`. Note the