1 use super::super::DeterministicRng;
4 use std::cmp::Ordering;
5 use std::iter::FromIterator;
6 use std::panic::{catch_unwind, AssertUnwindSafe};
7 use std::sync::atomic::{AtomicU32, Ordering::SeqCst};
11 let mut m = BTreeSet::new();
16 assert_eq!(m.clone(), m);
21 const SET: &'static BTreeSet<()> = &BTreeSet::new();
22 const LEN: usize = SET.len();
23 const IS_EMPTY: bool = SET.is_empty();
27 fn test_iter_min_max() {
28 let mut a = BTreeSet::new();
29 assert_eq!(a.iter().min(), None);
30 assert_eq!(a.iter().max(), None);
31 assert_eq!(a.range(..).min(), None);
32 assert_eq!(a.range(..).max(), None);
33 assert_eq!(a.difference(&BTreeSet::new()).min(), None);
34 assert_eq!(a.difference(&BTreeSet::new()).max(), None);
35 assert_eq!(a.intersection(&a).min(), None);
36 assert_eq!(a.intersection(&a).max(), None);
37 assert_eq!(a.symmetric_difference(&BTreeSet::new()).min(), None);
38 assert_eq!(a.symmetric_difference(&BTreeSet::new()).max(), None);
39 assert_eq!(a.union(&a).min(), None);
40 assert_eq!(a.union(&a).max(), None);
43 assert_eq!(a.iter().min(), Some(&1));
44 assert_eq!(a.iter().max(), Some(&2));
45 assert_eq!(a.range(..).min(), Some(&1));
46 assert_eq!(a.range(..).max(), Some(&2));
47 assert_eq!(a.difference(&BTreeSet::new()).min(), Some(&1));
48 assert_eq!(a.difference(&BTreeSet::new()).max(), Some(&2));
49 assert_eq!(a.intersection(&a).min(), Some(&1));
50 assert_eq!(a.intersection(&a).max(), Some(&2));
51 assert_eq!(a.symmetric_difference(&BTreeSet::new()).min(), Some(&1));
52 assert_eq!(a.symmetric_difference(&BTreeSet::new()).max(), Some(&2));
53 assert_eq!(a.union(&a).min(), Some(&1));
54 assert_eq!(a.union(&a).max(), Some(&2));
57 fn check<F>(a: &[i32], b: &[i32], expected: &[i32], f: F)
59 F: FnOnce(&BTreeSet<i32>, &BTreeSet<i32>, &mut dyn FnMut(&i32) -> bool) -> bool,
61 let mut set_a = BTreeSet::new();
62 let mut set_b = BTreeSet::new();
65 assert!(set_a.insert(*x))
68 assert!(set_b.insert(*y))
72 f(&set_a, &set_b, &mut |&x| {
73 if i < expected.len() {
74 assert_eq!(x, expected[i]);
79 assert_eq!(i, expected.len());
83 fn test_intersection() {
84 fn check_intersection(a: &[i32], b: &[i32], expected: &[i32]) {
85 check(a, b, expected, |x, y, f| x.intersection(y).all(f))
88 check_intersection(&[], &[], &[]);
89 check_intersection(&[1, 2, 3], &[], &[]);
90 check_intersection(&[], &[1, 2, 3], &[]);
91 check_intersection(&[2], &[1, 2, 3], &[2]);
92 check_intersection(&[1, 2, 3], &[2], &[2]);
93 check_intersection(&[11, 1, 3, 77, 103, 5, -5], &[2, 11, 77, -9, -42, 5, 3], &[3, 5, 11, 77]);
100 let large = (0..100).collect::<Vec<_>>();
101 check_intersection(&[], &large, &[]);
102 check_intersection(&large, &[], &[]);
103 check_intersection(&[-1], &large, &[]);
104 check_intersection(&large, &[-1], &[]);
105 check_intersection(&[0], &large, &[0]);
106 check_intersection(&large, &[0], &[0]);
107 check_intersection(&[99], &large, &[99]);
108 check_intersection(&large, &[99], &[99]);
109 check_intersection(&[100], &large, &[]);
110 check_intersection(&large, &[100], &[]);
111 check_intersection(&[11, 5000, 1, 3, 77, 8924], &large, &[1, 3, 11, 77]);
115 fn test_intersection_size_hint() {
116 let x: BTreeSet<i32> = [3, 4].iter().copied().collect();
117 let y: BTreeSet<i32> = [1, 2, 3].iter().copied().collect();
118 let mut iter = x.intersection(&y);
119 assert_eq!(iter.size_hint(), (1, Some(1)));
120 assert_eq!(iter.next(), Some(&3));
121 assert_eq!(iter.size_hint(), (0, Some(0)));
122 assert_eq!(iter.next(), None);
124 iter = y.intersection(&y);
125 assert_eq!(iter.size_hint(), (0, Some(3)));
126 assert_eq!(iter.next(), Some(&1));
127 assert_eq!(iter.size_hint(), (0, Some(2)));
131 fn test_difference() {
132 fn check_difference(a: &[i32], b: &[i32], expected: &[i32]) {
133 check(a, b, expected, |x, y, f| x.difference(y).all(f))
136 check_difference(&[], &[], &[]);
137 check_difference(&[1, 12], &[], &[1, 12]);
138 check_difference(&[], &[1, 2, 3, 9], &[]);
139 check_difference(&[1, 3, 5, 9, 11], &[3, 9], &[1, 5, 11]);
140 check_difference(&[1, 3, 5, 9, 11], &[3, 6, 9], &[1, 5, 11]);
141 check_difference(&[1, 3, 5, 9, 11], &[0, 1], &[3, 5, 9, 11]);
142 check_difference(&[1, 3, 5, 9, 11], &[11, 12], &[1, 3, 5, 9]);
144 &[-5, 11, 22, 33, 40, 42],
145 &[-12, -5, 14, 23, 34, 38, 39, 50],
146 &[11, 22, 33, 40, 42],
154 let large = (0..100).collect::<Vec<_>>();
155 check_difference(&[], &large, &[]);
156 check_difference(&[-1], &large, &[-1]);
157 check_difference(&[0], &large, &[]);
158 check_difference(&[99], &large, &[]);
159 check_difference(&[100], &large, &[100]);
160 check_difference(&[11, 5000, 1, 3, 77, 8924], &large, &[5000, 8924]);
161 check_difference(&large, &[], &large);
162 check_difference(&large, &[-1], &large);
163 check_difference(&large, &[100], &large);
167 fn test_difference_size_hint() {
168 let s246: BTreeSet<i32> = [2, 4, 6].iter().copied().collect();
169 let s23456: BTreeSet<i32> = (2..=6).collect();
170 let mut iter = s246.difference(&s23456);
171 assert_eq!(iter.size_hint(), (0, Some(3)));
172 assert_eq!(iter.next(), None);
174 let s12345: BTreeSet<i32> = (1..=5).collect();
175 iter = s246.difference(&s12345);
176 assert_eq!(iter.size_hint(), (0, Some(3)));
177 assert_eq!(iter.next(), Some(&6));
178 assert_eq!(iter.size_hint(), (0, Some(0)));
179 assert_eq!(iter.next(), None);
181 let s34567: BTreeSet<i32> = (3..=7).collect();
182 iter = s246.difference(&s34567);
183 assert_eq!(iter.size_hint(), (0, Some(3)));
184 assert_eq!(iter.next(), Some(&2));
185 assert_eq!(iter.size_hint(), (0, Some(2)));
186 assert_eq!(iter.next(), None);
188 let s1: BTreeSet<i32> = (-9..=1).collect();
189 iter = s246.difference(&s1);
190 assert_eq!(iter.size_hint(), (3, Some(3)));
192 let s2: BTreeSet<i32> = (-9..=2).collect();
193 iter = s246.difference(&s2);
194 assert_eq!(iter.size_hint(), (2, Some(2)));
195 assert_eq!(iter.next(), Some(&4));
196 assert_eq!(iter.size_hint(), (1, Some(1)));
198 let s23: BTreeSet<i32> = (2..=3).collect();
199 iter = s246.difference(&s23);
200 assert_eq!(iter.size_hint(), (1, Some(3)));
201 assert_eq!(iter.next(), Some(&4));
202 assert_eq!(iter.size_hint(), (1, Some(1)));
204 let s4: BTreeSet<i32> = (4..=4).collect();
205 iter = s246.difference(&s4);
206 assert_eq!(iter.size_hint(), (2, Some(3)));
207 assert_eq!(iter.next(), Some(&2));
208 assert_eq!(iter.size_hint(), (1, Some(2)));
209 assert_eq!(iter.next(), Some(&6));
210 assert_eq!(iter.size_hint(), (0, Some(0)));
211 assert_eq!(iter.next(), None);
213 let s56: BTreeSet<i32> = (5..=6).collect();
214 iter = s246.difference(&s56);
215 assert_eq!(iter.size_hint(), (1, Some(3)));
216 assert_eq!(iter.next(), Some(&2));
217 assert_eq!(iter.size_hint(), (0, Some(2)));
219 let s6: BTreeSet<i32> = (6..=19).collect();
220 iter = s246.difference(&s6);
221 assert_eq!(iter.size_hint(), (2, Some(2)));
222 assert_eq!(iter.next(), Some(&2));
223 assert_eq!(iter.size_hint(), (1, Some(1)));
225 let s7: BTreeSet<i32> = (7..=19).collect();
226 iter = s246.difference(&s7);
227 assert_eq!(iter.size_hint(), (3, Some(3)));
231 fn test_symmetric_difference() {
232 fn check_symmetric_difference(a: &[i32], b: &[i32], expected: &[i32]) {
233 check(a, b, expected, |x, y, f| x.symmetric_difference(y).all(f))
236 check_symmetric_difference(&[], &[], &[]);
237 check_symmetric_difference(&[1, 2, 3], &[2], &[1, 3]);
238 check_symmetric_difference(&[2], &[1, 2, 3], &[1, 3]);
239 check_symmetric_difference(&[1, 3, 5, 9, 11], &[-2, 3, 9, 14, 22], &[-2, 1, 5, 11, 14, 22]);
243 fn test_symmetric_difference_size_hint() {
244 let x: BTreeSet<i32> = [2, 4].iter().copied().collect();
245 let y: BTreeSet<i32> = [1, 2, 3].iter().copied().collect();
246 let mut iter = x.symmetric_difference(&y);
247 assert_eq!(iter.size_hint(), (0, Some(5)));
248 assert_eq!(iter.next(), Some(&1));
249 assert_eq!(iter.size_hint(), (0, Some(4)));
250 assert_eq!(iter.next(), Some(&3));
251 assert_eq!(iter.size_hint(), (0, Some(1)));
256 fn check_union(a: &[i32], b: &[i32], expected: &[i32]) {
257 check(a, b, expected, |x, y, f| x.union(y).all(f))
260 check_union(&[], &[], &[]);
261 check_union(&[1, 2, 3], &[2], &[1, 2, 3]);
262 check_union(&[2], &[1, 2, 3], &[1, 2, 3]);
264 &[1, 3, 5, 9, 11, 16, 19, 24],
265 &[-2, 1, 5, 9, 13, 19],
266 &[-2, 1, 3, 5, 9, 11, 13, 16, 19, 24],
271 fn test_union_size_hint() {
272 let x: BTreeSet<i32> = [2, 4].iter().copied().collect();
273 let y: BTreeSet<i32> = [1, 2, 3].iter().copied().collect();
274 let mut iter = x.union(&y);
275 assert_eq!(iter.size_hint(), (3, Some(5)));
276 assert_eq!(iter.next(), Some(&1));
277 assert_eq!(iter.size_hint(), (2, Some(4)));
278 assert_eq!(iter.next(), Some(&2));
279 assert_eq!(iter.size_hint(), (1, Some(2)));
283 // Only tests the simple function definition with respect to intersection
284 fn test_is_disjoint() {
285 let one = [1].iter().collect::<BTreeSet<_>>();
286 let two = [2].iter().collect::<BTreeSet<_>>();
287 assert!(one.is_disjoint(&two));
291 // Also implicitly tests the trivial function definition of is_superset
292 fn test_is_subset() {
293 fn is_subset(a: &[i32], b: &[i32]) -> bool {
294 let set_a = a.iter().collect::<BTreeSet<_>>();
295 let set_b = b.iter().collect::<BTreeSet<_>>();
296 set_a.is_subset(&set_b)
299 assert_eq!(is_subset(&[], &[]), true);
300 assert_eq!(is_subset(&[], &[1, 2]), true);
301 assert_eq!(is_subset(&[0], &[1, 2]), false);
302 assert_eq!(is_subset(&[1], &[1, 2]), true);
303 assert_eq!(is_subset(&[2], &[1, 2]), true);
304 assert_eq!(is_subset(&[3], &[1, 2]), false);
305 assert_eq!(is_subset(&[1, 2], &[1]), false);
306 assert_eq!(is_subset(&[1, 2], &[1, 2]), true);
307 assert_eq!(is_subset(&[1, 2], &[2, 3]), false);
309 is_subset(&[-5, 11, 22, 33, 40, 42], &[-12, -5, 11, 14, 22, 23, 33, 34, 38, 39, 40, 42]),
312 assert_eq!(is_subset(&[-5, 11, 22, 33, 40, 42], &[-12, -5, 11, 14, 22, 23, 34, 38]), false);
319 let large = (0..100).collect::<Vec<_>>();
320 assert_eq!(is_subset(&[], &large), true);
321 assert_eq!(is_subset(&large, &[]), false);
322 assert_eq!(is_subset(&[-1], &large), false);
323 assert_eq!(is_subset(&[0], &large), true);
324 assert_eq!(is_subset(&[1, 2], &large), true);
325 assert_eq!(is_subset(&[99, 100], &large), false);
330 let xs = [1, 2, 3, 4, 5, 6];
331 let mut set: BTreeSet<i32> = xs.iter().cloned().collect();
332 set.retain(|&k| k % 2 == 0);
333 assert_eq!(set.len(), 3);
334 assert!(set.contains(&2));
335 assert!(set.contains(&4));
336 assert!(set.contains(&6));
340 fn test_drain_filter() {
341 let mut x: BTreeSet<_> = [1].iter().copied().collect();
342 let mut y: BTreeSet<_> = [1].iter().copied().collect();
344 x.drain_filter(|_| true);
345 y.drain_filter(|_| false);
346 assert_eq!(x.len(), 0);
347 assert_eq!(y.len(), 1);
351 fn test_drain_filter_drop_panic_leak() {
352 static PREDS: AtomicU32 = AtomicU32::new(0);
353 static DROPS: AtomicU32 = AtomicU32::new(0);
355 #[derive(PartialEq, Eq, PartialOrd, Ord)]
359 if DROPS.fetch_add(1, SeqCst) == 1 {
360 panic!("panic in `drop`");
365 let mut set = BTreeSet::new();
370 catch_unwind(move || {
371 drop(set.drain_filter(|d| {
372 PREDS.fetch_add(1u32 << d.0, SeqCst);
378 assert_eq!(PREDS.load(SeqCst), 0x011);
379 assert_eq!(DROPS.load(SeqCst), 3);
383 fn test_drain_filter_pred_panic_leak() {
384 static PREDS: AtomicU32 = AtomicU32::new(0);
385 static DROPS: AtomicU32 = AtomicU32::new(0);
387 #[derive(PartialEq, Eq, PartialOrd, Ord)]
391 DROPS.fetch_add(1, SeqCst);
395 let mut set = BTreeSet::new();
400 catch_unwind(AssertUnwindSafe(|| {
401 drop(set.drain_filter(|d| {
402 PREDS.fetch_add(1u32 << d.0, SeqCst);
411 assert_eq!(PREDS.load(SeqCst), 0x011);
412 assert_eq!(DROPS.load(SeqCst), 1);
413 assert_eq!(set.len(), 2);
414 assert_eq!(set.first().unwrap().0, 4);
415 assert_eq!(set.last().unwrap().0, 8);
420 let mut x = BTreeSet::new();
424 assert!(x.is_empty());
429 let mut x = BTreeSet::new();
434 let mut y = BTreeSet::new();
440 let mut z = x.iter().zip(&y);
442 assert_eq!(z.next().unwrap(), (&5, &("bar")));
443 assert_eq!(z.next().unwrap(), (&11, &("foo")));
444 assert!(z.next().is_none());
448 fn test_from_iter() {
449 let xs = [1, 2, 3, 4, 5, 6, 7, 8, 9];
451 let set: BTreeSet<_> = xs.iter().cloned().collect();
454 assert!(set.contains(x));
460 let mut set = BTreeSet::new();
461 let empty = BTreeSet::<i32>::new();
466 let set_str = format!("{:?}", set);
468 assert_eq!(set_str, "{1, 2}");
469 assert_eq!(format!("{:?}", empty), "{}");
473 fn test_extend_ref() {
474 let mut a = BTreeSet::new();
477 a.extend(&[2, 3, 4]);
479 assert_eq!(a.len(), 4);
480 assert!(a.contains(&1));
481 assert!(a.contains(&2));
482 assert!(a.contains(&3));
483 assert!(a.contains(&4));
485 let mut b = BTreeSet::new();
491 assert_eq!(a.len(), 6);
492 assert!(a.contains(&1));
493 assert!(a.contains(&2));
494 assert!(a.contains(&3));
495 assert!(a.contains(&4));
496 assert!(a.contains(&5));
497 assert!(a.contains(&6));
503 struct Foo(&'static str, i32);
505 impl PartialEq for Foo {
506 fn eq(&self, other: &Self) -> bool {
513 impl PartialOrd for Foo {
514 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
515 self.0.partial_cmp(&other.0)
520 fn cmp(&self, other: &Self) -> Ordering {
525 let mut s = BTreeSet::new();
526 assert_eq!(s.replace(Foo("a", 1)), None);
527 assert_eq!(s.len(), 1);
528 assert_eq!(s.replace(Foo("a", 2)), Some(Foo("a", 1)));
529 assert_eq!(s.len(), 1);
532 let mut it = s.iter();
533 assert_eq!(it.next(), Some(&Foo("a", 2)));
534 assert_eq!(it.next(), None);
537 assert_eq!(s.get(&Foo("a", 1)), Some(&Foo("a", 2)));
538 assert_eq!(s.take(&Foo("a", 1)), Some(Foo("a", 2)));
539 assert_eq!(s.len(), 0);
541 assert_eq!(s.get(&Foo("a", 1)), None);
542 assert_eq!(s.take(&Foo("a", 1)), None);
544 assert_eq!(s.iter().next(), None);
549 fn set<'new>(v: BTreeSet<&'static str>) -> BTreeSet<&'new str> {
552 fn iter<'a, 'new>(v: Iter<'a, &'static str>) -> Iter<'a, &'new str> {
555 fn into_iter<'new>(v: IntoIter<&'static str>) -> IntoIter<&'new str> {
558 fn range<'a, 'new>(v: Range<'a, &'static str>) -> Range<'a, &'new str> {
561 // not applied to Difference, Intersection, SymmetricDifference, Union
566 fn set<T: Sync>(v: &BTreeSet<T>) -> impl Sync + '_ {
570 fn iter<T: Sync>(v: &BTreeSet<T>) -> impl Sync + '_ {
574 fn into_iter<T: Sync>(v: BTreeSet<T>) -> impl Sync {
578 fn range<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
582 fn drain_filter<T: Sync + Ord>(v: &mut BTreeSet<T>) -> impl Sync + '_ {
583 v.drain_filter(|_| false)
586 fn difference<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
590 fn intersection<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
594 fn symmetric_difference<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
595 v.symmetric_difference(&v)
598 fn union<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
605 fn set<T: Send>(v: BTreeSet<T>) -> impl Send {
609 fn iter<T: Send + Sync>(v: &BTreeSet<T>) -> impl Send + '_ {
613 fn into_iter<T: Send>(v: BTreeSet<T>) -> impl Send {
617 fn range<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
621 fn drain_filter<T: Send + Ord>(v: &mut BTreeSet<T>) -> impl Send + '_ {
622 v.drain_filter(|_| false)
625 fn difference<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
629 fn intersection<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
633 fn symmetric_difference<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
634 v.symmetric_difference(&v)
637 fn union<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
644 let mut a = BTreeSet::new();
649 let mut b = BTreeSet::new();
656 assert_eq!(a.len(), 5);
657 assert_eq!(b.len(), 0);
659 assert_eq!(a.contains(&1), true);
660 assert_eq!(a.contains(&2), true);
661 assert_eq!(a.contains(&3), true);
662 assert_eq!(a.contains(&4), true);
663 assert_eq!(a.contains(&5), true);
667 fn test_first_last() {
668 let mut a = BTreeSet::new();
669 assert_eq!(a.first(), None);
670 assert_eq!(a.last(), None);
672 assert_eq!(a.first(), Some(&1));
673 assert_eq!(a.last(), Some(&1));
675 assert_eq!(a.first(), Some(&1));
676 assert_eq!(a.last(), Some(&2));
680 assert_eq!(a.first(), Some(&1));
681 assert_eq!(a.last(), Some(&12));
682 assert_eq!(a.pop_first(), Some(1));
683 assert_eq!(a.pop_last(), Some(12));
684 assert_eq!(a.pop_first(), Some(2));
685 assert_eq!(a.pop_last(), Some(11));
686 assert_eq!(a.pop_first(), Some(3));
687 assert_eq!(a.pop_last(), Some(10));
688 assert_eq!(a.pop_first(), Some(4));
689 assert_eq!(a.pop_first(), Some(5));
690 assert_eq!(a.pop_first(), Some(6));
691 assert_eq!(a.pop_first(), Some(7));
692 assert_eq!(a.pop_first(), Some(8));
693 assert_eq!(a.clone().pop_last(), Some(9));
694 assert_eq!(a.pop_first(), Some(9));
695 assert_eq!(a.pop_first(), None);
696 assert_eq!(a.pop_last(), None);
699 fn rand_data(len: usize) -> Vec<u32> {
700 assert!(len <= 70029); // from that point on numbers repeat
701 let mut rng = DeterministicRng::new();
702 Vec::from_iter((0..len).map(|_| rng.next()))
706 fn test_split_off_empty_right() {
707 let mut data = rand_data(173);
709 let mut set = BTreeSet::from_iter(data.clone());
710 let right = set.split_off(&(data.iter().max().unwrap() + 1));
713 assert!(set.into_iter().eq(data));
714 assert!(right.into_iter().eq(None));
718 fn test_split_off_empty_left() {
719 let mut data = rand_data(314);
721 let mut set = BTreeSet::from_iter(data.clone());
722 let right = set.split_off(data.iter().min().unwrap());
725 assert!(set.into_iter().eq(None));
726 assert!(right.into_iter().eq(data));
730 fn test_split_off_large_random_sorted() {
732 let mut data = if cfg!(miri) { rand_data(529) } else { rand_data(1529) };
733 // special case with maximum height.
736 let mut set = BTreeSet::from_iter(data.clone());
737 let key = data[data.len() / 2];
738 let right = set.split_off(&key);
740 assert!(set.into_iter().eq(data.clone().into_iter().filter(|x| *x < key)));
741 assert!(right.into_iter().eq(data.into_iter().filter(|x| *x >= key)));