Skip to content

Commit a0d432a

Browse files
lemmihmbrubeck
authored andcommitted
Implement Arbitrary instances from proptest.
1 parent f004bc8 commit a0d432a

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ num-traits = { version = "0.2.1", default-features = false }
1818
serde = { version = "1.0", optional = true, default-features = false }
1919
schemars = { version = "0.6.5", optional = true }
2020
rand = { version = "0.8.3", optional = true, default-features = false }
21+
proptest = { version = "1.0.0", optional = true }
2122

2223
[dev-dependencies]
2324
serde_test = "1.0"
2425

2526
[features]
26-
default = ["std"]
27-
std = ["num-traits/std"]
27+
default = ["std"]
28+
std = ["num-traits/std"]
2829
randtest = ["rand/std", "rand/std_rng"]

src/lib.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,3 +1808,36 @@ mod impl_rand {
18081808
}
18091809
}
18101810
}
1811+
1812+
#[cfg(feature = "proptest")]
1813+
mod impl_proptest {
1814+
use super::{NotNan, OrderedFloat};
1815+
use proptest::arbitrary::{Arbitrary, StrategyFor};
1816+
use proptest::num::{f32, f64};
1817+
use proptest::strategy::{FilterMap, Map, Strategy};
1818+
use std::convert::TryFrom;
1819+
1820+
macro_rules! impl_arbitrary {
1821+
($($f:ident),+) => {
1822+
$(
1823+
impl Arbitrary for NotNan<$f> {
1824+
type Strategy = FilterMap<StrategyFor<$f>, fn(_: $f) -> Option<NotNan<$f>>>;
1825+
type Parameters = <$f as Arbitrary>::Parameters;
1826+
fn arbitrary_with(params: Self::Parameters) -> Self::Strategy {
1827+
<$f>::arbitrary_with(params)
1828+
.prop_filter_map("filter nan values", |f| NotNan::try_from(f).ok())
1829+
}
1830+
}
1831+
1832+
impl Arbitrary for OrderedFloat<$f> {
1833+
type Strategy = Map<StrategyFor<$f>, fn(_: $f) -> OrderedFloat<$f>>;
1834+
type Parameters = <$f as Arbitrary>::Parameters;
1835+
fn arbitrary_with(params: Self::Parameters) -> Self::Strategy {
1836+
<$f>::arbitrary_with(params).prop_map(|f| OrderedFloat::from(f))
1837+
}
1838+
}
1839+
)*
1840+
}
1841+
}
1842+
impl_arbitrary! { f32, f64 }
1843+
}

0 commit comments

Comments
 (0)