use crate::implementation::{TestContext, TestContextImpl}; #[salsa::query_group(MemoizedInputs)] pub(crate) trait MemoizedInputsContext: TestContext { fn max(&self) -> usize; #[salsa::input] fn input1(&self) -> usize; #[salsa::input] fn input2(&self) -> usize; } fn max(db: &dyn MemoizedInputsContext) -> usize { db.log().add("Max invoked"); std::cmp::max(db.input1(), db.input2()) } #[test] fn revalidate() { let db = &mut TestContextImpl::default(); db.set_input1(0); db.set_input2(0); let v = db.max(); assert_eq!(v, 0); db.assert_log(&["Max invoked"]); let v = db.max(); assert_eq!(v, 0); db.assert_log(&[]); db.set_input1(44); db.assert_log(&[]); let v = db.max(); assert_eq!(v, 44); db.assert_log(&["Max invoked"]); let v = db.max(); assert_eq!(v, 44); db.assert_log(&[]); db.set_input1(44); db.assert_log(&[]); db.set_input2(66); db.assert_log(&[]); db.set_input1(64); db.assert_log(&[]); let v = db.max(); assert_eq!(v, 66); db.assert_log(&["Max invoked"]); let v = db.max(); assert_eq!(v, 66); db.assert_log(&[]); } /// Test that invoking `set` on an input with the same value still /// triggers a new revision. #[test] fn set_after_no_change() { let db = &mut TestContextImpl::default(); db.set_input2(0); db.set_input1(44); let v = db.max(); assert_eq!(v, 44); db.assert_log(&["Max invoked"]); db.set_input1(44); let v = db.max(); assert_eq!(v, 44); db.assert_log(&["Max invoked"]); }