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
#![cfg(test)]

use crate::implementation::DatabaseImpl;
use crate::queries::Database;
use salsa::Database as _Database;
use salsa::Durability;

#[test]
fn memoized_twice() {
    let db = DatabaseImpl::default();
    let v1 = db.memoized();
    let v2 = db.memoized();
    assert_eq!(v1, v2);
}

#[test]
fn volatile_twice() {
    let mut db = DatabaseImpl::default();
    let v1 = db.volatile();
    let v2 = db.volatile(); // volatiles are cached, so 2nd read returns the same
    assert_eq!(v1, v2);

    db.synthetic_write(Durability::LOW); // clears volatile caches

    let v3 = db.volatile(); // will re-increment the counter
    let v4 = db.volatile(); // second call will be cached
    assert_eq!(v1 + 1, v3);
    assert_eq!(v3, v4);
}

#[test]
fn intermingled() {
    let mut db = DatabaseImpl::default();
    let v1 = db.volatile();
    let v2 = db.memoized();
    let v3 = db.volatile(); // cached
    let v4 = db.memoized(); // cached

    assert_eq!(v1, v2);
    assert_eq!(v1, v3);
    assert_eq!(v2, v4);

    db.synthetic_write(Durability::LOW); // clears volatile caches

    let v5 = db.memoized(); // re-executes volatile, caches new result
    let v6 = db.memoized(); // re-use cached result
    assert_eq!(v4 + 1, v5);
    assert_eq!(v5, v6);
}