summaryrefslogtreecommitdiffstats
path: root/third_party/rust/uluru/src/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/uluru/src/tests.rs')
-rw-r--r--third_party/rust/uluru/src/tests.rs216
1 files changed, 216 insertions, 0 deletions
diff --git a/third_party/rust/uluru/src/tests.rs b/third_party/rust/uluru/src/tests.rs
new file mode 100644
index 0000000000..978e129449
--- /dev/null
+++ b/third_party/rust/uluru/src/tests.rs
@@ -0,0 +1,216 @@
+extern crate std;
+
+use self::std::vec::Vec;
+use super::*;
+
+type TestCache = LRUCache<i32, 4>;
+
+/// Convenience function for test assertions
+fn items<T, const N: usize>(cache: &mut LRUCache<T, N>) -> Vec<T>
+where
+ T: Clone,
+{
+ let mut v = Vec::new();
+ let mut iter = cache.iter_mut();
+ while let Some((_idx, val)) = iter.next() {
+ v.push(val.clone())
+ }
+ v
+}
+
+#[test]
+fn empty() {
+ let mut cache = TestCache::default();
+ assert_eq!(cache.is_empty(), true);
+ assert_eq!(items(&mut cache), []);
+ cache.insert(1);
+ assert_eq!(cache.is_empty(), false);
+}
+
+#[test]
+fn len() {
+ let mut cache = TestCache::default();
+ cache.insert(1);
+ assert_eq!(cache.len(), 1);
+ assert_eq!(items(&mut cache), [1]);
+}
+
+#[test]
+fn insert() {
+ let mut cache = TestCache::default();
+ cache.insert(1);
+ assert_eq!(cache.len(), 1);
+ cache.insert(2);
+ assert_eq!(cache.len(), 2);
+ cache.insert(3);
+ assert_eq!(cache.len(), 3);
+ cache.insert(4);
+ assert_eq!(cache.len(), 4);
+ assert_eq!(
+ items(&mut cache),
+ [4, 3, 2, 1],
+ "Ordered from most- to least-recent."
+ );
+
+ cache.insert(5);
+ assert_eq!(cache.len(), 4);
+ assert_eq!(
+ items(&mut cache),
+ [5, 4, 3, 2],
+ "Least-recently-used item evicted."
+ );
+
+ cache.insert(6);
+ cache.insert(7);
+ cache.insert(8);
+ cache.insert(9);
+ assert_eq!(
+ items(&mut cache),
+ [9, 8, 7, 6],
+ "Least-recently-used item evicted."
+ );
+}
+
+#[test]
+fn lookup() {
+ let mut cache = TestCache::default();
+ cache.insert(1);
+ cache.insert(2);
+ cache.insert(3);
+ cache.insert(4);
+
+ let result = cache.lookup(|x| if *x == 5 { Some(()) } else { None });
+ assert_eq!(result, None, "Cache miss.");
+ assert_eq!(items(&mut cache), [4, 3, 2, 1], "Order not changed.");
+
+ // Cache hit
+ let result = cache.lookup(|x| if *x == 3 { Some(*x * 2) } else { None });
+ assert_eq!(result, Some(6), "Cache hit.");
+ assert_eq!(
+ items(&mut cache),
+ [3, 4, 2, 1],
+ "Matching item moved to front."
+ );
+}
+
+#[test]
+fn clear() {
+ let mut cache = TestCache::default();
+ cache.insert(1);
+ cache.clear();
+ assert_eq!(items(&mut cache), [], "all items evicted");
+
+ cache.insert(1);
+ cache.insert(2);
+ cache.insert(3);
+ cache.insert(4);
+ assert_eq!(items(&mut cache), [4, 3, 2, 1]);
+ cache.clear();
+ assert_eq!(items(&mut cache), [], "all items evicted again");
+}
+
+#[test]
+fn touch() {
+ let mut cache = TestCache::default();
+
+ cache.insert(0);
+ cache.insert(1);
+ cache.insert(2);
+ cache.insert(3);
+
+ cache.touch(|x| *x == 5);
+
+ assert_eq!(items(&mut cache), [3, 2, 1, 0], "Nothing is touched.");
+
+ cache.touch(|x| *x == 1);
+
+ assert_eq!(
+ items(&mut cache),
+ [1, 3, 2, 0],
+ "Touched item is moved to front."
+ );
+}
+
+#[test]
+fn find() {
+ let mut cache = TestCache::default();
+
+ cache.insert(0);
+ cache.insert(1);
+ cache.insert(2);
+ cache.insert(3);
+
+ let result = cache.find(|x| *x == 5).copied();
+
+ assert_eq!(result, None);
+ assert_eq!(items(&mut cache), [3, 2, 1, 0], "Nothing is touched.");
+
+ let result = cache.find(|x| *x == 1).copied();
+
+ assert_eq!(result, Some(1));
+ assert_eq!(
+ items(&mut cache),
+ [1, 3, 2, 0],
+ "Retrieved item is moved to front."
+ );
+}
+
+#[test]
+fn front() {
+ let mut cache = TestCache::default();
+
+ assert_eq!(cache.front(), None, "Nothing is in the front.");
+
+ cache.insert(0);
+ cache.insert(1);
+
+ assert_eq!(
+ cache.front(),
+ Some(&1),
+ "The last inserted item should be in the front."
+ );
+
+ cache.touch(|x| *x == 0);
+
+ assert_eq!(
+ cache.front(),
+ Some(&0),
+ "Touched item should be in the front."
+ );
+}
+
+#[test]
+fn get() {
+ let mut cache = TestCache::default();
+
+ assert_eq!(cache.get(0), None, "Nothing at index 0.");
+
+ cache.insert(42);
+ cache.insert(64);
+
+ assert_eq!(
+ cache.get(0),
+ Some(&64),
+ "The last inserted item should be at index 0."
+ );
+
+ assert_eq!(
+ cache.get(1),
+ Some(&42),
+ "The first inserted item should be at index 1."
+ );
+
+ cache.touch(|x| *x == 42);
+
+ assert_eq!(
+ cache.get(0),
+ Some(&42),
+ "The last touched item should be at index 0."
+ );
+
+ assert_eq!(
+ cache.get(1),
+ Some(&64),
+ "The previously front item should be at index 1."
+ );
+}