quickcheck/
arbitrary.rs

1use std::char;
2use std::collections::{
3    BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList, VecDeque,
4};
5use std::env;
6use std::ffi::{CString, OsString};
7use std::hash::{BuildHasher, Hash};
8use std::iter::{empty, once};
9use std::net::{
10    IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6,
11};
12use std::num::Wrapping;
13use std::num::{
14    NonZeroU128, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize,
15};
16use std::ops::{
17    Bound, Range, RangeFrom, RangeFull, RangeInclusive, RangeTo,
18    RangeToInclusive,
19};
20use std::path::PathBuf;
21use std::sync::Arc;
22use std::time::{Duration, SystemTime, UNIX_EPOCH};
23
24use rand::seq::SliceRandom;
25use rand::{self, Rng, SeedableRng};
26
27/// Gen represents a PRNG.
28///
29/// It is the source of randomness from which QuickCheck will generate
30/// values. An instance of `Gen` is passed to every invocation of
31/// `Arbitrary::arbitrary`, which permits callers to use lower level RNG
32/// routines to generate values.
33///
34/// It is unspecified whether this is a secure RNG or not. Therefore, callers
35/// should assume it is insecure.
36pub struct Gen {
37    rng: rand::rngs::SmallRng,
38    size: usize,
39}
40
41impl Gen {
42    /// Returns a `Gen` with the given size configuration.
43    ///
44    /// The `size` parameter controls the size of random values generated.
45    /// For example, it specifies the maximum length of a randomly generated
46    /// vector, but is and should not be used to control the range of a
47    /// randomly generated number. (Unless that number is used to control the
48    /// size of a data structure.)
49    pub fn new(size: usize) -> Gen {
50        Gen { rng: rand::rngs::SmallRng::from_entropy(), size: size }
51    }
52
53    /// Returns the size configured with this generator.
54    pub fn size(&self) -> usize {
55        self.size
56    }
57
58    /// Choose among the possible alternatives in the slice given. If the slice
59    /// is empty, then `None` is returned. Otherwise, a non-`None` value is
60    /// guaranteed to be returned.
61    pub fn choose<'a, T>(&mut self, slice: &'a [T]) -> Option<&'a T> {
62        slice.choose(&mut self.rng)
63    }
64
65    fn gen<T>(&mut self) -> T
66    where
67        rand::distributions::Standard: rand::distributions::Distribution<T>,
68    {
69        self.rng.gen()
70    }
71
72    fn gen_range<T, R>(&mut self, range: R) -> T
73    where
74        T: rand::distributions::uniform::SampleUniform,
75        R: rand::distributions::uniform::SampleRange<T>,
76    {
77        self.rng.gen_range(range)
78    }
79}
80
81/// Creates a shrinker with zero elements.
82pub fn empty_shrinker<A: 'static>() -> Box<dyn Iterator<Item = A>> {
83    Box::new(empty())
84}
85
86/// Creates a shrinker with a single element.
87pub fn single_shrinker<A: 'static>(value: A) -> Box<dyn Iterator<Item = A>> {
88    Box::new(once(value))
89}
90
91/// `Arbitrary` describes types whose values can be randomly generated and
92/// shrunk.
93///
94/// Aside from shrinking, `Arbitrary` is different from typical RNGs in that
95/// it respects `Gen::size()` for controlling how much memory a particular
96/// value uses, for practical purposes. For example, `Vec::arbitrary()`
97/// respects `Gen::size()` to decide the maximum `len()` of the vector.
98/// This behavior is necessary due to practical speed and size limitations.
99/// Conversely, `i32::arbitrary()` ignores `size()` since all `i32` values
100/// require `O(1)` memory and operations between `i32`s require `O(1)` time
101/// (with the exception of exponentiation).
102///
103/// Additionally, all types that implement `Arbitrary` must also implement
104/// `Clone`.
105pub trait Arbitrary: Clone + 'static {
106    /// Return an arbitrary value.
107    ///
108    /// Implementations should respect `Gen::size()` when decisions about how
109    /// big a particular value should be. Implementations should generally
110    /// defer to other `Arbitrary` implementations to generate other random
111    /// values when necessary. The `Gen` type also offers a few RNG helper
112    /// routines.
113    fn arbitrary(g: &mut Gen) -> Self;
114
115    /// Return an iterator of values that are smaller than itself.
116    ///
117    /// The way in which a value is "smaller" is implementation defined. In
118    /// some cases, the interpretation is obvious: shrinking an integer should
119    /// produce integers smaller than itself. Others are more complex, for
120    /// example, shrinking a `Vec` should both shrink its size and shrink its
121    /// component values.
122    ///
123    /// The iterator returned should be bounded to some reasonable size.
124    ///
125    /// It is always correct to return an empty iterator, and indeed, this
126    /// is the default implementation. The downside of this approach is that
127    /// witnesses to failures in properties will be more inscrutable.
128    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
129        empty_shrinker()
130    }
131}
132
133impl Arbitrary for () {
134    fn arbitrary(_: &mut Gen) -> () {
135        ()
136    }
137}
138
139impl Arbitrary for bool {
140    fn arbitrary(g: &mut Gen) -> bool {
141        g.gen()
142    }
143
144    fn shrink(&self) -> Box<dyn Iterator<Item = bool>> {
145        if *self {
146            single_shrinker(false)
147        } else {
148            empty_shrinker()
149        }
150    }
151}
152
153impl<A: Arbitrary> Arbitrary for Option<A> {
154    fn arbitrary(g: &mut Gen) -> Option<A> {
155        if g.gen() {
156            None
157        } else {
158            Some(Arbitrary::arbitrary(g))
159        }
160    }
161
162    fn shrink(&self) -> Box<dyn Iterator<Item = Option<A>>> {
163        match *self {
164            None => empty_shrinker(),
165            Some(ref x) => {
166                let chain = single_shrinker(None).chain(x.shrink().map(Some));
167                Box::new(chain)
168            }
169        }
170    }
171}
172
173impl<A: Arbitrary, B: Arbitrary> Arbitrary for Result<A, B> {
174    fn arbitrary(g: &mut Gen) -> Result<A, B> {
175        if g.gen() {
176            Ok(Arbitrary::arbitrary(g))
177        } else {
178            Err(Arbitrary::arbitrary(g))
179        }
180    }
181
182    fn shrink(&self) -> Box<dyn Iterator<Item = Result<A, B>>> {
183        match *self {
184            Ok(ref x) => {
185                let xs = x.shrink();
186                let tagged = xs.map(Ok);
187                Box::new(tagged)
188            }
189            Err(ref x) => {
190                let xs = x.shrink();
191                let tagged = xs.map(Err);
192                Box::new(tagged)
193            }
194        }
195    }
196}
197
198macro_rules! impl_arb_for_single_tuple {
199    ($(($type_param:ident, $tuple_index:tt),)*) => {
200        impl<$($type_param),*> Arbitrary for ($($type_param,)*)
201            where $($type_param: Arbitrary,)*
202        {
203            fn arbitrary(g: &mut Gen) -> ($($type_param,)*) {
204                (
205                    $(
206                        $type_param::arbitrary(g),
207                    )*
208                )
209            }
210
211            fn shrink(&self) -> Box<dyn Iterator<Item=($($type_param,)*)>> {
212                let iter = ::std::iter::empty();
213                $(
214                    let cloned = self.clone();
215                    let iter = iter.chain(
216                        self.$tuple_index.shrink().map(move |shr_value| {
217                            let mut result = cloned.clone();
218                            result.$tuple_index = shr_value;
219                            result
220                        })
221                    );
222                )*
223                Box::new(iter)
224            }
225        }
226    };
227}
228
229macro_rules! impl_arb_for_tuples {
230    (@internal [$($acc:tt,)*]) => { };
231    (@internal [$($acc:tt,)*] ($type_param:ident, $tuple_index:tt), $($rest:tt,)*) => {
232        impl_arb_for_single_tuple!($($acc,)* ($type_param, $tuple_index),);
233        impl_arb_for_tuples!(@internal [$($acc,)* ($type_param, $tuple_index),] $($rest,)*);
234    };
235    ($(($type_param:ident, $tuple_index:tt),)*) => {
236        impl_arb_for_tuples!(@internal [] $(($type_param, $tuple_index),)*);
237    };
238}
239
240impl_arb_for_tuples! {
241    (A, 0),
242    (B, 1),
243    (C, 2),
244    (D, 3),
245    (E, 4),
246    (F, 5),
247    (G, 6),
248    (H, 7),
249}
250
251impl<A: Arbitrary> Arbitrary for Vec<A> {
252    fn arbitrary(g: &mut Gen) -> Vec<A> {
253        let size = {
254            let s = g.size();
255            g.gen_range(0..s)
256        };
257        (0..size).map(|_| A::arbitrary(g)).collect()
258    }
259
260    fn shrink(&self) -> Box<dyn Iterator<Item = Vec<A>>> {
261        VecShrinker::new(self.clone())
262    }
263}
264
265///Iterator which returns successive attempts to shrink the vector `seed`
266struct VecShrinker<A> {
267    seed: Vec<A>,
268    /// How much which is removed when trying with smaller vectors
269    size: usize,
270    /// The end of the removed elements
271    offset: usize,
272    /// The shrinker for the element at `offset` once shrinking of individual
273    /// elements are attempted
274    element_shrinker: Box<dyn Iterator<Item = A>>,
275}
276
277impl<A: Arbitrary> VecShrinker<A> {
278    fn new(seed: Vec<A>) -> Box<dyn Iterator<Item = Vec<A>>> {
279        let es = match seed.get(0) {
280            Some(e) => e.shrink(),
281            None => return empty_shrinker(),
282        };
283        let size = seed.len();
284        Box::new(VecShrinker {
285            seed: seed,
286            size: size,
287            offset: size,
288            element_shrinker: es,
289        })
290    }
291
292    /// Returns the next shrunk element if any, `offset` points to the index
293    /// after the returned element after the function returns
294    fn next_element(&mut self) -> Option<A> {
295        loop {
296            match self.element_shrinker.next() {
297                Some(e) => return Some(e),
298                None => match self.seed.get(self.offset) {
299                    Some(e) => {
300                        self.element_shrinker = e.shrink();
301                        self.offset += 1;
302                    }
303                    None => return None,
304                },
305            }
306        }
307    }
308}
309
310impl<A> Iterator for VecShrinker<A>
311where
312    A: Arbitrary,
313{
314    type Item = Vec<A>;
315    fn next(&mut self) -> Option<Vec<A>> {
316        // Try with an empty vector first
317        if self.size == self.seed.len() {
318            self.size /= 2;
319            self.offset = self.size;
320            return Some(vec![]);
321        }
322        if self.size != 0 {
323            // Generate a smaller vector by removing the elements between
324            // (offset - size) and offset
325            let xs1 = self.seed[..(self.offset - self.size)]
326                .iter()
327                .chain(&self.seed[self.offset..])
328                .cloned()
329                .collect();
330            self.offset += self.size;
331            // Try to reduce the amount removed from the vector once all
332            // previous sizes tried
333            if self.offset > self.seed.len() {
334                self.size /= 2;
335                self.offset = self.size;
336            }
337            Some(xs1)
338        } else {
339            // A smaller vector did not work so try to shrink each element of
340            // the vector instead Reuse `offset` as the index determining which
341            // element to shrink
342
343            // The first element shrinker is already created so skip the first
344            // offset (self.offset == 0 only on first entry to this part of the
345            // iterator)
346            if self.offset == 0 {
347                self.offset = 1
348            }
349
350            match self.next_element() {
351                Some(e) => Some(
352                    self.seed[..self.offset - 1]
353                        .iter()
354                        .cloned()
355                        .chain(Some(e).into_iter())
356                        .chain(self.seed[self.offset..].iter().cloned())
357                        .collect(),
358                ),
359                None => None,
360            }
361        }
362    }
363}
364
365impl<K: Arbitrary + Ord, V: Arbitrary> Arbitrary for BTreeMap<K, V> {
366    fn arbitrary(g: &mut Gen) -> BTreeMap<K, V> {
367        let vec: Vec<(K, V)> = Arbitrary::arbitrary(g);
368        vec.into_iter().collect()
369    }
370
371    fn shrink(&self) -> Box<dyn Iterator<Item = BTreeMap<K, V>>> {
372        let vec: Vec<(K, V)> = self.clone().into_iter().collect();
373        Box::new(
374            vec.shrink().map(|v| v.into_iter().collect::<BTreeMap<K, V>>()),
375        )
376    }
377}
378
379impl<
380        K: Arbitrary + Eq + Hash,
381        V: Arbitrary,
382        S: BuildHasher + Default + Clone + 'static,
383    > Arbitrary for HashMap<K, V, S>
384{
385    fn arbitrary(g: &mut Gen) -> Self {
386        let vec: Vec<(K, V)> = Arbitrary::arbitrary(g);
387        vec.into_iter().collect()
388    }
389
390    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
391        let vec: Vec<(K, V)> = self.clone().into_iter().collect();
392        Box::new(vec.shrink().map(|v| v.into_iter().collect::<Self>()))
393    }
394}
395
396impl<T: Arbitrary + Ord> Arbitrary for BTreeSet<T> {
397    fn arbitrary(g: &mut Gen) -> BTreeSet<T> {
398        let vec: Vec<T> = Arbitrary::arbitrary(g);
399        vec.into_iter().collect()
400    }
401
402    fn shrink(&self) -> Box<dyn Iterator<Item = BTreeSet<T>>> {
403        let vec: Vec<T> = self.clone().into_iter().collect();
404        Box::new(vec.shrink().map(|v| v.into_iter().collect::<BTreeSet<T>>()))
405    }
406}
407
408impl<T: Arbitrary + Ord> Arbitrary for BinaryHeap<T> {
409    fn arbitrary(g: &mut Gen) -> BinaryHeap<T> {
410        let vec: Vec<T> = Arbitrary::arbitrary(g);
411        vec.into_iter().collect()
412    }
413
414    fn shrink(&self) -> Box<dyn Iterator<Item = BinaryHeap<T>>> {
415        let vec: Vec<T> = self.clone().into_iter().collect();
416        Box::new(
417            vec.shrink().map(|v| v.into_iter().collect::<BinaryHeap<T>>()),
418        )
419    }
420}
421
422impl<T: Arbitrary + Eq + Hash, S: BuildHasher + Default + Clone + 'static>
423    Arbitrary for HashSet<T, S>
424{
425    fn arbitrary(g: &mut Gen) -> Self {
426        let vec: Vec<T> = Arbitrary::arbitrary(g);
427        vec.into_iter().collect()
428    }
429
430    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
431        let vec: Vec<T> = self.clone().into_iter().collect();
432        Box::new(vec.shrink().map(|v| v.into_iter().collect::<Self>()))
433    }
434}
435
436impl<T: Arbitrary> Arbitrary for LinkedList<T> {
437    fn arbitrary(g: &mut Gen) -> LinkedList<T> {
438        let vec: Vec<T> = Arbitrary::arbitrary(g);
439        vec.into_iter().collect()
440    }
441
442    fn shrink(&self) -> Box<dyn Iterator<Item = LinkedList<T>>> {
443        let vec: Vec<T> = self.clone().into_iter().collect();
444        Box::new(
445            vec.shrink().map(|v| v.into_iter().collect::<LinkedList<T>>()),
446        )
447    }
448}
449
450impl<T: Arbitrary> Arbitrary for VecDeque<T> {
451    fn arbitrary(g: &mut Gen) -> VecDeque<T> {
452        let vec: Vec<T> = Arbitrary::arbitrary(g);
453        vec.into_iter().collect()
454    }
455
456    fn shrink(&self) -> Box<dyn Iterator<Item = VecDeque<T>>> {
457        let vec: Vec<T> = self.clone().into_iter().collect();
458        Box::new(vec.shrink().map(|v| v.into_iter().collect::<VecDeque<T>>()))
459    }
460}
461
462impl Arbitrary for IpAddr {
463    fn arbitrary(g: &mut Gen) -> IpAddr {
464        let ipv4: bool = g.gen();
465        if ipv4 {
466            IpAddr::V4(Arbitrary::arbitrary(g))
467        } else {
468            IpAddr::V6(Arbitrary::arbitrary(g))
469        }
470    }
471}
472
473impl Arbitrary for Ipv4Addr {
474    fn arbitrary(g: &mut Gen) -> Ipv4Addr {
475        Ipv4Addr::new(g.gen(), g.gen(), g.gen(), g.gen())
476    }
477}
478
479impl Arbitrary for Ipv6Addr {
480    fn arbitrary(g: &mut Gen) -> Ipv6Addr {
481        Ipv6Addr::new(
482            g.gen(),
483            g.gen(),
484            g.gen(),
485            g.gen(),
486            g.gen(),
487            g.gen(),
488            g.gen(),
489            g.gen(),
490        )
491    }
492}
493
494impl Arbitrary for SocketAddr {
495    fn arbitrary(g: &mut Gen) -> SocketAddr {
496        SocketAddr::new(Arbitrary::arbitrary(g), g.gen())
497    }
498}
499
500impl Arbitrary for SocketAddrV4 {
501    fn arbitrary(g: &mut Gen) -> SocketAddrV4 {
502        SocketAddrV4::new(Arbitrary::arbitrary(g), g.gen())
503    }
504}
505
506impl Arbitrary for SocketAddrV6 {
507    fn arbitrary(g: &mut Gen) -> SocketAddrV6 {
508        SocketAddrV6::new(Arbitrary::arbitrary(g), g.gen(), g.gen(), g.gen())
509    }
510}
511
512impl Arbitrary for PathBuf {
513    fn arbitrary(g: &mut Gen) -> PathBuf {
514        // use some real directories as guesses, so we may end up with
515        // actual working directories in case that is relevant.
516        let here =
517            env::current_dir().unwrap_or(PathBuf::from("/test/directory"));
518        let temp = env::temp_dir();
519        #[allow(deprecated)]
520        let home = env::home_dir().unwrap_or(PathBuf::from("/home/user"));
521        let mut p = g
522            .choose(&[
523                here,
524                temp,
525                home,
526                PathBuf::from("."),
527                PathBuf::from(".."),
528                PathBuf::from("../../.."),
529                PathBuf::new(),
530            ])
531            .unwrap()
532            .to_owned();
533        p.extend(Vec::<OsString>::arbitrary(g).iter());
534        p
535    }
536
537    fn shrink(&self) -> Box<dyn Iterator<Item = PathBuf>> {
538        let mut shrunk = vec![];
539        let mut popped = self.clone();
540        if popped.pop() {
541            shrunk.push(popped);
542        }
543
544        // Iterating over a Path performs a small amount of normalization.
545        let normalized = self.iter().collect::<PathBuf>();
546        if normalized.as_os_str() != self.as_os_str() {
547            shrunk.push(normalized);
548        }
549
550        // Add the canonicalized variant only if canonicalizing the path
551        // actually does something, making it (hopefully) smaller. Also, ignore
552        // canonicalization if canonicalization errors.
553        if let Ok(canonicalized) = self.canonicalize() {
554            if canonicalized.as_os_str() != self.as_os_str() {
555                shrunk.push(canonicalized);
556            }
557        }
558
559        Box::new(shrunk.into_iter())
560    }
561}
562
563impl Arbitrary for OsString {
564    fn arbitrary(g: &mut Gen) -> OsString {
565        OsString::from(String::arbitrary(g))
566    }
567
568    fn shrink(&self) -> Box<dyn Iterator<Item = OsString>> {
569        let mystring: String = self.clone().into_string().unwrap();
570        Box::new(mystring.shrink().map(|s| OsString::from(s)))
571    }
572}
573
574impl Arbitrary for String {
575    fn arbitrary(g: &mut Gen) -> String {
576        let size = {
577            let s = g.size();
578            g.gen_range(0..s)
579        };
580        (0..size).map(|_| char::arbitrary(g)).collect()
581    }
582
583    fn shrink(&self) -> Box<dyn Iterator<Item = String>> {
584        // Shrink a string by shrinking a vector of its characters.
585        let chars: Vec<char> = self.chars().collect();
586        Box::new(chars.shrink().map(|x| x.into_iter().collect::<String>()))
587    }
588}
589
590impl Arbitrary for CString {
591    fn arbitrary(g: &mut Gen) -> Self {
592        let size = {
593            let s = g.size();
594            g.gen_range(0..s)
595        };
596        // Use either random bytes or random UTF-8 encoded codepoints.
597        let utf8: bool = g.gen();
598        if utf8 {
599            CString::new(
600                (0..)
601                    .map(|_| char::arbitrary(g))
602                    .filter(|&c| c != '\0')
603                    .take(size)
604                    .collect::<String>(),
605            )
606        } else {
607            CString::new(
608                (0..)
609                    .map(|_| u8::arbitrary(g))
610                    .filter(|&c| c != b'\0')
611                    .take(size)
612                    .collect::<Vec<u8>>(),
613            )
614        }
615        .expect("null characters should have been filtered out")
616    }
617
618    fn shrink(&self) -> Box<dyn Iterator<Item = CString>> {
619        // Use the implementation for a vec here, but make sure null characters
620        // are filtered out.
621        Box::new(VecShrinker::new(self.as_bytes().to_vec()).map(|bytes| {
622            CString::new(
623                bytes.into_iter().filter(|&c| c != 0).collect::<Vec<u8>>(),
624            )
625            .expect("null characters should have been filtered out")
626        }))
627    }
628}
629
630impl Arbitrary for char {
631    fn arbitrary(g: &mut Gen) -> char {
632        let mode = g.gen_range(0..100);
633        match mode {
634            0..=49 => {
635                // ASCII + some control characters
636                g.gen_range(0..0xB0) as u8 as char
637            }
638            50..=59 => {
639                // Unicode BMP characters
640                loop {
641                    if let Some(x) = char::from_u32(g.gen_range(0..0x10000)) {
642                        return x;
643                    }
644                    // ignore surrogate pairs
645                }
646            }
647            60..=84 => {
648                // Characters often used in programming languages
649                g.choose(&[
650                    ' ', ' ', ' ', '\t', '\n', '~', '`', '!', '@', '#', '$',
651                    '%', '^', '&', '*', '(', ')', '_', '-', '=', '+', '[',
652                    ']', '{', '}', ':', ';', '\'', '"', '\\', '|', ',', '<',
653                    '>', '.', '/', '?', '0', '1', '2', '3', '4', '5', '6',
654                    '7', '8', '9',
655                ])
656                .unwrap()
657                .to_owned()
658            }
659            85..=89 => {
660                // Tricky Unicode, part 1
661                g.choose(&[
662                    '\u{0149}', // a deprecated character
663                    '\u{fff0}', // some of "Other, format" category:
664                    '\u{fff1}',
665                    '\u{fff2}',
666                    '\u{fff3}',
667                    '\u{fff4}',
668                    '\u{fff5}',
669                    '\u{fff6}',
670                    '\u{fff7}',
671                    '\u{fff8}',
672                    '\u{fff9}',
673                    '\u{fffA}',
674                    '\u{fffB}',
675                    '\u{fffC}',
676                    '\u{fffD}',
677                    '\u{fffE}',
678                    '\u{fffF}',
679                    '\u{0600}',
680                    '\u{0601}',
681                    '\u{0602}',
682                    '\u{0603}',
683                    '\u{0604}',
684                    '\u{0605}',
685                    '\u{061C}',
686                    '\u{06DD}',
687                    '\u{070F}',
688                    '\u{180E}',
689                    '\u{110BD}',
690                    '\u{1D173}',
691                    '\u{e0001}', // tag
692                    '\u{e0020}', //  tag space
693                    '\u{e000}',
694                    '\u{e001}',
695                    '\u{ef8ff}', // private use
696                    '\u{f0000}',
697                    '\u{ffffd}',
698                    '\u{ffffe}',
699                    '\u{fffff}',
700                    '\u{100000}',
701                    '\u{10FFFD}',
702                    '\u{10FFFE}',
703                    '\u{10FFFF}',
704                    // "Other, surrogate" characters are so that very special
705                    // that they are not even allowed in safe Rust,
706                    //so omitted here
707                    '\u{3000}', // ideographic space
708                    '\u{1680}',
709                    // other space characters are already covered by two next
710                    // branches
711                ])
712                .unwrap()
713                .to_owned()
714            }
715            90..=94 => {
716                // Tricky unicode, part 2
717                char::from_u32(g.gen_range(0x2000..0x2070)).unwrap()
718            }
719            95..=99 => {
720                // Completely arbitrary characters
721                g.gen()
722            }
723            _ => unreachable!(),
724        }
725    }
726
727    fn shrink(&self) -> Box<dyn Iterator<Item = char>> {
728        Box::new((*self as u32).shrink().filter_map(char::from_u32))
729    }
730}
731
732macro_rules! unsigned_shrinker {
733    ($ty:ty) => {
734        mod shrinker {
735            pub struct UnsignedShrinker {
736                x: $ty,
737                i: $ty,
738            }
739
740            impl UnsignedShrinker {
741                pub fn new(x: $ty) -> Box<dyn Iterator<Item = $ty>> {
742                    if x == 0 {
743                        super::empty_shrinker()
744                    } else {
745                        Box::new(
746                            vec![0]
747                                .into_iter()
748                                .chain(UnsignedShrinker { x: x, i: x / 2 }),
749                        )
750                    }
751                }
752            }
753
754            impl Iterator for UnsignedShrinker {
755                type Item = $ty;
756                fn next(&mut self) -> Option<$ty> {
757                    if self.x - self.i < self.x {
758                        let result = Some(self.x - self.i);
759                        self.i = self.i / 2;
760                        result
761                    } else {
762                        None
763                    }
764                }
765            }
766        }
767    };
768}
769
770macro_rules! unsigned_problem_values {
771    ($t:ty) => {
772        &[<$t>::min_value(), 1, <$t>::max_value()]
773    };
774}
775
776macro_rules! unsigned_arbitrary {
777    ($($ty:tt),*) => {
778        $(
779            impl Arbitrary for $ty {
780                fn arbitrary(g: &mut Gen) -> $ty {
781                    match g.gen_range(0..10) {
782                        0 => {
783                            *g.choose(unsigned_problem_values!($ty)).unwrap()
784                        },
785                        _ => g.gen()
786                    }
787                }
788                fn shrink(&self) -> Box<dyn Iterator<Item=$ty>> {
789                    unsigned_shrinker!($ty);
790                    shrinker::UnsignedShrinker::new(*self)
791                }
792            }
793        )*
794    }
795}
796
797unsigned_arbitrary! {
798    usize, u8, u16, u32, u64, u128
799}
800
801macro_rules! signed_shrinker {
802    ($ty:ty) => {
803        mod shrinker {
804            pub struct SignedShrinker {
805                x: $ty,
806                i: $ty,
807            }
808
809            impl SignedShrinker {
810                pub fn new(x: $ty) -> Box<dyn Iterator<Item = $ty>> {
811                    if x == 0 {
812                        super::empty_shrinker()
813                    } else {
814                        let shrinker = SignedShrinker { x: x, i: x / 2 };
815                        let mut items = vec![0];
816                        if shrinker.i < 0 && shrinker.x != <$ty>::MIN {
817                            items.push(shrinker.x.abs());
818                        }
819                        Box::new(items.into_iter().chain(shrinker))
820                    }
821                }
822            }
823
824            impl Iterator for SignedShrinker {
825                type Item = $ty;
826                fn next(&mut self) -> Option<$ty> {
827                    if self.x == <$ty>::MIN
828                        || (self.x - self.i).abs() < self.x.abs()
829                    {
830                        let result = Some(self.x - self.i);
831                        self.i = self.i / 2;
832                        result
833                    } else {
834                        None
835                    }
836                }
837            }
838        }
839    };
840}
841
842macro_rules! signed_problem_values {
843    ($t:ty) => {
844        &[<$t>::min_value(), 0, <$t>::max_value()]
845    };
846}
847
848macro_rules! signed_arbitrary {
849    ($($ty:tt),*) => {
850        $(
851            impl Arbitrary for $ty {
852                fn arbitrary(g: &mut Gen) -> $ty {
853                    match g.gen_range(0..10) {
854                        0 => {
855                            *g.choose(signed_problem_values!($ty)).unwrap()
856                        },
857                        _ => g.gen()
858                    }
859                }
860                fn shrink(&self) -> Box<dyn Iterator<Item=$ty>> {
861                    signed_shrinker!($ty);
862                    shrinker::SignedShrinker::new(*self)
863                }
864            }
865        )*
866    }
867}
868
869signed_arbitrary! {
870    isize, i8, i16, i32, i64, i128
871}
872
873macro_rules! float_problem_values {
874    ($path:path) => {{
875        // hack. see: https://github.com/rust-lang/rust/issues/48067
876        use $path as p;
877        &[p::NAN, p::NEG_INFINITY, p::MIN, -0., 0., p::MAX, p::INFINITY]
878    }};
879}
880
881macro_rules! float_arbitrary {
882    ($($t:ty, $path:path, $shrinkable:ty),+) => {$(
883        impl Arbitrary for $t {
884            fn arbitrary(g: &mut Gen) -> $t {
885                match g.gen_range(0..10) {
886                    0 => *g.choose(float_problem_values!($path)).unwrap(),
887                    _ => {
888                        use $path as p;
889                        let exp = g.gen_range((0.)..p::MAX_EXP as i16 as $t);
890                        let mantissa = g.gen_range((1.)..2.);
891                        let sign = *g.choose(&[-1., 1.]).unwrap();
892                        sign * mantissa * exp.exp2()
893                    }
894                }
895            }
896            fn shrink(&self) -> Box<dyn Iterator<Item = $t>> {
897                signed_shrinker!($shrinkable);
898                let it = shrinker::SignedShrinker::new(*self as $shrinkable);
899                Box::new(it.map(|x| x as $t))
900            }
901        }
902    )*};
903}
904
905float_arbitrary!(f32, std::f32, i32, f64, std::f64, i64);
906
907macro_rules! unsigned_non_zero_shrinker {
908    ($ty:tt) => {
909        mod shrinker {
910            pub struct UnsignedNonZeroShrinker {
911                x: $ty,
912                i: $ty,
913            }
914
915            impl UnsignedNonZeroShrinker {
916                pub fn new(x: $ty) -> Box<dyn Iterator<Item = $ty>> {
917                    debug_assert!(x > 0);
918
919                    if x == 1 {
920                        super::empty_shrinker()
921                    } else {
922                        Box::new(
923                            std::iter::once(1).chain(
924                                UnsignedNonZeroShrinker { x: x, i: x / 2 },
925                            ),
926                        )
927                    }
928                }
929            }
930
931            impl Iterator for UnsignedNonZeroShrinker {
932                type Item = $ty;
933
934                fn next(&mut self) -> Option<$ty> {
935                    if self.x - self.i < self.x {
936                        let result = Some(self.x - self.i);
937                        self.i = self.i / 2;
938                        result
939                    } else {
940                        None
941                    }
942                }
943            }
944        }
945    };
946}
947
948macro_rules! unsigned_non_zero_arbitrary {
949    ($($ty:tt => $inner:tt),*) => {
950        $(
951            impl Arbitrary for $ty {
952                fn arbitrary(g: &mut Gen) -> $ty {
953                    let mut v: $inner = g.gen();
954                    if v == 0 {
955                        v += 1;
956                    }
957                    $ty::new(v).expect("non-zero value contsturction failed")
958                }
959
960                fn shrink(&self) -> Box<dyn Iterator<Item = $ty>> {
961                    unsigned_non_zero_shrinker!($inner);
962                    Box::new(shrinker::UnsignedNonZeroShrinker::new(self.get())
963                        .map($ty::new)
964                        .map(Option::unwrap))
965                }
966            }
967        )*
968    }
969}
970
971unsigned_non_zero_arbitrary! {
972    NonZeroUsize => usize,
973    NonZeroU8    => u8,
974    NonZeroU16   => u16,
975    NonZeroU32   => u32,
976    NonZeroU64   => u64,
977    NonZeroU128  => u128
978}
979
980impl<T: Arbitrary> Arbitrary for Wrapping<T> {
981    fn arbitrary(g: &mut Gen) -> Wrapping<T> {
982        Wrapping(T::arbitrary(g))
983    }
984    fn shrink(&self) -> Box<dyn Iterator<Item = Wrapping<T>>> {
985        Box::new(self.0.shrink().map(|inner| Wrapping(inner)))
986    }
987}
988
989impl<T: Arbitrary> Arbitrary for Bound<T> {
990    fn arbitrary(g: &mut Gen) -> Bound<T> {
991        match g.gen_range(0..3) {
992            0 => Bound::Included(T::arbitrary(g)),
993            1 => Bound::Excluded(T::arbitrary(g)),
994            _ => Bound::Unbounded,
995        }
996    }
997    fn shrink(&self) -> Box<dyn Iterator<Item = Bound<T>>> {
998        match *self {
999            Bound::Included(ref x) => {
1000                Box::new(x.shrink().map(Bound::Included))
1001            }
1002            Bound::Excluded(ref x) => {
1003                Box::new(x.shrink().map(Bound::Excluded))
1004            }
1005            Bound::Unbounded => empty_shrinker(),
1006        }
1007    }
1008}
1009
1010impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for Range<T> {
1011    fn arbitrary(g: &mut Gen) -> Range<T> {
1012        Arbitrary::arbitrary(g)..Arbitrary::arbitrary(g)
1013    }
1014    fn shrink(&self) -> Box<dyn Iterator<Item = Range<T>>> {
1015        Box::new(
1016            (self.start.clone(), self.end.clone()).shrink().map(|(s, e)| s..e),
1017        )
1018    }
1019}
1020
1021impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for RangeInclusive<T> {
1022    fn arbitrary(g: &mut Gen) -> RangeInclusive<T> {
1023        Arbitrary::arbitrary(g)..=Arbitrary::arbitrary(g)
1024    }
1025    fn shrink(&self) -> Box<dyn Iterator<Item = RangeInclusive<T>>> {
1026        Box::new(
1027            (self.start().clone(), self.end().clone())
1028                .shrink()
1029                .map(|(s, e)| s..=e),
1030        )
1031    }
1032}
1033
1034impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for RangeFrom<T> {
1035    fn arbitrary(g: &mut Gen) -> RangeFrom<T> {
1036        Arbitrary::arbitrary(g)..
1037    }
1038    fn shrink(&self) -> Box<dyn Iterator<Item = RangeFrom<T>>> {
1039        Box::new(self.start.clone().shrink().map(|start| start..))
1040    }
1041}
1042
1043impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for RangeTo<T> {
1044    fn arbitrary(g: &mut Gen) -> RangeTo<T> {
1045        ..Arbitrary::arbitrary(g)
1046    }
1047    fn shrink(&self) -> Box<dyn Iterator<Item = RangeTo<T>>> {
1048        Box::new(self.end.clone().shrink().map(|end| ..end))
1049    }
1050}
1051
1052impl<T: Arbitrary + Clone + PartialOrd> Arbitrary for RangeToInclusive<T> {
1053    fn arbitrary(g: &mut Gen) -> RangeToInclusive<T> {
1054        ..=Arbitrary::arbitrary(g)
1055    }
1056    fn shrink(&self) -> Box<dyn Iterator<Item = RangeToInclusive<T>>> {
1057        Box::new(self.end.clone().shrink().map(|end| ..=end))
1058    }
1059}
1060
1061impl Arbitrary for RangeFull {
1062    fn arbitrary(_: &mut Gen) -> RangeFull {
1063        ..
1064    }
1065}
1066
1067impl Arbitrary for Duration {
1068    fn arbitrary(gen: &mut Gen) -> Self {
1069        let seconds = gen.gen_range(0..gen.size() as u64);
1070        let nanoseconds = gen.gen_range(0..1_000_000);
1071        Duration::new(seconds, nanoseconds)
1072    }
1073
1074    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
1075        Box::new(
1076            (self.as_secs(), self.subsec_nanos())
1077                .shrink()
1078                .map(|(secs, nanos)| Duration::new(secs, nanos % 1_000_000)),
1079        )
1080    }
1081}
1082
1083impl<A: Arbitrary> Arbitrary for Box<A> {
1084    fn arbitrary(g: &mut Gen) -> Box<A> {
1085        Box::new(A::arbitrary(g))
1086    }
1087
1088    fn shrink(&self) -> Box<dyn Iterator<Item = Box<A>>> {
1089        Box::new((**self).shrink().map(Box::new))
1090    }
1091}
1092
1093impl<A: Arbitrary + Sync> Arbitrary for Arc<A> {
1094    fn arbitrary(g: &mut Gen) -> Arc<A> {
1095        Arc::new(A::arbitrary(g))
1096    }
1097
1098    fn shrink(&self) -> Box<dyn Iterator<Item = Arc<A>>> {
1099        Box::new((**self).shrink().map(Arc::new))
1100    }
1101}
1102
1103impl Arbitrary for SystemTime {
1104    fn arbitrary(gen: &mut Gen) -> Self {
1105        let after_epoch = bool::arbitrary(gen);
1106        let duration = Duration::arbitrary(gen);
1107        if after_epoch {
1108            UNIX_EPOCH + duration
1109        } else {
1110            UNIX_EPOCH - duration
1111        }
1112    }
1113
1114    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
1115        let duration = match self.duration_since(UNIX_EPOCH) {
1116            Ok(duration) => duration,
1117            Err(e) => e.duration(),
1118        };
1119        Box::new(
1120            duration
1121                .shrink()
1122                .flat_map(|d| vec![UNIX_EPOCH + d, UNIX_EPOCH - d]),
1123        )
1124    }
1125}
1126
1127#[cfg(test)]
1128mod test {
1129    use std::collections::{
1130        BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList, VecDeque,
1131    };
1132    use std::fmt::Debug;
1133    use std::hash::Hash;
1134    use std::num::Wrapping;
1135    use std::path::PathBuf;
1136
1137    use super::{Arbitrary, Gen};
1138
1139    #[test]
1140    fn arby_unit() {
1141        assert_eq!(arby::<()>(), ());
1142    }
1143
1144    macro_rules! arby_int {
1145        ( $signed:expr, $($t:ty),+) => {$(
1146            let mut arbys = (0..1_000_000).map(|_| arby::<$t>());
1147            let mut problems = if $signed {
1148                    signed_problem_values!($t).iter()
1149                } else {
1150                    unsigned_problem_values!($t).iter()
1151                };
1152            assert!(problems.all(|p| arbys.any(|arby| arby == *p)),
1153                "Arbitrary does not generate all problematic values");
1154            let max = <$t>::max_value();
1155            let mid = (max + <$t>::min_value()) / 2;
1156            // split full range of $t into chunks
1157            // Arbitrary must return some value in each chunk
1158            let double_chunks: $t = 9;
1159            let chunks = double_chunks * 2;  // chunks must be even
1160            let lim: Box<dyn Iterator<Item=$t>> = if $signed {
1161                Box::new((0..=chunks)
1162                        .map(|idx| idx - chunks / 2)
1163                        .map(|x| mid + max / (chunks / 2) * x))
1164            } else {
1165                Box::new((0..=chunks).map(|idx| max / chunks * idx))
1166            };
1167            let mut lim = lim.peekable();
1168            while let (Some(low), Some(&high)) = (lim.next(), lim.peek()) {
1169                assert!(arbys.any(|arby| low <= arby && arby <= high),
1170                    "Arbitrary doesn't generate numbers in {}..={}", low, high)
1171            }
1172        )*};
1173    }
1174
1175    #[test]
1176    fn arby_int() {
1177        arby_int!(true, i8, i16, i32, i64, isize, i128);
1178    }
1179
1180    #[test]
1181    fn arby_uint() {
1182        arby_int!(false, u8, u16, u32, u64, usize, u128);
1183    }
1184
1185    macro_rules! arby_float {
1186        ($($t:ty, $path:path),+) => {$({
1187            use $path as p;
1188            let mut arbys = (0..1_000_000).map(|_| arby::<$t>());
1189            //NaN != NaN
1190            assert!(arbys.any(|f| f.is_nan()),
1191                "Arbitrary does not generate the problematic value NaN"
1192            );
1193            for p in float_problem_values!($path).iter().filter(|f| !f.is_nan()) {
1194                assert!(arbys.any(|arby| arby == *p),
1195                    "Arbitrary does not generate the problematic value {}",
1196                    p
1197                );
1198            }
1199            // split full range of $t into chunks
1200            // Arbitrary must return some value in each chunk
1201            let double_chunks: i8 = 9;
1202            let chunks = double_chunks * 2;  // chunks must be even
1203            let lim = (-double_chunks..=double_chunks)
1204                        .map(|idx| <$t>::from(idx))
1205                        .map(|idx| p::MAX/(<$t>::from(chunks/2)) * idx);
1206            let mut lim = lim.peekable();
1207            while let (Some(low), Some(&high)) = (lim.next(), lim.peek()) {
1208                assert!(
1209                    arbys.any(|arby| low <= arby && arby <= high),
1210                    "Arbitrary doesn't generate numbers in {:e}..={:e}",
1211                    low,
1212                    high,
1213                )
1214            }
1215        })*};
1216    }
1217
1218    #[test]
1219    fn arby_float() {
1220        arby_float!(f32, std::f32, f64, std::f64);
1221    }
1222
1223    fn arby<A: Arbitrary>() -> A {
1224        Arbitrary::arbitrary(&mut Gen::new(5))
1225    }
1226
1227    // Shrink testing.
1228    #[test]
1229    fn unit() {
1230        eq((), vec![]);
1231    }
1232
1233    #[test]
1234    fn bools() {
1235        eq(false, vec![]);
1236        eq(true, vec![false]);
1237    }
1238
1239    #[test]
1240    fn options() {
1241        eq(None::<()>, vec![]);
1242        eq(Some(false), vec![None]);
1243        eq(Some(true), vec![None, Some(false)]);
1244    }
1245
1246    #[test]
1247    fn results() {
1248        // Result<A, B> doesn't implement the Hash trait, so these tests
1249        // depends on the order of shrunk results. Ug.
1250        // TODO: Fix this.
1251        ordered_eq(Ok::<bool, ()>(true), vec![Ok(false)]);
1252        ordered_eq(Err::<(), bool>(true), vec![Err(false)]);
1253    }
1254
1255    #[test]
1256    fn tuples() {
1257        eq((false, false), vec![]);
1258        eq((true, false), vec![(false, false)]);
1259        eq((true, true), vec![(false, true), (true, false)]);
1260    }
1261
1262    #[test]
1263    fn triples() {
1264        eq((false, false, false), vec![]);
1265        eq((true, false, false), vec![(false, false, false)]);
1266        eq(
1267            (true, true, false),
1268            vec![(false, true, false), (true, false, false)],
1269        );
1270    }
1271
1272    #[test]
1273    fn quads() {
1274        eq((false, false, false, false), vec![]);
1275        eq((true, false, false, false), vec![(false, false, false, false)]);
1276        eq(
1277            (true, true, false, false),
1278            vec![(false, true, false, false), (true, false, false, false)],
1279        );
1280    }
1281
1282    #[test]
1283    fn ints() {
1284        // TODO: Test overflow?
1285        eq(5isize, vec![0, 3, 4]);
1286        eq(-5isize, vec![5, 0, -3, -4]);
1287        eq(0isize, vec![]);
1288    }
1289
1290    #[test]
1291    fn ints8() {
1292        eq(5i8, vec![0, 3, 4]);
1293        eq(-5i8, vec![5, 0, -3, -4]);
1294        eq(0i8, vec![]);
1295    }
1296
1297    #[test]
1298    fn ints16() {
1299        eq(5i16, vec![0, 3, 4]);
1300        eq(-5i16, vec![5, 0, -3, -4]);
1301        eq(0i16, vec![]);
1302    }
1303
1304    #[test]
1305    fn ints32() {
1306        eq(5i32, vec![0, 3, 4]);
1307        eq(-5i32, vec![5, 0, -3, -4]);
1308        eq(0i32, vec![]);
1309    }
1310
1311    #[test]
1312    fn ints64() {
1313        eq(5i64, vec![0, 3, 4]);
1314        eq(-5i64, vec![5, 0, -3, -4]);
1315        eq(0i64, vec![]);
1316    }
1317
1318    #[test]
1319    fn ints128() {
1320        eq(5i128, vec![0, 3, 4]);
1321        eq(-5i128, vec![5, 0, -3, -4]);
1322        eq(0i128, vec![]);
1323    }
1324
1325    #[test]
1326    fn uints() {
1327        eq(5usize, vec![0, 3, 4]);
1328        eq(0usize, vec![]);
1329    }
1330
1331    #[test]
1332    fn uints8() {
1333        eq(5u8, vec![0, 3, 4]);
1334        eq(0u8, vec![]);
1335    }
1336
1337    #[test]
1338    fn uints16() {
1339        eq(5u16, vec![0, 3, 4]);
1340        eq(0u16, vec![]);
1341    }
1342
1343    #[test]
1344    fn uints32() {
1345        eq(5u32, vec![0, 3, 4]);
1346        eq(0u32, vec![]);
1347    }
1348
1349    #[test]
1350    fn uints64() {
1351        eq(5u64, vec![0, 3, 4]);
1352        eq(0u64, vec![]);
1353    }
1354
1355    #[test]
1356    fn uints128() {
1357        eq(5u128, vec![0, 3, 4]);
1358        eq(0u128, vec![]);
1359    }
1360
1361    macro_rules! define_float_eq {
1362        ($ty:ty) => {
1363            fn eq(s: $ty, v: Vec<$ty>) {
1364                let shrunk: Vec<$ty> = s.shrink().collect();
1365                for n in v {
1366                    let found = shrunk.iter().any(|&i| i == n);
1367                    if !found {
1368                        panic!(format!(
1369                            "Element {:?} was not found \
1370                             in shrink results {:?}",
1371                            n, shrunk
1372                        ));
1373                    }
1374                }
1375            }
1376        };
1377    }
1378
1379    #[test]
1380    fn floats32() {
1381        define_float_eq!(f32);
1382
1383        eq(0.0, vec![]);
1384        eq(-0.0, vec![]);
1385        eq(1.0, vec![0.0]);
1386        eq(2.0, vec![0.0, 1.0]);
1387        eq(-2.0, vec![0.0, 2.0, -1.0]);
1388        eq(1.5, vec![0.0]);
1389    }
1390
1391    #[test]
1392    fn floats64() {
1393        define_float_eq!(f64);
1394
1395        eq(0.0, vec![]);
1396        eq(-0.0, vec![]);
1397        eq(1.0, vec![0.0]);
1398        eq(2.0, vec![0.0, 1.0]);
1399        eq(-2.0, vec![0.0, 2.0, -1.0]);
1400        eq(1.5, vec![0.0]);
1401    }
1402
1403    #[test]
1404    fn wrapping_ints32() {
1405        eq(Wrapping(5i32), vec![Wrapping(0), Wrapping(3), Wrapping(4)]);
1406        eq(
1407            Wrapping(-5i32),
1408            vec![Wrapping(5), Wrapping(0), Wrapping(-3), Wrapping(-4)],
1409        );
1410        eq(Wrapping(0i32), vec![]);
1411    }
1412
1413    #[test]
1414    fn vecs() {
1415        eq(
1416            {
1417                let it: Vec<isize> = vec![];
1418                it
1419            },
1420            vec![],
1421        );
1422        eq(
1423            {
1424                let it: Vec<Vec<isize>> = vec![vec![]];
1425                it
1426            },
1427            vec![vec![]],
1428        );
1429        eq(vec![1isize], vec![vec![], vec![0]]);
1430        eq(vec![11isize], vec![vec![], vec![0], vec![6], vec![9], vec![10]]);
1431        eq(
1432            vec![3isize, 5],
1433            vec![
1434                vec![],
1435                vec![5],
1436                vec![3],
1437                vec![0, 5],
1438                vec![2, 5],
1439                vec![3, 0],
1440                vec![3, 3],
1441                vec![3, 4],
1442            ],
1443        );
1444    }
1445
1446    macro_rules! map_tests {
1447        ($name:ident, $ctor:expr) => {
1448            #[test]
1449            fn $name() {
1450                ordered_eq($ctor, vec![]);
1451
1452                {
1453                    let mut map = $ctor;
1454                    map.insert(1usize, 1isize);
1455
1456                    let shrinks = vec![
1457                        $ctor,
1458                        {
1459                            let mut m = $ctor;
1460                            m.insert(0, 1);
1461                            m
1462                        },
1463                        {
1464                            let mut m = $ctor;
1465                            m.insert(1, 0);
1466                            m
1467                        },
1468                    ];
1469
1470                    ordered_eq(map, shrinks);
1471                }
1472            }
1473        };
1474    }
1475
1476    map_tests!(btreemap, BTreeMap::<usize, isize>::new());
1477    map_tests!(hashmap, HashMap::<usize, isize>::new());
1478
1479    macro_rules! list_tests {
1480        ($name:ident, $ctor:expr, $push:ident) => {
1481            #[test]
1482            fn $name() {
1483                ordered_eq($ctor, vec![]);
1484
1485                {
1486                    let mut list = $ctor;
1487                    list.$push(2usize);
1488
1489                    let shrinks = vec![
1490                        $ctor,
1491                        {
1492                            let mut m = $ctor;
1493                            m.$push(0);
1494                            m
1495                        },
1496                        {
1497                            let mut m = $ctor;
1498                            m.$push(1);
1499                            m
1500                        },
1501                    ];
1502
1503                    ordered_eq(list, shrinks);
1504                }
1505            }
1506        };
1507    }
1508
1509    list_tests!(btreesets, BTreeSet::<usize>::new(), insert);
1510    list_tests!(hashsets, HashSet::<usize>::new(), insert);
1511    list_tests!(linkedlists, LinkedList::<usize>::new(), push_back);
1512    list_tests!(vecdeques, VecDeque::<usize>::new(), push_back);
1513
1514    #[test]
1515    fn binaryheaps() {
1516        ordered_eq(
1517            BinaryHeap::<usize>::new().into_iter().collect::<Vec<_>>(),
1518            vec![],
1519        );
1520
1521        {
1522            let mut heap = BinaryHeap::<usize>::new();
1523            heap.push(2usize);
1524
1525            let shrinks = vec![vec![], vec![0], vec![1]];
1526
1527            ordered_eq(heap.into_iter().collect::<Vec<_>>(), shrinks);
1528        }
1529    }
1530
1531    #[test]
1532    fn chars() {
1533        eq('\x00', vec![]);
1534    }
1535
1536    // All this jazz is for testing set equality on the results of a shrinker.
1537    fn eq<A: Arbitrary + Eq + Debug + Hash>(s: A, v: Vec<A>) {
1538        let (left, right) = (shrunk(s), set(v));
1539        assert_eq!(left, right);
1540    }
1541    fn shrunk<A: Arbitrary + Eq + Hash>(s: A) -> HashSet<A> {
1542        set(s.shrink())
1543    }
1544    fn set<A: Hash + Eq, I: IntoIterator<Item = A>>(xs: I) -> HashSet<A> {
1545        xs.into_iter().collect()
1546    }
1547
1548    fn ordered_eq<A: Arbitrary + Eq + Debug>(s: A, v: Vec<A>) {
1549        let (left, right) = (s.shrink().collect::<Vec<A>>(), v);
1550        assert_eq!(left, right);
1551    }
1552
1553    #[test]
1554    fn bounds() {
1555        use std::ops::Bound::*;
1556        for i in -5..=5 {
1557            ordered_eq(Included(i), i.shrink().map(Included).collect());
1558            ordered_eq(Excluded(i), i.shrink().map(Excluded).collect());
1559        }
1560        eq(Unbounded::<i32>, vec![]);
1561    }
1562
1563    #[test]
1564    fn ranges() {
1565        ordered_eq(0..0, vec![]);
1566        ordered_eq(1..1, vec![0..1, 1..0]);
1567        ordered_eq(3..5, vec![0..5, 2..5, 3..0, 3..3, 3..4]);
1568        ordered_eq(5..3, vec![0..3, 3..3, 4..3, 5..0, 5..2]);
1569        ordered_eq(3.., vec![0.., 2..]);
1570        ordered_eq(..3, vec![..0, ..2]);
1571        ordered_eq(.., vec![]);
1572        ordered_eq(3..=5, vec![0..=5, 2..=5, 3..=0, 3..=3, 3..=4]);
1573        ordered_eq(..=3, vec![..=0, ..=2]);
1574    }
1575
1576    #[test]
1577    fn pathbuf() {
1578        ordered_eq(
1579            PathBuf::from("/home/foo//.././bar"),
1580            vec![
1581                PathBuf::from("/home/foo//.."),
1582                PathBuf::from("/home/foo/../bar"),
1583            ],
1584        );
1585    }
1586}