#![cfg(test)] use crate::implementation::DatabaseImpl; use crate::queries::Database; use salsa::Database as _Database; #[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 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.salsa_runtime().next_revision(); // 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 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.salsa_runtime().next_revision(); // 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); }