slice-3 §7.4: external golden JSON fixtures + a new integration-test file locking the exact on-wire bytes produced by each slice-3 encode_* function. The inline round-trip tests in protocol.rs use String::contains (substring) which cannot catch field-order drift, stray fields, or number formatting changes — all of which the Envelope Serialize impl promises to keep stable (protocol.rs:115-118: "field order is pinned to make the wire bytes deterministic"). These fixtures make that promise load-bearing. 5 fixtures cover the 5 new event kinds (spec §3.2-3.3): speech_started, speech_stopped, function_call, function_call_output, tools.update. Each fixture asserts (a) encode_* output equals the fixture bytes exactly (string equality, not serde_json::Value equality — the latter would erase the field-order pinning the serializer guarantees), and (b) the fixture decodes back to the expected DecodedPayload variant with the expected fields. Plus a forwards-compat re-assertion: unknown wire type -> DecodedPayload::Unknown (via FrameKind's #[serde(other)]), not an error — the foundation of the slice-2 §3.4 "drop + observe" posture that lets a future-protocol brain not crash an older core. On first run the golden test caught real drift: serde_json (without preserve_order) alphabetizes nested object keys, so tools.update's tools array serializes description-before-name, not input order. Fixture corrected to lock the actual contract. 11 new tests, all green. cargo fmt + clippy -D warnings clean.
1 line
48 B
JSON
1 line
48 B
JSON
{"v":1,"type":"speech_stopped","seq":9,"ts":200} |