diff options
Diffstat (limited to 'third_party/rust/linked-hash-map/tests/test.rs')
-rw-r--r-- | third_party/rust/linked-hash-map/tests/test.rs | 426 |
1 files changed, 426 insertions, 0 deletions
diff --git a/third_party/rust/linked-hash-map/tests/test.rs b/third_party/rust/linked-hash-map/tests/test.rs new file mode 100644 index 0000000000..7f34b018eb --- /dev/null +++ b/third_party/rust/linked-hash-map/tests/test.rs @@ -0,0 +1,426 @@ +extern crate linked_hash_map; + +use linked_hash_map::{LinkedHashMap, Entry}; + +fn assert_opt_eq<V: PartialEq>(opt: Option<&V>, v: V) { + assert!(opt.is_some()); + assert!(opt.unwrap() == &v); +} + +#[test] +fn test_insert_and_get() { + let mut map = LinkedHashMap::new(); + map.insert(1, 10); + map.insert(2, 20); + assert_opt_eq(map.get(&1), 10); + assert_opt_eq(map.get(&2), 20); + assert_eq!(map.len(), 2); +} + +#[test] +fn test_index() { + let mut map = LinkedHashMap::new(); + map.insert(1, 10); + map.insert(2, 20); + assert_eq!(10, map[&1]); + map[&2] = 22; + assert_eq!(22, map[&2]); +} + +#[test] +fn test_insert_update() { + let mut map = LinkedHashMap::new(); + map.insert("1".to_string(), vec![10, 10]); + map.insert("1".to_string(), vec![10, 19]); + assert_opt_eq(map.get(&"1".to_string()), vec![10, 19]); + assert_eq!(map.len(), 1); +} + +#[test] +fn test_entry_insert_vacant() { + let mut map = LinkedHashMap::new(); + match map.entry("1".to_string()) { + Entry::Vacant(e) => { + assert_eq!(*e.insert(vec![10, 10]), vec![10, 10]); + } + _ => panic!("fail"), + } + assert!(map.contains_key("1")); + assert_eq!(map["1"], vec![10, 10]); + + match map.entry("1".to_string()) { + Entry::Occupied(mut e) => { + assert_eq!(*e.get(), vec![10, 10]); + assert_eq!(e.insert(vec![10, 16]), vec![10, 10]); + } + _ => panic!("fail"), + } + + assert!(map.contains_key("1")); + assert_eq!(map["1"], vec![10, 16]); + + match map.entry("1".to_string()) { + Entry::Occupied(e) => { + assert_eq!(e.remove(), vec![10, 16]); + } + _ => panic!("fail"), + } +} + +#[test] +fn test_entries_replacing() { + let mut map = LinkedHashMap::new(); + map.insert("a", 10); + + { + let mut iter = map.entries(); + let mut entry = iter.next().unwrap(); + assert_eq!(entry.insert(20), 10); + assert!(iter.next().is_none()); + } + + assert_eq!(map["a"], 20); +} + +#[test] +fn test_entries_remove() { + let mut map = LinkedHashMap::new(); + map.insert("a", 10); + map.insert("b", 20); + map.insert("c", 30); + map.insert("d", 40); + + // remove middle + { + let mut iter = map.entries(); + iter.next().unwrap(); + let b = iter.next().unwrap(); + assert_eq!(*b.key(), "b"); + assert_eq!(b.remove(), 20); + assert_eq!(*iter.next().unwrap().key(), "c"); + } + + assert_eq!(map.len(), 3); + assert_eq!(map["a"], 10); + assert_eq!(map["c"], 30); + assert_eq!(map["d"], 40); + + // remove first + { + let mut iter = map.entries(); + let a = iter.next().unwrap(); + assert_eq!(*a.key(), "a"); + assert_eq!(a.remove(), 10); + } + + assert_eq!(map.len(), 2); + assert_eq!(map["c"], 30); + assert_eq!(map["d"], 40); + + // remove last + { + let mut iter = map.entries(); + iter.next().unwrap(); + let d = iter.next().unwrap(); + assert_eq!(*d.key(), "d"); + assert_eq!(d.remove(), 40); + assert!(iter.next().is_none()); + } + + assert_eq!(map.len(), 1); + assert_eq!(map["c"], 30); + + // remove only + { + let mut iter = map.entries(); + let c = iter.next().unwrap(); + assert_eq!(*c.key(), "c"); + assert_eq!(c.remove(), 30); + } + + assert!(map.is_empty()); +} +#[test] +fn entries_insert() { + let mut map = LinkedHashMap::new(); + map.insert(0, 0); + map.insert(1, 1); + + let mut iter = map.entries(); + + iter.next().unwrap().insert(0); + iter.next().unwrap(); // 1 + assert!(iter.next().is_none()); +} + +#[test] +fn test_debug() { + let mut map = LinkedHashMap::new(); + assert_eq!(format!("{:?}", map), "{}"); + map.insert(1, 10); + map.insert(2, 20); + map.insert(3, 30); + assert_eq!(format!("{:?}", map), "{1: 10, 2: 20, 3: 30}"); + map.insert(2, 22); + assert_eq!(format!("{:?}", map), "{1: 10, 3: 30, 2: 22}"); + map.get(&3); + assert_eq!(format!("{:?}", map), "{1: 10, 3: 30, 2: 22}"); + map.get_refresh(&mut 3); + assert_eq!(format!("{:?}", map), "{1: 10, 2: 22, 3: 30}"); + map.clear(); + assert_eq!(format!("{:?}", map), "{}"); +} + +#[test] +fn test_remove() { + let mut map = LinkedHashMap::new(); + map.insert(1, 10); + map.insert(2, 20); + map.insert(3, 30); + map.insert(4, 40); + map.insert(5, 50); + map.remove(&3); + map.remove(&4); + assert!(map.get(&3).is_none()); + assert!(map.get(&4).is_none()); + map.insert(6, 60); + map.insert(7, 70); + map.insert(8, 80); + assert_opt_eq(map.get(&6), 60); + assert_opt_eq(map.get(&7), 70); + assert_opt_eq(map.get(&8), 80); +} + + +#[test] +fn test_pop() { + let mut map = LinkedHashMap::new(); + map.insert(1, 10); + map.insert(2, 20); + map.insert(3, 30); + map.insert(4, 40); + map.insert(5, 50); + assert_eq!(map.pop_front(), Some((1, 10))); + assert!(map.get(&1).is_none()); + assert_eq!(map.pop_back(), Some((5, 50))); + assert!(map.get(&5).is_none()); + map.insert(6, 60); + map.insert(7, 70); + map.insert(8, 80); + assert_eq!(map.pop_front(), Some((2, 20))); + assert!(map.get(&2).is_none()); + assert_eq!(map.pop_back(), Some((8, 80))); + assert!(map.get(&8).is_none()); + map.insert(3, 30); + assert_eq!(map.pop_front(), Some((4, 40))); + assert!(map.get(&4).is_none()); + assert_eq!(map.pop_back(), Some((3, 30))); + assert!(map.get(&3).is_none()); +} + +#[test] +fn test_clear() { + let mut map = LinkedHashMap::new(); + map.insert(1, 10); + map.insert(2, 20); + map.clear(); + assert!(map.get(&1).is_none()); + assert!(map.get(&2).is_none()); + assert_eq!(format!("{:?}", map), "{}"); +} + +#[test] +fn test_iter() { + let mut map = LinkedHashMap::new(); + + // empty iter + assert_eq!(None, map.iter().next()); + + map.insert("a", 10); + map.insert("b", 20); + map.insert("c", 30); + + // regular iter + let mut iter = map.iter(); + assert_eq!((&"a", &10), iter.next().unwrap()); + assert_eq!((&"b", &20), iter.next().unwrap()); + assert_eq!((&"c", &30), iter.next().unwrap()); + assert_eq!(None, iter.next()); + assert_eq!(None, iter.next()); + + // reversed iter + let mut rev_iter = map.iter().rev(); + assert_eq!((&"c", &30), rev_iter.next().unwrap()); + assert_eq!((&"b", &20), rev_iter.next().unwrap()); + assert_eq!((&"a", &10), rev_iter.next().unwrap()); + assert_eq!(None, rev_iter.next()); + assert_eq!(None, rev_iter.next()); + + // mixed + let mut mixed_iter = map.iter(); + assert_eq!((&"a", &10), mixed_iter.next().unwrap()); + assert_eq!((&"c", &30), mixed_iter.next_back().unwrap()); + assert_eq!((&"b", &20), mixed_iter.next().unwrap()); + assert_eq!(None, mixed_iter.next()); + assert_eq!(None, mixed_iter.next_back()); +} + +#[test] +fn test_iter_mut() { + let mut map = LinkedHashMap::new(); + map.insert("a", 10); + map.insert("c", 30); + map.insert("b", 20); + + { + let mut iter = map.iter_mut(); + let entry = iter.next().unwrap(); + assert_eq!(&"a", entry.0); + *entry.1 = 17; + + // reverse iterator + let mut iter = iter.rev(); + let entry = iter.next().unwrap(); + assert_eq!(&"b", entry.0); + *entry.1 = 23; + + let entry = iter.next().unwrap(); + assert_eq!(&"c", entry.0); + assert_eq!(None, iter.next()); + assert_eq!(None, iter.next()); + } + + assert_eq!(17, map[&"a"]); + assert_eq!(23, map[&"b"]); +} + +#[test] +fn test_consuming_iter() { + let map = { + let mut map = LinkedHashMap::new(); + map.insert("a", 10); + map.insert("c", 30); + map.insert("b", 20); + map + }; + + let mut iter = map.into_iter(); + assert_eq!(Some(("a", 10)), iter.next()); + + let clone = iter.clone(); + for iter in &mut [iter, clone] { + assert_eq!(Some(("b", 20)), iter.next_back()); + assert_eq!(1, iter.len()); + assert_eq!(Some(("c", 30)), iter.next()); + assert_eq!(None, iter.next()); + } +} + +#[test] +fn test_consuming_iter_empty() { + let map = LinkedHashMap::<&str, i32>::new(); + let mut iter = map.into_iter(); + assert_eq!(None, iter.next()); + let mut clone = iter.clone(); + assert_eq!(None, clone.next()); +} + +#[test] +fn test_consuming_iter_with_free_list() { + let mut map = LinkedHashMap::new(); + map.insert("a", 10); + map.insert("c", 30); + map.insert("b", 20); + map.remove("a"); + map.remove("b"); + + let mut iter = map.into_iter(); + assert_eq!(Some(("c", 30)), iter.next()); + assert_eq!(None, iter.next()); +} + +#[test] +fn test_into_iter_drop() { + struct Counter<'a>(&'a mut usize); + + impl<'a> Drop for Counter<'a> { + fn drop(&mut self) { + *self.0 += 1; + } + } + + let mut a = 0; + let mut b = 0; + let mut c = 0; + + { + let mut map = LinkedHashMap::new(); + map.insert("a", Counter(&mut a)); + map.insert("b", Counter(&mut b)); + map.insert("c", Counter(&mut c)); + + let mut iter = map.into_iter(); + iter.next(); + iter.next_back(); + } + + assert_eq!(a, 1); + assert_eq!(b, 1); + assert_eq!(c, 1); +} + +#[test] +fn test_borrow() { + #[derive(PartialEq, Eq, Hash)] struct Foo(Bar); + #[derive(PartialEq, Eq, Hash)] struct Bar(i32); + + impl ::std::borrow::Borrow<Bar> for Foo { + fn borrow(&self) -> &Bar { &self.0 } + } + + let mut map = LinkedHashMap::new(); + map.insert(Foo(Bar(1)), "a"); + map.insert(Foo(Bar(2)), "b"); + + assert!(map.contains_key(&Bar(1))); + assert!(map.contains_key(&Bar(2))); + assert!(map.contains_key(&Foo(Bar(1)))); + assert!(map.contains_key(&Foo(Bar(2)))); + + assert_eq!(map.get(&Bar(1)), Some(&"a")); + assert_eq!(map.get(&Bar(2)), Some(&"b")); + assert_eq!(map.get(&Foo(Bar(1))), Some(&"a")); + assert_eq!(map.get(&Foo(Bar(2))), Some(&"b")); + + assert_eq!(map.get_refresh(&Bar(1)), Some(&mut "a")); + assert_eq!(map.get_refresh(&Bar(2)), Some(&mut "b")); + assert_eq!(map.get_refresh(&Foo(Bar(1))), Some(&mut "a")); + assert_eq!(map.get_refresh(&Foo(Bar(2))), Some(&mut "b")); + + assert_eq!(map.get_mut(&Bar(1)), Some(&mut "a")); + assert_eq!(map.get_mut(&Bar(2)), Some(&mut "b")); + assert_eq!(map.get_mut(&Foo(Bar(1))), Some(&mut "a")); + assert_eq!(map.get_mut(&Foo(Bar(2))), Some(&mut "b")); + + assert_eq!(map[&Bar(1)], "a"); + assert_eq!(map[&Bar(2)], "b"); + assert_eq!(map[&Foo(Bar(1))], "a"); + assert_eq!(map[&Foo(Bar(2))], "b"); + + assert_eq!(map.remove(&Bar(1)), Some("a")); + assert_eq!(map.remove(&Bar(2)), Some("b")); + assert_eq!(map.remove(&Foo(Bar(1))), None); + assert_eq!(map.remove(&Foo(Bar(2))), None); +} + +#[test] +fn test_send_sync() { + fn is_send_sync<T: Send + Sync>() {} + + is_send_sync::<LinkedHashMap<u32, i32>>(); + is_send_sync::<linked_hash_map::Iter<u32, i32>>(); + is_send_sync::<linked_hash_map::IterMut<u32, i32>>(); + is_send_sync::<linked_hash_map::IntoIter<u32, i32>>(); + is_send_sync::<linked_hash_map::Keys<u32, i32>>(); + is_send_sync::<linked_hash_map::Values<u32, i32>>(); +} |