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"]); | |
} |