quickcheck/
arbitrary.rs

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
20/// Gen represents a PRNG.
21///
22/// It is the source of randomness from which QuickCheck will generate
23/// values. An instance of `Gen` is passed to every invocation of
24/// `Arbitrary::arbitrary`, which permits callers to use lower level RNG
25/// routines to generate values.
26///
27/// It is unspecified whether this is a secure RNG or not. Therefore, callers
28/// should assume it is insecure.
29pub struct Gen {
30    rng: rand::rngs::SmallRng,
31    size: usize,
32}
33
34impl Gen {
35    pub(crate) const DEFAULT_SIZE: usize = 100;
36
37    /// Returns a `Gen` with a random seed and the given size configuration.
38    pub fn new(size: usize) -> Gen {
39        Gen {
40            rng: rand::rngs::SmallRng::from_entropy(),
41            size,
42        }
43    }
44
45    /// Returns a `Gen` with the given seed and a default size configuration.
46    ///
47    /// Two `Gen`s created with the same seed will generate the same values. Though the values
48    /// may vary between QuickCheck releases.
49    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    /// Sets the size configuration for this generator.
57    ///
58    /// The `size` parameter controls the size of random values generated.
59    /// For example, it specifies the maximum length of a randomly generated
60    /// vector, but is and should not be used to control the range of a
61    /// randomly generated number. (Unless that number is used to control the
62    /// size of a data structure.)
63    pub fn set_size(&mut self, size: usize) {
64        self.size = size;
65    }
66
67    /// Returns the size configured with this generator.
68    pub fn size(&self) -> usize {
69        self.size
70    }
71
72    /// Choose among the possible alternatives in the slice given. If the slice
73    /// is empty, then `None` is returned. Otherwise, a non-`None` value is
74    /// guaranteed to be returned.
75    pub fn choose<'a, T>(&mut self, slice: &'a [T]) -> Option<&'a T> {
76        slice.choose(&mut self.rng)
77    }
78
79    /// Fill a mutable slice of any Arbitrary-compatible type with Arbitrary
80    /// values.
81    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
111/// Creates a shrinker with zero elements.
112pub fn empty_shrinker<A: 'static>() -> Box<dyn Iterator<Item = A>> {
113    Box::new(empty())
114}
115
116/// Creates a shrinker with a single element.
117pub fn single_shrinker<A: 'static>(value: A) -> Box<dyn Iterator<Item = A>> {
118    Box::new(once(value))
119}
120
121/// `Arbitrary` describes types whose values can be randomly generated and
122/// shrunk.
123///
124/// Aside from shrinking, `Arbitrary` is different from typical RNGs in that
125/// it respects `Gen::size()` for controlling how much memory a particular
126/// value uses, for practical purposes. For example, `Vec::arbitrary()`
127/// respects `Gen::size()` to decide the maximum `len()` of the vector.
128/// This behavior is necessary due to practical speed and size limitations.
129/// Conversely, `i32::arbitrary()` ignores `size()` since all `i32` values
130/// require `O(1)` memory and operations between `i32`s require `O(1)` time
131/// (with the exception of exponentiation).
132///
133/// Additionally, all types that implement `Arbitrary` must also implement
134/// `Clone`.
135pub trait Arbitrary: Clone + 'static {
136    /// Return an arbitrary value.
137    ///
138    /// Implementations should respect `Gen::size()` when decisions about how
139    /// big a particular value should be. Implementations should generally
140    /// defer to other `Arbitrary` implementations to generate other random
141    /// values when necessary. The `Gen` type also offers a few RNG helper
142    /// routines.
143    fn arbitrary(g: &mut Gen) -> Self;
144
145    /// Return an iterator of values that are smaller than itself.
146    ///
147    /// The way in which a value is "smaller" is implementation defined. In
148    /// some cases, the interpretation is obvious: shrinking an integer should
149    /// produce integers smaller than itself. Others are more complex, for
150    /// example, shrinking a `Vec` should both shrink its size and shrink its
151    /// component values.
152    ///
153    /// The iterator returned should be bounded to some reasonable size.
154    ///
155    /// It is always correct to return an empty iterator, and indeed, this
156    /// is the default implementation. The downside of this approach is that
157    /// witnesses to failures in properties will be more inscrutable.
158    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
313///Iterator which returns successive attempts to shrink the vector `seed`
314struct VecShrinker<A> {
315    seed: Vec<A>,
316    /// How much which is removed when trying with smaller vectors
317    size: usize,
318    /// The end of the removed elements
319    offset: usize,
320    /// The shrinker for the element at `offset` once shrinking of individual
321    /// elements are attempted
322    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    /// Returns the next shrunk element if any, `offset` points to the index
341    /// after the returned element after the function returns
342    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        // Try with an empty vector first
365        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            // Generate a smaller vector by removing the elements between
372            // (offset - size) and offset
373            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            // Try to reduce the amount removed from the vector once all
380            // previous sizes tried
381            if self.offset > self.seed.len() {
382                self.size /= 2;
383                self.offset = self.size;
384            }
385            Some(xs1)
386        } else {
387            // A smaller vector did not work so try to shrink each element of
388            // the vector instead Reuse `offset` as the index determining which
389            // element to shrink
390
391            // The first element shrinker is already created so skip the first
392            // offset (self.offset == 0 only on first entry to this part of the
393            // iterator)
394            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        // use some real directories as guesses, so we may end up with
563        // actual working directories in case that is relevant.
564        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        // Iterating over a Path performs a small amount of normalization.
592        let normalized = self.iter().collect::<PathBuf>();
593        if normalized.as_os_str() != self.as_os_str() {
594            shrunk.push(normalized);
595        }
596
597        // Add the canonicalized variant only if canonicalizing the path
598        // actually does something, making it (hopefully) smaller. Also, ignore
599        // canonicalization if canonicalization errors.
600        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        // Shrink a string by shrinking a vector of its characters.
632        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        // Use either random bytes or random UTF-8 encoded codepoints.
644        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        // Use the implementation for a vec here, but make sure null characters
667        // are filtered out.
668        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                // ASCII + some control characters
681                g.gen_range(0..0xB0) as u8 as char
682            }
683            50..=59 => {
684                // Unicode BMP characters
685                loop {
686                    if let Some(x) = char::from_u32(g.gen_range(0..0x10000)) {
687                        return x;
688                    }
689                    // ignore surrogate pairs
690                }
691            }
692            60..=84 => {
693                // Characters often used in programming languages
694                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                // Tricky Unicode, part 1
705                g.choose(&[
706                    '\u{0149}', // a deprecated character
707                    '\u{fff0}', // some of "Other, format" category:
708                    '\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}', // tag
736                    '\u{e0020}', //  tag space
737                    '\u{e000}',
738                    '\u{e001}',
739                    '\u{ef8ff}', // private use
740                    '\u{f0000}',
741                    '\u{ffffd}',
742                    '\u{ffffe}',
743                    '\u{fffff}',
744                    '\u{100000}',
745                    '\u{10FFFD}',
746                    '\u{10FFFE}',
747                    '\u{10FFFF}',
748                    // "Other, surrogate" characters are so that very special
749                    // that they are not even allowed in safe Rust,
750                    //so omitted here
751                    '\u{3000}', // ideographic space
752                    '\u{1680}',
753                    // other space characters are already covered by two next
754                    // branches
755                ])
756                .unwrap()
757                .to_owned()
758            }
759            90..=94 => {
760                // Tricky unicode, part 2
761                char::from_u32(g.gen_range(0x2000..0x2070)).unwrap()
762            }
763            95..=99 => {
764                // Completely arbitrary characters
765                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        // hack. see: https://github.com/rust-lang/rust/issues/48067
914        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            // split full range of $t into chunks
1198            // Arbitrary must return some value in each chunk
1199            let double_chunks: $t = 9;
1200            let chunks = double_chunks * 2;  // chunks must be even
1201            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            //NaN != NaN
1231            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            // split full range of $t into chunks
1241            // Arbitrary must return some value in each chunk
1242            let double_chunks: i8 = 9;
1243            let chunks = double_chunks * 2;  // chunks must be even
1244            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    // Shrink testing.
1269    #[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        // Result<A, B> doesn't implement the Hash trait, so these tests
1290        // depends on the order of shrunk results. Ug.
1291        // TODO: Fix this.
1292        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        // TODO: Test overflow?
1329        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    // All this jazz is for testing set equality on the results of a shrinker.
1626    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}