1#![allow(clippy::new_ret_no_self)]
2#![allow(clippy::or_fun_call)]
3use std::char;
4use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList, VecDeque};
5use std::env;
6use std::ffi::{CString, OsString};
7use std::hash::{BuildHasher, Hash};
8use std::iter::{empty, once};
9use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
10use std::num::Wrapping;
11use std::num::{NonZeroU128, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize};
12use std::ops::{Bound, Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
13use std::path::PathBuf;
14use std::sync::Arc;
15use std::time::{Duration, SystemTime, UNIX_EPOCH};
16
17use rand::seq::SliceRandom;
18use rand::{self, Rng, SeedableRng};
19
20pub struct Gen {
30 rng: rand::rngs::SmallRng,
31 size: usize,
32}
33
34impl Gen {
35 pub(crate) const DEFAULT_SIZE: usize = 100;
36
37 pub fn new(size: usize) -> Gen {
39 Gen {
40 rng: rand::rngs::SmallRng::from_entropy(),
41 size,
42 }
43 }
44
45 pub fn from_seed(seed: u64) -> Gen {
50 Gen {
51 rng: rand::rngs::SmallRng::seed_from_u64(seed),
52 size: Self::DEFAULT_SIZE,
53 }
54 }
55
56 pub fn set_size(&mut self, size: usize) {
64 self.size = size;
65 }
66
67 pub fn size(&self) -> usize {
69 self.size
70 }
71
72 pub fn choose<'a, T>(&mut self, slice: &'a [T]) -> Option<&'a T> {
76 slice.choose(&mut self.rng)
77 }
78
79 pub fn fill<S, T>(&mut self, mut slice: S)
82 where
83 T: Arbitrary,
84 S: AsMut<[T]>,
85 {
86 slice.as_mut().fill_with(|| T::arbitrary(self))
87 }
88
89 fn gen<T>(&mut self) -> T
90 where
91 rand::distributions::Standard: rand::distributions::Distribution<T>,
92 {
93 self.rng.gen()
94 }
95
96 fn gen_range<T, R>(&mut self, range: R) -> T
97 where
98 T: rand::distributions::uniform::SampleUniform,
99 R: rand::distributions::uniform::SampleRange<T>,
100 {
101 self.rng.gen_range(range)
102 }
103}
104
105impl Default for Gen {
106 fn default() -> Self {
107 Self::new(Gen::DEFAULT_SIZE)
108 }
109}
110
111pub fn empty_shrinker<A: 'static>() -> Box<dyn Iterator<Item = A>> {
113 Box::new(empty())
114}
115
116pub fn single_shrinker<A: 'static>(value: A) -> Box<dyn Iterator<Item = A>> {
118 Box::new(once(value))
119}
120
121pub trait Arbitrary: Clone + 'static {
136 fn arbitrary(g: &mut Gen) -> Self;
144
145 fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
159 empty_shrinker()
160 }
161}
162
163impl Arbitrary for () {
164 fn arbitrary(_: &mut Gen) {}
165}
166
167impl Arbitrary for bool {
168 fn arbitrary(g: &mut Gen) -> bool {
169 g.gen()
170 }
171
172 fn shrink(&self) -> Box<dyn Iterator<Item = bool>> {
173 if *self {
174 single_shrinker(false)
175 } else {
176 empty_shrinker()
177 }
178 }
179}
180
181impl<A: Arbitrary> Arbitrary for Option<A> {
182 fn arbitrary(g: &mut Gen) -> Option<A> {
183 if g.gen() {
184 None
185 } else {
186 Some(Arbitrary::arbitrary(g))
187 }
188 }
189
190 fn shrink(&self) -> Box<dyn Iterator<Item = Option<A>>> {
191 match *self {
192 None => empty_shrinker(),
193 Some(ref x) => {
194 let chain = single_shrinker(None).chain(x.shrink().map(Some));
195 Box::new(chain)
196 }
197 }
198 }
199}
200
201impl<A: Arbitrary, B: Arbitrary> Arbitrary for Result<A, B> {
202 fn arbitrary(g: &mut Gen) -> Result<A, B> {
203 if g.gen() {
204 Ok(Arbitrary::arbitrary(g))
205 } else {
206 Err(Arbitrary::arbitrary(g))
207 }
208 }
209
210 fn shrink(&self) -> Box<dyn Iterator<Item = Result<A, B>>> {
211 match *self {
212 Ok(ref x) => {
213 let xs = x.shrink();
214 let tagged = xs.map(Ok);
215 Box::new(tagged)
216 }
217 Err(ref x) => {
218 let xs = x.shrink();
219 let tagged = xs.map(Err);
220 Box::new(tagged)
221 }
222 }
223 }
224}
225
226macro_rules! impl_arb_for_single_tuple {
227 ($(($type_param:ident, $tuple_index:tt),)*) => {
228 impl<$($type_param),*> Arbitrary for ($($type_param,)*)
229 where $($type_param: Arbitrary,)*
230 {
231 fn arbitrary(g: &mut Gen) -> ($($type_param,)*) {
232 (
233 $(
234 $type_param::arbitrary(g),
235 )*
236 )
237 }
238
239 fn shrink(&self) -> Box<dyn Iterator<Item=($($type_param,)*)>> {
240 let iter = ::std::iter::empty();
241 $(
242 let cloned = self.clone();
243 let iter = iter.chain(
244 self.$tuple_index.shrink().map(move |shr_value| {
245 let mut result = cloned.clone();
246 result.$tuple_index = shr_value;
247 result
248 })
249 );
250 )*
251 Box::new(iter)
252 }
253 }
254 };
255}
256
257macro_rules! impl_arb_for_tuples {
258 (@internal [$($acc:tt,)*]) => { };
259 (@internal [$($acc:tt,)*] ($type_param:ident, $tuple_index:tt), $($rest:tt,)*) => {
260 impl_arb_for_single_tuple!($($acc,)* ($type_param, $tuple_index),);
261 impl_arb_for_tuples!(@internal [$($acc,)* ($type_param, $tuple_index),] $($rest,)*);
262 };
263 ($(($type_param:ident, $tuple_index:tt),)*) => {
264 impl_arb_for_tuples!(@internal [] $(($type_param, $tuple_index),)*);
265 };
266}
267
268impl_arb_for_tuples! {
269 (A, 0),
270 (B, 1),
271 (C, 2),
272 (D, 3),
273 (E, 4),
274 (F, 5),
275 (G, 6),
276 (H, 7),
277}
278
279impl<const N: usize, A: Arbitrary> Arbitrary for [A; N] {
280 fn arbitrary(g: &mut Gen) -> [A; N] {
281 [(); N].map(|_| A::arbitrary(g))
282 }
283
284 fn shrink(&self) -> Box<dyn Iterator<Item = [A; N]>> {
285 let cloned = self.clone();
286 let iter = (0..N).flat_map(move |n| {
287 let cloned = cloned.clone();
288 cloned[n].shrink().map(move |shr_value| {
289 let mut result = cloned.clone();
290 result[n] = shr_value;
291 result
292 })
293 });
294
295 Box::new(iter)
296 }
297}
298
299impl<A: Arbitrary> Arbitrary for Vec<A> {
300 fn arbitrary(g: &mut Gen) -> Vec<A> {
301 let size = {
302 let s = g.size();
303 g.gen_range(0..s)
304 };
305 (0..size).map(|_| A::arbitrary(g)).collect()
306 }
307
308 fn shrink(&self) -> Box<dyn Iterator<Item = Vec<A>>> {
309 VecShrinker::new(self.clone())
310 }
311}
312
313struct VecShrinker<A> {
315 seed: Vec<A>,
316 size: usize,
318 offset: usize,
320 element_shrinker: Box<dyn Iterator<Item = A>>,
323}
324
325impl<A: Arbitrary> VecShrinker<A> {
326 fn new(seed: Vec<A>) -> Box<dyn Iterator<Item = Vec<A>>> {
327 let es = match seed.get(0) {
328 Some(e) => e.shrink(),
329 None => return empty_shrinker(),
330 };
331 let size = seed.len();
332 Box::new(VecShrinker {
333 seed,
334 size,
335 offset: size,
336 element_shrinker: es,
337 })
338 }
339
340 fn next_element(&mut self) -> Option<A> {
343 loop {
344 match self.element_shrinker.next() {
345 Some(e) => return Some(e),
346 None => match self.seed.get(self.offset) {
347 Some(e) => {
348 self.element_shrinker = e.shrink();
349 self.offset += 1;
350 }
351 None => return None,
352 },
353 }
354 }
355 }
356}
357
358impl<A> Iterator for VecShrinker<A>
359where
360 A: Arbitrary,
361{
362 type Item = Vec<A>;
363 fn next(&mut self) -> Option<Vec<A>> {
364 if self.size == self.seed.len() {
366 self.size /= 2;
367 self.offset = self.size;
368 return Some(vec![]);
369 }
370 if self.size != 0 {
371 let xs1 = self.seed[..(self.offset - self.size)]
374 .iter()
375 .chain(&self.seed[self.offset..])
376 .cloned()
377 .collect();
378 self.offset += self.size;
379 if self.offset > self.seed.len() {
382 self.size /= 2;
383 self.offset = self.size;
384 }
385 Some(xs1)
386 } else {
387 if self.offset == 0 {
395 self.offset = 1
396 }
397
398 match self.next_element() {
399 Some(e) => Some(
400 self.seed[..self.offset - 1]
401 .iter()
402 .cloned()
403 .chain(Some(e).into_iter())
404 .chain(self.seed[self.offset..].iter().cloned())
405 .collect(),
406 ),
407 None => None,
408 }
409 }
410 }
411}
412
413impl<K: Arbitrary + Ord, V: Arbitrary> Arbitrary for BTreeMap<K, V> {
414 fn arbitrary(g: &mut Gen) -> BTreeMap<K, V> {
415 let vec: Vec<(K, V)> = Arbitrary::arbitrary(g);
416 vec.into_iter().collect()
417 }
418
419 fn shrink(&self) -> Box<dyn Iterator<Item = BTreeMap<K, V>>> {
420 let vec: Vec<(K, V)> = self.clone().into_iter().collect();
421 Box::new(
422 vec.shrink()
423 .map(|v| v.into_iter().collect::<BTreeMap<K, V>>()),
424 )
425 }
426}
427
428impl<K: Arbitrary + Eq + Hash, V: Arbitrary, S: BuildHasher + Default + Clone + 'static> Arbitrary
429 for HashMap<K, V, S>
430{
431 fn arbitrary(g: &mut Gen) -> Self {
432 let vec: Vec<(K, V)> = Arbitrary::arbitrary(g);
433 vec.into_iter().collect()
434 }
435
436 fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
437 let vec: Vec<(K, V)> = self.clone().into_iter().collect();
438 Box::new(vec.shrink().map(|v| v.into_iter().collect::<Self>()))
439 }
440}
441
442impl<T: Arbitrary + Ord> Arbitrary for BTreeSet<T> {
443 fn arbitrary(g: &mut Gen) -> BTreeSet<T> {
444 let vec: Vec<T> = Arbitrary::arbitrary(g);
445 vec.into_iter().collect()
446 }
447
448 fn shrink(&self) -> Box<dyn Iterator<Item = BTreeSet<T>>> {
449 let vec: Vec<T> = self.clone().into_iter().collect();
450 Box::new(vec.shrink().map(|v| v.into_iter().collect::<BTreeSet<T>>()))
451 }
452}
453
454impl<T: Arbitrary + Ord> Arbitrary for BinaryHeap<T> {
455 fn arbitrary(g: &mut Gen) -> BinaryHeap<T> {
456 let vec: Vec<T> = Arbitrary::arbitrary(g);
457 vec.into_iter().collect()
458 }
459
460 fn shrink(&self) -> Box<dyn Iterator<Item = BinaryHeap<T>>> {
461 let vec: Vec<T> = self.clone().into_iter().collect();
462 Box::new(
463 vec.shrink()
464 .map(|v| v.into_iter().collect::<BinaryHeap<T>>()),
465 )
466 }
467}
468
469impl<T: Arbitrary + Eq + Hash, S: BuildHasher + Default + Clone + 'static> Arbitrary
470 for HashSet<T, S>
471{
472 fn arbitrary(g: &mut Gen) -> Self {
473 let vec: Vec<T> = Arbitrary::arbitrary(g);
474 vec.into_iter().collect()
475 }
476
477 fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
478 let vec: Vec<T> = self.clone().into_iter().collect();
479 Box::new(vec.shrink().map(|v| v.into_iter().collect::<Self>()))
480 }
481}
482
483impl<T: Arbitrary> Arbitrary for LinkedList<T> {
484 fn arbitrary(g: &mut Gen) -> LinkedList<T> {
485 let vec: Vec<T> = Arbitrary::arbitrary(g);
486 vec.into_iter().collect()
487 }
488
489 fn shrink(&self) -> Box<dyn Iterator<Item = LinkedList<T>>> {
490 let vec: Vec<T> = self.clone().into_iter().collect();
491 Box::new(
492 vec.shrink()
493 .map(|v| v.into_iter().collect::<LinkedList<T>>()),
494 )
495 }
496}
497
498impl<T: Arbitrary> Arbitrary for VecDeque<T> {
499 fn arbitrary(g: &mut Gen) -> VecDeque<T> {
500 let vec: Vec<T> = Arbitrary::arbitrary(g);
501 vec.into_iter().collect()
502 }
503
504 fn shrink(&self) -> Box<dyn Iterator<Item = VecDeque<T>>> {
505 let vec: Vec<T> = self.clone().into_iter().collect();
506 Box::new(vec.shrink().map(|v| v.into_iter().collect::<VecDeque<T>>()))
507 }
508}
509
510impl Arbitrary for IpAddr {
511 fn arbitrary(g: &mut Gen) -> IpAddr {
512 let ipv4: bool = g.gen();
513 if ipv4 {
514 IpAddr::V4(Arbitrary::arbitrary(g))
515 } else {
516 IpAddr::V6(Arbitrary::arbitrary(g))
517 }
518 }
519}
520
521impl Arbitrary for Ipv4Addr {
522 fn arbitrary(g: &mut Gen) -> Ipv4Addr {
523 Ipv4Addr::new(g.gen(), g.gen(), g.gen(), g.gen())
524 }
525}
526
527impl Arbitrary for Ipv6Addr {
528 fn arbitrary(g: &mut Gen) -> Ipv6Addr {
529 Ipv6Addr::new(
530 g.gen(),
531 g.gen(),
532 g.gen(),
533 g.gen(),
534 g.gen(),
535 g.gen(),
536 g.gen(),
537 g.gen(),
538 )
539 }
540}
541
542impl Arbitrary for SocketAddr {
543 fn arbitrary(g: &mut Gen) -> SocketAddr {
544 SocketAddr::new(Arbitrary::arbitrary(g), g.gen())
545 }
546}
547
548impl Arbitrary for SocketAddrV4 {
549 fn arbitrary(g: &mut Gen) -> SocketAddrV4 {
550 SocketAddrV4::new(Arbitrary::arbitrary(g), g.gen())
551 }
552}
553
554impl Arbitrary for SocketAddrV6 {
555 fn arbitrary(g: &mut Gen) -> SocketAddrV6 {
556 SocketAddrV6::new(Arbitrary::arbitrary(g), g.gen(), g.gen(), g.gen())
557 }
558}
559
560impl Arbitrary for PathBuf {
561 fn arbitrary(g: &mut Gen) -> PathBuf {
562 let here = env::current_dir().unwrap_or(PathBuf::from("/test/directory"));
565 let temp = env::temp_dir();
566 #[allow(deprecated)]
567 let home = env::home_dir().unwrap_or(PathBuf::from("/home/user"));
568 let mut p = g
569 .choose(&[
570 here,
571 temp,
572 home,
573 PathBuf::from("."),
574 PathBuf::from(".."),
575 PathBuf::from("../../.."),
576 PathBuf::new(),
577 ])
578 .unwrap()
579 .to_owned();
580 p.extend(Vec::<OsString>::arbitrary(g).iter());
581 p
582 }
583
584 fn shrink(&self) -> Box<dyn Iterator<Item = PathBuf>> {
585 let mut shrunk = vec![];
586 let mut popped = self.clone();
587 if popped.pop() {
588 shrunk.push(popped);
589 }
590
591 let normalized = self.iter().collect::<PathBuf>();
593 if normalized.as_os_str() != self.as_os_str() {
594 shrunk.push(normalized);
595 }
596
597 if let Ok(canonicalized) = self.canonicalize() {
601 if canonicalized.as_os_str() != self.as_os_str() {
602 shrunk.push(canonicalized);
603 }
604 }
605
606 Box::new(shrunk.into_iter())
607 }
608}
609
610impl Arbitrary for OsString {
611 fn arbitrary(g: &mut Gen) -> OsString {
612 OsString::from(String::arbitrary(g))
613 }
614
615 fn shrink(&self) -> Box<dyn Iterator<Item = OsString>> {
616 let mystring: String = self.clone().into_string().unwrap();
617 Box::new(mystring.shrink().map(OsString::from))
618 }
619}
620
621impl Arbitrary for String {
622 fn arbitrary(g: &mut Gen) -> String {
623 let size = {
624 let s = g.size();
625 g.gen_range(0..s)
626 };
627 (0..size).map(|_| char::arbitrary(g)).collect()
628 }
629
630 fn shrink(&self) -> Box<dyn Iterator<Item = String>> {
631 let chars: Vec<char> = self.chars().collect();
633 Box::new(chars.shrink().map(|x| x.into_iter().collect::<String>()))
634 }
635}
636
637impl Arbitrary for CString {
638 fn arbitrary(g: &mut Gen) -> Self {
639 let size = {
640 let s = g.size();
641 g.gen_range(0..s)
642 };
643 let utf8: bool = g.gen();
645 if utf8 {
646 CString::new(
647 (0..)
648 .map(|_| char::arbitrary(g))
649 .filter(|&c| c != '\0')
650 .take(size)
651 .collect::<String>(),
652 )
653 } else {
654 CString::new(
655 (0..)
656 .map(|_| u8::arbitrary(g))
657 .filter(|&c| c != b'\0')
658 .take(size)
659 .collect::<Vec<u8>>(),
660 )
661 }
662 .expect("null characters should have been filtered out")
663 }
664
665 fn shrink(&self) -> Box<dyn Iterator<Item = CString>> {
666 Box::new(VecShrinker::new(self.as_bytes().to_vec()).map(|bytes| {
669 CString::new(bytes.into_iter().filter(|&c| c != 0).collect::<Vec<u8>>())
670 .expect("null characters should have been filtered out")
671 }))
672 }
673}
674
675impl Arbitrary for char {
676 fn arbitrary(g: &mut Gen) -> char {
677 let mode = g.gen_range(0..100);
678 match mode {
679 0..=49 => {
680 g.gen_range(0..0xB0) as u8 as char
682 }
683 50..=59 => {
684 loop {
686 if let Some(x) = char::from_u32(g.gen_range(0..0x10000)) {
687 return x;
688 }
689 }
691 }
692 60..=84 => {
693 g.choose(&[
695 ' ', ' ', ' ', '\t', '\n', '~', '`', '!', '@', '#', '$', '%', '^', '&', '*',
696 '(', ')', '_', '-', '=', '+', '[', ']', '{', '}', ':', ';', '\'', '"', '\\',
697 '|', ',', '<', '>', '.', '/', '?', '0', '1', '2', '3', '4', '5', '6', '7', '8',
698 '9',
699 ])
700 .unwrap()
701 .to_owned()
702 }
703 85..=89 => {
704 g.choose(&[
706 '\u{0149}', '\u{fff0}', '\u{fff1}',
709 '\u{fff2}',
710 '\u{fff3}',
711 '\u{fff4}',
712 '\u{fff5}',
713 '\u{fff6}',
714 '\u{fff7}',
715 '\u{fff8}',
716 '\u{fff9}',
717 '\u{fffA}',
718 '\u{fffB}',
719 '\u{fffC}',
720 '\u{fffD}',
721 '\u{fffE}',
722 '\u{fffF}',
723 '\u{0600}',
724 '\u{0601}',
725 '\u{0602}',
726 '\u{0603}',
727 '\u{0604}',
728 '\u{0605}',
729 '\u{061C}',
730 '\u{06DD}',
731 '\u{070F}',
732 '\u{180E}',
733 '\u{110BD}',
734 '\u{1D173}',
735 '\u{e0001}', '\u{e0020}', '\u{e000}',
738 '\u{e001}',
739 '\u{ef8ff}', '\u{f0000}',
741 '\u{ffffd}',
742 '\u{ffffe}',
743 '\u{fffff}',
744 '\u{100000}',
745 '\u{10FFFD}',
746 '\u{10FFFE}',
747 '\u{10FFFF}',
748 '\u{3000}', '\u{1680}',
753 ])
756 .unwrap()
757 .to_owned()
758 }
759 90..=94 => {
760 char::from_u32(g.gen_range(0x2000..0x2070)).unwrap()
762 }
763 95..=99 => {
764 g.gen()
766 }
767 _ => unreachable!(),
768 }
769 }
770
771 fn shrink(&self) -> Box<dyn Iterator<Item = char>> {
772 Box::new((*self as u32).shrink().filter_map(char::from_u32))
773 }
774}
775
776macro_rules! unsigned_shrinker {
777 ($ty:ty) => {
778 mod shrinker {
779 pub struct UnsignedShrinker {
780 x: $ty,
781 i: $ty,
782 }
783
784 impl UnsignedShrinker {
785 pub fn new(x: $ty) -> Box<dyn Iterator<Item = $ty>> {
786 if x == 0 {
787 super::empty_shrinker()
788 } else {
789 Box::new(vec![0].into_iter().chain(UnsignedShrinker { x, i: x / 2 }))
790 }
791 }
792 }
793
794 impl Iterator for UnsignedShrinker {
795 type Item = $ty;
796 fn next(&mut self) -> Option<$ty> {
797 if self.x - self.i < self.x {
798 let result = Some(self.x - self.i);
799 self.i /= 2;
800 result
801 } else {
802 None
803 }
804 }
805 }
806 }
807 };
808}
809
810macro_rules! unsigned_problem_values {
811 ($t:ty) => {
812 &[<$t>::min_value(), 1, <$t>::max_value()]
813 };
814}
815
816macro_rules! unsigned_arbitrary {
817 ($($ty:tt),*) => {
818 $(
819 impl Arbitrary for $ty {
820 fn arbitrary(g: &mut Gen) -> $ty {
821 match g.gen_range(0..10) {
822 0 => {
823 *g.choose(unsigned_problem_values!($ty)).unwrap()
824 },
825 _ => g.gen()
826 }
827 }
828 fn shrink(&self) -> Box<dyn Iterator<Item=$ty>> {
829 unsigned_shrinker!($ty);
830 shrinker::UnsignedShrinker::new(*self)
831 }
832 }
833 )*
834 }
835}
836
837unsigned_arbitrary! {
838 usize, u8, u16, u32, u64, u128
839}
840
841macro_rules! signed_shrinker {
842 ($ty:ty) => {
843 mod shrinker {
844 pub struct SignedShrinker {
845 x: $ty,
846 i: $ty,
847 }
848
849 impl SignedShrinker {
850 pub fn new(x: $ty) -> Box<dyn Iterator<Item = $ty>> {
851 if x == 0 {
852 super::empty_shrinker()
853 } else {
854 let shrinker = SignedShrinker { x, i: x / 2 };
855 let mut items = vec![0];
856 if shrinker.i < 0 && shrinker.x != <$ty>::MIN {
857 items.push(shrinker.x.abs());
858 }
859 Box::new(items.into_iter().chain(shrinker))
860 }
861 }
862 }
863
864 impl Iterator for SignedShrinker {
865 type Item = $ty;
866 fn next(&mut self) -> Option<$ty> {
867 if self.x == <$ty>::MIN || (self.x - self.i).abs() < self.x.abs() {
868 let result = Some(self.x - self.i);
869 self.i /= 2;
870 result
871 } else {
872 None
873 }
874 }
875 }
876 }
877 };
878}
879
880macro_rules! signed_problem_values {
881 ($t:ty) => {
882 &[<$t>::min_value(), 0, <$t>::max_value()]
883 };
884}
885
886macro_rules! signed_arbitrary {
887 ($($ty:tt),*) => {
888 $(
889 impl Arbitrary for $ty {
890 fn arbitrary(g: &mut Gen) -> $ty {
891 match g.gen_range(0..10) {
892 0 => {
893 *g.choose(signed_problem_values!($ty)).unwrap()
894 },
895 _ => g.gen()
896 }
897 }
898 fn shrink(&self) -> Box<dyn Iterator<Item=$ty>> {
899 signed_shrinker!($ty);
900 shrinker::SignedShrinker::new(*self)
901 }
902 }
903 )*
904 }
905}
906
907signed_arbitrary! {
908 isize, i8, i16, i32, i64, i128
909}
910
911macro_rules! float_problem_values {
912 ($path:path) => {{
913 use $path as p;
915 &[
916 p::NAN,
917 p::NEG_INFINITY,
918 p::MIN,
919 -0.,
920 0.,
921 p::MAX,
922 p::INFINITY,
923 ]
924 }};
925}
926
927macro_rules! float_arbitrary {
928 ($($t:ty, $path:path, $shrinkable:ty),+) => {$(
929 impl Arbitrary for $t {
930 fn arbitrary(g: &mut Gen) -> $t {
931 match g.gen_range(0..10) {
932 0 => *g.choose(float_problem_values!($path)).unwrap(),
933 _ => {
934 use $path as p;
935 let exp = g.gen_range((0.)..p::MAX_EXP as i16 as $t);
936 let mantissa = g.gen_range((1.)..2.);
937 let sign = *g.choose(&[-1., 1.]).unwrap();
938 sign * mantissa * exp.exp2()
939 }
940 }
941 }
942 fn shrink(&self) -> Box<dyn Iterator<Item = $t>> {
943 signed_shrinker!($shrinkable);
944 let it = shrinker::SignedShrinker::new(*self as $shrinkable);
945 Box::new(it.map(|x| x as $t))
946 }
947 }
948 )*};
949}
950
951float_arbitrary!(f32, std::f32, i32, f64, std::f64, i64);
952
953macro_rules! unsigned_non_zero_shrinker {
954 ($ty:tt) => {
955 mod shrinker {
956 pub struct UnsignedNonZeroShrinker {
957 x: $ty,
958 i: $ty,
959 }
960
961 impl UnsignedNonZeroShrinker {
962 pub fn new(x: $ty) -> Box<dyn Iterator<Item = $ty>> {
963 debug_assert!(x > 0);
964
965 if x == 1 {
966 super::empty_shrinker()
967 } else {
968 Box::new(std::iter::once(1).chain(UnsignedNonZeroShrinker { x, i: x / 2 }))
969 }
970 }
971 }
972
973 impl Iterator for UnsignedNonZeroShrinker {
974 type Item = $ty;
975
976 fn next(&mut self) -> Option<$ty> {
977 if self.x - self.i < self.x {
978 let result = Some(self.x - self.i);
979 self.i /= 2;
980 result
981 } else {
982 None
983 }
984 }
985 }
986 }
987 };
988}
989
990macro_rules! unsigned_non_zero_arbitrary {
991 ($($ty:tt => $inner:tt),*) => {
992 $(
993 impl Arbitrary for $ty {
994 fn arbitrary(g: &mut Gen) -> $ty {
995 let mut v: $inner = g.gen();
996 if v == 0 {
997 v += 1;
998 }
999 $ty::new(v).expect("non-zero value contsturction failed")
1000 }
1001
1002 fn shrink(&self) -> Box<dyn Iterator<Item = $ty>> {
1003 unsigned_non_zero_shrinker!($inner);
1004 Box::new(shrinker::UnsignedNonZeroShrinker::new(self.get())
1005 .map($ty::new)
1006 .map(Option::unwrap))
1007 }
1008 }
1009 )*
1010 }
1011}
1012
1013unsigned_non_zero_arbitrary! {
1014 NonZeroUsize => usize,
1015 NonZeroU8 => u8,
1016 NonZeroU16 => u16,
1017 NonZeroU32 => u32,
1018 NonZeroU64 => u64,
1019 NonZeroU128 => u128
1020}
1021
1022impl<T: Arbitrary> Arbitrary for Wrapping<T> {
1023 fn arbitrary(g: &mut Gen) -> Wrapping<T> {
1024 Wrapping(T::arbitrary(g))
1025 }
1026 fn shrink(&self) -> Box<dyn Iterator<Item = Wrapping<T>>> {
1027 Box::new(self.0.shrink().map(|inner| Wrapping(inner)))
1028 }
1029}
1030
1031impl<T: Arbitrary> Arbitrary for Bound<T> {
1032 fn arbitrary(g: &mut Gen) -> Bound<T> {
1033 match g.gen_range(0..3) {
1034 0 => Bound::Included(T::arbitrary(g)),
1035 1 => Bound::Excluded(T::arbitrary(g)),
1036 _ => Bound::Unbounded,
1037 }
1038 }
1039 fn shrink(&self) -> Box<dyn Iterator<Item = Bound<T>>> {
1040 match *self {
1041 Bound::Included(ref x) => Box::new(x.shrink().map(Bound::Included)),
1042 Bound::Excluded(ref x) => Box::new(x.shrink().map(Bound::Excluded)),
1043 Bound::Unbounded => empty_shrinker(),
1044 }
1045 }
1046}
1047
1048impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for Range<T> {
1049 fn arbitrary(g: &mut Gen) -> Range<T> {
1050 Arbitrary::arbitrary(g)..Arbitrary::arbitrary(g)
1051 }
1052 fn shrink(&self) -> Box<dyn Iterator<Item = Range<T>>> {
1053 Box::new(
1054 (self.start.clone(), self.end.clone())
1055 .shrink()
1056 .map(|(s, e)| s..e),
1057 )
1058 }
1059}
1060
1061impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for RangeInclusive<T> {
1062 fn arbitrary(g: &mut Gen) -> RangeInclusive<T> {
1063 Arbitrary::arbitrary(g)..=Arbitrary::arbitrary(g)
1064 }
1065 fn shrink(&self) -> Box<dyn Iterator<Item = RangeInclusive<T>>> {
1066 Box::new(
1067 (self.start().clone(), self.end().clone())
1068 .shrink()
1069 .map(|(s, e)| s..=e),
1070 )
1071 }
1072}
1073
1074impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for RangeFrom<T> {
1075 fn arbitrary(g: &mut Gen) -> RangeFrom<T> {
1076 Arbitrary::arbitrary(g)..
1077 }
1078 fn shrink(&self) -> Box<dyn Iterator<Item = RangeFrom<T>>> {
1079 Box::new(self.start.clone().shrink().map(|start| start..))
1080 }
1081}
1082
1083impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for RangeTo<T> {
1084 fn arbitrary(g: &mut Gen) -> RangeTo<T> {
1085 ..Arbitrary::arbitrary(g)
1086 }
1087 fn shrink(&self) -> Box<dyn Iterator<Item = RangeTo<T>>> {
1088 Box::new(self.end.clone().shrink().map(|end| ..end))
1089 }
1090}
1091
1092impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for RangeToInclusive<T> {
1093 fn arbitrary(g: &mut Gen) -> RangeToInclusive<T> {
1094 ..=Arbitrary::arbitrary(g)
1095 }
1096 fn shrink(&self) -> Box<dyn Iterator<Item = RangeToInclusive<T>>> {
1097 Box::new(self.end.clone().shrink().map(|end| ..=end))
1098 }
1099}
1100
1101impl Arbitrary for RangeFull {
1102 fn arbitrary(_: &mut Gen) -> RangeFull {
1103 ..
1104 }
1105}
1106
1107impl Arbitrary for Duration {
1108 fn arbitrary(gen: &mut Gen) -> Self {
1109 let seconds = gen.gen_range(0..gen.size() as u64);
1110 let nanoseconds = gen.gen_range(0..1_000_000);
1111 Duration::new(seconds, nanoseconds)
1112 }
1113
1114 fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
1115 Box::new(
1116 (self.as_secs(), self.subsec_nanos())
1117 .shrink()
1118 .map(|(secs, nanos)| Duration::new(secs, nanos % 1_000_000)),
1119 )
1120 }
1121}
1122
1123impl<A: Arbitrary> Arbitrary for Box<A> {
1124 fn arbitrary(g: &mut Gen) -> Box<A> {
1125 Box::new(A::arbitrary(g))
1126 }
1127
1128 fn shrink(&self) -> Box<dyn Iterator<Item = Box<A>>> {
1129 Box::new((**self).shrink().map(Box::new))
1130 }
1131}
1132
1133impl<A: Arbitrary + Sync> Arbitrary for Arc<A> {
1134 fn arbitrary(g: &mut Gen) -> Arc<A> {
1135 Arc::new(A::arbitrary(g))
1136 }
1137
1138 fn shrink(&self) -> Box<dyn Iterator<Item = Arc<A>>> {
1139 Box::new((**self).shrink().map(Arc::new))
1140 }
1141}
1142
1143impl Arbitrary for SystemTime {
1144 fn arbitrary(gen: &mut Gen) -> Self {
1145 let after_epoch = bool::arbitrary(gen);
1146 let duration = Duration::arbitrary(gen);
1147 if after_epoch {
1148 UNIX_EPOCH + duration
1149 } else {
1150 UNIX_EPOCH - duration
1151 }
1152 }
1153
1154 fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
1155 let duration = match self.duration_since(UNIX_EPOCH) {
1156 Ok(duration) => duration,
1157 Err(e) => e.duration(),
1158 };
1159 Box::new(
1160 duration
1161 .shrink()
1162 .flat_map(|d| vec![UNIX_EPOCH + d, UNIX_EPOCH - d]),
1163 )
1164 }
1165}
1166
1167#[cfg(test)]
1168#[allow(clippy::unit_cmp)]
1169mod test {
1170 use std::collections::{
1171 BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList, VecDeque,
1172 };
1173 use std::fmt::Debug;
1174 use std::hash::Hash;
1175 use std::num::Wrapping;
1176 use std::path::PathBuf;
1177
1178 use super::{Arbitrary, Gen};
1179
1180 #[test]
1181 fn arby_unit() {
1182 assert_eq!(arby::<()>(), ());
1183 }
1184
1185 macro_rules! arby_int {
1186 ( $signed:expr, $($t:ty),+) => {$(
1187 let mut arbys = (0..1_000_000).map(|_| arby::<$t>());
1188 let mut problems = if $signed {
1189 signed_problem_values!($t).iter()
1190 } else {
1191 unsigned_problem_values!($t).iter()
1192 };
1193 assert!(problems.all(|p| arbys.any(|arby| arby == *p)),
1194 "Arbitrary does not generate all problematic values");
1195 let max = <$t>::max_value();
1196 let mid = (max + <$t>::min_value()) / 2;
1197 let double_chunks: $t = 9;
1200 let chunks = double_chunks * 2; let lim: Box<dyn Iterator<Item=$t>> = if $signed {
1202 Box::new((0..=chunks)
1203 .map(|idx| idx - chunks / 2)
1204 .map(|x| mid + max / (chunks / 2) * x))
1205 } else {
1206 Box::new((0..=chunks).map(|idx| max / chunks * idx))
1207 };
1208 let mut lim = lim.peekable();
1209 while let (Some(low), Some(&high)) = (lim.next(), lim.peek()) {
1210 assert!(arbys.any(|arby| low <= arby && arby <= high),
1211 "Arbitrary doesn't generate numbers in {}..={}", low, high)
1212 }
1213 )*};
1214 }
1215
1216 #[test]
1217 fn arby_int() {
1218 arby_int!(true, i8, i16, i32, i64, isize, i128);
1219 }
1220
1221 #[test]
1222 fn arby_uint() {
1223 arby_int!(false, u8, u16, u32, u64, usize, u128);
1224 }
1225
1226 macro_rules! arby_float {
1227 ($($t:ty, $path:path),+) => {$({
1228 use $path as p;
1229 let mut arbys = (0..1_000_000).map(|_| arby::<$t>());
1230 assert!(arbys.any(|f| f.is_nan()),
1232 "Arbitrary does not generate the problematic value NaN"
1233 );
1234 for p in float_problem_values!($path).iter().filter(|f| !f.is_nan()) {
1235 assert!(arbys.any(|arby| arby == *p),
1236 "Arbitrary does not generate the problematic value {}",
1237 p
1238 );
1239 }
1240 let double_chunks: i8 = 9;
1243 let chunks = double_chunks * 2; let lim = (-double_chunks..=double_chunks)
1245 .map(|idx| <$t>::from(idx))
1246 .map(|idx| p::MAX/(<$t>::from(chunks/2)) * idx);
1247 let mut lim = lim.peekable();
1248 while let (Some(low), Some(&high)) = (lim.next(), lim.peek()) {
1249 assert!(
1250 arbys.any(|arby| low <= arby && arby <= high),
1251 "Arbitrary doesn't generate numbers in {:e}..={:e}",
1252 low,
1253 high,
1254 )
1255 }
1256 })*};
1257 }
1258
1259 #[test]
1260 fn arby_float() {
1261 arby_float!(f32, std::f32, f64, std::f64);
1262 }
1263
1264 fn arby<A: Arbitrary>() -> A {
1265 Arbitrary::arbitrary(&mut Gen::new(5))
1266 }
1267
1268 #[test]
1270 fn unit() {
1271 eq((), vec![]);
1272 }
1273
1274 #[test]
1275 fn bools() {
1276 eq(false, vec![]);
1277 eq(true, vec![false]);
1278 }
1279
1280 #[test]
1281 fn options() {
1282 eq(None::<()>, vec![]);
1283 eq(Some(false), vec![None]);
1284 eq(Some(true), vec![None, Some(false)]);
1285 }
1286
1287 #[test]
1288 fn results() {
1289 ordered_eq(Ok::<bool, ()>(true), vec![Ok(false)]);
1293 ordered_eq(Err::<(), bool>(true), vec![Err(false)]);
1294 }
1295
1296 #[test]
1297 fn tuples() {
1298 eq((false, false), vec![]);
1299 eq((true, false), vec![(false, false)]);
1300 eq((true, true), vec![(false, true), (true, false)]);
1301 }
1302
1303 #[test]
1304 fn triples() {
1305 eq((false, false, false), vec![]);
1306 eq((true, false, false), vec![(false, false, false)]);
1307 eq(
1308 (true, true, false),
1309 vec![(false, true, false), (true, false, false)],
1310 );
1311 }
1312
1313 #[test]
1314 fn quads() {
1315 eq((false, false, false, false), vec![]);
1316 eq(
1317 (true, false, false, false),
1318 vec![(false, false, false, false)],
1319 );
1320 eq(
1321 (true, true, false, false),
1322 vec![(false, true, false, false), (true, false, false, false)],
1323 );
1324 }
1325
1326 #[test]
1327 fn ints() {
1328 eq(5isize, vec![0, 3, 4]);
1330 eq(-5isize, vec![5, 0, -3, -4]);
1331 eq(0isize, vec![]);
1332 }
1333
1334 #[test]
1335 fn ints8() {
1336 eq(5i8, vec![0, 3, 4]);
1337 eq(-5i8, vec![5, 0, -3, -4]);
1338 eq(0i8, vec![]);
1339 }
1340
1341 #[test]
1342 fn ints16() {
1343 eq(5i16, vec![0, 3, 4]);
1344 eq(-5i16, vec![5, 0, -3, -4]);
1345 eq(0i16, vec![]);
1346 }
1347
1348 #[test]
1349 fn ints32() {
1350 eq(5i32, vec![0, 3, 4]);
1351 eq(-5i32, vec![5, 0, -3, -4]);
1352 eq(0i32, vec![]);
1353 }
1354
1355 #[test]
1356 fn ints64() {
1357 eq(5i64, vec![0, 3, 4]);
1358 eq(-5i64, vec![5, 0, -3, -4]);
1359 eq(0i64, vec![]);
1360 }
1361
1362 #[test]
1363 fn ints128() {
1364 eq(5i128, vec![0, 3, 4]);
1365 eq(-5i128, vec![5, 0, -3, -4]);
1366 eq(0i128, vec![]);
1367 }
1368
1369 #[test]
1370 fn uints() {
1371 eq(5usize, vec![0, 3, 4]);
1372 eq(0usize, vec![]);
1373 }
1374
1375 #[test]
1376 fn uints8() {
1377 eq(5u8, vec![0, 3, 4]);
1378 eq(0u8, vec![]);
1379 }
1380
1381 #[test]
1382 fn uints16() {
1383 eq(5u16, vec![0, 3, 4]);
1384 eq(0u16, vec![]);
1385 }
1386
1387 #[test]
1388 fn uints32() {
1389 eq(5u32, vec![0, 3, 4]);
1390 eq(0u32, vec![]);
1391 }
1392
1393 #[test]
1394 fn uints64() {
1395 eq(5u64, vec![0, 3, 4]);
1396 eq(0u64, vec![]);
1397 }
1398
1399 #[test]
1400 fn uints128() {
1401 eq(5u128, vec![0, 3, 4]);
1402 eq(0u128, vec![]);
1403 }
1404
1405 macro_rules! define_float_eq {
1406 ($ty:ty) => {
1407 fn eq(s: $ty, v: Vec<$ty>) {
1408 let shrunk: Vec<$ty> = s.shrink().collect();
1409 for n in v {
1410 let found = shrunk.iter().any(|&i| i == n);
1411 if !found {
1412 panic!(
1413 "Element {:?} was not found \
1414 in shrink results {:?}",
1415 n, shrunk
1416 );
1417 }
1418 }
1419 }
1420 };
1421 }
1422
1423 #[test]
1424 fn floats32() {
1425 define_float_eq!(f32);
1426
1427 eq(0.0, vec![]);
1428 eq(-0.0, vec![]);
1429 eq(1.0, vec![0.0]);
1430 eq(2.0, vec![0.0, 1.0]);
1431 eq(-2.0, vec![0.0, 2.0, -1.0]);
1432 eq(1.5, vec![0.0]);
1433 }
1434
1435 #[test]
1436 fn floats64() {
1437 define_float_eq!(f64);
1438
1439 eq(0.0, vec![]);
1440 eq(-0.0, vec![]);
1441 eq(1.0, vec![0.0]);
1442 eq(2.0, vec![0.0, 1.0]);
1443 eq(-2.0, vec![0.0, 2.0, -1.0]);
1444 eq(1.5, vec![0.0]);
1445 }
1446
1447 #[test]
1448 fn wrapping_ints32() {
1449 eq(Wrapping(5i32), vec![Wrapping(0), Wrapping(3), Wrapping(4)]);
1450 eq(
1451 Wrapping(-5i32),
1452 vec![Wrapping(5), Wrapping(0), Wrapping(-3), Wrapping(-4)],
1453 );
1454 eq(Wrapping(0i32), vec![]);
1455 }
1456
1457 #[test]
1458 fn arrays() {
1459 eq([false, false], vec![]);
1460 eq([true, false], vec![[false, false]]);
1461 eq([true, true], vec![[false, true], [true, false]]);
1462
1463 eq([false, false, false], vec![]);
1464 eq([true, false, false], vec![[false, false, false]]);
1465 eq(
1466 [true, true, false],
1467 vec![[false, true, false], [true, false, false]],
1468 );
1469
1470 eq([false, false, false, false], vec![]);
1471 eq(
1472 [true, false, false, false],
1473 vec![[false, false, false, false]],
1474 );
1475 eq(
1476 [true, true, false, false],
1477 vec![[false, true, false, false], [true, false, false, false]],
1478 );
1479
1480 eq(
1481 {
1482 let it: [isize; 0] = [];
1483 it
1484 },
1485 vec![],
1486 );
1487 eq(
1488 {
1489 let it: [[isize; 0]; 1] = [[]];
1490 it
1491 },
1492 vec![],
1493 );
1494 eq([1isize; 1], vec![[0; 1]]);
1495 eq([11isize; 1], vec![[0; 1], [6; 1], [9; 1], [10; 1]]);
1496 eq([3isize, 5], vec![[0, 5], [2, 5], [3, 0], [3, 3], [3, 4]]);
1497 }
1498
1499 #[test]
1500 fn vecs() {
1501 eq(
1502 {
1503 let it: Vec<isize> = vec![];
1504 it
1505 },
1506 vec![],
1507 );
1508 eq(
1509 {
1510 let it: Vec<Vec<isize>> = vec![vec![]];
1511 it
1512 },
1513 vec![vec![]],
1514 );
1515 eq(vec![1isize], vec![vec![], vec![0]]);
1516 eq(
1517 vec![11isize],
1518 vec![vec![], vec![0], vec![6], vec![9], vec![10]],
1519 );
1520 eq(
1521 vec![3isize, 5],
1522 vec![
1523 vec![],
1524 vec![5],
1525 vec![3],
1526 vec![0, 5],
1527 vec![2, 5],
1528 vec![3, 0],
1529 vec![3, 3],
1530 vec![3, 4],
1531 ],
1532 );
1533 }
1534
1535 macro_rules! map_tests {
1536 ($name:ident, $ctor:expr) => {
1537 #[test]
1538 fn $name() {
1539 ordered_eq($ctor, vec![]);
1540
1541 {
1542 let mut map = $ctor;
1543 map.insert(1usize, 1isize);
1544
1545 let shrinks = vec![
1546 $ctor,
1547 {
1548 let mut m = $ctor;
1549 m.insert(0, 1);
1550 m
1551 },
1552 {
1553 let mut m = $ctor;
1554 m.insert(1, 0);
1555 m
1556 },
1557 ];
1558
1559 ordered_eq(map, shrinks);
1560 }
1561 }
1562 };
1563 }
1564
1565 map_tests!(btreemap, BTreeMap::<usize, isize>::new());
1566 map_tests!(hashmap, HashMap::<usize, isize>::new());
1567
1568 macro_rules! list_tests {
1569 ($name:ident, $ctor:expr, $push:ident) => {
1570 #[test]
1571 fn $name() {
1572 ordered_eq($ctor, vec![]);
1573
1574 {
1575 let mut list = $ctor;
1576 list.$push(2usize);
1577
1578 let shrinks = vec![
1579 $ctor,
1580 {
1581 let mut m = $ctor;
1582 m.$push(0);
1583 m
1584 },
1585 {
1586 let mut m = $ctor;
1587 m.$push(1);
1588 m
1589 },
1590 ];
1591
1592 ordered_eq(list, shrinks);
1593 }
1594 }
1595 };
1596 }
1597
1598 list_tests!(btreesets, BTreeSet::<usize>::new(), insert);
1599 list_tests!(hashsets, HashSet::<usize>::new(), insert);
1600 list_tests!(linkedlists, LinkedList::<usize>::new(), push_back);
1601 list_tests!(vecdeques, VecDeque::<usize>::new(), push_back);
1602
1603 #[test]
1604 fn binaryheaps() {
1605 ordered_eq(
1606 BinaryHeap::<usize>::new().into_iter().collect::<Vec<_>>(),
1607 vec![],
1608 );
1609
1610 {
1611 let mut heap = BinaryHeap::<usize>::new();
1612 heap.push(2usize);
1613
1614 let shrinks = vec![vec![], vec![0], vec![1]];
1615
1616 ordered_eq(heap.into_iter().collect::<Vec<_>>(), shrinks);
1617 }
1618 }
1619
1620 #[test]
1621 fn chars() {
1622 eq('\x00', vec![]);
1623 }
1624
1625 fn eq<A: Arbitrary + Eq + Debug + Hash>(s: A, v: Vec<A>) {
1627 let (left, right) = (shrunk(s), set(v));
1628 assert_eq!(left, right);
1629 }
1630 fn shrunk<A: Arbitrary + Eq + Hash>(s: A) -> HashSet<A> {
1631 set(s.shrink())
1632 }
1633 fn set<A: Hash + Eq, I: IntoIterator<Item = A>>(xs: I) -> HashSet<A> {
1634 xs.into_iter().collect()
1635 }
1636
1637 fn ordered_eq<A: Arbitrary + Eq + Debug>(s: A, v: Vec<A>) {
1638 let (left, right) = (s.shrink().collect::<Vec<A>>(), v);
1639 assert_eq!(left, right);
1640 }
1641
1642 #[test]
1643 fn bounds() {
1644 use std::ops::Bound::*;
1645 for i in -5..=5 {
1646 ordered_eq(Included(i), i.shrink().map(Included).collect());
1647 ordered_eq(Excluded(i), i.shrink().map(Excluded).collect());
1648 }
1649 eq(Unbounded::<i32>, vec![]);
1650 }
1651
1652 #[test]
1653 #[allow(clippy::reversed_empty_ranges)]
1654 fn ranges() {
1655 ordered_eq(0..0, vec![]);
1656 ordered_eq(1..1, vec![0..1, 1..0]);
1657 ordered_eq(3..5, vec![0..5, 2..5, 3..0, 3..3, 3..4]);
1658 ordered_eq(5..3, vec![0..3, 3..3, 4..3, 5..0, 5..2]);
1659 ordered_eq(3.., vec![0.., 2..]);
1660 ordered_eq(..3, vec![..0, ..2]);
1661 ordered_eq(.., vec![]);
1662 ordered_eq(3..=5, vec![0..=5, 2..=5, 3..=0, 3..=3, 3..=4]);
1663 ordered_eq(..=3, vec![..=0, ..=2]);
1664 }
1665
1666 #[test]
1667 fn pathbuf() {
1668 ordered_eq(
1669 PathBuf::from("/home/foo//.././bar"),
1670 vec![
1671 PathBuf::from("/home/foo//.."),
1672 PathBuf::from("/home/foo/../bar"),
1673 ],
1674 );
1675 }
1676}