vecmap_tests.rs

 1//! Tests for the VecMap collection.
 2//!
 3//! This is in a sibling module so that the tests are guaranteed to only cover
 4//! states that can be created by the public API.
 5
 6use crate::vecmap::*;
 7
 8#[test]
 9fn test_entry_vacant_or_insert() {
10    let mut map: VecMap<&str, i32> = VecMap::new();
11    let value = map.entry("a").or_insert(1);
12    assert_eq!(*value, 1);
13    assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&"a", &1)]);
14}
15
16#[test]
17fn test_entry_occupied_or_insert_keeps_existing() {
18    let mut map: VecMap<&str, i32> = VecMap::new();
19    map.entry("a").or_insert(1);
20    let value = map.entry("a").or_insert(99);
21    assert_eq!(*value, 1);
22    assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&"a", &1)]);
23}
24
25#[test]
26fn test_entry_or_insert_with() {
27    let mut map: VecMap<&str, i32> = VecMap::new();
28    map.entry("a").or_insert_with(|| 42);
29    assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&"a", &42)]);
30}
31
32#[test]
33fn test_entry_or_insert_with_not_called_when_occupied() {
34    let mut map: VecMap<&str, i32> = VecMap::new();
35    map.entry("a").or_insert(1);
36    map.entry("a")
37        .or_insert_with(|| panic!("should not be called"));
38    assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&"a", &1)]);
39}
40
41#[test]
42fn test_entry_or_insert_with_key() {
43    let mut map: VecMap<&str, String> = VecMap::new();
44    map.entry("hello").or_insert_with_key(|k| k.to_uppercase());
45    assert_eq!(
46        map.iter().collect::<Vec<_>>(),
47        vec![(&"hello", &"HELLO".to_string())]
48    );
49}
50
51#[test]
52fn test_entry_or_insert_default() {
53    let mut map: VecMap<&str, i32> = VecMap::new();
54    map.entry("a").or_insert_default();
55    assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&"a", &0)]);
56}
57
58#[test]
59fn test_entry_key() {
60    let mut map: VecMap<&str, i32> = VecMap::new();
61    assert_eq!(*map.entry("a").key(), "a");
62    map.entry("a").or_insert(1);
63    assert_eq!(*map.entry("a").key(), "a");
64}
65
66#[test]
67fn test_entry_mut_ref_can_be_updated() {
68    let mut map: VecMap<&str, i32> = VecMap::new();
69    let value = map.entry("a").or_insert(0);
70    *value = 5;
71    assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&"a", &5)]);
72}
73
74#[test]
75fn test_insertion_order_preserved() {
76    let mut map: VecMap<&str, i32> = VecMap::new();
77    map.entry("b").or_insert(2);
78    map.entry("a").or_insert(1);
79    map.entry("c").or_insert(3);
80    assert_eq!(
81        map.iter().collect::<Vec<_>>(),
82        vec![(&"b", &2), (&"a", &1), (&"c", &3)]
83    );
84}
85
86#[test]
87fn test_multiple_entries_independent() {
88    let mut map: VecMap<i32, i32> = VecMap::new();
89    map.entry(1).or_insert(10);
90    map.entry(2).or_insert(20);
91    map.entry(3).or_insert(30);
92    assert_eq!(map.iter().count(), 3);
93    // Re-inserting does not duplicate keys
94    map.entry(1).or_insert(99);
95    assert_eq!(map.iter().count(), 3);
96}