Test Registry
All tests run with: cargo test --features "serde,serde_json"
Stress tests require: cargo test --features "serde,serde_json" -- --ignored
Summary
| Category | Count | Run Time |
|---|---|---|
| Core tests (branch, trace, dagwood, content) | 94 | ~50ms |
| Serde round-trip tests | 16 | included |
| Stress tests (#[ignore]) | 8 | ~100ms |
| Total | 118 | ~150ms |
Branch Tests (branch.rs)
| ID | Name | Purpose | Status |
|---|---|---|---|
| T1 | root_branch_starts_at_position_2 |
Root branch initial state | passing |
| T2 | tree_branch_has_parent |
Tree branch parent linkage | passing |
| T3 | dag_branch_has_two_parents |
Dag branch dual parents | passing |
| T4 | next_position_increments |
Position counter starts at 2, increments to 3+ | passing |
| T5 | install_branch_first_child_goes_left |
First child installed on left | passing |
| T6 | install_branch_second_child_rotates |
Swap-after-recurse distributes children | passing |
| T7 | install_branch_idempotent_for_self |
Self-install is a no-op | passing |
| T8 | install_branch_grows_depth |
5 children produce depth > 1 | passing |
| T_extra | evict_transitions_to_stub |
Evict changes state to Stub | passing |
| T_extra | branch_id_stability_across_evict |
BranchId survives eviction | passing |
| T_extra | evict_already_stubbed_is_idempotent |
Double-evict is safe | passing |
| T_extra | contents_hash_is_deterministic |
Hash is stable | passing |
| P6 | stress_install_branch_1000 |
1,000 children, tree traversal reachability | ignored |
Trace Tests (trace.rs)
| ID | Name | Purpose | Status |
|---|---|---|---|
| T9 | equality_same_branch_same_position |
Equality semantics | passing |
| T10 | inequality_different_position |
Same branch, different position | passing |
| T11 | inequality_different_branch |
Different branches, same position | passing |
| T12 | hash_deterministic |
Hash is stable across calls | passing |
| T13 | hash_formula |
Hash matches documented formula | passing |
DagWood Tests (dagwood.rs)
| ID | Name | Purpose | Status |
|---|---|---|---|
| D1 | constructor_root_is_position_1 |
Root at (1,1) | passing |
| D2 | constructor_initial_branch_at_position_3 |
Trunk branch starts at position 3 | passing |
| D3 | constructor_creates_one_trunk_entry |
One trunk entry after construction | passing |
| D4 | new_position_returns_position_3 |
Fork returns position 3 | passing |
| D5 | new_position_creates_distinct_branches |
Each fork gets a unique branch | passing |
| D6 | new_position_populates_branch_tree |
Forks populate install_branch tree | passing |
| D7 | reflexivity |
A <= A for all positions | passing |
| D8 | antisymmetry |
A<=B and B<=A implies A==B | passing |
| D9 | transitivity |
A<=B and B<=C implies A<=C | passing |
| D10 | root_ancestor_of_all |
Root is ancestor of every position | passing |
| D11 | same_branch_monotonic_ordering |
Positions on same branch are ordered | passing |
| D12 | simple_fork_ancestry |
Fork position descends from trunk | passing |
| D13 | simple_merge_ancestry |
Merge descends from both parents | passing |
| D14 | cross_branch_transitivity |
A<=root and root<=merged implies A<=merged | passing |
| D15 | deeper_ancestry |
Multi-level ancestry chain | passing |
| D16 | diverged_descendants_incomparable |
Forked positions are incomparable | passing |
| D17 | no_phantom_ordering |
Unrelated positions have no ordering | passing |
| D18 | cache_reuse_same_reference |
Cache hit for same reference | passing |
| D19 | cache_equals_recomputed_simple |
Cache matches brute force (simple) | passing |
| D20 | cache_invalidation_new_reference |
Cache clears on reference change | passing |
| D21 | cache_equals_recomputed_deep |
Cache matches brute force (deep) | passing |
| D22 | dag_convergence_cache_value |
Cache[trunk] = max(path values) | passing |
| D23 | deep_dag_multi_merge |
Ancestry through multiple merge layers | passing |
| D24 | max_over_paths |
Max over all paths in diamond | passing |
| D25 | merge_preserves_parent_incomparability |
Parents remain incomparable after merge | passing |
| D26 | property_reflexivity |
Property: A<=A on random DAGs (5 seeds, 30 ops) | passing |
| D27 | property_antisymmetry |
Property: antisymmetry on random DAGs (5 seeds) | passing |
| D28 | property_transitivity |
Property: transitivity on random DAGs (5 seeds) | passing |
| D29 | property_cache_equivalence |
Property: cache=brute on random DAGs (5 seeds) | passing |
| D30 | stress_deep_linear_chain |
200-position chain, cache verification | passing |
| D31 | stress_wide_fork_tree |
100 root forks, pairwise incomparability | passing |
| D32 | stress_repeated_merges |
50 merge-extend cycles | passing |
| D33 | stress_heavy_cache_reuse |
1,020 comparisons against same reference | passing |
| S1 | same_branch_successor |
Next position is a successor | passing |
| S2 | no_same_branch_successor_at_tip |
Tip has no same-branch successor | passing |
| S3 | cross_branch_successors |
Root has cross-branch successors | passing |
| S4 | no_cross_branch_successors_for_leaf |
Leaf has no cross-branch successors | passing |
| S5 | successors_after_fork |
Same + cross branch successors combined | passing |
| S6 | successors_at_branch_end_with_forks |
Fork creates cross-branch successor | passing |
| S7 | successors_are_forward |
Every successor S of P satisfies P <= S | passing |
| V1 | trace_view_matches_is_le |
TraceView agrees with is_le (basic) | passing |
| V2 | trace_view_independent_of_internal_cache |
TraceView ignores DagWood cache state | passing |
| V3 | visible_branches_and_max |
Branch count and max position correct | passing |
| V4 | visible_max_none_for_unreachable |
Unreachable branches return None | passing |
| V5 | trace_view_on_deep_dag |
Visibility through multi-level DAG | passing |
| V6 | trace_view_matches_is_le_on_random_dags |
Property: view=brute on random DAGs (5 seeds) | passing |
| P1 | stress_deep_linear_10k |
10,000 position chain, sampled is_le checks | ignored |
| P2 | stress_exponential_merge_dag |
2,047 branches (binary merge tree), visited-set test | ignored |
| P7 | stress_cache_thrashing |
1,000 is_le calls, 10 alternating references | ignored |
| P8 | stress_trace_view_500_branches |
TraceView on 500+ branch DAG | ignored |
Content Tests (content.rs)
| ID | Name | Purpose | Status |
|---|---|---|---|
| C1 | basic_creation |
Create node + span + text + attach | passing |
| C2 | structural_attachment |
Parent-child structure via AttachChild | passing |
| C3 | same_branch_overwrite |
Later assertion overwrites earlier | passing |
| C4 | delete_suppression |
DeleteSpan hides span from view | passing |
| C5 | detach_suppression |
DetachChild hides child from view | passing |
| C6 | cross_branch_merge_alternatives |
3-branch merge produces 3 alternatives | passing |
| C7 | visibility_filtering |
Assertions outside view are invisible | passing |
| C8 | annotation_on_node |
Annotation attached to node | passing |
| C9 | annotation_on_span |
Annotation attached to span | passing |
| C10 | delete_annotation |
DeleteAnnotation suppresses annotation | passing |
| C11 | delete_node_suppresses |
DeleteNode hides node and descendants | passing |
| C12 | view_before_creation |
View at earlier position sees nothing | passing |
| C13 | annotation_on_span |
Annotation data preserved through materialization | passing |
| C14 | structural_attachment |
Ordinal ordering of children | passing |
| M1 | merge_compatible_different_properties |
Text + annotation coexist | passing |
| M2 | merge_text_conflict_produces_alternatives |
Text conflict preserved as alternatives | passing |
| M3 | merge_agreement_collapses |
Same value collapses to Single | passing |
| M4 | merge_delete_vs_modify |
Delete wins over modify | passing |
| M5 | merge_multi_merge_preserves_alternatives |
Diamond-of-diamonds: 4 alternatives survive | passing |
| S1-S16 | serde_* |
Serde round-trip tests (16 tests) | passing |
| P3 | stress_materialize_10k_assertions |
100 nodes x 10 spans, full document materialization | ignored |
| P4 | stress_deep_nesting_100 |
100 nested node levels, recursive materialization | ignored |
| P5 | stress_100_branch_alternatives |
100 branches with conflicting text, all alternatives preserved | ignored |
| COV1 | materialize_entity_node |
Entity dispatcher: Node variant | passing |
| COV2 | materialize_entity_span |
Entity dispatcher: Span variant | passing |
| COV3 | materialize_entity_annotation |
Entity dispatcher: Annotation variant | passing |
| COV4 | materialize_entity_not_found |
Entity dispatcher: NotFound variant | passing |
| COV5 | alternative_set_values |
values() accessor for Single and Alternatives | passing |
| COV6 | alternative_set_is_single |
is_single() returns correct bool | passing |
| COV7 | alternative_set_single_value |
single_value() returns Some/None correctly | passing |
| COV8 | alternative_set_empty_alternatives |
Empty Alternatives edge case | passing |
| COV9 | all_assertions_accessor |
all_assertions() length tracking | passing |
Ent Tests (ent.rs)
| ID | Name | Purpose | Status |
|---|---|---|---|
| E1 | ent_new_trace_returns_distinct_branches |
Each trace gets unique branch | passing |
| E2 | ent_new_trace_returns_position_3 |
Trace starts at position 3 | passing |
| E3 | ent_table_segment_max_size |
Segment max is 16384 | passing |
WASM Tests (wasm.rs)
| ID | Name | Purpose | Status |
|---|---|---|---|
| W1 | wasm_add_valid_payload |
Valid JSON payload accepted | passing |
| W2 | wasm_add_rejects_unknown_variant |
Unknown variant throws with suggestion | passing |
| W3 | wasm_add_rejects_missing_field |
Missing field throws with field name | passing |
| W4 | wasm_add_rejects_wrong_type |
Wrong JSON type throws | passing |
| W5 | wasm_add_rejects_invalid_json |
Non-JSON input throws | passing |
| W6 | wasm_materialize_empty_store |
Empty store returns null root | passing |
| W7 | wasm_assertion_count_tracks_adds |
Count increments with each add | passing |
| W8 | wasm_full_pipeline |
Create doc, add assertions, materialize, verify JSON | passing |
| W9 | wasm_materialize_document_json_string |
JSON string output works | passing |
| W10 | wasm_large_document_pipeline |
200 nodes through full WASM pipeline | passing |
Enhancement Opportunities
Areas for future expansion:
| Area | Current Limitation | Enhancement |
|---|---|---|
| P1 scale | 10K chain | Push to 100K to benchmark is_le cache |
| P3 scale | 10K assertions | Push to 100K, add timing assertions |
| P4 depth | 100 levels | Push to 1,000 levels, test stack limits |
| P5 branches | 100 alternatives | Push to 1,000, benchmark AlternativeSet growth |
| P6 children | 1,000 children | Push to 10,000, verify install_branch balance |
| P2 merges | 2,047 branches | Push to 4 levels deeper (32K branches) |
| Concurrent operations | Not tested | Interleave fork/merge/add/materialize randomly |
| Eviction stress | Not tested | Evict 50% of branches, then access patterns |
| Serialization throughput | Not tested | Benchmark serde_json for 100K assertion documents |
| WASM browser tests | Not tested | Run test suite in actual browser via wasm-pack test --chrome |