//! A staged write's id is never one used before that day, so a write staged after another was //! accepted or rejected stays waiting and can be accepted (M5a spec, section 5; review of //! 2026-09-24). Do not edit. #[path = "support/tmp.rs"] mod tmp; use bxcore::{DataClass, MemoryArgs, MemoryFile, Timestamp}; use memoryd::edit::Context; use memoryd::files::Store; use memoryd::review; use tmp::TempDir; fn now() -> Timestamp { Timestamp::parse("2026-09-24T20:14:37.123Z").unwrap() } fn setup(tag: &str) -> (TempDir, Store) { let dir = TempDir::new(tag); let starter = dir.write("etc/soul.md", "Soul.\n"); let store = Store::new(&dir.path().join("memory")); store.init(&starter).unwrap(); (dir, store) } fn ctx() -> Context { Context { session: "mm-s1".to_string(), call: 7, taint: DataClass::Private, untrusted: false, now: now(), } } /// Stage an add of `text` to memory.md; the answer. fn stage(store: &Store, text: &str) -> String { let json = format!(r#"{{"action":"add","file":"memory","text":"{text}"}}"#); let args: MemoryArgs = serde_json::from_str(&json).unwrap(); review::submit(store, &args, &json, &ctx()).unwrap() } fn waiting_as(id: &str) -> String { format!("waiting for the owner's review ({id}); nothing is changed until it is accepted") } #[test] fn a_write_staged_after_an_accepted_one_gets_a_new_id_and_can_be_accepted() { let (_dir, store) = setup("review-ids-accepted"); assert_eq!(stage(&store, "a"), waiting_as("p-2026-09-24-0001")); review::accept(&store, "p-2026-09-24-0001", now()).unwrap(); assert_eq!(stage(&store, "b"), waiting_as("p-2026-09-24-0002")); let listed = review::list(&store).unwrap(); assert_eq!(listed.lines().count(), 1, "{listed}"); assert!( listed.starts_with("p-2026-09-24-0002 mm-s1 {"), "{listed}" ); review::accept(&store, "p-2026-09-24-0002", now()).unwrap(); assert_eq!(store.entries(MemoryFile::Memory).unwrap(), ["a", "b"]); } #[test] fn ids_count_every_write_staged_that_day_waiting_or_done() { let (_dir, store) = setup("review-ids-mixed"); stage(&store, "a"); stage(&store, "b"); stage(&store, "c"); review::reject(&store, "p-2026-09-24-0001", now()).unwrap(); review::accept(&store, "p-2026-09-24-0003", now()).unwrap(); assert_eq!(stage(&store, "d"), waiting_as("p-2026-09-24-0004")); let listed = review::list(&store).unwrap(); let ids: Vec<&str> = listed .lines() .filter_map(|line| line.split(" ").next()) .collect(); assert_eq!(ids, ["p-2026-09-24-0002", "p-2026-09-24-0004"], "{listed}"); }