Skip to content

Commit 530cd9c

Browse files
committed
fix: rewrite range proptest strategy
1 parent c3a9567 commit 530cd9c

File tree

1 file changed

+38
-39
lines changed

1 file changed

+38
-39
lines changed

src/range.rs

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -467,54 +467,53 @@ impl<'de, V: serde::Deserialize<'de>> serde::Deserialize<'de> for Range<V> {
467467
#[cfg(test)]
468468
pub mod tests {
469469
use proptest::prelude::*;
470-
use proptest::test_runner::TestRng;
471470

472471
use super::*;
473472

474473
pub fn strategy() -> impl Strategy<Value = Range<u32>> {
475-
prop::collection::vec(any::<u32>(), 0..10)
476-
.prop_map(|mut vec| {
477-
vec.sort_unstable();
478-
vec.dedup();
479-
vec
480-
})
481-
.prop_perturb(|vec, mut rng| {
482-
let mut segments = SmallVec::empty();
483-
let mut iter = vec.into_iter().peekable();
484-
if let Some(first) = iter.next() {
485-
fn next_bound<I: Iterator<Item = u32>>(
486-
iter: &mut I,
487-
rng: &mut TestRng,
488-
) -> Bound<u32> {
489-
if let Some(next) = iter.next() {
490-
if rng.gen_bool(0.5) {
491-
Included(next)
492-
} else {
493-
Excluded(next)
494-
}
495-
} else {
496-
Unbounded
497-
}
498-
}
499-
500-
let start = if rng.gen_bool(0.3) {
501-
Unbounded
502-
} else {
503-
if rng.gen_bool(0.5) {
504-
Included(first)
474+
(
475+
any::<(bool, bool)>(),
476+
prop::collection::vec(any::<(u32, bool)>(), 1..10),
477+
)
478+
.prop_map(|((start_bounded, end_bounded), mut vec)| {
479+
// Ensure the bounds are increasing and non-repeating
480+
vec.sort_by_key(|(value, _)| *value);
481+
vec.dedup_by_key(|(value, _)| *value);
482+
483+
// Construct an iterator of bounds instead of values
484+
let mut vec: Vec<_> = vec
485+
.into_iter()
486+
.map(|(value, inclusive)| {
487+
if inclusive {
488+
Included(value)
505489
} else {
506-
Excluded(first)
490+
Excluded(value)
507491
}
508-
};
492+
})
493+
.collect();
509494

510-
let end = next_bound(&mut iter, &mut rng);
511-
segments.push((start, end));
495+
// Add the start bound
496+
if !start_bounded {
497+
vec.insert(0, Unbounded);
498+
}
512499

513-
while iter.peek().is_some() {
514-
let start = next_bound(&mut iter, &mut rng);
515-
let end = next_bound(&mut iter, &mut rng);
516-
segments.push((start, end));
500+
// Add end bound
501+
if !end_bounded {
502+
if (vec.len() % 2) == 0 {
503+
// Drop the last element if it would result in an uneven vec
504+
vec.pop();
517505
}
506+
vec.push(Unbounded);
507+
} else if (vec.len() % 2) == 1 {
508+
// Drop the last element if it would result in an uneven vec
509+
vec.pop();
510+
}
511+
512+
let mut segments = SmallVec::empty();
513+
let mut iter = vec.into_iter();
514+
while let Some(start) = iter.next() {
515+
let end = iter.next().expect("not an even amount of values");
516+
segments.push((start, end));
518517
}
519518
return Range { segments };
520519
})

0 commit comments

Comments
 (0)