2 collections::{BTreeMap, btree_map::Entry::{Occupied, Vacant}},
3 ops::Bound::{self, Excluded, Included, Unbounded},
8 use super::DeterministicRng;
11 fn test_basic_large() {
12 let mut map = BTreeMap::new();
14 assert_eq!(map.len(), 0);
17 assert_eq!(map.insert(i, 10 * i), None);
18 assert_eq!(map.len(), i + 1);
22 assert_eq!(map.get(&i).unwrap(), &(i * 10));
25 for i in size..size * 2 {
26 assert_eq!(map.get(&i), None);
30 assert_eq!(map.insert(i, 100 * i), Some(10 * i));
31 assert_eq!(map.len(), size);
35 assert_eq!(map.get(&i).unwrap(), &(i * 100));
38 for i in 0..size / 2 {
39 assert_eq!(map.remove(&(i * 2)), Some(i * 200));
40 assert_eq!(map.len(), size - i - 1);
43 for i in 0..size / 2 {
44 assert_eq!(map.get(&(2 * i)), None);
45 assert_eq!(map.get(&(2 * i + 1)).unwrap(), &(i * 200 + 100));
48 for i in 0..size / 2 {
49 assert_eq!(map.remove(&(2 * i)), None);
50 assert_eq!(map.remove(&(2 * i + 1)), Some(i * 200 + 100));
51 assert_eq!(map.len(), size / 2 - i - 1);
56 fn test_basic_small() {
57 let mut map = BTreeMap::new();
58 assert_eq!(map.remove(&1), None);
59 assert_eq!(map.get(&1), None);
60 assert_eq!(map.insert(1, 1), None);
61 assert_eq!(map.get(&1), Some(&1));
62 assert_eq!(map.insert(1, 2), Some(1));
63 assert_eq!(map.get(&1), Some(&2));
64 assert_eq!(map.insert(2, 4), None);
65 assert_eq!(map.get(&2), Some(&4));
66 assert_eq!(map.remove(&1), Some(2));
67 assert_eq!(map.remove(&2), Some(4));
68 assert_eq!(map.remove(&1), None);
76 let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
78 fn test<T>(size: usize, mut iter: T)
79 where T: Iterator<Item = (usize, usize)>
82 assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
83 assert_eq!(iter.next().unwrap(), (i, i));
85 assert_eq!(iter.size_hint(), (0, Some(0)));
86 assert_eq!(iter.next(), None);
88 test(size, map.iter().map(|(&k, &v)| (k, v)));
89 test(size, map.iter_mut().map(|(&k, &mut v)| (k, v)));
90 test(size, map.into_iter());
98 let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
100 fn test<T>(size: usize, mut iter: T)
101 where T: Iterator<Item = (usize, usize)>
104 assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
105 assert_eq!(iter.next().unwrap(), (size - i - 1, size - i - 1));
107 assert_eq!(iter.size_hint(), (0, Some(0)));
108 assert_eq!(iter.next(), None);
110 test(size, map.iter().rev().map(|(&k, &v)| (k, v)));
111 test(size, map.iter_mut().rev().map(|(&k, &mut v)| (k, v)));
112 test(size, map.into_iter().rev());
116 fn test_values_mut() {
117 let mut a = BTreeMap::new();
118 a.insert(1, String::from("hello"));
119 a.insert(2, String::from("goodbye"));
121 for value in a.values_mut() {
125 let values: Vec<String> = a.values().cloned().collect();
126 assert_eq!(values, [String::from("hello!"), String::from("goodbye!")]);
130 fn test_iter_mixed() {
134 let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
136 fn test<T>(size: usize, mut iter: T)
137 where T: Iterator<Item = (usize, usize)> + DoubleEndedIterator
139 for i in 0..size / 4 {
140 assert_eq!(iter.size_hint(), (size - i * 2, Some(size - i * 2)));
141 assert_eq!(iter.next().unwrap(), (i, i));
142 assert_eq!(iter.next_back().unwrap(), (size - i - 1, size - i - 1));
144 for i in size / 4..size * 3 / 4 {
145 assert_eq!(iter.size_hint(), (size * 3 / 4 - i, Some(size * 3 / 4 - i)));
146 assert_eq!(iter.next().unwrap(), (i, i));
148 assert_eq!(iter.size_hint(), (0, Some(0)));
149 assert_eq!(iter.next(), None);
151 test(size, map.iter().map(|(&k, &v)| (k, v)));
152 test(size, map.iter_mut().map(|(&k, &mut v)| (k, v)));
153 test(size, map.into_iter());
157 fn test_range_small() {
161 let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
164 for ((&k, &v), i) in map.range(2..).zip(2..size) {
169 assert_eq!(j, size - 2);
173 fn test_range_inclusive() {
176 let map: BTreeMap<_, _> = (0..=size).map(|i| (i, i)).collect();
178 fn check<'a, L, R>(lhs: L, rhs: R)
179 where L: IntoIterator<Item=(&'a i32, &'a i32)>,
180 R: IntoIterator<Item=(&'a i32, &'a i32)>,
182 let lhs: Vec<_> = lhs.into_iter().collect();
183 let rhs: Vec<_> = rhs.into_iter().collect();
184 assert_eq!(lhs, rhs);
187 check(map.range(size + 1..=size + 1), vec![]);
188 check(map.range(size..=size), vec![(&size, &size)]);
189 check(map.range(size..=size + 1), vec![(&size, &size)]);
190 check(map.range(0..=0), vec![(&0, &0)]);
191 check(map.range(0..=size - 1), map.range(..size));
192 check(map.range(-1..=-1), vec![]);
193 check(map.range(-1..=size), map.range(..));
194 check(map.range(..=size), map.range(..));
195 check(map.range(..=200), map.range(..201));
196 check(map.range(5..=8), vec![(&5, &5), (&6, &6), (&7, &7), (&8, &8)]);
197 check(map.range(-1..=0), vec![(&0, &0)]);
198 check(map.range(-1..=2), vec![(&0, &0), (&1, &1), (&2, &2)]);
202 fn test_range_inclusive_max_value() {
203 let max = std::usize::MAX;
204 let map: BTreeMap<_, _> = vec![(max, 0)].into_iter().collect();
206 assert_eq!(map.range(max..=max).collect::<Vec<_>>(), &[(&max, &0)]);
210 fn test_range_equal_empty_cases() {
211 let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
212 assert_eq!(map.range((Included(2), Excluded(2))).next(), None);
213 assert_eq!(map.range((Excluded(2), Included(2))).next(), None);
218 fn test_range_equal_excluded() {
219 let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
220 map.range((Excluded(2), Excluded(2)));
225 fn test_range_backwards_1() {
226 let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
227 map.range((Included(3), Included(2)));
232 fn test_range_backwards_2() {
233 let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
234 map.range((Included(3), Excluded(2)));
239 fn test_range_backwards_3() {
240 let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
241 map.range((Excluded(3), Included(2)));
246 fn test_range_backwards_4() {
247 let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
248 map.range((Excluded(3), Excluded(2)));
252 fn test_range_1000() {
254 let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
256 fn test(map: &BTreeMap<u32, u32>, size: u32, min: Bound<&u32>, max: Bound<&u32>) {
257 let mut kvs = map.range((min, max)).map(|(&k, &v)| (k, v));
258 let mut pairs = (0..size).map(|i| (i, i));
260 for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
261 assert_eq!(kv, pair);
263 assert_eq!(kvs.next(), None);
264 assert_eq!(pairs.next(), None);
266 test(&map, size, Included(&0), Excluded(&size));
267 test(&map, size, Unbounded, Excluded(&size));
268 test(&map, size, Included(&0), Included(&(size - 1)));
269 test(&map, size, Unbounded, Included(&(size - 1)));
270 test(&map, size, Included(&0), Unbounded);
271 test(&map, size, Unbounded, Unbounded);
275 fn test_range_borrowed_key() {
276 let mut map = BTreeMap::new();
277 map.insert("aardvark".to_string(), 1);
278 map.insert("baboon".to_string(), 2);
279 map.insert("coyote".to_string(), 3);
280 map.insert("dingo".to_string(), 4);
281 // NOTE: would like to use simply "b".."d" here...
282 let mut iter = map.range::<str, _>((Included("b"),Excluded("d")));
283 assert_eq!(iter.next(), Some((&"baboon".to_string(), &2)));
284 assert_eq!(iter.next(), Some((&"coyote".to_string(), &3)));
285 assert_eq!(iter.next(), None);
291 let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
295 let mut kvs = map.range((Included(&i), Included(&j))).map(|(&k, &v)| (k, v));
296 let mut pairs = (i..=j).map(|i| (i, i));
298 for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
299 assert_eq!(kv, pair);
301 assert_eq!(kvs.next(), None);
302 assert_eq!(pairs.next(), None);
308 fn test_range_mut() {
310 let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
314 let mut kvs = map.range_mut((Included(&i), Included(&j))).map(|(&k, &mut v)| (k, v));
315 let mut pairs = (i..=j).map(|i| (i, i));
317 for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
318 assert_eq!(kv, pair);
320 assert_eq!(kvs.next(), None);
321 assert_eq!(pairs.next(), None);
328 // make sure these compile -- using the Borrow trait
330 let mut map = BTreeMap::new();
331 map.insert("0".to_string(), 1);
332 assert_eq!(map["0"], 1);
336 let mut map = BTreeMap::new();
337 map.insert(Box::new(0), 1);
338 assert_eq!(map[&0], 1);
342 let mut map = BTreeMap::new();
343 map.insert(Box::new([0, 1]) as Box<[i32]>, 1);
344 assert_eq!(map[&[0, 1][..]], 1);
348 let mut map = BTreeMap::new();
349 map.insert(Rc::new(0), 1);
350 assert_eq!(map[&0], 1);
356 let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
358 let mut map: BTreeMap<_, _> = xs.iter().cloned().collect();
360 // Existing key (insert)
362 Vacant(_) => unreachable!(),
363 Occupied(mut view) => {
364 assert_eq!(view.get(), &10);
365 assert_eq!(view.insert(100), 10);
368 assert_eq!(map.get(&1).unwrap(), &100);
369 assert_eq!(map.len(), 6);
372 // Existing key (update)
374 Vacant(_) => unreachable!(),
375 Occupied(mut view) => {
376 let v = view.get_mut();
380 assert_eq!(map.get(&2).unwrap(), &200);
381 assert_eq!(map.len(), 6);
383 // Existing key (take)
385 Vacant(_) => unreachable!(),
387 assert_eq!(view.remove(), 30);
390 assert_eq!(map.get(&3), None);
391 assert_eq!(map.len(), 5);
394 // Inexistent key (insert)
395 match map.entry(10) {
396 Occupied(_) => unreachable!(),
398 assert_eq!(*view.insert(1000), 1000);
401 assert_eq!(map.get(&10).unwrap(), &1000);
402 assert_eq!(map.len(), 6);
406 fn test_extend_ref() {
407 let mut a = BTreeMap::new();
409 let mut b = BTreeMap::new();
411 b.insert(3, "three");
415 assert_eq!(a.len(), 3);
416 assert_eq!(a[&1], "one");
417 assert_eq!(a[&2], "two");
418 assert_eq!(a[&3], "three");
423 let mut m = BTreeMap::new();
424 assert_eq!(m.len(), 0);
426 assert_eq!(m.insert((), ()), None);
427 assert_eq!(m.len(), 1);
429 assert_eq!(m.insert((), ()), Some(()));
430 assert_eq!(m.len(), 1);
431 assert_eq!(m.iter().count(), 1);
434 assert_eq!(m.len(), 0);
440 assert_eq!(m.len(), 1);
441 assert_eq!(m.iter().count(), 1);
444 // This test's only purpose is to ensure that zero-sized keys with nonsensical orderings
445 // do not cause segfaults when used with zero-sized values. All other map behavior is
449 use std::cmp::Ordering;
453 impl PartialEq for Bad {
454 fn eq(&self, _: &Self) -> bool {
461 impl PartialOrd for Bad {
462 fn partial_cmp(&self, _: &Self) -> Option<Ordering> {
468 fn cmp(&self, _: &Self) -> Ordering {
473 let mut m = BTreeMap::new();
482 let mut map = BTreeMap::new();
484 assert_eq!(map.len(), 0);
487 assert_eq!(map.insert(i, 10 * i), None);
488 assert_eq!(map.len(), i + 1);
489 assert_eq!(map, map.clone());
493 assert_eq!(map.insert(i, 100 * i), Some(10 * i));
494 assert_eq!(map.len(), size);
495 assert_eq!(map, map.clone());
498 for i in 0..size / 2 {
499 assert_eq!(map.remove(&(i * 2)), Some(i * 200));
500 assert_eq!(map.len(), size - i - 1);
501 assert_eq!(map, map.clone());
504 for i in 0..size / 2 {
505 assert_eq!(map.remove(&(2 * i)), None);
506 assert_eq!(map.remove(&(2 * i + 1)), Some(i * 200 + 100));
507 assert_eq!(map.len(), size / 2 - i - 1);
508 assert_eq!(map, map.clone());
515 use std::collections::btree_map::{Iter, IntoIter, Range, Keys, Values};
517 fn map_key<'new>(v: BTreeMap<&'static str, ()>) -> BTreeMap<&'new str, ()> {
520 fn map_val<'new>(v: BTreeMap<(), &'static str>) -> BTreeMap<(), &'new str> {
523 fn iter_key<'a, 'new>(v: Iter<'a, &'static str, ()>) -> Iter<'a, &'new str, ()> {
526 fn iter_val<'a, 'new>(v: Iter<'a, (), &'static str>) -> Iter<'a, (), &'new str> {
529 fn into_iter_key<'new>(v: IntoIter<&'static str, ()>) -> IntoIter<&'new str, ()> {
532 fn into_iter_val<'new>(v: IntoIter<(), &'static str>) -> IntoIter<(), &'new str> {
535 fn range_key<'a, 'new>(v: Range<'a, &'static str, ()>) -> Range<'a, &'new str, ()> {
538 fn range_val<'a, 'new>(v: Range<'a, (), &'static str>) -> Range<'a, (), &'new str> {
541 fn keys<'a, 'new>(v: Keys<'a, &'static str, ()>) -> Keys<'a, &'new str, ()> {
544 fn vals<'a, 'new>(v: Values<'a, (), &'static str>) -> Values<'a, (), &'new str> {
550 fn test_occupied_entry_key() {
551 let mut a = BTreeMap::new();
552 let key = "hello there";
553 let value = "value goes here";
554 assert!(a.is_empty());
555 a.insert(key.clone(), value.clone());
556 assert_eq!(a.len(), 1);
557 assert_eq!(a[key], value);
559 match a.entry(key.clone()) {
560 Vacant(_) => panic!(),
561 Occupied(e) => assert_eq!(key, *e.key()),
563 assert_eq!(a.len(), 1);
564 assert_eq!(a[key], value);
568 fn test_vacant_entry_key() {
569 let mut a = BTreeMap::new();
570 let key = "hello there";
571 let value = "value goes here";
573 assert!(a.is_empty());
574 match a.entry(key.clone()) {
575 Occupied(_) => panic!(),
577 assert_eq!(key, *e.key());
578 e.insert(value.clone());
581 assert_eq!(a.len(), 1);
582 assert_eq!(a[key], value);
585 macro_rules! create_append_test {
586 ($name:ident, $len:expr) => {
589 let mut a = BTreeMap::new();
594 let mut b = BTreeMap::new();
601 assert_eq!(a.len(), $len);
602 assert_eq!(b.len(), 0);
606 assert_eq!(a[&i], i);
608 assert_eq!(a[&i], 2*i);
612 assert_eq!(a.remove(&($len-1)), Some(2*($len-1)));
613 assert_eq!(a.insert($len-1, 20), None);
618 // These are mostly for testing the algorithm that "fixes" the right edge after insertion.
620 create_append_test!(test_append_9, 9);
621 // Two leafs that don't need fixing.
622 create_append_test!(test_append_17, 17);
623 // Two leafs where the second one ends up underfull and needs stealing at the end.
624 create_append_test!(test_append_14, 14);
625 // Two leafs where the second one ends up empty because the insertion finished at the root.
626 create_append_test!(test_append_12, 12);
627 // Three levels; insertion finished at the root.
628 create_append_test!(test_append_144, 144);
629 // Three levels; insertion finished at leaf while there is an empty node on the second level.
630 create_append_test!(test_append_145, 145);
631 // Tests for several randomly chosen sizes.
632 create_append_test!(test_append_170, 170);
633 create_append_test!(test_append_181, 181);
634 create_append_test!(test_append_239, 239);
635 create_append_test!(test_append_1700, 1700);
637 fn rand_data(len: usize) -> Vec<(u32, u32)> {
638 let mut rng = DeterministicRng::new();
639 Vec::from_iter((0..len).map(|_| (rng.next(), rng.next())))
643 fn test_split_off_empty_right() {
644 let mut data = rand_data(173);
646 let mut map = BTreeMap::from_iter(data.clone());
647 let right = map.split_off(&(data.iter().max().unwrap().0 + 1));
650 assert!(map.into_iter().eq(data));
651 assert!(right.into_iter().eq(None));
655 fn test_split_off_empty_left() {
656 let mut data = rand_data(314);
658 let mut map = BTreeMap::from_iter(data.clone());
659 let right = map.split_off(&data.iter().min().unwrap().0);
662 assert!(map.into_iter().eq(None));
663 assert!(right.into_iter().eq(data));
667 fn test_split_off_large_random_sorted() {
668 let mut data = rand_data(1529);
669 // special case with maximum height.
672 let mut map = BTreeMap::from_iter(data.clone());
673 let key = data[data.len() / 2].0;
674 let right = map.split_off(&key);
676 assert!(map.into_iter().eq(data.clone().into_iter().filter(|x| x.0 < key)));
677 assert!(right.into_iter().eq(data.into_iter().filter(|x| x.0 >= key)));