Skip to main content

proptest/arbitrary/_core/
option.rs

1//-
2// Copyright 2017, 2018 The proptest developers
3//
4// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7// option. This file may not be copied, modified, or distributed
8// except according to those terms.
9
10//! Arbitrary implementations for `std::option`.
11
12use crate::std_facade::string;
13use core::ops::RangeInclusive;
14use core::option as opt;
15
16use crate::arbitrary::*;
17use crate::option::{weighted, OptionStrategy, Probability};
18use crate::strategy::statics::static_map;
19use crate::strategy::*;
20
21arbitrary!(Probability, MapInto<RangeInclusive<f64>, Self>;
22    (0.0..=1.0).prop_map_into()
23);
24
25// This is an Option<AnUninhabitedType> impl:
26
27arbitrary!(Option<string::ParseError>; None);
28
29arbitrary!([A: Arbitrary] opt::Option<A>, OptionStrategy<A::Strategy>,
30    product_type![Probability, A::Parameters];
31    args => {
32        let product_unpack![prob, a] = args;
33        weighted(prob, any_with::<A>(a))
34    }
35);
36
37lift1!([] Option<A>, Probability; base, prob => weighted(prob, base));
38
39arbitrary!([A: Arbitrary] opt::IntoIter<A>, SMapped<Option<A>, Self>,
40    <Option<A> as Arbitrary>::Parameters;
41    args => static_map(any_with::<Option<A>>(args), Option::into_iter));
42
43lift1!(['static] opt::IntoIter<A>, Probability;
44    base, prob => weighted(prob, base).prop_map(Option::into_iter)
45);
46
47#[cfg(test)]
48mod test {
49    no_panic_test!(
50        probability => Probability,
51        option      => Option<u8>,
52        option_iter => opt::IntoIter<u8>,
53        option_parse_error => Option<string::ParseError>
54    );
55}