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 Select(statics::Map::new(0..cow.len(), SelectMapFn(Arc::new(cow))))
162}
163
164#[derive(Clone, Copy, Debug)]
213pub struct Index(usize);
214
215impl Index {
216 pub fn index(&self, size: usize) -> usize {
222 assert!(size > 0, "Attempt to use `Index` with 0-size collection");
223
224 ((size as u128) * (self.0 as u128) >> (mem::size_of::<usize>() * 8))
228 as usize
229 }
230
231 pub fn get<'a, T>(&self, slice: &'a [T]) -> &'a T {
235 &slice[self.index(slice.len())]
236 }
237
238 pub fn get_mut<'a, T>(&self, slice: &'a mut [T]) -> &'a mut T {
243 let ix = self.index(slice.len());
244 &mut slice[ix]
245 }
246}
247
248impl AsRef<Index> for Index {
251 fn as_ref(&self) -> &Index {
252 self
253 }
254}
255
256mapfn! {
257 [] fn UsizeToIndex[](raw: usize) -> Index {
258 Index(raw)
259 }
260}
261
262opaque_strategy_wrapper! {
263 #[derive(Clone, Debug)]
267 pub struct IndexStrategy[][](
268 statics::Map<num::usize::Any, UsizeToIndex>)
269 -> IndexValueTree;
270 #[derive(Clone, Debug)]
272 pub struct IndexValueTree[][](
273 statics::Map<num::usize::BinarySearch,UsizeToIndex>)
274 -> Index;
275}
276
277impl IndexStrategy {
278 pub(crate) fn new() -> Self {
279 IndexStrategy(statics::Map::new(num::usize::ANY, UsizeToIndex))
280 }
281}
282
283#[derive(Clone, Debug)]
319pub struct Selector {
320 rng: TestRng,
321 bias_increment: u64,
322}
323
324#[derive(Debug)]
328pub struct SelectorStrategy {
329 _nonexhaustive: (),
330}
331
332#[derive(Debug)]
334pub struct SelectorValueTree {
335 rng: TestRng,
336 reverse_bias_increment: num::u64::BinarySearch,
337}
338
339impl SelectorStrategy {
340 pub(crate) fn new() -> Self {
341 SelectorStrategy { _nonexhaustive: () }
342 }
343}
344
345impl Strategy for SelectorStrategy {
346 type Tree = SelectorValueTree;
347 type Value = Selector;
348
349 fn new_tree(&self, runner: &mut TestRunner) -> NewTree<Self> {
350 Ok(SelectorValueTree {
351 rng: runner.new_rng(),
352 reverse_bias_increment: num::u64::BinarySearch::new(u64::MAX),
353 })
354 }
355}
356
357impl ValueTree for SelectorValueTree {
358 type Value = Selector;
359
360 fn current(&self) -> Selector {
361 Selector {
362 rng: self.rng.clone(),
363 bias_increment: u64::MAX - self.reverse_bias_increment.current(),
364 }
365 }
366
367 fn simplify(&mut self) -> bool {
368 self.reverse_bias_increment.simplify()
369 }
370
371 fn complicate(&mut self) -> bool {
372 self.reverse_bias_increment.complicate()
373 }
374}
375
376impl Selector {
377 pub fn select<T: IntoIterator>(&self, it: T) -> T::Item {
388 self.try_select(it).expect("select from empty iterator")
389 }
390
391 pub fn try_select<T: IntoIterator>(&self, it: T) -> Option<T::Item> {
400 let mut bias = 0u64;
401 let mut min_score = 0;
402 let mut best = None;
403 let mut rng = self.rng.clone();
404
405 for item in it {
406 let score = bias.saturating_add(rng.gen());
407 if best.is_none() || score < min_score {
408 best = Some(item);
409 min_score = score;
410 }
411
412 bias = bias.saturating_add(self.bias_increment);
413 }
414
415 best
416 }
417}
418
419#[cfg(test)]
420mod test {
421 use crate::std_facade::BTreeSet;
422
423 use super::*;
424 use crate::arbitrary::any;
425
426 #[test]
427 fn sample_slice() {
428 static VALUES: &[usize] = &[0, 1, 2, 3, 4, 5, 6, 7];
429 let mut size_counts = [0; 8];
430 let mut value_counts = [0; 8];
431
432 let mut runner = TestRunner::deterministic();
433 let input = subsequence(VALUES, 3..7);
434
435 for _ in 0..2048 {
436 let value = input.new_tree(&mut runner).unwrap().current();
437 assert!(value.len() >= 3 && value.len() < 7);
439 assert_eq!(
441 value.len(),
442 value.iter().cloned().collect::<BTreeSet<_>>().len()
443 );
444 let mut sorted = value.clone();
446 sorted.sort();
447 assert_eq!(sorted, value);
448
449 size_counts[value.len()] += 1;
450
451 for value in value {
452 value_counts[value] += 1;
453 }
454 }
455
456 for i in 3..7 {
457 assert!(
458 size_counts[i] >= 256 && size_counts[i] < 1024,
459 "size {} was chosen {} times",
460 i,
461 size_counts[i]
462 );
463 }
464
465 for (ix, &v) in value_counts.iter().enumerate() {
466 assert!(
467 v >= 1024 && v < 1500,
468 "Value {} was chosen {} times",
469 ix,
470 v
471 );
472 }
473 }
474
475 #[test]
476 fn sample_vec() {
477 let values = vec![0, 1, 2, 3, 4];
479
480 let mut runner = TestRunner::deterministic();
481 let input = subsequence(values, 1..3);
482
483 let _ = input.new_tree(&mut runner).unwrap().current();
484 }
485
486 #[test]
487 fn test_select() {
488 let values = vec![0, 1, 2, 3, 4, 5, 6, 7];
489 let mut counts = [0; 8];
490
491 let mut runner = TestRunner::deterministic();
492 let input = select(values);
493
494 for _ in 0..1024 {
495 counts[input.new_tree(&mut runner).unwrap().current()] += 1;
496 }
497
498 for (ix, &count) in counts.iter().enumerate() {
499 assert!(
500 count >= 64 && count < 256,
501 "Generated value {} {} times",
502 ix,
503 count
504 );
505 }
506 }
507
508 #[test]
509 fn test_sample_sanity() {
510 check_strategy_sanity(subsequence(vec![0, 1, 2, 3, 4], 1..3), None);
511 }
512
513 #[test]
514 fn test_select_sanity() {
515 check_strategy_sanity(select(vec![0, 1, 2, 3, 4]), None);
516 }
517
518 #[test]
519 fn subseq_empty_vec_works() {
520 let mut runner = TestRunner::deterministic();
521 let input = subsequence(Vec::<()>::new(), 0..1);
522 assert_eq!(
523 Vec::<()>::new(),
524 input.new_tree(&mut runner).unwrap().current()
525 );
526 }
527
528 #[test]
529 fn subseq_full_vec_works() {
530 let v = vec![1u32, 2u32, 3u32];
531 let mut runner = TestRunner::deterministic();
532 let input = subsequence(v.clone(), 3);
533 assert_eq!(v, input.new_tree(&mut runner).unwrap().current());
534 }
535
536 #[test]
537 fn index_works() {
538 let mut runner = TestRunner::deterministic();
539 let input = any::<Index>();
540 let col = vec!["foo", "bar", "baz"];
541 let mut seen = BTreeSet::new();
542
543 for _ in 0..16 {
544 let mut tree = input.new_tree(&mut runner).unwrap();
545 seen.insert(*tree.current().get(&col));
546
547 while tree.simplify() {}
548
549 assert_eq!("foo", *tree.current().get(&col));
550 }
551
552 assert_eq!(col.into_iter().collect::<BTreeSet<_>>(), seen);
553 }
554
555 #[test]
556 fn selector_works() {
557 let mut runner = TestRunner::deterministic();
558 let input = any::<Selector>();
559 let col: BTreeSet<&str> =
560 vec!["foo", "bar", "baz"].into_iter().collect();
561 let mut seen = BTreeSet::new();
562
563 for _ in 0..16 {
564 let mut tree = input.new_tree(&mut runner).unwrap();
565 seen.insert(*tree.current().select(&col));
566
567 while tree.simplify() {}
568
569 assert_eq!("bar", *tree.current().select(&col));
570 }
571
572 assert_eq!(col, seen);
573 }
574}