prop_check_rs/gen/
one.rs

1use crate::gen::{Gen, Gens};
2
3/// Trait for types that can generate a single random value.
4pub trait One
5where
6  Self: Sized, {
7  /// Generate a single random value of this type.
8  ///
9  /// # Returns
10  /// - `Gen<Self>` - A generator that produces a random value of this type.
11  fn one() -> Gen<Self>;
12}
13
14impl One for i64 {
15  /// Generate a single random i64 value.
16  ///
17  /// # Returns
18  /// - `Gen<Self>` - A generator that produces a random i64 value.
19  fn one() -> Gen<Self> {
20    Gens::one_i64()
21  }
22}
23
24impl One for u64 {
25  /// Generate a single random u64 value.
26  ///
27  /// # Returns
28  /// - `Gen<Self>` - A generator that produces a random u64 value.
29  fn one() -> Gen<Self> {
30    Gens::one_u64()
31  }
32}
33
34impl One for i32 {
35  /// Generate a single random i32 value.
36  ///
37  /// # Returns
38  /// - `Gen<Self>` - A generator that produces a random i32 value.
39  fn one() -> Gen<Self> {
40    Gens::one_i32()
41  }
42}
43
44impl One for u32 {
45  /// Generate a single random u32 value.
46  ///
47  /// # Returns
48  /// - `Gen<Self>` - A generator that produces a random u32 value.
49  fn one() -> Gen<Self> {
50    Gens::one_u32()
51  }
52}
53
54impl One for i16 {
55  /// Generate a single random i16 value.
56  ///
57  /// # Returns
58  /// - `Gen<Self>` - A generator that produces a random i16 value.
59  fn one() -> Gen<Self> {
60    Gens::one_i16()
61  }
62}
63
64impl One for u16 {
65  /// Generate a single random u16 value.
66  ///
67  /// # Returns
68  /// - `Gen<Self>` - A generator that produces a random u16 value.
69  fn one() -> Gen<Self> {
70    Gens::one_u16()
71  }
72}
73
74impl One for i8 {
75  /// Generate a single random i8 value.
76  ///
77  /// # Returns
78  /// - `Gen<Self>` - A generator that produces a random i8 value.
79  fn one() -> Gen<Self> {
80    Gens::one_i8()
81  }
82}
83
84impl One for u8 {
85  /// Generate a single random u8 value.
86  ///
87  /// # Returns
88  /// - `Gen<Self>` - A generator that produces a random u8 value.
89  fn one() -> Gen<Self> {
90    Gens::one_u8()
91  }
92}
93
94impl One for char {
95  /// Generate a single random char value.
96  ///
97  /// # Returns
98  /// - `Gen<Self>` - A generator that produces a random char value.
99  fn one() -> Gen<Self> {
100    Gens::one_char()
101  }
102}
103
104impl One for bool {
105  /// Generate a single random bool value.
106  ///
107  /// # Returns
108  /// - `Gen<Self>` - A generator that produces a random bool value.
109  fn one() -> Gen<Self> {
110    Gens::one_bool()
111  }
112}
113
114impl One for f64 {
115  /// Generate a single random f64 value.
116  ///
117  /// # Returns
118  /// - `Gen<Self>` - A generator that produces a random f64 value.
119  fn one() -> Gen<Self> {
120    Gens::one_f64()
121  }
122}
123
124impl One for f32 {
125  /// Generate a single random f32 value.
126  ///
127  /// # Returns
128  /// - `Gen<Self>` - A generator that produces a random f32 value.
129  fn one() -> Gen<Self> {
130    Gens::one_f32()
131  }
132}
133
134#[cfg(test)]
135mod tests {
136  use super::*;
137  use crate::rng::RNG;
138  use std::env;
139
140  fn init() {
141    env::set_var("RUST_LOG", "info");
142    let _ = env_logger::builder().is_test(true).try_init();
143  }
144
145  fn new_rng() -> RNG {
146    RNG::new()
147  }
148
149  #[test]
150  fn test_one_i64() {
151    init();
152    let gen = <i64 as One>::one();
153    let (value, _) = gen.run(new_rng());
154    assert!(value >= i64::MIN && value <= i64::MAX);
155  }
156
157  #[test]
158  fn test_one_u64() {
159    init();
160    let gen = <u64 as One>::one();
161    let (value, _) = gen.run(new_rng());
162    assert!(value <= u64::MAX);
163  }
164
165  #[test]
166  fn test_one_i32() {
167    init();
168    let gen = <i32 as One>::one();
169    let (value, _) = gen.run(new_rng());
170    assert!(value >= i32::MIN && value <= i32::MAX);
171  }
172
173  #[test]
174  fn test_one_u32() {
175    init();
176    let gen = <u32 as One>::one();
177    let (value, _) = gen.run(new_rng());
178    assert!(value <= u32::MAX);
179  }
180
181  #[test]
182  fn test_one_i16() {
183    init();
184    let gen = <i16 as One>::one();
185    let (value, _) = gen.run(new_rng());
186    assert!(value >= i16::MIN && value <= i16::MAX);
187  }
188
189  #[test]
190  fn test_one_u16() {
191    init();
192    let gen = <u16 as One>::one();
193    let (value, _) = gen.run(new_rng());
194    assert!(value <= u16::MAX);
195  }
196
197  #[test]
198  fn test_one_i8() {
199    init();
200    let gen = <i8 as One>::one();
201    let (value, _) = gen.run(new_rng());
202    assert!(value >= i8::MIN && value <= i8::MAX);
203  }
204
205  #[test]
206  fn test_one_u8() {
207    init();
208    let gen = <u8 as One>::one();
209    let (value, _) = gen.run(new_rng());
210    assert!(value <= u8::MAX);
211  }
212
213  #[test]
214  fn test_one_char() {
215    init();
216    let gen = <char as One>::one();
217    let (value, _) = gen.run(new_rng());
218    assert!(value as u32 <= u8::MAX as u32);
219  }
220
221  #[test]
222  fn test_one_bool() {
223    init();
224    let gen = <bool as One>::one();
225    let (value, _) = gen.run(new_rng());
226    assert!(value == true || value == false);
227  }
228
229  #[test]
230  fn test_one_f64() {
231    init();
232    let gen = <f64 as One>::one();
233    let (value, _) = gen.run(new_rng());
234    assert!(!value.is_nan());
235  }
236
237  #[test]
238  fn test_one_f32() {
239    init();
240    let gen = <f32 as One>::one();
241    let (value, _) = gen.run(new_rng());
242    assert!(!value.is_nan());
243  }
244}