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}