]> git.lizzy.rs Git - rust.git/blob - library/alloc/src/collections/btree/map/tests.rs
Rollup merge of #89433 - arlosi:stdin-fix, r=joshtriplett
[rust.git] / library / alloc / src / collections / btree / map / tests.rs
1 use super::super::testing::crash_test::{CrashTestDummy, Panic};
2 use super::super::testing::ord_chaos::{Cyclic3, Governed, Governor};
3 use super::super::testing::rng::DeterministicRng;
4 use super::Entry::{Occupied, Vacant};
5 use super::*;
6 use crate::boxed::Box;
7 use crate::fmt::Debug;
8 use crate::rc::Rc;
9 use crate::string::{String, ToString};
10 use crate::vec::Vec;
11 use std::cmp::Ordering;
12 use std::convert::TryFrom;
13 use std::iter::{self, FromIterator};
14 use std::mem;
15 use std::ops::Bound::{self, Excluded, Included, Unbounded};
16 use std::ops::RangeBounds;
17 use std::panic::{catch_unwind, AssertUnwindSafe};
18 use std::sync::atomic::{AtomicUsize, Ordering::SeqCst};
19
20 // Capacity of a tree with a single level,
21 // i.e., a tree who's root is a leaf node at height 0.
22 const NODE_CAPACITY: usize = node::CAPACITY;
23
24 // Minimum number of elements to insert, to guarantee a tree with 2 levels,
25 // i.e., a tree who's root is an internal node at height 1, with edges to leaf nodes.
26 // It's not the minimum size: removing an element from such a tree does not always reduce height.
27 const MIN_INSERTS_HEIGHT_1: usize = NODE_CAPACITY + 1;
28
29 // Minimum number of elements to insert in ascending order, to guarantee a tree with 3 levels,
30 // i.e., a tree who's root is an internal node at height 2, with edges to more internal nodes.
31 // It's not the minimum size: removing an element from such a tree does not always reduce height.
32 const MIN_INSERTS_HEIGHT_2: usize = 89;
33
34 // Gathers all references from a mutable iterator and makes sure Miri notices if
35 // using them is dangerous.
36 fn test_all_refs<'a, T: 'a>(dummy: &mut T, iter: impl Iterator<Item = &'a mut T>) {
37     // Gather all those references.
38     let mut refs: Vec<&mut T> = iter.collect();
39     // Use them all. Twice, to be sure we got all interleavings.
40     for r in refs.iter_mut() {
41         mem::swap(dummy, r);
42     }
43     for r in refs {
44         mem::swap(dummy, r);
45     }
46 }
47
48 impl<K, V> BTreeMap<K, V> {
49     // Panics if the map (or the code navigating it) is corrupted.
50     fn check_invariants(&self) {
51         if let Some(root) = &self.root {
52             let root_node = root.reborrow();
53
54             // Check the back pointers top-down, before we attempt to rely on
55             // more serious navigation code.
56             assert!(root_node.ascend().is_err());
57             root_node.assert_back_pointers();
58
59             // Check consistency of `length` with what navigation code encounters.
60             assert_eq!(self.length, root_node.calc_length());
61
62             // Lastly, check the invariant causing the least harm.
63             root_node.assert_min_len(if root_node.height() > 0 { 1 } else { 0 });
64         } else {
65             assert_eq!(self.length, 0);
66         }
67
68         // Check that `assert_strictly_ascending` will encounter all keys.
69         assert_eq!(self.length, self.keys().count());
70     }
71
72     // Panics if the map is corrupted or if the keys are not in strictly
73     // ascending order, in the current opinion of the `Ord` implementation.
74     // If the `Ord` implementation violates transitivity, this method does not
75     // guarantee that all keys are unique, just that adjacent keys are unique.
76     fn check(&self)
77     where
78         K: Debug + Ord,
79     {
80         self.check_invariants();
81         self.assert_strictly_ascending();
82     }
83
84     // Returns the height of the root, if any.
85     fn height(&self) -> Option<usize> {
86         self.root.as_ref().map(node::Root::height)
87     }
88
89     fn dump_keys(&self) -> String
90     where
91         K: Debug,
92     {
93         if let Some(root) = self.root.as_ref() {
94             root.reborrow().dump_keys()
95         } else {
96             String::from("not yet allocated")
97         }
98     }
99
100     // Panics if the keys are not in strictly ascending order.
101     fn assert_strictly_ascending(&self)
102     where
103         K: Debug + Ord,
104     {
105         let mut keys = self.keys();
106         if let Some(mut previous) = keys.next() {
107             for next in keys {
108                 assert!(previous < next, "{:?} >= {:?}", previous, next);
109                 previous = next;
110             }
111         }
112     }
113
114     // Transform the tree to minimize wasted space, obtaining fewer nodes that
115     // are mostly filled up to their capacity. The same compact tree could have
116     // been obtained by inserting keys in a shrewd order.
117     fn compact(&mut self)
118     where
119         K: Ord,
120     {
121         let iter = mem::take(self).into_iter();
122         let root = BTreeMap::ensure_is_owned(&mut self.root);
123         root.bulk_push(iter, &mut self.length);
124     }
125 }
126
127 impl<'a, K: 'a, V: 'a> NodeRef<marker::Immut<'a>, K, V, marker::LeafOrInternal> {
128     fn assert_min_len(self, min_len: usize) {
129         assert!(self.len() >= min_len, "node len {} < {}", self.len(), min_len);
130         if let node::ForceResult::Internal(node) = self.force() {
131             for idx in 0..=node.len() {
132                 let edge = unsafe { Handle::new_edge(node, idx) };
133                 edge.descend().assert_min_len(MIN_LEN);
134             }
135         }
136     }
137 }
138
139 // Tests our value of MIN_INSERTS_HEIGHT_2. Failure may mean you just need to
140 // adapt that value to match a change in node::CAPACITY or the choices made
141 // during insertion, otherwise other test cases may fail or be less useful.
142 #[test]
143 fn test_levels() {
144     let mut map = BTreeMap::new();
145     map.check();
146     assert_eq!(map.height(), None);
147     assert_eq!(map.len(), 0);
148
149     map.insert(0, ());
150     while map.height() == Some(0) {
151         let last_key = *map.last_key_value().unwrap().0;
152         map.insert(last_key + 1, ());
153     }
154     map.check();
155     // Structure:
156     // - 1 element in internal root node with 2 children
157     // - 6 elements in left leaf child
158     // - 5 elements in right leaf child
159     assert_eq!(map.height(), Some(1));
160     assert_eq!(map.len(), MIN_INSERTS_HEIGHT_1, "{}", map.dump_keys());
161
162     while map.height() == Some(1) {
163         let last_key = *map.last_key_value().unwrap().0;
164         map.insert(last_key + 1, ());
165     }
166     map.check();
167     // Structure:
168     // - 1 element in internal root node with 2 children
169     // - 6 elements in left internal child with 7 grandchildren
170     // - 42 elements in left child's 7 grandchildren with 6 elements each
171     // - 5 elements in right internal child with 6 grandchildren
172     // - 30 elements in right child's 5 first grandchildren with 6 elements each
173     // - 5 elements in right child's last grandchild
174     assert_eq!(map.height(), Some(2));
175     assert_eq!(map.len(), MIN_INSERTS_HEIGHT_2, "{}", map.dump_keys());
176 }
177
178 // Ensures the testing infrastructure usually notices order violations.
179 #[test]
180 #[should_panic]
181 fn test_check_ord_chaos() {
182     let gov = Governor::new();
183     let map: BTreeMap<_, _> = (0..2).map(|i| (Governed(i, &gov), ())).collect();
184     gov.flip();
185     map.check();
186 }
187
188 // Ensures the testing infrastructure doesn't always mind order violations.
189 #[test]
190 fn test_check_invariants_ord_chaos() {
191     let gov = Governor::new();
192     let map: BTreeMap<_, _> = (0..2).map(|i| (Governed(i, &gov), ())).collect();
193     gov.flip();
194     map.check_invariants();
195 }
196
197 #[test]
198 fn test_basic_large() {
199     let mut map = BTreeMap::new();
200     // Miri is too slow
201     let size = if cfg!(miri) { MIN_INSERTS_HEIGHT_2 } else { 10000 };
202     let size = size + (size % 2); // round up to even number
203     assert_eq!(map.len(), 0);
204
205     for i in 0..size {
206         assert_eq!(map.insert(i, 10 * i), None);
207         assert_eq!(map.len(), i + 1);
208     }
209
210     assert_eq!(map.first_key_value(), Some((&0, &0)));
211     assert_eq!(map.last_key_value(), Some((&(size - 1), &(10 * (size - 1)))));
212     assert_eq!(map.first_entry().unwrap().key(), &0);
213     assert_eq!(map.last_entry().unwrap().key(), &(size - 1));
214
215     for i in 0..size {
216         assert_eq!(map.get(&i).unwrap(), &(i * 10));
217     }
218
219     for i in size..size * 2 {
220         assert_eq!(map.get(&i), None);
221     }
222
223     for i in 0..size {
224         assert_eq!(map.insert(i, 100 * i), Some(10 * i));
225         assert_eq!(map.len(), size);
226     }
227
228     for i in 0..size {
229         assert_eq!(map.get(&i).unwrap(), &(i * 100));
230     }
231
232     for i in 0..size / 2 {
233         assert_eq!(map.remove(&(i * 2)), Some(i * 200));
234         assert_eq!(map.len(), size - i - 1);
235     }
236
237     for i in 0..size / 2 {
238         assert_eq!(map.get(&(2 * i)), None);
239         assert_eq!(map.get(&(2 * i + 1)).unwrap(), &(i * 200 + 100));
240     }
241
242     for i in 0..size / 2 {
243         assert_eq!(map.remove(&(2 * i)), None);
244         assert_eq!(map.remove(&(2 * i + 1)), Some(i * 200 + 100));
245         assert_eq!(map.len(), size / 2 - i - 1);
246     }
247     map.check();
248 }
249
250 #[test]
251 fn test_basic_small() {
252     let mut map = BTreeMap::new();
253     // Empty, root is absent (None):
254     assert_eq!(map.remove(&1), None);
255     assert_eq!(map.len(), 0);
256     assert_eq!(map.get(&1), None);
257     assert_eq!(map.get_mut(&1), None);
258     assert_eq!(map.first_key_value(), None);
259     assert_eq!(map.last_key_value(), None);
260     assert_eq!(map.keys().count(), 0);
261     assert_eq!(map.values().count(), 0);
262     assert_eq!(map.range(..).next(), None);
263     assert_eq!(map.range(..1).next(), None);
264     assert_eq!(map.range(1..).next(), None);
265     assert_eq!(map.range(1..=1).next(), None);
266     assert_eq!(map.range(1..2).next(), None);
267     assert_eq!(map.height(), None);
268     assert_eq!(map.insert(1, 1), None);
269     assert_eq!(map.height(), Some(0));
270     map.check();
271
272     // 1 key-value pair:
273     assert_eq!(map.len(), 1);
274     assert_eq!(map.get(&1), Some(&1));
275     assert_eq!(map.get_mut(&1), Some(&mut 1));
276     assert_eq!(map.first_key_value(), Some((&1, &1)));
277     assert_eq!(map.last_key_value(), Some((&1, &1)));
278     assert_eq!(map.keys().collect::<Vec<_>>(), vec![&1]);
279     assert_eq!(map.values().collect::<Vec<_>>(), vec![&1]);
280     assert_eq!(map.insert(1, 2), Some(1));
281     assert_eq!(map.len(), 1);
282     assert_eq!(map.get(&1), Some(&2));
283     assert_eq!(map.get_mut(&1), Some(&mut 2));
284     assert_eq!(map.first_key_value(), Some((&1, &2)));
285     assert_eq!(map.last_key_value(), Some((&1, &2)));
286     assert_eq!(map.keys().collect::<Vec<_>>(), vec![&1]);
287     assert_eq!(map.values().collect::<Vec<_>>(), vec![&2]);
288     assert_eq!(map.insert(2, 4), None);
289     assert_eq!(map.height(), Some(0));
290     map.check();
291
292     // 2 key-value pairs:
293     assert_eq!(map.len(), 2);
294     assert_eq!(map.get(&2), Some(&4));
295     assert_eq!(map.get_mut(&2), Some(&mut 4));
296     assert_eq!(map.first_key_value(), Some((&1, &2)));
297     assert_eq!(map.last_key_value(), Some((&2, &4)));
298     assert_eq!(map.keys().collect::<Vec<_>>(), vec![&1, &2]);
299     assert_eq!(map.values().collect::<Vec<_>>(), vec![&2, &4]);
300     assert_eq!(map.remove(&1), Some(2));
301     assert_eq!(map.height(), Some(0));
302     map.check();
303
304     // 1 key-value pair:
305     assert_eq!(map.len(), 1);
306     assert_eq!(map.get(&1), None);
307     assert_eq!(map.get_mut(&1), None);
308     assert_eq!(map.get(&2), Some(&4));
309     assert_eq!(map.get_mut(&2), Some(&mut 4));
310     assert_eq!(map.first_key_value(), Some((&2, &4)));
311     assert_eq!(map.last_key_value(), Some((&2, &4)));
312     assert_eq!(map.keys().collect::<Vec<_>>(), vec![&2]);
313     assert_eq!(map.values().collect::<Vec<_>>(), vec![&4]);
314     assert_eq!(map.remove(&2), Some(4));
315     assert_eq!(map.height(), Some(0));
316     map.check();
317
318     // Empty but root is owned (Some(...)):
319     assert_eq!(map.len(), 0);
320     assert_eq!(map.get(&1), None);
321     assert_eq!(map.get_mut(&1), None);
322     assert_eq!(map.first_key_value(), None);
323     assert_eq!(map.last_key_value(), None);
324     assert_eq!(map.keys().count(), 0);
325     assert_eq!(map.values().count(), 0);
326     assert_eq!(map.range(..).next(), None);
327     assert_eq!(map.range(..1).next(), None);
328     assert_eq!(map.range(1..).next(), None);
329     assert_eq!(map.range(1..=1).next(), None);
330     assert_eq!(map.range(1..2).next(), None);
331     assert_eq!(map.remove(&1), None);
332     assert_eq!(map.height(), Some(0));
333     map.check();
334 }
335
336 #[test]
337 fn test_iter() {
338     // Miri is too slow
339     let size = if cfg!(miri) { 200 } else { 10000 };
340
341     let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
342
343     fn test<T>(size: usize, mut iter: T)
344     where
345         T: Iterator<Item = (usize, usize)>,
346     {
347         for i in 0..size {
348             assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
349             assert_eq!(iter.next().unwrap(), (i, i));
350         }
351         assert_eq!(iter.size_hint(), (0, Some(0)));
352         assert_eq!(iter.next(), None);
353     }
354     test(size, map.iter().map(|(&k, &v)| (k, v)));
355     test(size, map.iter_mut().map(|(&k, &mut v)| (k, v)));
356     test(size, map.into_iter());
357 }
358
359 #[test]
360 fn test_iter_rev() {
361     // Miri is too slow
362     let size = if cfg!(miri) { 200 } else { 10000 };
363
364     let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
365
366     fn test<T>(size: usize, mut iter: T)
367     where
368         T: Iterator<Item = (usize, usize)>,
369     {
370         for i in 0..size {
371             assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
372             assert_eq!(iter.next().unwrap(), (size - i - 1, size - i - 1));
373         }
374         assert_eq!(iter.size_hint(), (0, Some(0)));
375         assert_eq!(iter.next(), None);
376     }
377     test(size, map.iter().rev().map(|(&k, &v)| (k, v)));
378     test(size, map.iter_mut().rev().map(|(&k, &mut v)| (k, v)));
379     test(size, map.into_iter().rev());
380 }
381
382 // Specifically tests iter_mut's ability to mutate the value of pairs in-line.
383 fn do_test_iter_mut_mutation<T>(size: usize)
384 where
385     T: Copy + Debug + Ord + TryFrom<usize>,
386     <T as TryFrom<usize>>::Error: Debug,
387 {
388     let zero = T::try_from(0).unwrap();
389     let mut map: BTreeMap<T, T> = (0..size).map(|i| (T::try_from(i).unwrap(), zero)).collect();
390
391     // Forward and backward iteration sees enough pairs (also tested elsewhere)
392     assert_eq!(map.iter_mut().count(), size);
393     assert_eq!(map.iter_mut().rev().count(), size);
394
395     // Iterate forwards, trying to mutate to unique values
396     for (i, (k, v)) in map.iter_mut().enumerate() {
397         assert_eq!(*k, T::try_from(i).unwrap());
398         assert_eq!(*v, zero);
399         *v = T::try_from(i + 1).unwrap();
400     }
401
402     // Iterate backwards, checking that mutations succeeded and trying to mutate again
403     for (i, (k, v)) in map.iter_mut().rev().enumerate() {
404         assert_eq!(*k, T::try_from(size - i - 1).unwrap());
405         assert_eq!(*v, T::try_from(size - i).unwrap());
406         *v = T::try_from(2 * size - i).unwrap();
407     }
408
409     // Check that backward mutations succeeded
410     for (i, (k, v)) in map.iter_mut().enumerate() {
411         assert_eq!(*k, T::try_from(i).unwrap());
412         assert_eq!(*v, T::try_from(size + i + 1).unwrap());
413     }
414     map.check();
415 }
416
417 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)]
418 #[repr(align(32))]
419 struct Align32(usize);
420
421 impl TryFrom<usize> for Align32 {
422     type Error = ();
423
424     fn try_from(s: usize) -> Result<Align32, ()> {
425         Ok(Align32(s))
426     }
427 }
428
429 #[test]
430 fn test_iter_mut_mutation() {
431     // Check many alignments and trees with roots at various heights.
432     do_test_iter_mut_mutation::<u8>(0);
433     do_test_iter_mut_mutation::<u8>(1);
434     do_test_iter_mut_mutation::<u8>(MIN_INSERTS_HEIGHT_1);
435     do_test_iter_mut_mutation::<u8>(MIN_INSERTS_HEIGHT_2);
436     do_test_iter_mut_mutation::<u16>(1);
437     do_test_iter_mut_mutation::<u16>(MIN_INSERTS_HEIGHT_1);
438     do_test_iter_mut_mutation::<u16>(MIN_INSERTS_HEIGHT_2);
439     do_test_iter_mut_mutation::<u32>(1);
440     do_test_iter_mut_mutation::<u32>(MIN_INSERTS_HEIGHT_1);
441     do_test_iter_mut_mutation::<u32>(MIN_INSERTS_HEIGHT_2);
442     do_test_iter_mut_mutation::<u64>(1);
443     do_test_iter_mut_mutation::<u64>(MIN_INSERTS_HEIGHT_1);
444     do_test_iter_mut_mutation::<u64>(MIN_INSERTS_HEIGHT_2);
445     do_test_iter_mut_mutation::<u128>(1);
446     do_test_iter_mut_mutation::<u128>(MIN_INSERTS_HEIGHT_1);
447     do_test_iter_mut_mutation::<u128>(MIN_INSERTS_HEIGHT_2);
448     do_test_iter_mut_mutation::<Align32>(1);
449     do_test_iter_mut_mutation::<Align32>(MIN_INSERTS_HEIGHT_1);
450     do_test_iter_mut_mutation::<Align32>(MIN_INSERTS_HEIGHT_2);
451 }
452
453 #[test]
454 fn test_values_mut() {
455     let mut a: BTreeMap<_, _> = (0..MIN_INSERTS_HEIGHT_2).map(|i| (i, i)).collect();
456     test_all_refs(&mut 13, a.values_mut());
457     a.check();
458 }
459
460 #[test]
461 fn test_values_mut_mutation() {
462     let mut a = BTreeMap::new();
463     a.insert(1, String::from("hello"));
464     a.insert(2, String::from("goodbye"));
465
466     for value in a.values_mut() {
467         value.push_str("!");
468     }
469
470     let values: Vec<String> = a.values().cloned().collect();
471     assert_eq!(values, [String::from("hello!"), String::from("goodbye!")]);
472     a.check();
473 }
474
475 #[test]
476 fn test_iter_entering_root_twice() {
477     let mut map: BTreeMap<_, _> = (0..2).map(|i| (i, i)).collect();
478     let mut it = map.iter_mut();
479     let front = it.next().unwrap();
480     let back = it.next_back().unwrap();
481     assert_eq!(front, (&0, &mut 0));
482     assert_eq!(back, (&1, &mut 1));
483     *front.1 = 24;
484     *back.1 = 42;
485     assert_eq!(front, (&0, &mut 24));
486     assert_eq!(back, (&1, &mut 42));
487     assert_eq!(it.next(), None);
488     assert_eq!(it.next_back(), None);
489     map.check();
490 }
491
492 #[test]
493 fn test_iter_descending_to_same_node_twice() {
494     let mut map: BTreeMap<_, _> = (0..MIN_INSERTS_HEIGHT_1).map(|i| (i, i)).collect();
495     let mut it = map.iter_mut();
496     // Descend into first child.
497     let front = it.next().unwrap();
498     // Descend into first child again, after running through second child.
499     while it.next_back().is_some() {}
500     // Check immutable access.
501     assert_eq!(front, (&0, &mut 0));
502     // Perform mutable access.
503     *front.1 = 42;
504     map.check();
505 }
506
507 #[test]
508 fn test_iter_mixed() {
509     // Miri is too slow
510     let size = if cfg!(miri) { 200 } else { 10000 };
511
512     let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
513
514     fn test<T>(size: usize, mut iter: T)
515     where
516         T: Iterator<Item = (usize, usize)> + DoubleEndedIterator,
517     {
518         for i in 0..size / 4 {
519             assert_eq!(iter.size_hint(), (size - i * 2, Some(size - i * 2)));
520             assert_eq!(iter.next().unwrap(), (i, i));
521             assert_eq!(iter.next_back().unwrap(), (size - i - 1, size - i - 1));
522         }
523         for i in size / 4..size * 3 / 4 {
524             assert_eq!(iter.size_hint(), (size * 3 / 4 - i, Some(size * 3 / 4 - i)));
525             assert_eq!(iter.next().unwrap(), (i, i));
526         }
527         assert_eq!(iter.size_hint(), (0, Some(0)));
528         assert_eq!(iter.next(), None);
529     }
530     test(size, map.iter().map(|(&k, &v)| (k, v)));
531     test(size, map.iter_mut().map(|(&k, &mut v)| (k, v)));
532     test(size, map.into_iter());
533 }
534
535 #[test]
536 fn test_iter_min_max() {
537     let mut a = BTreeMap::new();
538     assert_eq!(a.iter().min(), None);
539     assert_eq!(a.iter().max(), None);
540     assert_eq!(a.iter_mut().min(), None);
541     assert_eq!(a.iter_mut().max(), None);
542     assert_eq!(a.range(..).min(), None);
543     assert_eq!(a.range(..).max(), None);
544     assert_eq!(a.range_mut(..).min(), None);
545     assert_eq!(a.range_mut(..).max(), None);
546     assert_eq!(a.keys().min(), None);
547     assert_eq!(a.keys().max(), None);
548     assert_eq!(a.values().min(), None);
549     assert_eq!(a.values().max(), None);
550     assert_eq!(a.values_mut().min(), None);
551     assert_eq!(a.values_mut().max(), None);
552     a.insert(1, 42);
553     a.insert(2, 24);
554     assert_eq!(a.iter().min(), Some((&1, &42)));
555     assert_eq!(a.iter().max(), Some((&2, &24)));
556     assert_eq!(a.iter_mut().min(), Some((&1, &mut 42)));
557     assert_eq!(a.iter_mut().max(), Some((&2, &mut 24)));
558     assert_eq!(a.range(..).min(), Some((&1, &42)));
559     assert_eq!(a.range(..).max(), Some((&2, &24)));
560     assert_eq!(a.range_mut(..).min(), Some((&1, &mut 42)));
561     assert_eq!(a.range_mut(..).max(), Some((&2, &mut 24)));
562     assert_eq!(a.keys().min(), Some(&1));
563     assert_eq!(a.keys().max(), Some(&2));
564     assert_eq!(a.values().min(), Some(&24));
565     assert_eq!(a.values().max(), Some(&42));
566     assert_eq!(a.values_mut().min(), Some(&mut 24));
567     assert_eq!(a.values_mut().max(), Some(&mut 42));
568     a.check();
569 }
570
571 fn range_keys(map: &BTreeMap<i32, i32>, range: impl RangeBounds<i32>) -> Vec<i32> {
572     map.range(range)
573         .map(|(&k, &v)| {
574             assert_eq!(k, v);
575             k
576         })
577         .collect()
578 }
579
580 #[test]
581 fn test_range_small() {
582     let size = 4;
583
584     let map: BTreeMap<_, _> = (1..=size).map(|i| (i, i)).collect();
585     let all: Vec<_> = (1..=size).collect();
586     let (first, last) = (vec![all[0]], vec![all[size as usize - 1]]);
587
588     assert_eq!(range_keys(&map, (Excluded(0), Excluded(size + 1))), all);
589     assert_eq!(range_keys(&map, (Excluded(0), Included(size + 1))), all);
590     assert_eq!(range_keys(&map, (Excluded(0), Included(size))), all);
591     assert_eq!(range_keys(&map, (Excluded(0), Unbounded)), all);
592     assert_eq!(range_keys(&map, (Included(0), Excluded(size + 1))), all);
593     assert_eq!(range_keys(&map, (Included(0), Included(size + 1))), all);
594     assert_eq!(range_keys(&map, (Included(0), Included(size))), all);
595     assert_eq!(range_keys(&map, (Included(0), Unbounded)), all);
596     assert_eq!(range_keys(&map, (Included(1), Excluded(size + 1))), all);
597     assert_eq!(range_keys(&map, (Included(1), Included(size + 1))), all);
598     assert_eq!(range_keys(&map, (Included(1), Included(size))), all);
599     assert_eq!(range_keys(&map, (Included(1), Unbounded)), all);
600     assert_eq!(range_keys(&map, (Unbounded, Excluded(size + 1))), all);
601     assert_eq!(range_keys(&map, (Unbounded, Included(size + 1))), all);
602     assert_eq!(range_keys(&map, (Unbounded, Included(size))), all);
603     assert_eq!(range_keys(&map, ..), all);
604
605     assert_eq!(range_keys(&map, (Excluded(0), Excluded(1))), vec![]);
606     assert_eq!(range_keys(&map, (Excluded(0), Included(0))), vec![]);
607     assert_eq!(range_keys(&map, (Included(0), Included(0))), vec![]);
608     assert_eq!(range_keys(&map, (Included(0), Excluded(1))), vec![]);
609     assert_eq!(range_keys(&map, (Unbounded, Excluded(1))), vec![]);
610     assert_eq!(range_keys(&map, (Unbounded, Included(0))), vec![]);
611     assert_eq!(range_keys(&map, (Excluded(0), Excluded(2))), first);
612     assert_eq!(range_keys(&map, (Excluded(0), Included(1))), first);
613     assert_eq!(range_keys(&map, (Included(0), Excluded(2))), first);
614     assert_eq!(range_keys(&map, (Included(0), Included(1))), first);
615     assert_eq!(range_keys(&map, (Included(1), Excluded(2))), first);
616     assert_eq!(range_keys(&map, (Included(1), Included(1))), first);
617     assert_eq!(range_keys(&map, (Unbounded, Excluded(2))), first);
618     assert_eq!(range_keys(&map, (Unbounded, Included(1))), first);
619     assert_eq!(range_keys(&map, (Excluded(size - 1), Excluded(size + 1))), last);
620     assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size + 1))), last);
621     assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size))), last);
622     assert_eq!(range_keys(&map, (Excluded(size - 1), Unbounded)), last);
623     assert_eq!(range_keys(&map, (Included(size), Excluded(size + 1))), last);
624     assert_eq!(range_keys(&map, (Included(size), Included(size + 1))), last);
625     assert_eq!(range_keys(&map, (Included(size), Included(size))), last);
626     assert_eq!(range_keys(&map, (Included(size), Unbounded)), last);
627     assert_eq!(range_keys(&map, (Excluded(size), Excluded(size + 1))), vec![]);
628     assert_eq!(range_keys(&map, (Excluded(size), Included(size))), vec![]);
629     assert_eq!(range_keys(&map, (Excluded(size), Unbounded)), vec![]);
630     assert_eq!(range_keys(&map, (Included(size + 1), Excluded(size + 1))), vec![]);
631     assert_eq!(range_keys(&map, (Included(size + 1), Included(size + 1))), vec![]);
632     assert_eq!(range_keys(&map, (Included(size + 1), Unbounded)), vec![]);
633
634     assert_eq!(range_keys(&map, ..3), vec![1, 2]);
635     assert_eq!(range_keys(&map, 3..), vec![3, 4]);
636     assert_eq!(range_keys(&map, 2..=3), vec![2, 3]);
637 }
638
639 #[test]
640 fn test_range_height_1() {
641     // Tests tree with a root and 2 leaves. The single key in the root node is
642     // close to the middle among the keys.
643
644     let map: BTreeMap<_, _> = (0..MIN_INSERTS_HEIGHT_1 as i32).map(|i| (i, i)).collect();
645     let middle = MIN_INSERTS_HEIGHT_1 as i32 / 2;
646     for root in middle - 2..=middle + 2 {
647         assert_eq!(range_keys(&map, (Excluded(root), Excluded(root + 1))), vec![]);
648         assert_eq!(range_keys(&map, (Excluded(root), Included(root + 1))), vec![root + 1]);
649         assert_eq!(range_keys(&map, (Included(root), Excluded(root + 1))), vec![root]);
650         assert_eq!(range_keys(&map, (Included(root), Included(root + 1))), vec![root, root + 1]);
651
652         assert_eq!(range_keys(&map, (Excluded(root - 1), Excluded(root))), vec![]);
653         assert_eq!(range_keys(&map, (Included(root - 1), Excluded(root))), vec![root - 1]);
654         assert_eq!(range_keys(&map, (Excluded(root - 1), Included(root))), vec![root]);
655         assert_eq!(range_keys(&map, (Included(root - 1), Included(root))), vec![root - 1, root]);
656     }
657 }
658
659 #[test]
660 fn test_range_large() {
661     let size = 200;
662
663     let map: BTreeMap<_, _> = (1..=size).map(|i| (i, i)).collect();
664     let all: Vec<_> = (1..=size).collect();
665     let (first, last) = (vec![all[0]], vec![all[size as usize - 1]]);
666
667     assert_eq!(range_keys(&map, (Excluded(0), Excluded(size + 1))), all);
668     assert_eq!(range_keys(&map, (Excluded(0), Included(size + 1))), all);
669     assert_eq!(range_keys(&map, (Excluded(0), Included(size))), all);
670     assert_eq!(range_keys(&map, (Excluded(0), Unbounded)), all);
671     assert_eq!(range_keys(&map, (Included(0), Excluded(size + 1))), all);
672     assert_eq!(range_keys(&map, (Included(0), Included(size + 1))), all);
673     assert_eq!(range_keys(&map, (Included(0), Included(size))), all);
674     assert_eq!(range_keys(&map, (Included(0), Unbounded)), all);
675     assert_eq!(range_keys(&map, (Included(1), Excluded(size + 1))), all);
676     assert_eq!(range_keys(&map, (Included(1), Included(size + 1))), all);
677     assert_eq!(range_keys(&map, (Included(1), Included(size))), all);
678     assert_eq!(range_keys(&map, (Included(1), Unbounded)), all);
679     assert_eq!(range_keys(&map, (Unbounded, Excluded(size + 1))), all);
680     assert_eq!(range_keys(&map, (Unbounded, Included(size + 1))), all);
681     assert_eq!(range_keys(&map, (Unbounded, Included(size))), all);
682     assert_eq!(range_keys(&map, ..), all);
683
684     assert_eq!(range_keys(&map, (Excluded(0), Excluded(1))), vec![]);
685     assert_eq!(range_keys(&map, (Excluded(0), Included(0))), vec![]);
686     assert_eq!(range_keys(&map, (Included(0), Included(0))), vec![]);
687     assert_eq!(range_keys(&map, (Included(0), Excluded(1))), vec![]);
688     assert_eq!(range_keys(&map, (Unbounded, Excluded(1))), vec![]);
689     assert_eq!(range_keys(&map, (Unbounded, Included(0))), vec![]);
690     assert_eq!(range_keys(&map, (Excluded(0), Excluded(2))), first);
691     assert_eq!(range_keys(&map, (Excluded(0), Included(1))), first);
692     assert_eq!(range_keys(&map, (Included(0), Excluded(2))), first);
693     assert_eq!(range_keys(&map, (Included(0), Included(1))), first);
694     assert_eq!(range_keys(&map, (Included(1), Excluded(2))), first);
695     assert_eq!(range_keys(&map, (Included(1), Included(1))), first);
696     assert_eq!(range_keys(&map, (Unbounded, Excluded(2))), first);
697     assert_eq!(range_keys(&map, (Unbounded, Included(1))), first);
698     assert_eq!(range_keys(&map, (Excluded(size - 1), Excluded(size + 1))), last);
699     assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size + 1))), last);
700     assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size))), last);
701     assert_eq!(range_keys(&map, (Excluded(size - 1), Unbounded)), last);
702     assert_eq!(range_keys(&map, (Included(size), Excluded(size + 1))), last);
703     assert_eq!(range_keys(&map, (Included(size), Included(size + 1))), last);
704     assert_eq!(range_keys(&map, (Included(size), Included(size))), last);
705     assert_eq!(range_keys(&map, (Included(size), Unbounded)), last);
706     assert_eq!(range_keys(&map, (Excluded(size), Excluded(size + 1))), vec![]);
707     assert_eq!(range_keys(&map, (Excluded(size), Included(size))), vec![]);
708     assert_eq!(range_keys(&map, (Excluded(size), Unbounded)), vec![]);
709     assert_eq!(range_keys(&map, (Included(size + 1), Excluded(size + 1))), vec![]);
710     assert_eq!(range_keys(&map, (Included(size + 1), Included(size + 1))), vec![]);
711     assert_eq!(range_keys(&map, (Included(size + 1), Unbounded)), vec![]);
712
713     fn check<'a, L, R>(lhs: L, rhs: R)
714     where
715         L: IntoIterator<Item = (&'a i32, &'a i32)>,
716         R: IntoIterator<Item = (&'a i32, &'a i32)>,
717     {
718         let lhs: Vec<_> = lhs.into_iter().collect();
719         let rhs: Vec<_> = rhs.into_iter().collect();
720         assert_eq!(lhs, rhs);
721     }
722
723     check(map.range(..=100), map.range(..101));
724     check(map.range(5..=8), vec![(&5, &5), (&6, &6), (&7, &7), (&8, &8)]);
725     check(map.range(-1..=2), vec![(&1, &1), (&2, &2)]);
726 }
727
728 #[test]
729 fn test_range_inclusive_max_value() {
730     let max = usize::MAX;
731     let map: BTreeMap<_, _> = vec![(max, 0)].into_iter().collect();
732
733     assert_eq!(map.range(max..=max).collect::<Vec<_>>(), &[(&max, &0)]);
734 }
735
736 #[test]
737 fn test_range_equal_empty_cases() {
738     let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
739     assert_eq!(map.range((Included(2), Excluded(2))).next(), None);
740     assert_eq!(map.range((Excluded(2), Included(2))).next(), None);
741 }
742
743 #[test]
744 #[should_panic]
745 fn test_range_equal_excluded() {
746     let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
747     map.range((Excluded(2), Excluded(2)));
748 }
749
750 #[test]
751 #[should_panic]
752 fn test_range_backwards_1() {
753     let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
754     map.range((Included(3), Included(2)));
755 }
756
757 #[test]
758 #[should_panic]
759 fn test_range_backwards_2() {
760     let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
761     map.range((Included(3), Excluded(2)));
762 }
763
764 #[test]
765 #[should_panic]
766 fn test_range_backwards_3() {
767     let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
768     map.range((Excluded(3), Included(2)));
769 }
770
771 #[test]
772 #[should_panic]
773 fn test_range_backwards_4() {
774     let map: BTreeMap<_, _> = (0..5).map(|i| (i, i)).collect();
775     map.range((Excluded(3), Excluded(2)));
776 }
777
778 #[test]
779 fn test_range_finding_ill_order_in_map() {
780     let mut map = BTreeMap::new();
781     map.insert(Cyclic3::B, ());
782     // Lacking static_assert, call `range` conditionally, to emphasise that
783     // we cause a different panic than `test_range_backwards_1` does.
784     // A more refined `should_panic` would be welcome.
785     if Cyclic3::C < Cyclic3::A {
786         map.range(Cyclic3::C..=Cyclic3::A);
787     }
788 }
789
790 #[test]
791 fn test_range_finding_ill_order_in_range_ord() {
792     // Has proper order the first time asked, then flips around.
793     struct EvilTwin(i32);
794
795     impl PartialOrd for EvilTwin {
796         fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
797             Some(self.cmp(other))
798         }
799     }
800
801     static COMPARES: AtomicUsize = AtomicUsize::new(0);
802     impl Ord for EvilTwin {
803         fn cmp(&self, other: &Self) -> Ordering {
804             let ord = self.0.cmp(&other.0);
805             if COMPARES.fetch_add(1, SeqCst) > 0 { ord.reverse() } else { ord }
806         }
807     }
808
809     impl PartialEq for EvilTwin {
810         fn eq(&self, other: &Self) -> bool {
811             self.0.eq(&other.0)
812         }
813     }
814
815     impl Eq for EvilTwin {}
816
817     #[derive(PartialEq, Eq, PartialOrd, Ord)]
818     struct CompositeKey(i32, EvilTwin);
819
820     impl Borrow<EvilTwin> for CompositeKey {
821         fn borrow(&self) -> &EvilTwin {
822             &self.1
823         }
824     }
825
826     let map = (0..12).map(|i| (CompositeKey(i, EvilTwin(i)), ())).collect::<BTreeMap<_, _>>();
827     map.range(EvilTwin(5)..=EvilTwin(7));
828 }
829
830 #[test]
831 fn test_range_1000() {
832     // Miri is too slow
833     let size = if cfg!(miri) { MIN_INSERTS_HEIGHT_2 as u32 } else { 1000 };
834     let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
835
836     fn test(map: &BTreeMap<u32, u32>, size: u32, min: Bound<&u32>, max: Bound<&u32>) {
837         let mut kvs = map.range((min, max)).map(|(&k, &v)| (k, v));
838         let mut pairs = (0..size).map(|i| (i, i));
839
840         for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
841             assert_eq!(kv, pair);
842         }
843         assert_eq!(kvs.next(), None);
844         assert_eq!(pairs.next(), None);
845     }
846     test(&map, size, Included(&0), Excluded(&size));
847     test(&map, size, Unbounded, Excluded(&size));
848     test(&map, size, Included(&0), Included(&(size - 1)));
849     test(&map, size, Unbounded, Included(&(size - 1)));
850     test(&map, size, Included(&0), Unbounded);
851     test(&map, size, Unbounded, Unbounded);
852 }
853
854 #[test]
855 fn test_range_borrowed_key() {
856     let mut map = BTreeMap::new();
857     map.insert("aardvark".to_string(), 1);
858     map.insert("baboon".to_string(), 2);
859     map.insert("coyote".to_string(), 3);
860     map.insert("dingo".to_string(), 4);
861     // NOTE: would like to use simply "b".."d" here...
862     let mut iter = map.range::<str, _>((Included("b"), Excluded("d")));
863     assert_eq!(iter.next(), Some((&"baboon".to_string(), &2)));
864     assert_eq!(iter.next(), Some((&"coyote".to_string(), &3)));
865     assert_eq!(iter.next(), None);
866 }
867
868 #[test]
869 fn test_range() {
870     let size = 200;
871     // Miri is too slow
872     let step = if cfg!(miri) { 66 } else { 1 };
873     let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
874
875     for i in (0..size).step_by(step) {
876         for j in (i..size).step_by(step) {
877             let mut kvs = map.range((Included(&i), Included(&j))).map(|(&k, &v)| (k, v));
878             let mut pairs = (i..=j).map(|i| (i, i));
879
880             for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
881                 assert_eq!(kv, pair);
882             }
883             assert_eq!(kvs.next(), None);
884             assert_eq!(pairs.next(), None);
885         }
886     }
887 }
888
889 #[test]
890 fn test_range_mut() {
891     let size = 200;
892     // Miri is too slow
893     let step = if cfg!(miri) { 66 } else { 1 };
894     let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
895
896     for i in (0..size).step_by(step) {
897         for j in (i..size).step_by(step) {
898             let mut kvs = map.range_mut((Included(&i), Included(&j))).map(|(&k, &mut v)| (k, v));
899             let mut pairs = (i..=j).map(|i| (i, i));
900
901             for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
902                 assert_eq!(kv, pair);
903             }
904             assert_eq!(kvs.next(), None);
905             assert_eq!(pairs.next(), None);
906         }
907     }
908     map.check();
909 }
910
911 #[test]
912 fn test_retain() {
913     let mut map: BTreeMap<i32, i32> = (0..100).map(|x| (x, x * 10)).collect();
914
915     map.retain(|&k, _| k % 2 == 0);
916     assert_eq!(map.len(), 50);
917     assert_eq!(map[&2], 20);
918     assert_eq!(map[&4], 40);
919     assert_eq!(map[&6], 60);
920 }
921
922 mod test_drain_filter {
923     use super::*;
924
925     #[test]
926     fn empty() {
927         let mut map: BTreeMap<i32, i32> = BTreeMap::new();
928         map.drain_filter(|_, _| unreachable!("there's nothing to decide on"));
929         assert!(map.is_empty());
930         map.check();
931     }
932
933     // Explicitly consumes the iterator, where most test cases drop it instantly.
934     #[test]
935     fn consumed_keeping_all() {
936         let pairs = (0..3).map(|i| (i, i));
937         let mut map: BTreeMap<_, _> = pairs.collect();
938         assert!(map.drain_filter(|_, _| false).eq(iter::empty()));
939         map.check();
940     }
941
942     // Explicitly consumes the iterator, where most test cases drop it instantly.
943     #[test]
944     fn consumed_removing_all() {
945         let pairs = (0..3).map(|i| (i, i));
946         let mut map: BTreeMap<_, _> = pairs.clone().collect();
947         assert!(map.drain_filter(|_, _| true).eq(pairs));
948         assert!(map.is_empty());
949         map.check();
950     }
951
952     // Explicitly consumes the iterator and modifies values through it.
953     #[test]
954     fn mutating_and_keeping() {
955         let pairs = (0..3).map(|i| (i, i));
956         let mut map: BTreeMap<_, _> = pairs.collect();
957         assert!(
958             map.drain_filter(|_, v| {
959                 *v += 6;
960                 false
961             })
962             .eq(iter::empty())
963         );
964         assert!(map.keys().copied().eq(0..3));
965         assert!(map.values().copied().eq(6..9));
966         map.check();
967     }
968
969     // Explicitly consumes the iterator and modifies values through it.
970     #[test]
971     fn mutating_and_removing() {
972         let pairs = (0..3).map(|i| (i, i));
973         let mut map: BTreeMap<_, _> = pairs.collect();
974         assert!(
975             map.drain_filter(|_, v| {
976                 *v += 6;
977                 true
978             })
979             .eq((0..3).map(|i| (i, i + 6)))
980         );
981         assert!(map.is_empty());
982         map.check();
983     }
984
985     #[test]
986     fn underfull_keeping_all() {
987         let pairs = (0..3).map(|i| (i, i));
988         let mut map: BTreeMap<_, _> = pairs.collect();
989         map.drain_filter(|_, _| false);
990         assert!(map.keys().copied().eq(0..3));
991         map.check();
992     }
993
994     #[test]
995     fn underfull_removing_one() {
996         let pairs = (0..3).map(|i| (i, i));
997         for doomed in 0..3 {
998             let mut map: BTreeMap<_, _> = pairs.clone().collect();
999             map.drain_filter(|i, _| *i == doomed);
1000             assert_eq!(map.len(), 2);
1001             map.check();
1002         }
1003     }
1004
1005     #[test]
1006     fn underfull_keeping_one() {
1007         let pairs = (0..3).map(|i| (i, i));
1008         for sacred in 0..3 {
1009             let mut map: BTreeMap<_, _> = pairs.clone().collect();
1010             map.drain_filter(|i, _| *i != sacred);
1011             assert!(map.keys().copied().eq(sacred..=sacred));
1012             map.check();
1013         }
1014     }
1015
1016     #[test]
1017     fn underfull_removing_all() {
1018         let pairs = (0..3).map(|i| (i, i));
1019         let mut map: BTreeMap<_, _> = pairs.collect();
1020         map.drain_filter(|_, _| true);
1021         assert!(map.is_empty());
1022         map.check();
1023     }
1024
1025     #[test]
1026     fn height_0_keeping_all() {
1027         let pairs = (0..NODE_CAPACITY).map(|i| (i, i));
1028         let mut map: BTreeMap<_, _> = pairs.collect();
1029         map.drain_filter(|_, _| false);
1030         assert!(map.keys().copied().eq(0..NODE_CAPACITY));
1031         map.check();
1032     }
1033
1034     #[test]
1035     fn height_0_removing_one() {
1036         let pairs = (0..NODE_CAPACITY).map(|i| (i, i));
1037         for doomed in 0..NODE_CAPACITY {
1038             let mut map: BTreeMap<_, _> = pairs.clone().collect();
1039             map.drain_filter(|i, _| *i == doomed);
1040             assert_eq!(map.len(), NODE_CAPACITY - 1);
1041             map.check();
1042         }
1043     }
1044
1045     #[test]
1046     fn height_0_keeping_one() {
1047         let pairs = (0..NODE_CAPACITY).map(|i| (i, i));
1048         for sacred in 0..NODE_CAPACITY {
1049             let mut map: BTreeMap<_, _> = pairs.clone().collect();
1050             map.drain_filter(|i, _| *i != sacred);
1051             assert!(map.keys().copied().eq(sacred..=sacred));
1052             map.check();
1053         }
1054     }
1055
1056     #[test]
1057     fn height_0_removing_all() {
1058         let pairs = (0..NODE_CAPACITY).map(|i| (i, i));
1059         let mut map: BTreeMap<_, _> = pairs.collect();
1060         map.drain_filter(|_, _| true);
1061         assert!(map.is_empty());
1062         map.check();
1063     }
1064
1065     #[test]
1066     fn height_0_keeping_half() {
1067         let mut map: BTreeMap<_, _> = (0..16).map(|i| (i, i)).collect();
1068         assert_eq!(map.drain_filter(|i, _| *i % 2 == 0).count(), 8);
1069         assert_eq!(map.len(), 8);
1070         map.check();
1071     }
1072
1073     #[test]
1074     fn height_1_removing_all() {
1075         let pairs = (0..MIN_INSERTS_HEIGHT_1).map(|i| (i, i));
1076         let mut map: BTreeMap<_, _> = pairs.collect();
1077         map.drain_filter(|_, _| true);
1078         assert!(map.is_empty());
1079         map.check();
1080     }
1081
1082     #[test]
1083     fn height_1_removing_one() {
1084         let pairs = (0..MIN_INSERTS_HEIGHT_1).map(|i| (i, i));
1085         for doomed in 0..MIN_INSERTS_HEIGHT_1 {
1086             let mut map: BTreeMap<_, _> = pairs.clone().collect();
1087             map.drain_filter(|i, _| *i == doomed);
1088             assert_eq!(map.len(), MIN_INSERTS_HEIGHT_1 - 1);
1089             map.check();
1090         }
1091     }
1092
1093     #[test]
1094     fn height_1_keeping_one() {
1095         let pairs = (0..MIN_INSERTS_HEIGHT_1).map(|i| (i, i));
1096         for sacred in 0..MIN_INSERTS_HEIGHT_1 {
1097             let mut map: BTreeMap<_, _> = pairs.clone().collect();
1098             map.drain_filter(|i, _| *i != sacred);
1099             assert!(map.keys().copied().eq(sacred..=sacred));
1100             map.check();
1101         }
1102     }
1103
1104     #[test]
1105     fn height_2_removing_one() {
1106         let pairs = (0..MIN_INSERTS_HEIGHT_2).map(|i| (i, i));
1107         for doomed in (0..MIN_INSERTS_HEIGHT_2).step_by(12) {
1108             let mut map: BTreeMap<_, _> = pairs.clone().collect();
1109             map.drain_filter(|i, _| *i == doomed);
1110             assert_eq!(map.len(), MIN_INSERTS_HEIGHT_2 - 1);
1111             map.check();
1112         }
1113     }
1114
1115     #[test]
1116     fn height_2_keeping_one() {
1117         let pairs = (0..MIN_INSERTS_HEIGHT_2).map(|i| (i, i));
1118         for sacred in (0..MIN_INSERTS_HEIGHT_2).step_by(12) {
1119             let mut map: BTreeMap<_, _> = pairs.clone().collect();
1120             map.drain_filter(|i, _| *i != sacred);
1121             assert!(map.keys().copied().eq(sacred..=sacred));
1122             map.check();
1123         }
1124     }
1125
1126     #[test]
1127     fn height_2_removing_all() {
1128         let pairs = (0..MIN_INSERTS_HEIGHT_2).map(|i| (i, i));
1129         let mut map: BTreeMap<_, _> = pairs.collect();
1130         map.drain_filter(|_, _| true);
1131         assert!(map.is_empty());
1132         map.check();
1133     }
1134
1135     #[test]
1136     fn drop_panic_leak() {
1137         let a = CrashTestDummy::new(0);
1138         let b = CrashTestDummy::new(1);
1139         let c = CrashTestDummy::new(2);
1140         let mut map = BTreeMap::new();
1141         map.insert(a.spawn(Panic::Never), ());
1142         map.insert(b.spawn(Panic::InDrop), ());
1143         map.insert(c.spawn(Panic::Never), ());
1144
1145         catch_unwind(move || drop(map.drain_filter(|dummy, _| dummy.query(true)))).unwrap_err();
1146
1147         assert_eq!(a.queried(), 1);
1148         assert_eq!(b.queried(), 1);
1149         assert_eq!(c.queried(), 0);
1150         assert_eq!(a.dropped(), 1);
1151         assert_eq!(b.dropped(), 1);
1152         assert_eq!(c.dropped(), 1);
1153     }
1154
1155     #[test]
1156     fn pred_panic_leak() {
1157         let a = CrashTestDummy::new(0);
1158         let b = CrashTestDummy::new(1);
1159         let c = CrashTestDummy::new(2);
1160         let mut map = BTreeMap::new();
1161         map.insert(a.spawn(Panic::Never), ());
1162         map.insert(b.spawn(Panic::InQuery), ());
1163         map.insert(c.spawn(Panic::InQuery), ());
1164
1165         catch_unwind(AssertUnwindSafe(|| drop(map.drain_filter(|dummy, _| dummy.query(true)))))
1166             .unwrap_err();
1167
1168         assert_eq!(a.queried(), 1);
1169         assert_eq!(b.queried(), 1);
1170         assert_eq!(c.queried(), 0);
1171         assert_eq!(a.dropped(), 1);
1172         assert_eq!(b.dropped(), 0);
1173         assert_eq!(c.dropped(), 0);
1174         assert_eq!(map.len(), 2);
1175         assert_eq!(map.first_entry().unwrap().key().id(), 1);
1176         assert_eq!(map.last_entry().unwrap().key().id(), 2);
1177         map.check();
1178     }
1179
1180     // Same as above, but attempt to use the iterator again after the panic in the predicate
1181     #[test]
1182     fn pred_panic_reuse() {
1183         let a = CrashTestDummy::new(0);
1184         let b = CrashTestDummy::new(1);
1185         let c = CrashTestDummy::new(2);
1186         let mut map = BTreeMap::new();
1187         map.insert(a.spawn(Panic::Never), ());
1188         map.insert(b.spawn(Panic::InQuery), ());
1189         map.insert(c.spawn(Panic::InQuery), ());
1190
1191         {
1192             let mut it = map.drain_filter(|dummy, _| dummy.query(true));
1193             catch_unwind(AssertUnwindSafe(|| while it.next().is_some() {})).unwrap_err();
1194             // Iterator behaviour after a panic is explicitly unspecified,
1195             // so this is just the current implementation:
1196             let result = catch_unwind(AssertUnwindSafe(|| it.next()));
1197             assert!(matches!(result, Ok(None)));
1198         }
1199
1200         assert_eq!(a.queried(), 1);
1201         assert_eq!(b.queried(), 1);
1202         assert_eq!(c.queried(), 0);
1203         assert_eq!(a.dropped(), 1);
1204         assert_eq!(b.dropped(), 0);
1205         assert_eq!(c.dropped(), 0);
1206         assert_eq!(map.len(), 2);
1207         assert_eq!(map.first_entry().unwrap().key().id(), 1);
1208         assert_eq!(map.last_entry().unwrap().key().id(), 2);
1209         map.check();
1210     }
1211 }
1212
1213 #[test]
1214 fn test_borrow() {
1215     // make sure these compile -- using the Borrow trait
1216     {
1217         let mut map = BTreeMap::new();
1218         map.insert("0".to_string(), 1);
1219         assert_eq!(map["0"], 1);
1220     }
1221
1222     {
1223         let mut map = BTreeMap::new();
1224         map.insert(Box::new(0), 1);
1225         assert_eq!(map[&0], 1);
1226     }
1227
1228     {
1229         let mut map = BTreeMap::new();
1230         map.insert(Box::new([0, 1]) as Box<[i32]>, 1);
1231         assert_eq!(map[&[0, 1][..]], 1);
1232     }
1233
1234     {
1235         let mut map = BTreeMap::new();
1236         map.insert(Rc::new(0), 1);
1237         assert_eq!(map[&0], 1);
1238     }
1239
1240     #[allow(dead_code)]
1241     fn get<T: Ord>(v: &BTreeMap<Box<T>, ()>, t: &T) {
1242         v.get(t);
1243     }
1244
1245     #[allow(dead_code)]
1246     fn get_mut<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: &T) {
1247         v.get_mut(t);
1248     }
1249
1250     #[allow(dead_code)]
1251     fn get_key_value<T: Ord>(v: &BTreeMap<Box<T>, ()>, t: &T) {
1252         v.get_key_value(t);
1253     }
1254
1255     #[allow(dead_code)]
1256     fn contains_key<T: Ord>(v: &BTreeMap<Box<T>, ()>, t: &T) {
1257         v.contains_key(t);
1258     }
1259
1260     #[allow(dead_code)]
1261     fn range<T: Ord>(v: &BTreeMap<Box<T>, ()>, t: T) {
1262         v.range(t..);
1263     }
1264
1265     #[allow(dead_code)]
1266     fn range_mut<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: T) {
1267         v.range_mut(t..);
1268     }
1269
1270     #[allow(dead_code)]
1271     fn remove<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: &T) {
1272         v.remove(t);
1273     }
1274
1275     #[allow(dead_code)]
1276     fn remove_entry<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: &T) {
1277         v.remove_entry(t);
1278     }
1279
1280     #[allow(dead_code)]
1281     fn split_off<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: &T) {
1282         v.split_off(t);
1283     }
1284 }
1285
1286 #[test]
1287 fn test_entry() {
1288     let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
1289
1290     let mut map: BTreeMap<_, _> = xs.iter().cloned().collect();
1291
1292     // Existing key (insert)
1293     match map.entry(1) {
1294         Vacant(_) => unreachable!(),
1295         Occupied(mut view) => {
1296             assert_eq!(view.get(), &10);
1297             assert_eq!(view.insert(100), 10);
1298         }
1299     }
1300     assert_eq!(map.get(&1).unwrap(), &100);
1301     assert_eq!(map.len(), 6);
1302
1303     // Existing key (update)
1304     match map.entry(2) {
1305         Vacant(_) => unreachable!(),
1306         Occupied(mut view) => {
1307             let v = view.get_mut();
1308             *v *= 10;
1309         }
1310     }
1311     assert_eq!(map.get(&2).unwrap(), &200);
1312     assert_eq!(map.len(), 6);
1313     map.check();
1314
1315     // Existing key (take)
1316     match map.entry(3) {
1317         Vacant(_) => unreachable!(),
1318         Occupied(view) => {
1319             assert_eq!(view.remove(), 30);
1320         }
1321     }
1322     assert_eq!(map.get(&3), None);
1323     assert_eq!(map.len(), 5);
1324     map.check();
1325
1326     // Inexistent key (insert)
1327     match map.entry(10) {
1328         Occupied(_) => unreachable!(),
1329         Vacant(view) => {
1330             assert_eq!(*view.insert(1000), 1000);
1331         }
1332     }
1333     assert_eq!(map.get(&10).unwrap(), &1000);
1334     assert_eq!(map.len(), 6);
1335     map.check();
1336 }
1337
1338 #[test]
1339 fn test_extend_ref() {
1340     let mut a = BTreeMap::new();
1341     a.insert(1, "one");
1342     let mut b = BTreeMap::new();
1343     b.insert(2, "two");
1344     b.insert(3, "three");
1345
1346     a.extend(&b);
1347
1348     assert_eq!(a.len(), 3);
1349     assert_eq!(a[&1], "one");
1350     assert_eq!(a[&2], "two");
1351     assert_eq!(a[&3], "three");
1352     a.check();
1353 }
1354
1355 #[test]
1356 fn test_zst() {
1357     let mut m = BTreeMap::new();
1358     assert_eq!(m.len(), 0);
1359
1360     assert_eq!(m.insert((), ()), None);
1361     assert_eq!(m.len(), 1);
1362
1363     assert_eq!(m.insert((), ()), Some(()));
1364     assert_eq!(m.len(), 1);
1365     assert_eq!(m.iter().count(), 1);
1366
1367     m.clear();
1368     assert_eq!(m.len(), 0);
1369
1370     for _ in 0..100 {
1371         m.insert((), ());
1372     }
1373
1374     assert_eq!(m.len(), 1);
1375     assert_eq!(m.iter().count(), 1);
1376     m.check();
1377 }
1378
1379 // This test's only purpose is to ensure that zero-sized keys with nonsensical orderings
1380 // do not cause segfaults when used with zero-sized values. All other map behavior is
1381 // undefined.
1382 #[test]
1383 fn test_bad_zst() {
1384     #[derive(Clone, Copy, Debug)]
1385     struct Bad;
1386
1387     impl PartialEq for Bad {
1388         fn eq(&self, _: &Self) -> bool {
1389             false
1390         }
1391     }
1392
1393     impl Eq for Bad {}
1394
1395     impl PartialOrd for Bad {
1396         fn partial_cmp(&self, _: &Self) -> Option<Ordering> {
1397             Some(Ordering::Less)
1398         }
1399     }
1400
1401     impl Ord for Bad {
1402         fn cmp(&self, _: &Self) -> Ordering {
1403             Ordering::Less
1404         }
1405     }
1406
1407     let mut m = BTreeMap::new();
1408
1409     for _ in 0..100 {
1410         m.insert(Bad, Bad);
1411     }
1412     m.check();
1413 }
1414
1415 #[test]
1416 fn test_clear() {
1417     let mut map = BTreeMap::new();
1418     for &len in &[MIN_INSERTS_HEIGHT_1, MIN_INSERTS_HEIGHT_2, 0, NODE_CAPACITY] {
1419         for i in 0..len {
1420             map.insert(i, ());
1421         }
1422         assert_eq!(map.len(), len);
1423         map.clear();
1424         map.check();
1425         assert!(map.is_empty());
1426     }
1427 }
1428
1429 #[test]
1430 fn test_clear_drop_panic_leak() {
1431     let a = CrashTestDummy::new(0);
1432     let b = CrashTestDummy::new(1);
1433     let c = CrashTestDummy::new(2);
1434
1435     let mut map = BTreeMap::new();
1436     map.insert(a.spawn(Panic::Never), ());
1437     map.insert(b.spawn(Panic::InDrop), ());
1438     map.insert(c.spawn(Panic::Never), ());
1439
1440     catch_unwind(AssertUnwindSafe(|| map.clear())).unwrap_err();
1441     assert_eq!(a.dropped(), 1);
1442     assert_eq!(b.dropped(), 1);
1443     assert_eq!(c.dropped(), 1);
1444     assert_eq!(map.len(), 0);
1445
1446     drop(map);
1447     assert_eq!(a.dropped(), 1);
1448     assert_eq!(b.dropped(), 1);
1449     assert_eq!(c.dropped(), 1);
1450 }
1451
1452 #[test]
1453 fn test_clone() {
1454     let mut map = BTreeMap::new();
1455     let size = MIN_INSERTS_HEIGHT_1;
1456     assert_eq!(map.len(), 0);
1457
1458     for i in 0..size {
1459         assert_eq!(map.insert(i, 10 * i), None);
1460         assert_eq!(map.len(), i + 1);
1461         map.check();
1462         assert_eq!(map, map.clone());
1463     }
1464
1465     for i in 0..size {
1466         assert_eq!(map.insert(i, 100 * i), Some(10 * i));
1467         assert_eq!(map.len(), size);
1468         map.check();
1469         assert_eq!(map, map.clone());
1470     }
1471
1472     for i in 0..size / 2 {
1473         assert_eq!(map.remove(&(i * 2)), Some(i * 200));
1474         assert_eq!(map.len(), size - i - 1);
1475         map.check();
1476         assert_eq!(map, map.clone());
1477     }
1478
1479     for i in 0..size / 2 {
1480         assert_eq!(map.remove(&(2 * i)), None);
1481         assert_eq!(map.remove(&(2 * i + 1)), Some(i * 200 + 100));
1482         assert_eq!(map.len(), size / 2 - i - 1);
1483         map.check();
1484         assert_eq!(map, map.clone());
1485     }
1486
1487     // Test a tree with 2 semi-full levels and a tree with 3 levels.
1488     map = (1..MIN_INSERTS_HEIGHT_2).map(|i| (i, i)).collect();
1489     assert_eq!(map.len(), MIN_INSERTS_HEIGHT_2 - 1);
1490     assert_eq!(map, map.clone());
1491     map.insert(0, 0);
1492     assert_eq!(map.len(), MIN_INSERTS_HEIGHT_2);
1493     assert_eq!(map, map.clone());
1494     map.check();
1495 }
1496
1497 fn test_clone_panic_leak(size: usize) {
1498     for i in 0..size {
1499         let dummies: Vec<CrashTestDummy> = (0..size).map(|id| CrashTestDummy::new(id)).collect();
1500         let map: BTreeMap<_, ()> = dummies
1501             .iter()
1502             .map(|dummy| {
1503                 let panic = if dummy.id == i { Panic::InClone } else { Panic::Never };
1504                 (dummy.spawn(panic), ())
1505             })
1506             .collect();
1507
1508         catch_unwind(|| map.clone()).unwrap_err();
1509         for d in &dummies {
1510             assert_eq!(d.cloned(), if d.id <= i { 1 } else { 0 }, "id={}/{}", d.id, i);
1511             assert_eq!(d.dropped(), if d.id < i { 1 } else { 0 }, "id={}/{}", d.id, i);
1512         }
1513         assert_eq!(map.len(), size);
1514
1515         drop(map);
1516         for d in &dummies {
1517             assert_eq!(d.cloned(), if d.id <= i { 1 } else { 0 }, "id={}/{}", d.id, i);
1518             assert_eq!(d.dropped(), if d.id < i { 2 } else { 1 }, "id={}/{}", d.id, i);
1519         }
1520     }
1521 }
1522
1523 #[test]
1524 fn test_clone_panic_leak_height_0() {
1525     test_clone_panic_leak(3)
1526 }
1527
1528 #[test]
1529 fn test_clone_panic_leak_height_1() {
1530     test_clone_panic_leak(MIN_INSERTS_HEIGHT_1)
1531 }
1532
1533 #[test]
1534 fn test_clone_from() {
1535     let mut map1 = BTreeMap::new();
1536     let max_size = MIN_INSERTS_HEIGHT_1;
1537
1538     // Range to max_size inclusive, because i is the size of map1 being tested.
1539     for i in 0..=max_size {
1540         let mut map2 = BTreeMap::new();
1541         for j in 0..i {
1542             let mut map1_copy = map2.clone();
1543             map1_copy.clone_from(&map1); // small cloned from large
1544             assert_eq!(map1_copy, map1);
1545             let mut map2_copy = map1.clone();
1546             map2_copy.clone_from(&map2); // large cloned from small
1547             assert_eq!(map2_copy, map2);
1548             map2.insert(100 * j + 1, 2 * j + 1);
1549         }
1550         map2.clone_from(&map1); // same length
1551         map2.check();
1552         assert_eq!(map2, map1);
1553         map1.insert(i, 10 * i);
1554         map1.check();
1555     }
1556 }
1557
1558 #[allow(dead_code)]
1559 fn test_variance() {
1560     fn map_key<'new>(v: BTreeMap<&'static str, ()>) -> BTreeMap<&'new str, ()> {
1561         v
1562     }
1563     fn map_val<'new>(v: BTreeMap<(), &'static str>) -> BTreeMap<(), &'new str> {
1564         v
1565     }
1566
1567     fn iter_key<'a, 'new>(v: Iter<'a, &'static str, ()>) -> Iter<'a, &'new str, ()> {
1568         v
1569     }
1570     fn iter_val<'a, 'new>(v: Iter<'a, (), &'static str>) -> Iter<'a, (), &'new str> {
1571         v
1572     }
1573
1574     fn into_iter_key<'new>(v: IntoIter<&'static str, ()>) -> IntoIter<&'new str, ()> {
1575         v
1576     }
1577     fn into_iter_val<'new>(v: IntoIter<(), &'static str>) -> IntoIter<(), &'new str> {
1578         v
1579     }
1580
1581     fn into_keys_key<'new>(v: IntoKeys<&'static str, ()>) -> IntoKeys<&'new str, ()> {
1582         v
1583     }
1584     fn into_keys_val<'new>(v: IntoKeys<(), &'static str>) -> IntoKeys<(), &'new str> {
1585         v
1586     }
1587
1588     fn into_values_key<'new>(v: IntoValues<&'static str, ()>) -> IntoValues<&'new str, ()> {
1589         v
1590     }
1591     fn into_values_val<'new>(v: IntoValues<(), &'static str>) -> IntoValues<(), &'new str> {
1592         v
1593     }
1594
1595     fn range_key<'a, 'new>(v: Range<'a, &'static str, ()>) -> Range<'a, &'new str, ()> {
1596         v
1597     }
1598     fn range_val<'a, 'new>(v: Range<'a, (), &'static str>) -> Range<'a, (), &'new str> {
1599         v
1600     }
1601
1602     fn keys_key<'a, 'new>(v: Keys<'a, &'static str, ()>) -> Keys<'a, &'new str, ()> {
1603         v
1604     }
1605     fn keys_val<'a, 'new>(v: Keys<'a, (), &'static str>) -> Keys<'a, (), &'new str> {
1606         v
1607     }
1608
1609     fn values_key<'a, 'new>(v: Values<'a, &'static str, ()>) -> Values<'a, &'new str, ()> {
1610         v
1611     }
1612     fn values_val<'a, 'new>(v: Values<'a, (), &'static str>) -> Values<'a, (), &'new str> {
1613         v
1614     }
1615 }
1616
1617 #[allow(dead_code)]
1618 fn test_sync() {
1619     fn map<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1620         v
1621     }
1622
1623     fn into_iter<T: Sync>(v: BTreeMap<T, T>) -> impl Sync {
1624         v.into_iter()
1625     }
1626
1627     fn into_keys<T: Sync + Ord>(v: BTreeMap<T, T>) -> impl Sync {
1628         v.into_keys()
1629     }
1630
1631     fn into_values<T: Sync + Ord>(v: BTreeMap<T, T>) -> impl Sync {
1632         v.into_values()
1633     }
1634
1635     fn drain_filter<T: Sync + Ord>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1636         v.drain_filter(|_, _| false)
1637     }
1638
1639     fn iter<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1640         v.iter()
1641     }
1642
1643     fn iter_mut<T: Sync>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1644         v.iter_mut()
1645     }
1646
1647     fn keys<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1648         v.keys()
1649     }
1650
1651     fn values<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1652         v.values()
1653     }
1654
1655     fn values_mut<T: Sync>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1656         v.values_mut()
1657     }
1658
1659     fn range<T: Sync + Ord>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1660         v.range(..)
1661     }
1662
1663     fn range_mut<T: Sync + Ord>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1664         v.range_mut(..)
1665     }
1666
1667     fn entry<T: Sync + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1668         v.entry(Default::default())
1669     }
1670
1671     fn occupied_entry<T: Sync + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1672         match v.entry(Default::default()) {
1673             Occupied(entry) => entry,
1674             _ => unreachable!(),
1675         }
1676     }
1677
1678     fn vacant_entry<T: Sync + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1679         match v.entry(Default::default()) {
1680             Vacant(entry) => entry,
1681             _ => unreachable!(),
1682         }
1683     }
1684 }
1685
1686 #[allow(dead_code)]
1687 fn test_send() {
1688     fn map<T: Send>(v: BTreeMap<T, T>) -> impl Send {
1689         v
1690     }
1691
1692     fn into_iter<T: Send>(v: BTreeMap<T, T>) -> impl Send {
1693         v.into_iter()
1694     }
1695
1696     fn into_keys<T: Send + Ord>(v: BTreeMap<T, T>) -> impl Send {
1697         v.into_keys()
1698     }
1699
1700     fn into_values<T: Send + Ord>(v: BTreeMap<T, T>) -> impl Send {
1701         v.into_values()
1702     }
1703
1704     fn drain_filter<T: Send + Ord>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1705         v.drain_filter(|_, _| false)
1706     }
1707
1708     fn iter<T: Send + Sync>(v: &BTreeMap<T, T>) -> impl Send + '_ {
1709         v.iter()
1710     }
1711
1712     fn iter_mut<T: Send>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1713         v.iter_mut()
1714     }
1715
1716     fn keys<T: Send + Sync>(v: &BTreeMap<T, T>) -> impl Send + '_ {
1717         v.keys()
1718     }
1719
1720     fn values<T: Send + Sync>(v: &BTreeMap<T, T>) -> impl Send + '_ {
1721         v.values()
1722     }
1723
1724     fn values_mut<T: Send>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1725         v.values_mut()
1726     }
1727
1728     fn range<T: Send + Sync + Ord>(v: &BTreeMap<T, T>) -> impl Send + '_ {
1729         v.range(..)
1730     }
1731
1732     fn range_mut<T: Send + Ord>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1733         v.range_mut(..)
1734     }
1735
1736     fn entry<T: Send + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1737         v.entry(Default::default())
1738     }
1739
1740     fn occupied_entry<T: Send + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1741         match v.entry(Default::default()) {
1742             Occupied(entry) => entry,
1743             _ => unreachable!(),
1744         }
1745     }
1746
1747     fn vacant_entry<T: Send + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1748         match v.entry(Default::default()) {
1749             Vacant(entry) => entry,
1750             _ => unreachable!(),
1751         }
1752     }
1753 }
1754
1755 #[test]
1756 fn test_ord_absence() {
1757     fn map<K>(mut map: BTreeMap<K, ()>) {
1758         let _ = map.is_empty();
1759         let _ = map.len();
1760         map.clear();
1761         let _ = map.iter();
1762         let _ = map.iter_mut();
1763         let _ = map.keys();
1764         let _ = map.values();
1765         let _ = map.values_mut();
1766         if true {
1767             let _ = map.into_values();
1768         } else if true {
1769             let _ = map.into_iter();
1770         } else {
1771             let _ = map.into_keys();
1772         }
1773     }
1774
1775     fn map_debug<K: Debug>(mut map: BTreeMap<K, ()>) {
1776         format!("{:?}", map);
1777         format!("{:?}", map.iter());
1778         format!("{:?}", map.iter_mut());
1779         format!("{:?}", map.keys());
1780         format!("{:?}", map.values());
1781         format!("{:?}", map.values_mut());
1782         if true {
1783             format!("{:?}", map.into_iter());
1784         } else if true {
1785             format!("{:?}", map.into_keys());
1786         } else {
1787             format!("{:?}", map.into_values());
1788         }
1789     }
1790
1791     fn map_clone<K: Clone>(mut map: BTreeMap<K, ()>) {
1792         map.clone_from(&map.clone());
1793     }
1794
1795     #[derive(Debug, Clone)]
1796     struct NonOrd;
1797     map(BTreeMap::<NonOrd, _>::new());
1798     map_debug(BTreeMap::<NonOrd, _>::new());
1799     map_clone(BTreeMap::<NonOrd, _>::default());
1800 }
1801
1802 #[test]
1803 fn test_occupied_entry_key() {
1804     let mut a = BTreeMap::new();
1805     let key = "hello there";
1806     let value = "value goes here";
1807     assert!(a.is_empty());
1808     a.insert(key, value);
1809     assert_eq!(a.len(), 1);
1810     assert_eq!(a[key], value);
1811
1812     match a.entry(key) {
1813         Vacant(_) => panic!(),
1814         Occupied(e) => assert_eq!(key, *e.key()),
1815     }
1816     assert_eq!(a.len(), 1);
1817     assert_eq!(a[key], value);
1818     a.check();
1819 }
1820
1821 #[test]
1822 fn test_vacant_entry_key() {
1823     let mut a = BTreeMap::new();
1824     let key = "hello there";
1825     let value = "value goes here";
1826
1827     assert!(a.is_empty());
1828     match a.entry(key) {
1829         Occupied(_) => panic!(),
1830         Vacant(e) => {
1831             assert_eq!(key, *e.key());
1832             e.insert(value);
1833         }
1834     }
1835     assert_eq!(a.len(), 1);
1836     assert_eq!(a[key], value);
1837     a.check();
1838 }
1839
1840 #[test]
1841 fn test_first_last_entry() {
1842     let mut a = BTreeMap::new();
1843     assert!(a.first_entry().is_none());
1844     assert!(a.last_entry().is_none());
1845     a.insert(1, 42);
1846     assert_eq!(a.first_entry().unwrap().key(), &1);
1847     assert_eq!(a.last_entry().unwrap().key(), &1);
1848     a.insert(2, 24);
1849     assert_eq!(a.first_entry().unwrap().key(), &1);
1850     assert_eq!(a.last_entry().unwrap().key(), &2);
1851     a.insert(0, 6);
1852     assert_eq!(a.first_entry().unwrap().key(), &0);
1853     assert_eq!(a.last_entry().unwrap().key(), &2);
1854     let (k1, v1) = a.first_entry().unwrap().remove_entry();
1855     assert_eq!(k1, 0);
1856     assert_eq!(v1, 6);
1857     let (k2, v2) = a.last_entry().unwrap().remove_entry();
1858     assert_eq!(k2, 2);
1859     assert_eq!(v2, 24);
1860     assert_eq!(a.first_entry().unwrap().key(), &1);
1861     assert_eq!(a.last_entry().unwrap().key(), &1);
1862     a.check();
1863 }
1864
1865 #[test]
1866 fn test_insert_into_full_height_0() {
1867     let size = NODE_CAPACITY;
1868     for pos in 0..=size {
1869         let mut map: BTreeMap<_, _> = (0..size).map(|i| (i * 2 + 1, ())).collect();
1870         assert!(map.insert(pos * 2, ()).is_none());
1871         map.check();
1872     }
1873 }
1874
1875 #[test]
1876 fn test_insert_into_full_height_1() {
1877     let size = NODE_CAPACITY + 1 + NODE_CAPACITY;
1878     for pos in 0..=size {
1879         let mut map: BTreeMap<_, _> = (0..size).map(|i| (i * 2 + 1, ())).collect();
1880         map.compact();
1881         let root_node = map.root.as_ref().unwrap().reborrow();
1882         assert_eq!(root_node.len(), 1);
1883         assert_eq!(root_node.first_leaf_edge().into_node().len(), NODE_CAPACITY);
1884         assert_eq!(root_node.last_leaf_edge().into_node().len(), NODE_CAPACITY);
1885
1886         assert!(map.insert(pos * 2, ()).is_none());
1887         map.check();
1888     }
1889 }
1890
1891 macro_rules! create_append_test {
1892     ($name:ident, $len:expr) => {
1893         #[test]
1894         fn $name() {
1895             let mut a = BTreeMap::new();
1896             for i in 0..8 {
1897                 a.insert(i, i);
1898             }
1899
1900             let mut b = BTreeMap::new();
1901             for i in 5..$len {
1902                 b.insert(i, 2 * i);
1903             }
1904
1905             a.append(&mut b);
1906
1907             assert_eq!(a.len(), $len);
1908             assert_eq!(b.len(), 0);
1909
1910             for i in 0..$len {
1911                 if i < 5 {
1912                     assert_eq!(a[&i], i);
1913                 } else {
1914                     assert_eq!(a[&i], 2 * i);
1915                 }
1916             }
1917
1918             a.check();
1919             assert_eq!(a.remove(&($len - 1)), Some(2 * ($len - 1)));
1920             assert_eq!(a.insert($len - 1, 20), None);
1921             a.check();
1922         }
1923     };
1924 }
1925
1926 // These are mostly for testing the algorithm that "fixes" the right edge after insertion.
1927 // Single node.
1928 create_append_test!(test_append_9, 9);
1929 // Two leafs that don't need fixing.
1930 create_append_test!(test_append_17, 17);
1931 // Two leafs where the second one ends up underfull and needs stealing at the end.
1932 create_append_test!(test_append_14, 14);
1933 // Two leafs where the second one ends up empty because the insertion finished at the root.
1934 create_append_test!(test_append_12, 12);
1935 // Three levels; insertion finished at the root.
1936 create_append_test!(test_append_144, 144);
1937 // Three levels; insertion finished at leaf while there is an empty node on the second level.
1938 create_append_test!(test_append_145, 145);
1939 // Tests for several randomly chosen sizes.
1940 create_append_test!(test_append_170, 170);
1941 create_append_test!(test_append_181, 181);
1942 #[cfg(not(miri))] // Miri is too slow
1943 create_append_test!(test_append_239, 239);
1944 #[cfg(not(miri))] // Miri is too slow
1945 create_append_test!(test_append_1700, 1700);
1946
1947 #[test]
1948 fn test_append_drop_leak() {
1949     let a = CrashTestDummy::new(0);
1950     let b = CrashTestDummy::new(1);
1951     let c = CrashTestDummy::new(2);
1952     let mut left = BTreeMap::new();
1953     let mut right = BTreeMap::new();
1954     left.insert(a.spawn(Panic::Never), ());
1955     left.insert(b.spawn(Panic::InDrop), ()); // first duplicate key, dropped during append
1956     left.insert(c.spawn(Panic::Never), ());
1957     right.insert(b.spawn(Panic::Never), ());
1958     right.insert(c.spawn(Panic::Never), ());
1959
1960     catch_unwind(move || left.append(&mut right)).unwrap_err();
1961     assert_eq!(a.dropped(), 1);
1962     assert_eq!(b.dropped(), 1); // should be 2 were it not for Rust issue #47949
1963     assert_eq!(c.dropped(), 2);
1964 }
1965
1966 #[test]
1967 fn test_append_ord_chaos() {
1968     let mut map1 = BTreeMap::new();
1969     map1.insert(Cyclic3::A, ());
1970     map1.insert(Cyclic3::B, ());
1971     let mut map2 = BTreeMap::new();
1972     map2.insert(Cyclic3::A, ());
1973     map2.insert(Cyclic3::B, ());
1974     map2.insert(Cyclic3::C, ()); // lands first, before A
1975     map2.insert(Cyclic3::B, ()); // lands first, before C
1976     map1.check();
1977     map2.check(); // keys are not unique but still strictly ascending
1978     assert_eq!(map1.len(), 2);
1979     assert_eq!(map2.len(), 4);
1980     map1.append(&mut map2);
1981     assert_eq!(map1.len(), 5);
1982     assert_eq!(map2.len(), 0);
1983     map1.check();
1984     map2.check();
1985 }
1986
1987 fn rand_data(len: usize) -> Vec<(u32, u32)> {
1988     let mut rng = DeterministicRng::new();
1989     Vec::from_iter((0..len).map(|_| (rng.next(), rng.next())))
1990 }
1991
1992 #[test]
1993 fn test_split_off_empty_right() {
1994     let mut data = rand_data(173);
1995
1996     let mut map = BTreeMap::from_iter(data.clone());
1997     let right = map.split_off(&(data.iter().max().unwrap().0 + 1));
1998     map.check();
1999     right.check();
2000
2001     data.sort();
2002     assert!(map.into_iter().eq(data));
2003     assert!(right.into_iter().eq(None));
2004 }
2005
2006 #[test]
2007 fn test_split_off_empty_left() {
2008     let mut data = rand_data(314);
2009
2010     let mut map = BTreeMap::from_iter(data.clone());
2011     let right = map.split_off(&data.iter().min().unwrap().0);
2012     map.check();
2013     right.check();
2014
2015     data.sort();
2016     assert!(map.into_iter().eq(None));
2017     assert!(right.into_iter().eq(data));
2018 }
2019
2020 // In a tree with 3 levels, if all but a part of the first leaf node is split off,
2021 // make sure fix_top eliminates both top levels.
2022 #[test]
2023 fn test_split_off_tiny_left_height_2() {
2024     let pairs = (0..MIN_INSERTS_HEIGHT_2).map(|i| (i, i));
2025     let mut left: BTreeMap<_, _> = pairs.clone().collect();
2026     let right = left.split_off(&1);
2027     left.check();
2028     right.check();
2029     assert_eq!(left.len(), 1);
2030     assert_eq!(right.len(), MIN_INSERTS_HEIGHT_2 - 1);
2031     assert_eq!(*left.first_key_value().unwrap().0, 0);
2032     assert_eq!(*right.first_key_value().unwrap().0, 1);
2033 }
2034
2035 // In a tree with 3 levels, if only part of the last leaf node is split off,
2036 // make sure fix_top eliminates both top levels.
2037 #[test]
2038 fn test_split_off_tiny_right_height_2() {
2039     let pairs = (0..MIN_INSERTS_HEIGHT_2).map(|i| (i, i));
2040     let last = MIN_INSERTS_HEIGHT_2 - 1;
2041     let mut left: BTreeMap<_, _> = pairs.clone().collect();
2042     assert_eq!(*left.last_key_value().unwrap().0, last);
2043     let right = left.split_off(&last);
2044     left.check();
2045     right.check();
2046     assert_eq!(left.len(), MIN_INSERTS_HEIGHT_2 - 1);
2047     assert_eq!(right.len(), 1);
2048     assert_eq!(*left.last_key_value().unwrap().0, last - 1);
2049     assert_eq!(*right.last_key_value().unwrap().0, last);
2050 }
2051
2052 #[test]
2053 fn test_split_off_halfway() {
2054     let mut rng = DeterministicRng::new();
2055     for &len in &[NODE_CAPACITY, 25, 50, 75, 100] {
2056         let mut data = Vec::from_iter((0..len).map(|_| (rng.next(), ())));
2057         // Insertion in non-ascending order creates some variation in node length.
2058         let mut map = BTreeMap::from_iter(data.iter().copied());
2059         data.sort();
2060         let small_keys = data.iter().take(len / 2).map(|kv| kv.0);
2061         let large_keys = data.iter().skip(len / 2).map(|kv| kv.0);
2062         let split_key = large_keys.clone().next().unwrap();
2063         let right = map.split_off(&split_key);
2064         map.check();
2065         right.check();
2066         assert!(map.keys().copied().eq(small_keys));
2067         assert!(right.keys().copied().eq(large_keys));
2068     }
2069 }
2070
2071 #[test]
2072 fn test_split_off_large_random_sorted() {
2073     // Miri is too slow
2074     let mut data = if cfg!(miri) { rand_data(529) } else { rand_data(1529) };
2075     // special case with maximum height.
2076     data.sort();
2077
2078     let mut map = BTreeMap::from_iter(data.clone());
2079     let key = data[data.len() / 2].0;
2080     let right = map.split_off(&key);
2081     map.check();
2082     right.check();
2083
2084     assert!(map.into_iter().eq(data.clone().into_iter().filter(|x| x.0 < key)));
2085     assert!(right.into_iter().eq(data.into_iter().filter(|x| x.0 >= key)));
2086 }
2087
2088 #[test]
2089 fn test_into_iter_drop_leak_height_0() {
2090     let a = CrashTestDummy::new(0);
2091     let b = CrashTestDummy::new(1);
2092     let c = CrashTestDummy::new(2);
2093     let d = CrashTestDummy::new(3);
2094     let e = CrashTestDummy::new(4);
2095     let mut map = BTreeMap::new();
2096     map.insert("a", a.spawn(Panic::Never));
2097     map.insert("b", b.spawn(Panic::Never));
2098     map.insert("c", c.spawn(Panic::Never));
2099     map.insert("d", d.spawn(Panic::InDrop));
2100     map.insert("e", e.spawn(Panic::Never));
2101
2102     catch_unwind(move || drop(map.into_iter())).unwrap_err();
2103
2104     assert_eq!(a.dropped(), 1);
2105     assert_eq!(b.dropped(), 1);
2106     assert_eq!(c.dropped(), 1);
2107     assert_eq!(d.dropped(), 1);
2108     assert_eq!(e.dropped(), 1);
2109 }
2110
2111 #[test]
2112 fn test_into_iter_drop_leak_height_1() {
2113     let size = MIN_INSERTS_HEIGHT_1;
2114     for panic_point in vec![0, 1, size - 2, size - 1] {
2115         let dummies: Vec<_> = (0..size).map(|i| CrashTestDummy::new(i)).collect();
2116         let map: BTreeMap<_, _> = (0..size)
2117             .map(|i| {
2118                 let panic = if i == panic_point { Panic::InDrop } else { Panic::Never };
2119                 (dummies[i].spawn(Panic::Never), dummies[i].spawn(panic))
2120             })
2121             .collect();
2122         catch_unwind(move || drop(map.into_iter())).unwrap_err();
2123         for i in 0..size {
2124             assert_eq!(dummies[i].dropped(), 2);
2125         }
2126     }
2127 }
2128
2129 #[test]
2130 fn test_into_keys() {
2131     let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
2132     let map: BTreeMap<_, _> = vec.into_iter().collect();
2133     let keys: Vec<_> = map.into_keys().collect();
2134
2135     assert_eq!(keys.len(), 3);
2136     assert!(keys.contains(&1));
2137     assert!(keys.contains(&2));
2138     assert!(keys.contains(&3));
2139 }
2140
2141 #[test]
2142 fn test_into_values() {
2143     let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
2144     let map: BTreeMap<_, _> = vec.into_iter().collect();
2145     let values: Vec<_> = map.into_values().collect();
2146
2147     assert_eq!(values.len(), 3);
2148     assert!(values.contains(&'a'));
2149     assert!(values.contains(&'b'));
2150     assert!(values.contains(&'c'));
2151 }
2152
2153 #[test]
2154 fn test_insert_remove_intertwined() {
2155     let loops = if cfg!(miri) { 100 } else { 1_000_000 };
2156     let mut map = BTreeMap::new();
2157     let mut i = 1;
2158     let offset = 165; // somewhat arbitrarily chosen to cover some code paths
2159     for _ in 0..loops {
2160         i = (i + offset) & 0xFF;
2161         map.insert(i, i);
2162         map.remove(&(0xFF - i));
2163     }
2164     map.check();
2165 }
2166
2167 #[test]
2168 fn test_insert_remove_intertwined_ord_chaos() {
2169     let loops = if cfg!(miri) { 100 } else { 1_000_000 };
2170     let gov = Governor::new();
2171     let mut map = BTreeMap::new();
2172     let mut i = 1;
2173     let offset = 165; // more arbitrarily copied from above
2174     for _ in 0..loops {
2175         i = (i + offset) & 0xFF;
2176         map.insert(Governed(i, &gov), ());
2177         map.remove(&Governed(0xFF - i, &gov));
2178         gov.flip();
2179     }
2180     map.check_invariants();
2181 }
2182
2183 #[test]
2184 fn from_array() {
2185     let map = BTreeMap::from([(1, 2), (3, 4)]);
2186     let unordered_duplicates = BTreeMap::from([(3, 4), (1, 2), (1, 2)]);
2187     assert_eq!(map, unordered_duplicates);
2188 }