use mem_store::{EventRecord, LogWriter, RebuildState}; use serde_json::json; use std::fs; #[test] fn m2_gate_rebuild_idempotent() { // Write events to log let _ = fs::remove_dir_all("log/test/rebuild"); let mut writer = LogWriter::new("test", "rebuild", "r1").unwrap(); for i in 1..=5 { writer.log(EventRecord { project: "test".to_string(), query: "q1".to_string(), run: "r1".to_string(), turn: i, event_type: format!("event_{}", i), data: json!({"n": i}), }).unwrap(); } // Read back let events1 = writer.read_all().unwrap(); // Rebuild state let state1 = RebuildState::from_events(&events1).unwrap(); // Read again - should be identical let events2 = writer.read_all().unwrap(); let state2 = RebuildState::from_events(&events2).unwrap(); // Proof: events are identical assert_eq!(events1.len(), events2.len()); for (e1, e2) in events1.iter().zip(events2.iter()) { assert_eq!(e1.turn, e2.turn); assert_eq!(e1.event_type, e2.event_type); } // Proof: rebuild produces same state assert_eq!(state1.event_count, state2.event_count); assert_eq!(state1.chunks_seen, state2.chunks_seen); assert_eq!(state1.chunks_used, state2.chunks_used); let _ = fs::remove_dir_all("log/test/rebuild"); } #[test] fn m2_gate_rebuild_byte_identical() { // Key proof: serialize -> deserialize -> serialize produces identical bytes let _ = fs::remove_dir_all("log/test/byte_id"); let mut writer = LogWriter::new("test", "byte_id", "r2").unwrap(); let original = EventRecord { project: "test".to_string(), query: "q1".to_string(), run: "r2".to_string(), turn: 1, event_type: "test_event".to_string(), data: json!({"key": "value", "num": 42}), }; writer.log(original.clone()).unwrap(); // Read back and verify it's byte-identical let events = writer.read_all().unwrap(); assert_eq!(events.len(), 1); assert_eq!(events[0], original); let _ = fs::remove_dir_all("log/test/byte_id"); }