]> git.lizzy.rs Git - rust.git/blob - library/alloc/src/collections/btree/set/tests.rs
Do not suggest using a const parameter when there are bounds on an unused type parameter
[rust.git] / library / alloc / src / collections / btree / set / tests.rs
1 use super::super::testing::crash_test::{CrashTestDummy, Panic};
2 use super::super::testing::rng::DeterministicRng;
3 use super::*;
4 use crate::vec::Vec;
5 use std::cmp::Ordering;
6 use std::hash::{Hash, Hasher};
7 use std::iter::FromIterator;
8 use std::panic::{catch_unwind, AssertUnwindSafe};
9
10 #[test]
11 fn test_clone_eq() {
12     let mut m = BTreeSet::new();
13
14     m.insert(1);
15     m.insert(2);
16
17     assert_eq!(m.clone(), m);
18 }
19
20 #[test]
21 fn test_iter_min_max() {
22     let mut a = BTreeSet::new();
23     assert_eq!(a.iter().min(), None);
24     assert_eq!(a.iter().max(), None);
25     assert_eq!(a.range(..).min(), None);
26     assert_eq!(a.range(..).max(), None);
27     assert_eq!(a.difference(&BTreeSet::new()).min(), None);
28     assert_eq!(a.difference(&BTreeSet::new()).max(), None);
29     assert_eq!(a.intersection(&a).min(), None);
30     assert_eq!(a.intersection(&a).max(), None);
31     assert_eq!(a.symmetric_difference(&BTreeSet::new()).min(), None);
32     assert_eq!(a.symmetric_difference(&BTreeSet::new()).max(), None);
33     assert_eq!(a.union(&a).min(), None);
34     assert_eq!(a.union(&a).max(), None);
35     a.insert(1);
36     a.insert(2);
37     assert_eq!(a.iter().min(), Some(&1));
38     assert_eq!(a.iter().max(), Some(&2));
39     assert_eq!(a.range(..).min(), Some(&1));
40     assert_eq!(a.range(..).max(), Some(&2));
41     assert_eq!(a.difference(&BTreeSet::new()).min(), Some(&1));
42     assert_eq!(a.difference(&BTreeSet::new()).max(), Some(&2));
43     assert_eq!(a.intersection(&a).min(), Some(&1));
44     assert_eq!(a.intersection(&a).max(), Some(&2));
45     assert_eq!(a.symmetric_difference(&BTreeSet::new()).min(), Some(&1));
46     assert_eq!(a.symmetric_difference(&BTreeSet::new()).max(), Some(&2));
47     assert_eq!(a.union(&a).min(), Some(&1));
48     assert_eq!(a.union(&a).max(), Some(&2));
49 }
50
51 fn check<F>(a: &[i32], b: &[i32], expected: &[i32], f: F)
52 where
53     F: FnOnce(&BTreeSet<i32>, &BTreeSet<i32>, &mut dyn FnMut(&i32) -> bool) -> bool,
54 {
55     let mut set_a = BTreeSet::new();
56     let mut set_b = BTreeSet::new();
57
58     for x in a {
59         assert!(set_a.insert(*x))
60     }
61     for y in b {
62         assert!(set_b.insert(*y))
63     }
64
65     let mut i = 0;
66     f(&set_a, &set_b, &mut |&x| {
67         if i < expected.len() {
68             assert_eq!(x, expected[i]);
69         }
70         i += 1;
71         true
72     });
73     assert_eq!(i, expected.len());
74 }
75
76 #[test]
77 fn test_intersection() {
78     fn check_intersection(a: &[i32], b: &[i32], expected: &[i32]) {
79         check(a, b, expected, |x, y, f| x.intersection(y).all(f))
80     }
81
82     check_intersection(&[], &[], &[]);
83     check_intersection(&[1, 2, 3], &[], &[]);
84     check_intersection(&[], &[1, 2, 3], &[]);
85     check_intersection(&[2], &[1, 2, 3], &[2]);
86     check_intersection(&[1, 2, 3], &[2], &[2]);
87     check_intersection(&[11, 1, 3, 77, 103, 5, -5], &[2, 11, 77, -9, -42, 5, 3], &[3, 5, 11, 77]);
88
89     if cfg!(miri) {
90         // Miri is too slow
91         return;
92     }
93
94     let large = (0..100).collect::<Vec<_>>();
95     check_intersection(&[], &large, &[]);
96     check_intersection(&large, &[], &[]);
97     check_intersection(&[-1], &large, &[]);
98     check_intersection(&large, &[-1], &[]);
99     check_intersection(&[0], &large, &[0]);
100     check_intersection(&large, &[0], &[0]);
101     check_intersection(&[99], &large, &[99]);
102     check_intersection(&large, &[99], &[99]);
103     check_intersection(&[100], &large, &[]);
104     check_intersection(&large, &[100], &[]);
105     check_intersection(&[11, 5000, 1, 3, 77, 8924], &large, &[1, 3, 11, 77]);
106 }
107
108 #[test]
109 fn test_intersection_size_hint() {
110     let x: BTreeSet<i32> = [3, 4].iter().copied().collect();
111     let y: BTreeSet<i32> = [1, 2, 3].iter().copied().collect();
112     let mut iter = x.intersection(&y);
113     assert_eq!(iter.size_hint(), (1, Some(1)));
114     assert_eq!(iter.next(), Some(&3));
115     assert_eq!(iter.size_hint(), (0, Some(0)));
116     assert_eq!(iter.next(), None);
117
118     iter = y.intersection(&y);
119     assert_eq!(iter.size_hint(), (0, Some(3)));
120     assert_eq!(iter.next(), Some(&1));
121     assert_eq!(iter.size_hint(), (0, Some(2)));
122 }
123
124 #[test]
125 fn test_difference() {
126     fn check_difference(a: &[i32], b: &[i32], expected: &[i32]) {
127         check(a, b, expected, |x, y, f| x.difference(y).all(f))
128     }
129
130     check_difference(&[], &[], &[]);
131     check_difference(&[1, 12], &[], &[1, 12]);
132     check_difference(&[], &[1, 2, 3, 9], &[]);
133     check_difference(&[1, 3, 5, 9, 11], &[3, 9], &[1, 5, 11]);
134     check_difference(&[1, 3, 5, 9, 11], &[3, 6, 9], &[1, 5, 11]);
135     check_difference(&[1, 3, 5, 9, 11], &[0, 1], &[3, 5, 9, 11]);
136     check_difference(&[1, 3, 5, 9, 11], &[11, 12], &[1, 3, 5, 9]);
137     check_difference(
138         &[-5, 11, 22, 33, 40, 42],
139         &[-12, -5, 14, 23, 34, 38, 39, 50],
140         &[11, 22, 33, 40, 42],
141     );
142
143     if cfg!(miri) {
144         // Miri is too slow
145         return;
146     }
147
148     let large = (0..100).collect::<Vec<_>>();
149     check_difference(&[], &large, &[]);
150     check_difference(&[-1], &large, &[-1]);
151     check_difference(&[0], &large, &[]);
152     check_difference(&[99], &large, &[]);
153     check_difference(&[100], &large, &[100]);
154     check_difference(&[11, 5000, 1, 3, 77, 8924], &large, &[5000, 8924]);
155     check_difference(&large, &[], &large);
156     check_difference(&large, &[-1], &large);
157     check_difference(&large, &[100], &large);
158 }
159
160 #[test]
161 fn test_difference_size_hint() {
162     let s246: BTreeSet<i32> = [2, 4, 6].iter().copied().collect();
163     let s23456: BTreeSet<i32> = (2..=6).collect();
164     let mut iter = s246.difference(&s23456);
165     assert_eq!(iter.size_hint(), (0, Some(3)));
166     assert_eq!(iter.next(), None);
167
168     let s12345: BTreeSet<i32> = (1..=5).collect();
169     iter = s246.difference(&s12345);
170     assert_eq!(iter.size_hint(), (0, Some(3)));
171     assert_eq!(iter.next(), Some(&6));
172     assert_eq!(iter.size_hint(), (0, Some(0)));
173     assert_eq!(iter.next(), None);
174
175     let s34567: BTreeSet<i32> = (3..=7).collect();
176     iter = s246.difference(&s34567);
177     assert_eq!(iter.size_hint(), (0, Some(3)));
178     assert_eq!(iter.next(), Some(&2));
179     assert_eq!(iter.size_hint(), (0, Some(2)));
180     assert_eq!(iter.next(), None);
181
182     let s1: BTreeSet<i32> = (-9..=1).collect();
183     iter = s246.difference(&s1);
184     assert_eq!(iter.size_hint(), (3, Some(3)));
185
186     let s2: BTreeSet<i32> = (-9..=2).collect();
187     iter = s246.difference(&s2);
188     assert_eq!(iter.size_hint(), (2, Some(2)));
189     assert_eq!(iter.next(), Some(&4));
190     assert_eq!(iter.size_hint(), (1, Some(1)));
191
192     let s23: BTreeSet<i32> = (2..=3).collect();
193     iter = s246.difference(&s23);
194     assert_eq!(iter.size_hint(), (1, Some(3)));
195     assert_eq!(iter.next(), Some(&4));
196     assert_eq!(iter.size_hint(), (1, Some(1)));
197
198     let s4: BTreeSet<i32> = (4..=4).collect();
199     iter = s246.difference(&s4);
200     assert_eq!(iter.size_hint(), (2, Some(3)));
201     assert_eq!(iter.next(), Some(&2));
202     assert_eq!(iter.size_hint(), (1, Some(2)));
203     assert_eq!(iter.next(), Some(&6));
204     assert_eq!(iter.size_hint(), (0, Some(0)));
205     assert_eq!(iter.next(), None);
206
207     let s56: BTreeSet<i32> = (5..=6).collect();
208     iter = s246.difference(&s56);
209     assert_eq!(iter.size_hint(), (1, Some(3)));
210     assert_eq!(iter.next(), Some(&2));
211     assert_eq!(iter.size_hint(), (0, Some(2)));
212
213     let s6: BTreeSet<i32> = (6..=19).collect();
214     iter = s246.difference(&s6);
215     assert_eq!(iter.size_hint(), (2, Some(2)));
216     assert_eq!(iter.next(), Some(&2));
217     assert_eq!(iter.size_hint(), (1, Some(1)));
218
219     let s7: BTreeSet<i32> = (7..=19).collect();
220     iter = s246.difference(&s7);
221     assert_eq!(iter.size_hint(), (3, Some(3)));
222 }
223
224 #[test]
225 fn test_symmetric_difference() {
226     fn check_symmetric_difference(a: &[i32], b: &[i32], expected: &[i32]) {
227         check(a, b, expected, |x, y, f| x.symmetric_difference(y).all(f))
228     }
229
230     check_symmetric_difference(&[], &[], &[]);
231     check_symmetric_difference(&[1, 2, 3], &[2], &[1, 3]);
232     check_symmetric_difference(&[2], &[1, 2, 3], &[1, 3]);
233     check_symmetric_difference(&[1, 3, 5, 9, 11], &[-2, 3, 9, 14, 22], &[-2, 1, 5, 11, 14, 22]);
234 }
235
236 #[test]
237 fn test_symmetric_difference_size_hint() {
238     let x: BTreeSet<i32> = [2, 4].iter().copied().collect();
239     let y: BTreeSet<i32> = [1, 2, 3].iter().copied().collect();
240     let mut iter = x.symmetric_difference(&y);
241     assert_eq!(iter.size_hint(), (0, Some(5)));
242     assert_eq!(iter.next(), Some(&1));
243     assert_eq!(iter.size_hint(), (0, Some(4)));
244     assert_eq!(iter.next(), Some(&3));
245     assert_eq!(iter.size_hint(), (0, Some(1)));
246 }
247
248 #[test]
249 fn test_union() {
250     fn check_union(a: &[i32], b: &[i32], expected: &[i32]) {
251         check(a, b, expected, |x, y, f| x.union(y).all(f))
252     }
253
254     check_union(&[], &[], &[]);
255     check_union(&[1, 2, 3], &[2], &[1, 2, 3]);
256     check_union(&[2], &[1, 2, 3], &[1, 2, 3]);
257     check_union(
258         &[1, 3, 5, 9, 11, 16, 19, 24],
259         &[-2, 1, 5, 9, 13, 19],
260         &[-2, 1, 3, 5, 9, 11, 13, 16, 19, 24],
261     );
262 }
263
264 #[test]
265 fn test_union_size_hint() {
266     let x: BTreeSet<i32> = [2, 4].iter().copied().collect();
267     let y: BTreeSet<i32> = [1, 2, 3].iter().copied().collect();
268     let mut iter = x.union(&y);
269     assert_eq!(iter.size_hint(), (3, Some(5)));
270     assert_eq!(iter.next(), Some(&1));
271     assert_eq!(iter.size_hint(), (2, Some(4)));
272     assert_eq!(iter.next(), Some(&2));
273     assert_eq!(iter.size_hint(), (1, Some(2)));
274 }
275
276 #[test]
277 // Only tests the simple function definition with respect to intersection
278 fn test_is_disjoint() {
279     let one = [1].iter().collect::<BTreeSet<_>>();
280     let two = [2].iter().collect::<BTreeSet<_>>();
281     assert!(one.is_disjoint(&two));
282 }
283
284 #[test]
285 // Also implicitly tests the trivial function definition of is_superset
286 fn test_is_subset() {
287     fn is_subset(a: &[i32], b: &[i32]) -> bool {
288         let set_a = a.iter().collect::<BTreeSet<_>>();
289         let set_b = b.iter().collect::<BTreeSet<_>>();
290         set_a.is_subset(&set_b)
291     }
292
293     assert_eq!(is_subset(&[], &[]), true);
294     assert_eq!(is_subset(&[], &[1, 2]), true);
295     assert_eq!(is_subset(&[0], &[1, 2]), false);
296     assert_eq!(is_subset(&[1], &[1, 2]), true);
297     assert_eq!(is_subset(&[2], &[1, 2]), true);
298     assert_eq!(is_subset(&[3], &[1, 2]), false);
299     assert_eq!(is_subset(&[1, 2], &[1]), false);
300     assert_eq!(is_subset(&[1, 2], &[1, 2]), true);
301     assert_eq!(is_subset(&[1, 2], &[2, 3]), false);
302     assert_eq!(
303         is_subset(&[-5, 11, 22, 33, 40, 42], &[-12, -5, 11, 14, 22, 23, 33, 34, 38, 39, 40, 42]),
304         true
305     );
306     assert_eq!(is_subset(&[-5, 11, 22, 33, 40, 42], &[-12, -5, 11, 14, 22, 23, 34, 38]), false);
307
308     if cfg!(miri) {
309         // Miri is too slow
310         return;
311     }
312
313     let large = (0..100).collect::<Vec<_>>();
314     assert_eq!(is_subset(&[], &large), true);
315     assert_eq!(is_subset(&large, &[]), false);
316     assert_eq!(is_subset(&[-1], &large), false);
317     assert_eq!(is_subset(&[0], &large), true);
318     assert_eq!(is_subset(&[1, 2], &large), true);
319     assert_eq!(is_subset(&[99, 100], &large), false);
320 }
321
322 #[test]
323 fn test_retain() {
324     let xs = [1, 2, 3, 4, 5, 6];
325     let mut set: BTreeSet<i32> = xs.iter().cloned().collect();
326     set.retain(|&k| k % 2 == 0);
327     assert_eq!(set.len(), 3);
328     assert!(set.contains(&2));
329     assert!(set.contains(&4));
330     assert!(set.contains(&6));
331 }
332
333 #[test]
334 fn test_drain_filter() {
335     let mut x: BTreeSet<_> = [1].iter().copied().collect();
336     let mut y: BTreeSet<_> = [1].iter().copied().collect();
337
338     x.drain_filter(|_| true);
339     y.drain_filter(|_| false);
340     assert_eq!(x.len(), 0);
341     assert_eq!(y.len(), 1);
342 }
343
344 #[test]
345 fn test_drain_filter_drop_panic_leak() {
346     let a = CrashTestDummy::new(0);
347     let b = CrashTestDummy::new(1);
348     let c = CrashTestDummy::new(2);
349     let mut set = BTreeSet::new();
350     set.insert(a.spawn(Panic::Never));
351     set.insert(b.spawn(Panic::InDrop));
352     set.insert(c.spawn(Panic::Never));
353
354     catch_unwind(move || drop(set.drain_filter(|dummy| dummy.query(true)))).ok();
355
356     assert_eq!(a.queried(), 1);
357     assert_eq!(b.queried(), 1);
358     assert_eq!(c.queried(), 0);
359     assert_eq!(a.dropped(), 1);
360     assert_eq!(b.dropped(), 1);
361     assert_eq!(c.dropped(), 1);
362 }
363
364 #[test]
365 fn test_drain_filter_pred_panic_leak() {
366     let a = CrashTestDummy::new(0);
367     let b = CrashTestDummy::new(1);
368     let c = CrashTestDummy::new(2);
369     let mut set = BTreeSet::new();
370     set.insert(a.spawn(Panic::Never));
371     set.insert(b.spawn(Panic::InQuery));
372     set.insert(c.spawn(Panic::InQuery));
373
374     catch_unwind(AssertUnwindSafe(|| drop(set.drain_filter(|dummy| dummy.query(true))))).ok();
375
376     assert_eq!(a.queried(), 1);
377     assert_eq!(b.queried(), 1);
378     assert_eq!(c.queried(), 0);
379     assert_eq!(a.dropped(), 1);
380     assert_eq!(b.dropped(), 0);
381     assert_eq!(c.dropped(), 0);
382     assert_eq!(set.len(), 2);
383     assert_eq!(set.first().unwrap().id(), 1);
384     assert_eq!(set.last().unwrap().id(), 2);
385 }
386
387 #[test]
388 fn test_clear() {
389     let mut x = BTreeSet::new();
390     x.insert(1);
391
392     x.clear();
393     assert!(x.is_empty());
394 }
395
396 #[test]
397 fn test_zip() {
398     let mut x = BTreeSet::new();
399     x.insert(5);
400     x.insert(12);
401     x.insert(11);
402
403     let mut y = BTreeSet::new();
404     y.insert("foo");
405     y.insert("bar");
406
407     let x = x;
408     let y = y;
409     let mut z = x.iter().zip(&y);
410
411     assert_eq!(z.next().unwrap(), (&5, &("bar")));
412     assert_eq!(z.next().unwrap(), (&11, &("foo")));
413     assert!(z.next().is_none());
414 }
415
416 #[test]
417 fn test_from_iter() {
418     let xs = [1, 2, 3, 4, 5, 6, 7, 8, 9];
419
420     let set: BTreeSet<_> = xs.iter().cloned().collect();
421
422     for x in &xs {
423         assert!(set.contains(x));
424     }
425 }
426
427 #[test]
428 fn test_show() {
429     let mut set = BTreeSet::new();
430     let empty = BTreeSet::<i32>::new();
431
432     set.insert(1);
433     set.insert(2);
434
435     let set_str = format!("{:?}", set);
436
437     assert_eq!(set_str, "{1, 2}");
438     assert_eq!(format!("{:?}", empty), "{}");
439 }
440
441 #[test]
442 fn test_extend_ref() {
443     let mut a = BTreeSet::new();
444     a.insert(1);
445
446     a.extend(&[2, 3, 4]);
447
448     assert_eq!(a.len(), 4);
449     assert!(a.contains(&1));
450     assert!(a.contains(&2));
451     assert!(a.contains(&3));
452     assert!(a.contains(&4));
453
454     let mut b = BTreeSet::new();
455     b.insert(5);
456     b.insert(6);
457
458     a.extend(&b);
459
460     assert_eq!(a.len(), 6);
461     assert!(a.contains(&1));
462     assert!(a.contains(&2));
463     assert!(a.contains(&3));
464     assert!(a.contains(&4));
465     assert!(a.contains(&5));
466     assert!(a.contains(&6));
467 }
468
469 #[test]
470 fn test_recovery() {
471     #[derive(Debug)]
472     struct Foo(&'static str, i32);
473
474     impl PartialEq for Foo {
475         fn eq(&self, other: &Self) -> bool {
476             self.0 == other.0
477         }
478     }
479
480     impl Eq for Foo {}
481
482     impl PartialOrd for Foo {
483         fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
484             self.0.partial_cmp(&other.0)
485         }
486     }
487
488     impl Ord for Foo {
489         fn cmp(&self, other: &Self) -> Ordering {
490             self.0.cmp(&other.0)
491         }
492     }
493
494     let mut s = BTreeSet::new();
495     assert_eq!(s.replace(Foo("a", 1)), None);
496     assert_eq!(s.len(), 1);
497     assert_eq!(s.replace(Foo("a", 2)), Some(Foo("a", 1)));
498     assert_eq!(s.len(), 1);
499
500     {
501         let mut it = s.iter();
502         assert_eq!(it.next(), Some(&Foo("a", 2)));
503         assert_eq!(it.next(), None);
504     }
505
506     assert_eq!(s.get(&Foo("a", 1)), Some(&Foo("a", 2)));
507     assert_eq!(s.take(&Foo("a", 1)), Some(Foo("a", 2)));
508     assert_eq!(s.len(), 0);
509
510     assert_eq!(s.get(&Foo("a", 1)), None);
511     assert_eq!(s.take(&Foo("a", 1)), None);
512
513     assert_eq!(s.iter().next(), None);
514 }
515
516 #[allow(dead_code)]
517 fn assert_covariance() {
518     fn set<'new>(v: BTreeSet<&'static str>) -> BTreeSet<&'new str> {
519         v
520     }
521     fn iter<'a, 'new>(v: Iter<'a, &'static str>) -> Iter<'a, &'new str> {
522         v
523     }
524     fn into_iter<'new>(v: IntoIter<&'static str>) -> IntoIter<&'new str> {
525         v
526     }
527     fn range<'a, 'new>(v: Range<'a, &'static str>) -> Range<'a, &'new str> {
528         v
529     }
530     // not applied to Difference, Intersection, SymmetricDifference, Union
531 }
532
533 #[allow(dead_code)]
534 fn assert_sync() {
535     fn set<T: Sync>(v: &BTreeSet<T>) -> impl Sync + '_ {
536         v
537     }
538
539     fn iter<T: Sync>(v: &BTreeSet<T>) -> impl Sync + '_ {
540         v.iter()
541     }
542
543     fn into_iter<T: Sync>(v: BTreeSet<T>) -> impl Sync {
544         v.into_iter()
545     }
546
547     fn range<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
548         v.range(..)
549     }
550
551     fn drain_filter<T: Sync + Ord>(v: &mut BTreeSet<T>) -> impl Sync + '_ {
552         v.drain_filter(|_| false)
553     }
554
555     fn difference<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
556         v.difference(&v)
557     }
558
559     fn intersection<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
560         v.intersection(&v)
561     }
562
563     fn symmetric_difference<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
564         v.symmetric_difference(&v)
565     }
566
567     fn union<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
568         v.union(&v)
569     }
570 }
571
572 #[allow(dead_code)]
573 fn assert_send() {
574     fn set<T: Send>(v: BTreeSet<T>) -> impl Send {
575         v
576     }
577
578     fn iter<T: Send + Sync>(v: &BTreeSet<T>) -> impl Send + '_ {
579         v.iter()
580     }
581
582     fn into_iter<T: Send>(v: BTreeSet<T>) -> impl Send {
583         v.into_iter()
584     }
585
586     fn range<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
587         v.range(..)
588     }
589
590     fn drain_filter<T: Send + Ord>(v: &mut BTreeSet<T>) -> impl Send + '_ {
591         v.drain_filter(|_| false)
592     }
593
594     fn difference<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
595         v.difference(&v)
596     }
597
598     fn intersection<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
599         v.intersection(&v)
600     }
601
602     fn symmetric_difference<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
603         v.symmetric_difference(&v)
604     }
605
606     fn union<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
607         v.union(&v)
608     }
609 }
610
611 #[allow(dead_code)]
612 // Check that the member-like functions conditionally provided by #[derive()]
613 // are not overriden by genuine member functions with a different signature.
614 fn assert_derives() {
615     fn hash<T: Hash, H: Hasher>(v: BTreeSet<T>, state: &mut H) {
616         v.hash(state);
617         // Tested much more thoroughly outside the crate in btree_set_hash.rs
618     }
619     fn eq<T: PartialEq>(v: BTreeSet<T>) {
620         let _ = v.eq(&v);
621     }
622     fn ne<T: PartialEq>(v: BTreeSet<T>) {
623         let _ = v.ne(&v);
624     }
625     fn cmp<T: Ord>(v: BTreeSet<T>) {
626         let _ = v.cmp(&v);
627     }
628     fn min<T: Ord>(v: BTreeSet<T>, w: BTreeSet<T>) {
629         let _ = v.min(w);
630     }
631     fn max<T: Ord>(v: BTreeSet<T>, w: BTreeSet<T>) {
632         let _ = v.max(w);
633     }
634     fn clamp<T: Ord>(v: BTreeSet<T>, w: BTreeSet<T>, x: BTreeSet<T>) {
635         let _ = v.clamp(w, x);
636     }
637     fn partial_cmp<T: PartialOrd>(v: &BTreeSet<T>) {
638         let _ = v.partial_cmp(&v);
639     }
640 }
641
642 #[test]
643 fn test_ord_absence() {
644     fn set<K>(mut set: BTreeSet<K>) {
645         let _ = set.is_empty();
646         let _ = set.len();
647         set.clear();
648         let _ = set.iter();
649         let _ = set.into_iter();
650     }
651
652     fn set_debug<K: Debug>(set: BTreeSet<K>) {
653         format!("{:?}", set);
654         format!("{:?}", set.iter());
655         format!("{:?}", set.into_iter());
656     }
657
658     fn set_clone<K: Clone>(mut set: BTreeSet<K>) {
659         set.clone_from(&set.clone());
660     }
661
662     #[derive(Debug, Clone)]
663     struct NonOrd;
664     set(BTreeSet::<NonOrd>::new());
665     set_debug(BTreeSet::<NonOrd>::new());
666     set_clone(BTreeSet::<NonOrd>::default());
667 }
668
669 #[test]
670 fn test_append() {
671     let mut a = BTreeSet::new();
672     a.insert(1);
673     a.insert(2);
674     a.insert(3);
675
676     let mut b = BTreeSet::new();
677     b.insert(3);
678     b.insert(4);
679     b.insert(5);
680
681     a.append(&mut b);
682
683     assert_eq!(a.len(), 5);
684     assert_eq!(b.len(), 0);
685
686     assert_eq!(a.contains(&1), true);
687     assert_eq!(a.contains(&2), true);
688     assert_eq!(a.contains(&3), true);
689     assert_eq!(a.contains(&4), true);
690     assert_eq!(a.contains(&5), true);
691 }
692
693 #[test]
694 fn test_first_last() {
695     let mut a = BTreeSet::new();
696     assert_eq!(a.first(), None);
697     assert_eq!(a.last(), None);
698     a.insert(1);
699     assert_eq!(a.first(), Some(&1));
700     assert_eq!(a.last(), Some(&1));
701     a.insert(2);
702     assert_eq!(a.first(), Some(&1));
703     assert_eq!(a.last(), Some(&2));
704     for i in 3..=12 {
705         a.insert(i);
706     }
707     assert_eq!(a.first(), Some(&1));
708     assert_eq!(a.last(), Some(&12));
709     assert_eq!(a.pop_first(), Some(1));
710     assert_eq!(a.pop_last(), Some(12));
711     assert_eq!(a.pop_first(), Some(2));
712     assert_eq!(a.pop_last(), Some(11));
713     assert_eq!(a.pop_first(), Some(3));
714     assert_eq!(a.pop_last(), Some(10));
715     assert_eq!(a.pop_first(), Some(4));
716     assert_eq!(a.pop_first(), Some(5));
717     assert_eq!(a.pop_first(), Some(6));
718     assert_eq!(a.pop_first(), Some(7));
719     assert_eq!(a.pop_first(), Some(8));
720     assert_eq!(a.clone().pop_last(), Some(9));
721     assert_eq!(a.pop_first(), Some(9));
722     assert_eq!(a.pop_first(), None);
723     assert_eq!(a.pop_last(), None);
724 }
725
726 // Unlike the function with the same name in map/tests, returns no values.
727 // Which also means it returns different predetermined pseudo-random keys,
728 // and the test cases using this function explore slightly different trees.
729 fn rand_data(len: usize) -> Vec<u32> {
730     let mut rng = DeterministicRng::new();
731     Vec::from_iter((0..len).map(|_| rng.next()))
732 }
733
734 #[test]
735 fn test_split_off_empty_right() {
736     let mut data = rand_data(173);
737
738     let mut set = BTreeSet::from_iter(data.clone());
739     let right = set.split_off(&(data.iter().max().unwrap() + 1));
740
741     data.sort();
742     assert!(set.into_iter().eq(data));
743     assert!(right.into_iter().eq(None));
744 }
745
746 #[test]
747 fn test_split_off_empty_left() {
748     let mut data = rand_data(314);
749
750     let mut set = BTreeSet::from_iter(data.clone());
751     let right = set.split_off(data.iter().min().unwrap());
752
753     data.sort();
754     assert!(set.into_iter().eq(None));
755     assert!(right.into_iter().eq(data));
756 }
757
758 #[test]
759 fn test_split_off_large_random_sorted() {
760     // Miri is too slow
761     let mut data = if cfg!(miri) { rand_data(529) } else { rand_data(1529) };
762     // special case with maximum height.
763     data.sort();
764
765     let mut set = BTreeSet::from_iter(data.clone());
766     let key = data[data.len() / 2];
767     let right = set.split_off(&key);
768
769     assert!(set.into_iter().eq(data.clone().into_iter().filter(|x| *x < key)));
770     assert!(right.into_iter().eq(data.into_iter().filter(|x| *x >= key)));
771 }
772
773 #[test]
774 fn from_array() {
775     let set = BTreeSet::from([1, 2, 3, 4]);
776     let unordered_duplicates = BTreeSet::from([4, 1, 4, 3, 2]);
777     assert_eq!(set, unordered_duplicates);
778 }