1#![deny(missing_docs)]
7
8use num::integer::{Average, Integer};
9use std::{
10 collections::VecDeque,
11 iter::{Fuse, FusedIterator},
12};
13
14#[derive(Default)]
28#[doc(hidden)]
29struct SimulationState {
30 script: Vec<bool>,
31 cursor: usize,
32}
33
34impl SimulationState {
35 fn choose_bool(&mut self) -> bool {
70 let result = if self.cursor == self.script.len() {
71 self.script.push(false);
72 false
73 } else {
74 self.script[self.cursor]
75 };
76 self.cursor += 1;
77 result
78 }
79
80 fn end_current_simulation_and_prepare_next(&mut self) -> bool {
142 assert!(self.cursor == self.script.len());
143 self.cursor = 0;
144 while let Some(last) = self.script.last_mut() {
145 if *last {
146 self.script.pop();
147 } else {
148 *last = true;
149 return true;
150 }
151 }
152 false
153 }
154}
155
156#[derive(Default)]
167pub struct SimulationExplorer {
168 state: Option<SimulationState>,
169}
170
171impl SimulationExplorer {
172 pub fn next_simulation(&mut self) -> Option<Simulation<'_>> {
174 match self.state {
175 None => {
176 self.state = Some(SimulationState::default());
177 Some(Simulation {
178 state: self.state.as_mut().unwrap(),
179 })
180 }
181 Some(ref mut state) => {
182 if state.end_current_simulation_and_prepare_next() {
183 Some(Simulation { state })
184 } else {
185 None
186 }
187 }
188 }
189 }
190
191 pub fn for_each<F, T>(&mut self, f: F)
193 where
194 F: for<'b> FnMut(Simulation<'b>) -> T,
195 {
196 self.map(f).for_each(|_| ())
197 }
198
199 pub fn map<F, T>(&mut self, f: F) -> Map<'_, F>
202 where
203 F: for<'b> FnMut(Simulation<'b>) -> T,
204 {
205 Map { simex: self, f }
206 }
207}
208
209pub struct Simulation<'a> {
222 state: &'a mut SimulationState,
223}
224
225impl<'a> Simulation<'a> {
226 pub fn choose_bool(&mut self) -> bool {
240 self.state.choose_bool()
241 }
242
243 pub fn choose_integer<T: Average + Copy + Integer>(&mut self, min: T, max: T) -> T {
263 assert!(min <= max);
264 self.choose_integer_unchecked(min, max)
265 }
266
267 #[doc(hidden)]
271 fn choose_integer_unchecked<T: Average + Copy + Integer>(&mut self, min: T, max: T) -> T {
272 if min == max {
273 min
274 } else if !self.choose_bool() {
275 self.choose_integer_unchecked(min, min.average_floor(&max))
276 } else {
277 self.choose_integer_unchecked(min.average_floor(&max) + T::one(), max)
278 }
279 }
280
281 pub fn choose<T>(&mut self, i: T) -> Option<T::Item>
303 where
304 T: IntoIterator,
305 T::IntoIter: ExactSizeIterator,
306 {
307 let mut iter = i.into_iter();
308 match iter.len() {
309 0 => None,
310 n => iter.nth(self.choose_integer_unchecked(0, n - 1)),
311 }
312 }
313
314 pub fn choose_n<'b, T>(&'b mut self, n: usize, i: T) -> ChooseN<'a, 'b, T::IntoIter>
358 where
359 T: IntoIterator,
360 T::IntoIter: ExactSizeIterator,
361 'a: 'b,
362 {
363 ChooseN {
364 simulation: self,
365 n,
366 iter: i.into_iter(),
367 }
368 }
369
370 pub fn choose_unknown_size<T: IntoIterator>(&mut self, i: T) -> Option<T::Item> {
392 let mut iter = i.into_iter();
393 let mut a = iter.next()?;
394 for b in iter {
395 if self.choose_bool() {
396 a = b;
397 } else {
398 break;
399 }
400 }
401 Some(a)
402 }
403
404 pub fn choose_n_unknown_size<'b, T>(
446 &'b mut self,
447 n: usize,
448 i: T,
449 ) -> ChooseNUnknownSize<'a, 'b, T::IntoIter>
450 where
451 T: IntoIterator,
452 'a: 'b,
453 {
454 ChooseNUnknownSize {
455 simulation: self,
456 reservoir: VecDeque::with_capacity(n + 1),
457 n,
458 iter: i.into_iter().fuse(),
459 }
460 }
461}
462
463pub struct Map<'a, F> {
477 simex: &'a mut SimulationExplorer,
478 f: F,
479}
480
481impl<F, T> Iterator for Map<'_, F>
482where
483 F: for<'b> FnMut(Simulation<'b>) -> T,
484{
485 type Item = T;
486
487 fn next(&mut self) -> Option<Self::Item> {
488 self.simex.next_simulation().map(|sim| (self.f)(sim))
489 }
490}
491
492impl<F, T> FusedIterator for Map<'_, F> where F: for<'b> FnMut(Simulation<'b>) -> T {}
493
494pub struct ChooseN<'a, 'b, T> {
507 simulation: &'b mut Simulation<'a>,
508 n: usize,
509 iter: T,
510}
511
512impl<T> Iterator for ChooseN<'_, '_, T>
513where
514 T: ExactSizeIterator,
515{
516 type Item = T::Item;
517
518 fn next(&mut self) -> Option<Self::Item> {
519 match (self.n, self.iter.len()) {
520 (0, _) | (_, 0) => None,
521 (n, remaining) if n >= remaining => {
522 self.n = n - 1;
523 self.iter.next()
524 }
525 (n, remaining) => {
526 let extra = remaining - n;
527 self.n = n - 1;
528 self.iter
529 .nth(self.simulation.choose_integer_unchecked(0, extra))
530 }
531 }
532 }
533
534 fn size_hint(&self) -> (usize, Option<usize>) {
535 let len = self.len();
536 (len, Some(len))
537 }
538}
539
540impl<T> FusedIterator for ChooseN<'_, '_, T> where T: ExactSizeIterator {}
541
542impl<T> ExactSizeIterator for ChooseN<'_, '_, T>
543where
544 T: ExactSizeIterator,
545{
546 fn len(&self) -> usize {
547 self.n.min(self.iter.len())
548 }
549}
550
551pub struct ChooseNUnknownSize<'a, 'b, T>
572where
573 T: Iterator,
574{
575 simulation: &'b mut Simulation<'a>,
576 reservoir: VecDeque<T::Item>,
577 n: usize,
578 iter: Fuse<T>,
579}
580
581impl<T> Iterator for ChooseNUnknownSize<'_, '_, T>
582where
583 T: Iterator,
584{
585 type Item = T::Item;
586
587 fn next(&mut self) -> Option<Self::Item> {
588 if self.n == 0 {
589 return None;
590 }
591 loop {
592 while self.reservoir.len() < self.n + 1 {
594 match self.iter.next() {
595 Some(elem) => self.reservoir.push_back(elem),
596 None => {
597 if !self.reservoir.is_empty() {
598 self.n -= 1;
599 }
600 return self.reservoir.pop_front();
601 }
602 }
603 }
604 let front = self.reservoir.pop_front();
606 if !self.simulation.choose_bool() {
607 self.n -= 1;
608 return front;
609 }
610 }
611 }
612
613 fn size_hint(&self) -> (usize, Option<usize>) {
614 let (underlying_min, underlying_max) = self.iter.size_hint();
617 let min = underlying_min
618 .saturating_add(self.reservoir.len())
619 .min(self.n);
620 let max = if let Some(underlying_max) = underlying_max {
621 underlying_max
622 .saturating_add(self.reservoir.len())
623 .min(self.n)
624 } else {
625 self.n
626 };
627 (min, Some(max))
628 }
629}
630
631impl<T> FusedIterator for ChooseNUnknownSize<'_, '_, T> where T: Iterator {}
632
633#[cfg(test)]
642mod tests {
643 use super::*;
644 use std::mem;
645
646 struct FusedAssertingIterator<T> {
647 inner: T,
648 has_returned_none: bool,
649 }
650
651 impl<T> FusedAssertingIterator<T> {
652 fn from(inner: T) -> Self {
653 FusedAssertingIterator {
654 inner,
655 has_returned_none: false,
656 }
657 }
658 }
659
660 impl<T: Iterator> Iterator for FusedAssertingIterator<T> {
661 type Item = T::Item;
662
663 fn next(&mut self) -> Option<Self::Item> {
664 assert!(!self.has_returned_none);
665 let result = self.inner.next();
666 if result.is_none() {
667 self.has_returned_none = true;
668 }
669 result
670 }
671
672 fn size_hint(&self) -> (usize, Option<usize>) {
673 self.inner.size_hint()
674 }
675 }
676
677 impl<T: ExactSizeIterator> ExactSizeIterator for FusedAssertingIterator<T> {
678 fn len(&self) -> usize {
679 self.inner.len()
680 }
681 }
682
683 #[test]
684 fn next_simulation_on_empty_is_false() {
685 let mut simex = SimulationExplorer::default();
686 assert!(simex.next_simulation().is_some());
687 assert!(simex.next_simulation().is_none());
688 assert!(simex.next_simulation().is_none());
689 }
690
691 #[test]
692 fn general_exercise() {
693 let mut simex = SimulationExplorer::default();
694
695 let mut simulation = simex.next_simulation().unwrap();
696 assert!(!simulation.choose_bool());
697 assert!(!simulation.choose_bool());
698 assert!(!simulation.choose_bool());
699 assert!(!simulation.choose_bool());
700
701 let mut simulation = simex.next_simulation().unwrap();
702 assert!(!simulation.choose_bool());
703 assert!(!simulation.choose_bool());
704 assert!(!simulation.choose_bool());
705 assert!(simulation.choose_bool());
706 assert!(!simulation.choose_bool());
707
708 let mut simulation = simex.next_simulation().unwrap();
709 assert!(!simulation.choose_bool());
710 assert!(!simulation.choose_bool());
711 assert!(!simulation.choose_bool());
712 assert!(simulation.choose_bool());
713 assert!(simulation.choose_bool());
714
715 let mut simulation = simex.next_simulation().unwrap();
716 assert!(!simulation.choose_bool());
717 assert!(!simulation.choose_bool());
718 assert!(simulation.choose_bool());
719
720 let mut simulation = simex.next_simulation().unwrap();
721 assert!(!simulation.choose_bool());
722 assert!(simulation.choose_bool());
723
724 let mut simulation = simex.next_simulation().unwrap();
725 assert!(simulation.choose_bool());
726 assert!(!simulation.choose_bool());
727
728 let mut simulation = simex.next_simulation().unwrap();
729 assert!(simulation.choose_bool());
730 assert!(simulation.choose_bool());
731
732 assert!(simex.next_simulation().is_none());
733 }
734
735 #[test]
736 fn choose_range() {
737 let mut simex = SimulationExplorer::default();
738
739 for i in 10..20 {
740 let mut simulation = simex.next_simulation().unwrap();
741 let j = simulation
742 .choose(FusedAssertingIterator::from(10..20))
743 .unwrap();
744 assert_eq!(i, j);
745 }
746 assert!(simex.next_simulation().is_none());
747 }
748
749 #[test]
750 fn choose_vector() {
751 let mut simex = SimulationExplorer::default();
752
753 for i in 1..=4 {
754 let mut simulation = simex.next_simulation().unwrap();
755 let j = simulation.choose(vec![1, 2, 3, 4]).unwrap();
756 assert_eq!(i, j);
757 }
758 assert!(simex.next_simulation().is_none());
759 }
760
761 #[test]
762 fn choose_empty() {
763 let mut simex = SimulationExplorer::default();
764 let mut simulation = simex.next_simulation().unwrap();
765 assert!(simulation
766 .choose(FusedAssertingIterator::from(0..0))
767 .is_none());
768 assert!(simex.next_simulation().is_none());
769 }
770
771 #[test]
772 fn while_let() {
773 let mut simex = SimulationExplorer::default();
774 let mut actual = vec![];
775 while let Some(mut simulation) = simex.next_simulation() {
776 actual.push(
777 simulation
778 .choose(FusedAssertingIterator::from(0..10))
779 .unwrap(),
780 );
781 }
782 assert_eq!(actual, Vec::from_iter(0..10));
783 }
784
785 #[test]
786 fn map() {
787 assert!(SimulationExplorer::default()
788 .map(|mut sim| sim.choose(FusedAssertingIterator::from(0..10)).unwrap())
789 .eq(FusedAssertingIterator::from(0..10)));
790 }
791
792 #[test]
793 fn map_is_fused() {
794 let mut simex = SimulationExplorer::default();
795 let mut iter = simex.map(|_| ());
796 assert_eq!(iter.next(), Some(()));
797 assert_eq!(iter.next(), None);
798 assert_eq!(iter.next(), None);
799 assert_eq!(iter.next(), None);
800 }
801
802 #[test]
803 fn for_each() {
804 let mut vec = vec![];
805 SimulationExplorer::default().for_each(|mut sim| vec.push(sim.choose_integer(1, 5)));
806 assert_eq!(vec, vec![1, 2, 3, 4, 5]);
807 }
808
809 #[test]
810 fn choose_bool() {
811 assert_eq!(
812 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_bool())),
813 vec![false, true],
814 );
815 }
816
817 #[test]
818 fn choose_n() {
819 assert_eq!(
820 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
821 sim.choose_n(3, FusedAssertingIterator::from(0..5))
822 ))),
823 vec![
824 vec![0, 1, 2],
825 vec![0, 1, 3],
826 vec![0, 1, 4],
827 vec![0, 2, 3],
828 vec![0, 2, 4],
829 vec![0, 3, 4],
830 vec![1, 2, 3],
831 vec![1, 2, 4],
832 vec![1, 3, 4],
833 vec![2, 3, 4],
834 ],
835 );
836 }
837
838 #[test]
839 fn choose_n_too_small() {
840 assert_eq!(
841 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
842 sim.choose_n(3, FusedAssertingIterator::from(0..2))
843 ))),
844 vec![vec![0, 1]],
845 );
846 }
847
848 #[test]
849 fn choose_n_from_empty() {
850 assert_eq!(
851 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
852 sim.choose_n(3, FusedAssertingIterator::from(0..0))
853 ))),
854 vec![vec![]],
855 );
856 }
857
858 #[test]
859 fn choose_n_exact() {
860 assert_eq!(
861 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
862 sim.choose_n(3, FusedAssertingIterator::from(0..3))
863 ))),
864 vec![vec![0, 1, 2]],
865 );
866 }
867
868 #[test]
869 fn choose_0_from_some() {
870 assert_eq!(
871 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
872 sim.choose_n(0, FusedAssertingIterator::from(0..5))
873 ))),
874 vec![vec![]],
875 );
876 }
877
878 #[test]
879 fn choose_0_from_none() {
880 assert_eq!(
881 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
882 sim.choose_n(0, FusedAssertingIterator::from(0..0))
883 ))),
884 vec![vec![]],
885 );
886 }
887
888 #[test]
889 fn choose_n_is_fused() {
890 let mut simex = SimulationExplorer::default();
891 let mut simulation = simex.next_simulation().unwrap();
892 let mut iter = simulation.choose_n(1, FusedAssertingIterator::from(0..2));
893 assert_eq!(iter.next(), Some(0));
894 assert_eq!(iter.next(), None);
895 assert_eq!(iter.next(), None);
896 assert_eq!(iter.next(), None);
897 }
898
899 #[test]
900 fn choose_n_exact_size() {
901 let mut simex = SimulationExplorer::default();
902 let mut simulation = simex.next_simulation().unwrap();
903 let mut iter = simulation.choose_n(1, FusedAssertingIterator::from(0..2));
904 assert_eq!(iter.len(), 1);
905 assert_eq!(iter.next(), Some(0));
906 assert_eq!(iter.len(), 0);
907 assert_eq!(iter.next(), None);
908 assert_eq!(iter.len(), 0);
909 }
910
911 #[test]
912 fn choose_n_exact_size_with_short_underlying_iter() {
913 let mut simex = SimulationExplorer::default();
914 let mut simulation = simex.next_simulation().unwrap();
915 let mut iter = simulation.choose_n(100, FusedAssertingIterator::from(0..2));
916 assert_eq!(iter.len(), 2);
917 assert_eq!(iter.next(), Some(0));
918 assert_eq!(iter.len(), 1);
919 assert_eq!(iter.next(), Some(1));
920 assert_eq!(iter.len(), 0);
921 assert_eq!(iter.next(), None);
922 assert_eq!(iter.len(), 0);
923 assert_eq!(iter.next(), None);
924 assert_eq!(iter.len(), 0);
925 }
926
927 #[test]
928 fn choose_unknown_size_empty() {
929 let mut simex = SimulationExplorer::default();
930 let mut simulation = simex.next_simulation().unwrap();
931 assert!(simulation
932 .choose_unknown_size(FusedAssertingIterator::from(0..0))
933 .is_none());
934 assert!(simex.next_simulation().is_none());
935 }
936
937 #[test]
938 fn choose_unknown_size_from_single_element() {
939 assert_eq!(
940 Vec::from_iter(SimulationExplorer::default().map(|mut sim| {
941 sim.choose_unknown_size(FusedAssertingIterator::from(0..1))
942 .unwrap()
943 })),
944 vec![0],
945 );
946 }
947
948 #[test]
949 fn choose_unknown_size() {
950 assert_eq!(
951 Vec::from_iter(SimulationExplorer::default().map(|mut sim| {
952 sim.choose_unknown_size(FusedAssertingIterator::from(0..10))
953 .unwrap()
954 })),
955 vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
956 );
957 }
958
959 #[test]
960 fn choose_n_unknown_size() {
961 assert_eq!(
962 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
963 sim.choose_n_unknown_size(3, FusedAssertingIterator::from(0..5))
964 ))),
965 vec![
966 vec![0, 1, 2],
967 vec![0, 1, 3],
968 vec![0, 1, 4],
969 vec![0, 2, 3],
970 vec![0, 2, 4],
971 vec![0, 3, 4],
972 vec![1, 2, 3],
973 vec![1, 2, 4],
974 vec![1, 3, 4],
975 vec![2, 3, 4],
976 ],
977 );
978 }
979
980 #[test]
981 fn choose_n_unknown_size_too_small() {
982 assert_eq!(
983 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
984 sim.choose_n_unknown_size(3, FusedAssertingIterator::from(0..2))
985 ))),
986 vec![vec![0, 1]],
987 );
988 }
989
990 #[test]
991 fn choose_n_unknown_size_from_empty() {
992 assert_eq!(
993 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
994 sim.choose_n_unknown_size(3, FusedAssertingIterator::from(0..0))
995 ))),
996 vec![vec![]],
997 );
998 }
999
1000 #[test]
1001 fn choose_n_unknown_size_exact() {
1002 assert_eq!(
1003 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
1004 sim.choose_n_unknown_size(3, FusedAssertingIterator::from(0..3))
1005 ))),
1006 vec![vec![0, 1, 2]],
1007 );
1008 }
1009
1010 #[test]
1011 fn choose_0_unknown_size_from_some() {
1012 assert_eq!(
1013 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
1014 sim.choose_n_unknown_size(0, FusedAssertingIterator::from(0..5))
1015 ))),
1016 vec![vec![]],
1017 );
1018 }
1019
1020 #[test]
1021 fn choose_0_unknown_size_from_none() {
1022 assert_eq!(
1023 Vec::from_iter(SimulationExplorer::default().map(|mut sim| Vec::from_iter(
1024 sim.choose_n_unknown_size(0, FusedAssertingIterator::from(0..0))
1025 ))),
1026 vec![vec![]],
1027 );
1028 }
1029
1030 struct TestIterator<T> {
1031 script: Vec<(usize, Option<usize>, Option<T>)>,
1032 min: usize,
1033 max: Option<usize>,
1034 next: Option<T>,
1035 }
1036
1037 impl<T> TestIterator<T> {
1038 fn new(mut script: Vec<(usize, Option<usize>, Option<T>)>) -> Self {
1039 let (min, max, next) = script.remove(0);
1040 TestIterator {
1041 script,
1042 min,
1043 max,
1044 next,
1045 }
1046 }
1047 }
1048
1049 impl<T> Iterator for TestIterator<T> {
1050 type Item = T;
1051
1052 fn next(&mut self) -> Option<Self::Item> {
1053 if self.script.is_empty() {
1054 self.next.take()
1055 } else {
1056 let (min, max, mut next) = self.script.remove(0);
1057 mem::swap(&mut next, &mut self.next);
1058 self.min = min;
1059 self.max = max;
1060 next
1061 }
1062 }
1063
1064 fn size_hint(&self) -> (usize, Option<usize>) {
1065 (self.min, self.max)
1066 }
1067 }
1068
1069 #[test]
1070 fn choose_n_unknown_size_size_hint_1() {
1071 let mut simex = SimulationExplorer::default();
1072 let mut simulation = simex.next_simulation().unwrap();
1073 let mut iter = simulation.choose_n_unknown_size(
1074 1,
1075 FusedAssertingIterator::from(TestIterator::new(vec![
1076 (0, None, Some(0)),
1077 (0, None, Some(1)),
1078 (0, None, Some(2)),
1079 ])),
1080 );
1081 assert_eq!(iter.size_hint(), (0, Some(1)));
1082 assert_eq!(iter.next(), Some(0));
1083 assert_eq!(iter.size_hint(), (0, Some(0)));
1084 }
1085
1086 #[test]
1087 fn choose_n_unknown_size_size_hint_2() {
1088 let mut simex = SimulationExplorer::default();
1089 let mut simulation = simex.next_simulation().unwrap();
1090 let mut iter = simulation.choose_n_unknown_size(
1091 1,
1092 FusedAssertingIterator::from(TestIterator::new(vec![
1093 (3, None, Some(0)),
1094 (2, None, Some(1)),
1095 (1, None, Some(2)),
1096 ])),
1097 );
1098 assert_eq!(iter.size_hint(), (1, Some(1)));
1099 assert_eq!(iter.next(), Some(0));
1100 assert_eq!(iter.size_hint(), (0, Some(0)));
1101 }
1102
1103 #[test]
1104 fn choose_n_unknown_size_size_hint_3() {
1105 let mut simex = SimulationExplorer::default();
1106 let mut simulation = simex.next_simulation().unwrap();
1107 let mut iter = simulation.choose_n_unknown_size(
1108 4,
1109 FusedAssertingIterator::from(TestIterator::new(vec![
1110 (1, Some(3), Some(0)),
1111 (1, Some(2), Some(1)),
1112 (1, Some(1), Some(2)),
1113 (0, Some(0), None),
1114 ])),
1115 );
1116 assert_eq!(iter.size_hint(), (1, Some(3)));
1117 assert_eq!(iter.next(), Some(0));
1118 assert_eq!(iter.size_hint(), (2, Some(2)));
1119 assert_eq!(iter.next(), Some(1));
1120 assert_eq!(iter.size_hint(), (1, Some(1)));
1121 assert_eq!(iter.next(), Some(2));
1122 assert_eq!(iter.size_hint(), (0, Some(0)));
1123 }
1124
1125 #[test]
1126 fn choose_n_unknown_size_size_hint_4() {
1127 let mut simex = SimulationExplorer::default();
1128 let mut simulation = simex.next_simulation().unwrap();
1129 let mut iter = simulation.choose_n_unknown_size(
1130 4,
1131 FusedAssertingIterator::from(TestIterator::new(vec![
1132 (0, Some(100), Some(0)),
1133 (0, Some(100), Some(1)),
1134 (0, Some(100), Some(2)),
1135 (0, Some(0), None),
1136 ])),
1137 );
1138 assert_eq!(iter.size_hint(), (0, Some(4)));
1139 assert_eq!(iter.next(), Some(0));
1140 assert_eq!(iter.size_hint(), (2, Some(2)));
1141 assert_eq!(iter.next(), Some(1));
1142 assert_eq!(iter.size_hint(), (1, Some(1)));
1143 assert_eq!(iter.next(), Some(2));
1144 assert_eq!(iter.size_hint(), (0, Some(0)));
1145 assert_eq!(iter.next(), None);
1146 assert_eq!(iter.size_hint(), (0, Some(0)));
1147 }
1148
1149 #[test]
1150 fn choose_n_unknown_size_size_hint_5() {
1151 let mut simex = SimulationExplorer::default();
1152 let mut simulation = simex.next_simulation().unwrap();
1153 let mut iter = simulation.choose_n_unknown_size(
1154 2,
1155 FusedAssertingIterator::from(TestIterator::new(vec![
1156 (0, Some(100), Some(0)),
1157 (0, Some(100), Some(1)),
1158 (0, Some(100), Some(2)),
1159 (0, Some(100), Some(3)),
1160 (0, Some(0), None),
1161 ])),
1162 );
1163 assert_eq!(iter.size_hint(), (0, Some(2)));
1164 assert_eq!(iter.next(), Some(0));
1165 assert_eq!(iter.size_hint(), (1, Some(1)));
1166 assert_eq!(iter.next(), Some(1));
1167 assert_eq!(iter.size_hint(), (0, Some(0)));
1168 assert_eq!(iter.next(), None);
1169 assert_eq!(iter.size_hint(), (0, Some(0)));
1170 assert_eq!(iter.next(), None);
1171 assert_eq!(iter.size_hint(), (0, Some(0)));
1172 }
1173
1174 #[test]
1175 fn choose_n_unknown_size_is_fused() {
1176 let mut simex = SimulationExplorer::default();
1177 let mut simulation = simex.next_simulation().unwrap();
1178 let mut iter = simulation.choose_n_unknown_size(1, FusedAssertingIterator::from(0..2));
1179 assert_eq!(iter.next(), Some(0));
1180 assert_eq!(iter.next(), None);
1181 assert_eq!(iter.next(), None);
1182 assert_eq!(iter.next(), None);
1183 }
1184
1185 #[test]
1186 fn choose_integer_0() {
1187 assert_eq!(
1188 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(0, 0))),
1189 vec![0],
1190 );
1191 }
1192
1193 #[test]
1194 fn choose_integer_max() {
1195 assert_eq!(
1196 Vec::from_iter(
1197 SimulationExplorer::default()
1198 .map(|mut sim| sim.choose_integer(usize::MAX, usize::MAX))
1199 ),
1200 vec![usize::MAX],
1201 );
1202 }
1203
1204 #[test]
1205 fn choose_integer_0_to_1() {
1206 assert_eq!(
1207 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(0, 1))),
1208 vec![0, 1],
1209 );
1210 }
1211
1212 #[test]
1213 fn choose_integer_1_to_2() {
1214 assert_eq!(
1215 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(1, 2))),
1216 vec![1, 2],
1217 );
1218 }
1219
1220 #[test]
1221 fn choose_integer_0_to_2() {
1222 assert_eq!(
1223 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(0, 2))),
1224 vec![0, 1, 2],
1225 );
1226 }
1227
1228 #[test]
1229 fn choose_integer_1_to_3() {
1230 assert_eq!(
1231 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(1, 3))),
1232 vec![1, 2, 3],
1233 );
1234 }
1235
1236 #[test]
1237 fn choose_integer_1_to_13() {
1238 assert_eq!(
1239 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(1, 13))),
1240 vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
1241 );
1242 }
1243
1244 #[test]
1245 fn choose_integer_neg_1_to_0() {
1246 assert_eq!(
1247 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(-1, 0))),
1248 vec![-1, 0],
1249 );
1250 }
1251
1252 #[test]
1253 fn choose_integer_neg_2_to_neg_1() {
1254 assert_eq!(
1255 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(-2, -1))),
1256 vec![-2, -1],
1257 );
1258 }
1259
1260 #[test]
1261 fn choose_integer_neg_2_to_0() {
1262 assert_eq!(
1263 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(-2, 0))),
1264 vec![-2, -1, 0],
1265 );
1266 }
1267
1268 #[test]
1269 fn choose_integer_neg_3_to_neg_1() {
1270 assert_eq!(
1271 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(-3, -1))),
1272 vec![-3, -2, -1],
1273 );
1274 }
1275
1276 #[test]
1277 fn choose_integer_neg_13_to_neg_1() {
1278 assert_eq!(
1279 Vec::from_iter(
1280 SimulationExplorer::default().map(|mut sim| sim.choose_integer(-13, -1))
1281 ),
1282 vec![-13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1],
1283 );
1284 }
1285
1286 #[test]
1287 fn choose_integer_min_to_max() {
1288 assert!(SimulationExplorer::default()
1289 .map(|mut sim| sim.choose_integer(i16::MIN, i16::MAX))
1290 .eq(i16::MIN..=i16::MAX));
1291 }
1292
1293 #[test]
1294 #[should_panic(expected = "min <= max")]
1295 fn choose_integer_1_to_0() {
1296 assert_eq!(
1297 Vec::from_iter(SimulationExplorer::default().map(|mut sim| sim.choose_integer(1, 0))),
1298 vec![1, 0],
1299 );
1300 }
1301}