1use crate::std_facade::{Arc, Cow, Vec};
17use core::fmt;
18use core::mem;
19use core::ops::Range;
20use core::u64;
21
22use rand::Rng;
23
24use crate::bits::{self, BitSetValueTree, SampledBitSetStrategy, VarBitSet};
25use crate::num;
26use crate::strategy::*;
27use crate::test_runner::*;
28
29pub use crate::collection::{size_range, SizeRange};
31
32pub fn subsequence<T: Clone + 'static>(
50 values: impl Into<Cow<'static, [T]>>,
51 size: impl Into<SizeRange>,
52) -> Subsequence<T> {
53 let values = values.into();
54 let len = values.len();
55 let size = size.into();
56
57 size.assert_nonempty();
58 assert!(
59 size.end_incl() <= len,
60 "Maximum size of subsequence {} exceeds length of input {}",
61 size.end_incl(),
62 len
63 );
64 Subsequence {
65 values: Arc::new(values),
66 bit_strategy: bits::varsize::sampled(size, 0..len),
67 }
68}
69
70#[derive(Debug, Clone)]
75#[must_use = "strategies do nothing unless used"]
76pub struct Subsequence<T: Clone + 'static> {
77 values: Arc<Cow<'static, [T]>>,
78 bit_strategy: SampledBitSetStrategy<VarBitSet>,
79}
80
81impl<T: fmt::Debug + Clone + 'static> Strategy for Subsequence<T> {
82 type Tree = SubsequenceValueTree<T>;
83 type Value = Vec<T>;
84
85 fn new_tree(&self, runner: &mut TestRunner) -> NewTree<Self> {
86 Ok(SubsequenceValueTree {
87 values: Arc::clone(&self.values),
88 inner: self.bit_strategy.new_tree(runner)?,
89 })
90 }
91}
92
93#[derive(Debug, Clone)]
95pub struct SubsequenceValueTree<T: Clone + 'static> {
96 values: Arc<Cow<'static, [T]>>,
97 inner: BitSetValueTree<VarBitSet>,
98}
99
100impl<T: fmt::Debug + Clone + 'static> ValueTree for SubsequenceValueTree<T> {
101 type Value = Vec<T>;
102
103 fn current(&self) -> Self::Value {
104 let inner = self.inner.current();
105 let ret = inner.iter().map(|ix| self.values[ix].clone()).collect();
106 ret
107 }
108
109 fn simplify(&mut self) -> bool {
110 self.inner.simplify()
111 }
112
113 fn complicate(&mut self) -> bool {
114 self.inner.complicate()
115 }
116}
117
118#[derive(Debug, Clone)]
119struct SelectMapFn<T: Clone + 'static>(Arc<Cow<'static, [T]>>);
120
121impl<T: fmt::Debug + Clone + 'static> statics::MapFn<usize> for SelectMapFn<T> {
122 type Output = T;
123
124 fn apply(&self, ix: usize) -> T {
125 self.0[ix].clone()
126 }
127}
128
129opaque_strategy_wrapper! {
130 #[derive(Clone, Debug)]
134 pub struct Select[<T>][where T : Clone + fmt::Debug + 'static](
135 statics::Map<Range<usize>, SelectMapFn<T>>)
136 -> SelectValueTree<T>;
137 #[derive(Clone, Debug)]
139 pub struct SelectValueTree[<T>][where T : Clone + fmt::Debug + 'static](
140 statics::Map<num::usize::BinarySearch, SelectMapFn<T>>)
141 -> T;
142}
143
144pub fn select<T: Clone + fmt::Debug + 'static>(
157 values: impl Into<Cow<'static, [T]>>,
158) -> Select<T> {
159 let cow = values.into();
160
161 assert!(!cow.is_empty(), "Cannot select from empty collection");
162
163 Select(statics::Map::new(0..cow.len(), SelectMapFn(Arc::new(cow))))
164}
165
166#[derive(Clone, Copy, Debug)]
215pub struct Index(usize);
216
217impl Index {
218 pub fn index(&self, size: usize) -> usize {
224 assert!(size > 0, "Attempt to use `Index` with 0-size collection");
225
226 ((size as u128) * (self.0 as u128) >> (mem::size_of::<usize>() * 8))
230 as usize
231 }
232
233 pub fn get<'a, T>(&self, slice: &'a [T]) -> &'a T {
237 &slice[self.index(slice.len())]
238 }
239
240 pub fn get_mut<'a, T>(&self, slice: &'a mut [T]) -> &'a mut T {
245 let ix = self.index(slice.len());
246 &mut slice[ix]
247 }
248}
249
250impl AsRef<Index> for Index {
253 fn as_ref(&self) -> &Index {
254 self
255 }
256}
257
258mapfn! {
259 [] fn UsizeToIndex[](raw: usize) -> Index {
260 Index(raw)
261 }
262}
263
264opaque_strategy_wrapper! {
265 #[derive(Clone, Debug)]
269 pub struct IndexStrategy[][](
270 statics::Map<num::usize::Any, UsizeToIndex>)
271 -> IndexValueTree;
272 #[derive(Clone, Debug)]
274 pub struct IndexValueTree[][](
275 statics::Map<num::usize::BinarySearch,UsizeToIndex>)
276 -> Index;
277}
278
279impl IndexStrategy {
280 pub(crate) fn new() -> Self {
281 IndexStrategy(statics::Map::new(num::usize::ANY, UsizeToIndex))
282 }
283}
284
285#[derive(Clone, Debug)]
321pub struct Selector {
322 rng: TestRng,
323 bias_increment: u64,
324}
325
326#[derive(Debug)]
330pub struct SelectorStrategy {
331 _nonexhaustive: (),
332}
333
334#[derive(Debug)]
336pub struct SelectorValueTree {
337 rng: TestRng,
338 reverse_bias_increment: num::u64::BinarySearch,
339}
340
341impl SelectorStrategy {
342 pub(crate) fn new() -> Self {
343 SelectorStrategy { _nonexhaustive: () }
344 }
345}
346
347impl Strategy for SelectorStrategy {
348 type Tree = SelectorValueTree;
349 type Value = Selector;
350
351 fn new_tree(&self, runner: &mut TestRunner) -> NewTree<Self> {
352 Ok(SelectorValueTree {
353 rng: runner.new_rng(),
354 reverse_bias_increment: num::u64::BinarySearch::new(u64::MAX),
355 })
356 }
357}
358
359impl ValueTree for SelectorValueTree {
360 type Value = Selector;
361
362 fn current(&self) -> Selector {
363 Selector {
364 rng: self.rng.clone(),
365 bias_increment: u64::MAX - self.reverse_bias_increment.current(),
366 }
367 }
368
369 fn simplify(&mut self) -> bool {
370 self.reverse_bias_increment.simplify()
371 }
372
373 fn complicate(&mut self) -> bool {
374 self.reverse_bias_increment.complicate()
375 }
376}
377
378impl Selector {
379 pub fn select<T: IntoIterator>(&self, it: T) -> T::Item {
390 self.try_select(it).expect("select from empty iterator")
391 }
392
393 pub fn try_select<T: IntoIterator>(&self, it: T) -> Option<T::Item> {
402 let mut bias = 0u64;
403 let mut min_score = 0;
404 let mut best = None;
405 let mut rng = self.rng.clone();
406
407 for item in it {
408 let score = bias.saturating_add(rng.random());
409 if best.is_none() || score < min_score {
410 best = Some(item);
411 min_score = score;
412 }
413
414 bias = bias.saturating_add(self.bias_increment);
415 }
416
417 best
418 }
419}
420
421#[cfg(test)]
422mod test {
423 use crate::std_facade::BTreeSet;
424
425 use super::*;
426 use crate::arbitrary::any;
427
428 #[test]
429 fn sample_slice() {
430 static VALUES: &[usize] = &[0, 1, 2, 3, 4, 5, 6, 7];
431 let mut size_counts = [0; 8];
432 let mut value_counts = [0; 8];
433
434 let mut runner = TestRunner::deterministic();
435 let input = subsequence(VALUES, 3..7);
436
437 for _ in 0..2048 {
438 let value = input.new_tree(&mut runner).unwrap().current();
439 assert!(value.len() >= 3 && value.len() < 7);
441 assert_eq!(
443 value.len(),
444 value.iter().cloned().collect::<BTreeSet<_>>().len()
445 );
446 let mut sorted = value.clone();
448 sorted.sort();
449 assert_eq!(sorted, value);
450
451 size_counts[value.len()] += 1;
452
453 for value in value {
454 value_counts[value] += 1;
455 }
456 }
457
458 for i in 3..7 {
459 assert!(
460 size_counts[i] >= 256 && size_counts[i] < 1024,
461 "size {} was chosen {} times",
462 i,
463 size_counts[i]
464 );
465 }
466
467 for (ix, &v) in value_counts.iter().enumerate() {
468 assert!(
469 v >= 1024 && v < 1500,
470 "Value {} was chosen {} times",
471 ix,
472 v
473 );
474 }
475 }
476
477 #[test]
478 fn sample_vec() {
479 let values = vec![0, 1, 2, 3, 4];
481
482 let mut runner = TestRunner::deterministic();
483 let input = subsequence(values, 1..3);
484
485 let _ = input.new_tree(&mut runner).unwrap().current();
486 }
487
488 #[test]
489 fn test_select() {
490 let values = vec![0, 1, 2, 3, 4, 5, 6, 7];
491 let mut counts = [0; 8];
492
493 let mut runner = TestRunner::deterministic();
494 let input = select(values);
495
496 for _ in 0..1024 {
497 counts[input.new_tree(&mut runner).unwrap().current()] += 1;
498 }
499
500 for (ix, &count) in counts.iter().enumerate() {
501 assert!(
502 count >= 64 && count < 256,
503 "Generated value {} {} times",
504 ix,
505 count
506 );
507 }
508 }
509
510 #[test]
511 fn test_sample_sanity() {
512 check_strategy_sanity(subsequence(vec![0, 1, 2, 3, 4], 1..3), None);
513 }
514
515 #[test]
516 fn test_select_sanity() {
517 check_strategy_sanity(select(vec![0, 1, 2, 3, 4]), None);
518 }
519
520 #[test]
521 fn subseq_empty_vec_works() {
522 let mut runner = TestRunner::deterministic();
523 let input = subsequence(Vec::<()>::new(), 0..1);
524 assert_eq!(
525 Vec::<()>::new(),
526 input.new_tree(&mut runner).unwrap().current()
527 );
528 }
529
530 #[test]
531 fn subseq_full_vec_works() {
532 let v = vec![1u32, 2u32, 3u32];
533 let mut runner = TestRunner::deterministic();
534 let input = subsequence(v.clone(), 3);
535 assert_eq!(v, input.new_tree(&mut runner).unwrap().current());
536 }
537
538 #[test]
539 fn index_works() {
540 let mut runner = TestRunner::deterministic();
541 let input = any::<Index>();
542 let col = vec!["foo", "bar", "baz"];
543 let mut seen = BTreeSet::new();
544
545 for _ in 0..16 {
546 let mut tree = input.new_tree(&mut runner).unwrap();
547 seen.insert(*tree.current().get(&col));
548
549 while tree.simplify() {}
550
551 assert_eq!("foo", *tree.current().get(&col));
552 }
553
554 assert_eq!(col.into_iter().collect::<BTreeSet<_>>(), seen);
555 }
556
557 #[test]
558 fn selector_works() {
559 let mut runner = TestRunner::deterministic();
560 let input = any::<Selector>();
561 let col: BTreeSet<&str> =
562 vec!["foo", "bar", "baz"].into_iter().collect();
563 let mut seen = BTreeSet::new();
564
565 for _ in 0..16 {
566 let mut tree = input.new_tree(&mut runner).unwrap();
567 seen.insert(*tree.current().select(&col));
568
569 while tree.simplify() {}
570
571 assert_eq!("bar", *tree.current().select(&col));
572 }
573
574 assert_eq!(col, seen);
575 }
576}