@@ -467,54 +467,53 @@ impl<'de, V: serde::Deserialize<'de>> serde::Deserialize<'de> for Range<V> {
467
467
#[ cfg( test) ]
468
468
pub mod tests {
469
469
use proptest:: prelude:: * ;
470
- use proptest:: test_runner:: TestRng ;
471
470
472
471
use super :: * ;
473
472
474
473
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)
505
489
} else {
506
- Excluded ( first )
490
+ Excluded ( value )
507
491
}
508
- } ;
492
+ } )
493
+ . collect ( ) ;
509
494
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
+ }
512
499
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 ( ) ;
517
505
}
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) ) ;
518
517
}
519
518
return Range { segments } ;
520
519
} )
0 commit comments