]> git.lizzy.rs Git - rust.git/blob - library/alloc/src/collections/btree/set/tests.rs
Rollup merge of #93400 - ChayimFriedman2:dont-suggest-using-const-with-bounds-unused...
[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 = Vec::from_iter(0..100);
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::from([3, 4]);
111     let y = BTreeSet::from([1, 2, 3]);
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 = Vec::from_iter(0..100);
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::from([2, 4, 6]);
163     let s23456 = BTreeSet::from_iter(2..=6);
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::from_iter(1..=5);
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::from_iter(3..=7);
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::from_iter(-9..=1);
183     iter = s246.difference(&s1);
184     assert_eq!(iter.size_hint(), (3, Some(3)));
185
186     let s2 = BTreeSet::from_iter(-9..=2);
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::from([2, 3]);
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::from([4]);
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::from([5, 6]);
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::from_iter(6..=19);
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::from_iter(7..=19);
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::from([2, 4]);
239     let y = BTreeSet::from([1, 2, 3]);
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::from([2, 4]);
267     let y = BTreeSet::from([1, 2, 3]);
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 = BTreeSet::from([1]);
280     let two = BTreeSet::from([2]);
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 = BTreeSet::from_iter(a.iter());
289         let set_b = BTreeSet::from_iter(b.iter());
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 = Vec::from_iter(0..100);
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 mut set = BTreeSet::from([1, 2, 3, 4, 5, 6]);
325     set.retain(|&k| k % 2 == 0);
326     assert_eq!(set.len(), 3);
327     assert!(set.contains(&2));
328     assert!(set.contains(&4));
329     assert!(set.contains(&6));
330 }
331
332 #[test]
333 fn test_drain_filter() {
334     let mut x = BTreeSet::from([1]);
335     let mut y = BTreeSet::from([1]);
336
337     x.drain_filter(|_| true);
338     y.drain_filter(|_| false);
339     assert_eq!(x.len(), 0);
340     assert_eq!(y.len(), 1);
341 }
342
343 #[test]
344 fn test_drain_filter_drop_panic_leak() {
345     let a = CrashTestDummy::new(0);
346     let b = CrashTestDummy::new(1);
347     let c = CrashTestDummy::new(2);
348     let mut set = BTreeSet::new();
349     set.insert(a.spawn(Panic::Never));
350     set.insert(b.spawn(Panic::InDrop));
351     set.insert(c.spawn(Panic::Never));
352
353     catch_unwind(move || drop(set.drain_filter(|dummy| dummy.query(true)))).ok();
354
355     assert_eq!(a.queried(), 1);
356     assert_eq!(b.queried(), 1);
357     assert_eq!(c.queried(), 0);
358     assert_eq!(a.dropped(), 1);
359     assert_eq!(b.dropped(), 1);
360     assert_eq!(c.dropped(), 1);
361 }
362
363 #[test]
364 fn test_drain_filter_pred_panic_leak() {
365     let a = CrashTestDummy::new(0);
366     let b = CrashTestDummy::new(1);
367     let c = CrashTestDummy::new(2);
368     let mut set = BTreeSet::new();
369     set.insert(a.spawn(Panic::Never));
370     set.insert(b.spawn(Panic::InQuery));
371     set.insert(c.spawn(Panic::InQuery));
372
373     catch_unwind(AssertUnwindSafe(|| drop(set.drain_filter(|dummy| dummy.query(true))))).ok();
374
375     assert_eq!(a.queried(), 1);
376     assert_eq!(b.queried(), 1);
377     assert_eq!(c.queried(), 0);
378     assert_eq!(a.dropped(), 1);
379     assert_eq!(b.dropped(), 0);
380     assert_eq!(c.dropped(), 0);
381     assert_eq!(set.len(), 2);
382     assert_eq!(set.first().unwrap().id(), 1);
383     assert_eq!(set.last().unwrap().id(), 2);
384 }
385
386 #[test]
387 fn test_clear() {
388     let mut x = BTreeSet::new();
389     x.insert(1);
390
391     x.clear();
392     assert!(x.is_empty());
393 }
394
395 #[test]
396 fn test_zip() {
397     let mut x = BTreeSet::new();
398     x.insert(5);
399     x.insert(12);
400     x.insert(11);
401
402     let mut y = BTreeSet::new();
403     y.insert("foo");
404     y.insert("bar");
405
406     let x = x;
407     let y = y;
408     let mut z = x.iter().zip(&y);
409
410     assert_eq!(z.next().unwrap(), (&5, &("bar")));
411     assert_eq!(z.next().unwrap(), (&11, &("foo")));
412     assert!(z.next().is_none());
413 }
414
415 #[test]
416 fn test_from_iter() {
417     let xs = [1, 2, 3, 4, 5, 6, 7, 8, 9];
418
419     let set = BTreeSet::from_iter(xs.iter());
420
421     for x in &xs {
422         assert!(set.contains(x));
423     }
424 }
425
426 #[test]
427 fn test_show() {
428     let mut set = BTreeSet::new();
429     let empty = BTreeSet::<i32>::new();
430
431     set.insert(1);
432     set.insert(2);
433
434     let set_str = format!("{:?}", set);
435
436     assert_eq!(set_str, "{1, 2}");
437     assert_eq!(format!("{:?}", empty), "{}");
438 }
439
440 #[test]
441 fn test_extend_ref() {
442     let mut a = BTreeSet::new();
443     a.insert(1);
444
445     a.extend(&[2, 3, 4]);
446
447     assert_eq!(a.len(), 4);
448     assert!(a.contains(&1));
449     assert!(a.contains(&2));
450     assert!(a.contains(&3));
451     assert!(a.contains(&4));
452
453     let mut b = BTreeSet::new();
454     b.insert(5);
455     b.insert(6);
456
457     a.extend(&b);
458
459     assert_eq!(a.len(), 6);
460     assert!(a.contains(&1));
461     assert!(a.contains(&2));
462     assert!(a.contains(&3));
463     assert!(a.contains(&4));
464     assert!(a.contains(&5));
465     assert!(a.contains(&6));
466 }
467
468 #[test]
469 fn test_recovery() {
470     #[derive(Debug)]
471     struct Foo(&'static str, i32);
472
473     impl PartialEq for Foo {
474         fn eq(&self, other: &Self) -> bool {
475             self.0 == other.0
476         }
477     }
478
479     impl Eq for Foo {}
480
481     impl PartialOrd for Foo {
482         fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
483             self.0.partial_cmp(&other.0)
484         }
485     }
486
487     impl Ord for Foo {
488         fn cmp(&self, other: &Self) -> Ordering {
489             self.0.cmp(&other.0)
490         }
491     }
492
493     let mut s = BTreeSet::new();
494     assert_eq!(s.replace(Foo("a", 1)), None);
495     assert_eq!(s.len(), 1);
496     assert_eq!(s.replace(Foo("a", 2)), Some(Foo("a", 1)));
497     assert_eq!(s.len(), 1);
498
499     {
500         let mut it = s.iter();
501         assert_eq!(it.next(), Some(&Foo("a", 2)));
502         assert_eq!(it.next(), None);
503     }
504
505     assert_eq!(s.get(&Foo("a", 1)), Some(&Foo("a", 2)));
506     assert_eq!(s.take(&Foo("a", 1)), Some(Foo("a", 2)));
507     assert_eq!(s.len(), 0);
508
509     assert_eq!(s.get(&Foo("a", 1)), None);
510     assert_eq!(s.take(&Foo("a", 1)), None);
511
512     assert_eq!(s.iter().next(), None);
513 }
514
515 #[allow(dead_code)]
516 fn assert_covariance() {
517     fn set<'new>(v: BTreeSet<&'static str>) -> BTreeSet<&'new str> {
518         v
519     }
520     fn iter<'a, 'new>(v: Iter<'a, &'static str>) -> Iter<'a, &'new str> {
521         v
522     }
523     fn into_iter<'new>(v: IntoIter<&'static str>) -> IntoIter<&'new str> {
524         v
525     }
526     fn range<'a, 'new>(v: Range<'a, &'static str>) -> Range<'a, &'new str> {
527         v
528     }
529     // not applied to Difference, Intersection, SymmetricDifference, Union
530 }
531
532 #[allow(dead_code)]
533 fn assert_sync() {
534     fn set<T: Sync>(v: &BTreeSet<T>) -> impl Sync + '_ {
535         v
536     }
537
538     fn iter<T: Sync>(v: &BTreeSet<T>) -> impl Sync + '_ {
539         v.iter()
540     }
541
542     fn into_iter<T: Sync>(v: BTreeSet<T>) -> impl Sync {
543         v.into_iter()
544     }
545
546     fn range<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
547         v.range(..)
548     }
549
550     fn drain_filter<T: Sync + Ord>(v: &mut BTreeSet<T>) -> impl Sync + '_ {
551         v.drain_filter(|_| false)
552     }
553
554     fn difference<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
555         v.difference(&v)
556     }
557
558     fn intersection<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
559         v.intersection(&v)
560     }
561
562     fn symmetric_difference<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
563         v.symmetric_difference(&v)
564     }
565
566     fn union<T: Sync + Ord>(v: &BTreeSet<T>) -> impl Sync + '_ {
567         v.union(&v)
568     }
569 }
570
571 #[allow(dead_code)]
572 fn assert_send() {
573     fn set<T: Send>(v: BTreeSet<T>) -> impl Send {
574         v
575     }
576
577     fn iter<T: Send + Sync>(v: &BTreeSet<T>) -> impl Send + '_ {
578         v.iter()
579     }
580
581     fn into_iter<T: Send>(v: BTreeSet<T>) -> impl Send {
582         v.into_iter()
583     }
584
585     fn range<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
586         v.range(..)
587     }
588
589     fn drain_filter<T: Send + Ord>(v: &mut BTreeSet<T>) -> impl Send + '_ {
590         v.drain_filter(|_| false)
591     }
592
593     fn difference<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
594         v.difference(&v)
595     }
596
597     fn intersection<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
598         v.intersection(&v)
599     }
600
601     fn symmetric_difference<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
602         v.symmetric_difference(&v)
603     }
604
605     fn union<T: Send + Sync + Ord>(v: &BTreeSet<T>) -> impl Send + '_ {
606         v.union(&v)
607     }
608 }
609
610 #[allow(dead_code)]
611 // Check that the member-like functions conditionally provided by #[derive()]
612 // are not overriden by genuine member functions with a different signature.
613 fn assert_derives() {
614     fn hash<T: Hash, H: Hasher>(v: BTreeSet<T>, state: &mut H) {
615         v.hash(state);
616         // Tested much more thoroughly outside the crate in btree_set_hash.rs
617     }
618     fn eq<T: PartialEq>(v: BTreeSet<T>) {
619         let _ = v.eq(&v);
620     }
621     fn ne<T: PartialEq>(v: BTreeSet<T>) {
622         let _ = v.ne(&v);
623     }
624     fn cmp<T: Ord>(v: BTreeSet<T>) {
625         let _ = v.cmp(&v);
626     }
627     fn min<T: Ord>(v: BTreeSet<T>, w: BTreeSet<T>) {
628         let _ = v.min(w);
629     }
630     fn max<T: Ord>(v: BTreeSet<T>, w: BTreeSet<T>) {
631         let _ = v.max(w);
632     }
633     fn clamp<T: Ord>(v: BTreeSet<T>, w: BTreeSet<T>, x: BTreeSet<T>) {
634         let _ = v.clamp(w, x);
635     }
636     fn partial_cmp<T: PartialOrd>(v: &BTreeSet<T>) {
637         let _ = v.partial_cmp(&v);
638     }
639 }
640
641 #[test]
642 fn test_ord_absence() {
643     fn set<K>(mut set: BTreeSet<K>) {
644         let _ = set.is_empty();
645         let _ = set.len();
646         set.clear();
647         let _ = set.iter();
648         let _ = set.into_iter();
649     }
650
651     fn set_debug<K: Debug>(set: BTreeSet<K>) {
652         format!("{:?}", set);
653         format!("{:?}", set.iter());
654         format!("{:?}", set.into_iter());
655     }
656
657     fn set_clone<K: Clone>(mut set: BTreeSet<K>) {
658         set.clone_from(&set.clone());
659     }
660
661     #[derive(Debug, Clone)]
662     struct NonOrd;
663     set(BTreeSet::<NonOrd>::new());
664     set_debug(BTreeSet::<NonOrd>::new());
665     set_clone(BTreeSet::<NonOrd>::default());
666 }
667
668 #[test]
669 fn test_append() {
670     let mut a = BTreeSet::new();
671     a.insert(1);
672     a.insert(2);
673     a.insert(3);
674
675     let mut b = BTreeSet::new();
676     b.insert(3);
677     b.insert(4);
678     b.insert(5);
679
680     a.append(&mut b);
681
682     assert_eq!(a.len(), 5);
683     assert_eq!(b.len(), 0);
684
685     assert_eq!(a.contains(&1), true);
686     assert_eq!(a.contains(&2), true);
687     assert_eq!(a.contains(&3), true);
688     assert_eq!(a.contains(&4), true);
689     assert_eq!(a.contains(&5), true);
690 }
691
692 #[test]
693 fn test_first_last() {
694     let mut a = BTreeSet::new();
695     assert_eq!(a.first(), None);
696     assert_eq!(a.last(), None);
697     a.insert(1);
698     assert_eq!(a.first(), Some(&1));
699     assert_eq!(a.last(), Some(&1));
700     a.insert(2);
701     assert_eq!(a.first(), Some(&1));
702     assert_eq!(a.last(), Some(&2));
703     for i in 3..=12 {
704         a.insert(i);
705     }
706     assert_eq!(a.first(), Some(&1));
707     assert_eq!(a.last(), Some(&12));
708     assert_eq!(a.pop_first(), Some(1));
709     assert_eq!(a.pop_last(), Some(12));
710     assert_eq!(a.pop_first(), Some(2));
711     assert_eq!(a.pop_last(), Some(11));
712     assert_eq!(a.pop_first(), Some(3));
713     assert_eq!(a.pop_last(), Some(10));
714     assert_eq!(a.pop_first(), Some(4));
715     assert_eq!(a.pop_first(), Some(5));
716     assert_eq!(a.pop_first(), Some(6));
717     assert_eq!(a.pop_first(), Some(7));
718     assert_eq!(a.pop_first(), Some(8));
719     assert_eq!(a.clone().pop_last(), Some(9));
720     assert_eq!(a.pop_first(), Some(9));
721     assert_eq!(a.pop_first(), None);
722     assert_eq!(a.pop_last(), None);
723 }
724
725 // Unlike the function with the same name in map/tests, returns no values.
726 // Which also means it returns different predetermined pseudo-random keys,
727 // and the test cases using this function explore slightly different trees.
728 fn rand_data(len: usize) -> Vec<u32> {
729     let mut rng = DeterministicRng::new();
730     Vec::from_iter((0..len).map(|_| rng.next()))
731 }
732
733 #[test]
734 fn test_split_off_empty_right() {
735     let mut data = rand_data(173);
736
737     let mut set = BTreeSet::from_iter(data.clone());
738     let right = set.split_off(&(data.iter().max().unwrap() + 1));
739
740     data.sort();
741     assert!(set.into_iter().eq(data));
742     assert!(right.into_iter().eq(None));
743 }
744
745 #[test]
746 fn test_split_off_empty_left() {
747     let mut data = rand_data(314);
748
749     let mut set = BTreeSet::from_iter(data.clone());
750     let right = set.split_off(data.iter().min().unwrap());
751
752     data.sort();
753     assert!(set.into_iter().eq(None));
754     assert!(right.into_iter().eq(data));
755 }
756
757 #[test]
758 fn test_split_off_large_random_sorted() {
759     // Miri is too slow
760     let mut data = if cfg!(miri) { rand_data(529) } else { rand_data(1529) };
761     // special case with maximum height.
762     data.sort();
763
764     let mut set = BTreeSet::from_iter(data.clone());
765     let key = data[data.len() / 2];
766     let right = set.split_off(&key);
767
768     assert!(set.into_iter().eq(data.clone().into_iter().filter(|x| *x < key)));
769     assert!(right.into_iter().eq(data.into_iter().filter(|x| *x >= key)));
770 }
771
772 #[test]
773 fn from_array() {
774     let set = BTreeSet::from([1, 2, 3, 4]);
775     let unordered_duplicates = BTreeSet::from([4, 1, 4, 3, 2]);
776     assert_eq!(set, unordered_duplicates);
777 }