Unnamed repository; edit this file 'description' to name the repository.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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"]);
}