2.5 KiB
2.5 KiB
Tests and Validation
1. Principle
A feature is not complete without relevant validation.
The exchange-format validator is part of the executable contract during early development.
2. Validation layers
Trainlog uses or will use:
- JSON Schema validation;
- Trainlog semantic validation;
- unit tests;
- integration tests;
- database constraint tests;
- TUI smoke tests;
- sanitizer builds where practical.
3. Exchange-format validation
Run the canonical suite with:
python tools/validate_json.py
The command validates:
examples/session-v1.json;- every file in
tests/fixtures/valid/as valid; - every file in
tests/fixtures/invalid/as invalid.
A negative fixture passes only when validation rejects it.
4. Structural versus semantic validation
JSON Schema validates structure and primitive bounds.
tools/validate_json.py additionally validates rules JSON Schema cannot safely express, including:
- unique
exercise_idvalues; - normalized display-name uniqueness;
- catalog-reference integrity;
- one workout entry per exercise;
- target/actual mode consistency;
- explicit timestamp offsets;
- end-time chronology.
Android export and TUI import must eventually implement the same semantic rules.
5. Initial invalid fixture coverage
The Gate 0 suite covers:
- duplicate exercise identifiers;
- duplicate normalized exercise names;
- unknown exercise references;
- duplicate workout exercise entries;
- end timestamp before start timestamp;
- offset-less timestamp;
- target/actual mode mismatch;
- target containing both repetitions and duration;
- unknown JSON field.
6. Database tests
Future tests must verify:
- foreign keys are active;
- duplicate
session_idis rejected or handled idempotently; - duplicate
exercise_idis rejected; - failed imports roll back completely;
- migrations preserve data.
7. C validation
Initial C validation will include:
normal build
strict warning build
ASan/UBSan build
Exact commands will be frozen when meson.build exists.
8. TUI tests
At minimum:
- application starts in a supported terminal;
- small-terminal fallback works;
- navigation does not corrupt state;
- UTF-8 labels render correctly;
- color roles render correctly;
- monochrome fallback remains understandable.
9. Pre-push checklist
Before a meaningful push:
- format code;
- run
python tools/validate_json.py; - build when buildable code exists;
- run relevant tests;
- run sanitizer suite when relevant;
- run
git diff --check; - inspect
git status --short; - update documentation.