@@ -376,9 +376,12 @@ fn test_windows_zip() {
376
376
assert_eq ! ( res, [ 14 , 18 , 22 , 26 ] ) ;
377
377
}
378
378
379
+ // The current implementation of SliceIndex fails to handle methods
380
+ // orthogonally from range types; therefore, it is worth testing
381
+ // all of the indexing operations on each input.
379
382
mod slice_index {
380
- // Test a slicing operation that should succeed,
381
- // testing it on all of the indexing methods.
383
+ // This checks all six indexing methods, given an input range that
384
+ // should succeed. ( it is NOT suitable for testing invalid inputs)
382
385
macro_rules! assert_range_eq {
383
386
( $arr: expr, $range: expr, $expected: expr)
384
387
=> {
@@ -423,7 +426,7 @@ mod slice_index {
423
426
// because if it can't, then what are we even doing here?
424
427
//
425
428
// (Be aware this only demonstrates the ability to detect bugs
426
- // in the FIRST method it calls , as the macro is not designed
429
+ // in the FIRST method that panics , as the macro is not designed
427
430
// to be used in `should_panic`)
428
431
#[ test]
429
432
#[ should_panic( expected = "out of range" ) ]
@@ -446,30 +449,29 @@ mod slice_index {
446
449
// and `None` test cases for get/get_mut.
447
450
macro_rules! panic_cases {
448
451
( $(
449
- mod $case_name: ident {
450
- let DATA : $Data: ty = $data: expr;
452
+ // each test case needs a unique name to namespace the tests
453
+ in mod $case_name: ident {
454
+ data: $data: expr;
451
455
452
456
// optional:
453
457
//
454
- // a similar input for which DATA[input] succeeds, and the corresponding
455
- // output as an array. This helps validate "critical points" where an
456
- // input range straddles the boundary between valid and invalid.
458
+ // one or more similar inputs for which data[input] succeeds,
459
+ // and the corresponding output as an array. This helps validate
460
+ // "critical points" where an input range straddles the boundary
461
+ // between valid and invalid.
457
462
// (such as the input `len..len`, which is just barely valid)
458
463
$(
459
- let GOOD_INPUT = $good: expr;
460
- let GOOD_OUTPUT = $output: expr;
464
+ good: data[ $good: expr] == $output: expr;
461
465
) *
462
466
463
- let BAD_INPUT = $bad: expr;
464
- const EXPECT_MSG = $expect_msg: expr;
465
-
466
- !!generate_tests!!
467
+ bad: data[ $bad: expr] ;
468
+ message: $expect_msg: expr;
467
469
}
468
470
) * ) => { $(
469
471
mod $case_name {
470
472
#[ test]
471
473
fn pass( ) {
472
- let mut v: $Data = $data;
474
+ let mut v = $data;
473
475
474
476
$( assert_range_eq!( $data, $good, $output) ; ) *
475
477
@@ -487,15 +489,15 @@ mod slice_index {
487
489
#[ test]
488
490
#[ should_panic( expected = $expect_msg) ]
489
491
fn index_fail( ) {
490
- let v: $Data = $data;
492
+ let v = $data;
491
493
let v: & [ _] = & v;
492
494
let _v = & v[ $bad] ;
493
495
}
494
496
495
497
#[ test]
496
498
#[ should_panic( expected = $expect_msg) ]
497
499
fn index_mut_fail( ) {
498
- let mut v: $Data = $data;
500
+ let mut v = $data;
499
501
let v: & mut [ _] = & mut v;
500
502
let _v = & mut v[ $bad] ;
501
503
}
@@ -516,112 +518,80 @@ mod slice_index {
516
518
}
517
519
518
520
panic_cases ! {
519
- mod rangefrom_len {
520
- let DATA : [ i32 ; 6 ] = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
521
-
522
- let GOOD_INPUT = 6 ..;
523
- let GOOD_OUTPUT = [ ] ;
521
+ in mod rangefrom_len {
522
+ data: [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
524
523
525
- let BAD_INPUT = 7 ..;
526
- const EXPECT_MSG = "but ends at" ; // perhaps not ideal
527
-
528
- !!generate_tests!!
524
+ good: data[ 6 ..] == [ ] ;
525
+ bad: data[ 7 ..] ;
526
+ message: "but ends at" ; // perhaps not ideal
529
527
}
530
528
531
- mod rangeto_len {
532
- let DATA : [ i32 ; 6 ] = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
533
-
534
- let GOOD_INPUT = ..6 ;
535
- let GOOD_OUTPUT = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
529
+ in mod rangeto_len {
530
+ data: [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
536
531
537
- let BAD_INPUT = ..7 ;
538
- const EXPECT_MSG = "out of range" ;
539
-
540
- !!generate_tests!!
532
+ good: data[ ..6 ] == [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
533
+ bad: data[ ..7 ] ;
534
+ message: "out of range" ;
541
535
}
542
536
543
- mod rangetoinclusive_len {
544
- let DATA : [ i32 ; 6 ] = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
545
-
546
- let GOOD_INPUT = ..=5 ;
547
- let GOOD_OUTPUT = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
537
+ in mod rangetoinclusive_len {
538
+ data: [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
548
539
549
- let BAD_INPUT = ..=6 ;
550
- const EXPECT_MSG = "out of range" ;
551
-
552
- !!generate_tests!!
540
+ good: data[ ..=5 ] == [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
541
+ bad: data[ ..=6 ] ;
542
+ message: "out of range" ;
553
543
}
554
544
555
- mod range_len_len {
556
- let DATA : [ i32 ; 6 ] = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
557
-
558
- let GOOD_INPUT = 6 ..6 ;
559
- let GOOD_OUTPUT = [ ] ;
545
+ in mod range_len_len {
546
+ data: [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
560
547
561
- let BAD_INPUT = 7 ..7 ;
562
- const EXPECT_MSG = "out of range" ;
563
-
564
- !!generate_tests!!
548
+ good: data[ 6 ..6 ] == [ ] ;
549
+ bad: data[ 7 ..7 ] ;
550
+ message: "out of range" ;
565
551
}
566
552
567
- mod rangeinclusive_len_len{
568
- let DATA : [ i32 ; 6 ] = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
569
-
570
- let GOOD_INPUT = 6 ..=5 ;
571
- let GOOD_OUTPUT = [ ] ;
572
-
573
- let BAD_INPUT = 7 ..=6 ;
574
- const EXPECT_MSG = "out of range" ;
553
+ in mod rangeinclusive_len_len {
554
+ data: [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
575
555
576
- !!generate_tests!!
556
+ good: data[ 6 ..=5 ] == [ ] ;
557
+ bad: data[ 7 ..=6 ] ;
558
+ message: "out of range" ;
577
559
}
578
560
}
579
561
580
562
panic_cases ! {
581
- mod range_neg_width {
582
- let DATA : [ i32 ; 6 ] = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
583
-
584
- let GOOD_INPUT = 4 ..4 ;
585
- let GOOD_OUTPUT = [ ] ;
586
-
587
- let BAD_INPUT = 4 ..3 ;
588
- const EXPECT_MSG = "but ends at" ;
563
+ in mod range_neg_width {
564
+ data: [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
589
565
590
- !!generate_tests!!
566
+ good: data[ 4 ..4 ] == [ ] ;
567
+ bad: data[ 4 ..3 ] ;
568
+ message: "but ends at" ;
591
569
}
592
570
593
- mod rangeinclusive_neg_width {
594
- let DATA : [ i32 ; 6 ] = [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
571
+ in mod rangeinclusive_neg_width {
572
+ data : [ 0 , 1 , 2 , 3 , 4 , 5 ] ;
595
573
596
- let GOOD_INPUT = 4 ..=3 ;
597
- let GOOD_OUTPUT = [ ] ;
598
-
599
- let BAD_INPUT = 4 ..=2 ;
600
- const EXPECT_MSG = "but ends at" ;
601
-
602
- !!generate_tests!!
574
+ good: data[ 4 ..=3 ] == [ ] ;
575
+ bad: data[ 4 ..=2 ] ;
576
+ message: "but ends at" ;
603
577
}
604
578
}
605
579
606
580
panic_cases ! {
607
- mod rangeinclusive_overflow {
608
- let DATA : [ i32 ; 2 ] = [ 0 , 1 ] ;
581
+ in mod rangeinclusive_overflow {
582
+ data : [ 0 , 1 ] ;
609
583
610
584
// note: using 0 specifically ensures that the result of overflowing is 0..0,
611
585
// so that `get` doesn't simply return None for the wrong reason.
612
- let BAD_INPUT = 0 ..= :: std:: usize :: MAX ;
613
- const EXPECT_MSG = "maximum usize" ;
614
-
615
- !!generate_tests!!
586
+ bad: data[ 0 ..= :: std:: usize :: MAX ] ;
587
+ message: "maximum usize" ;
616
588
}
617
589
618
- mod rangetoinclusive_overflow {
619
- let DATA : [ i32 ; 2 ] = [ 0 , 1 ] ;
620
-
621
- let BAD_INPUT = ..= :: std:: usize :: MAX ;
622
- const EXPECT_MSG = "maximum usize" ;
590
+ in mod rangetoinclusive_overflow {
591
+ data: [ 0 , 1 ] ;
623
592
624
- !!generate_tests!!
593
+ bad: data[ ..= :: std:: usize :: MAX ] ;
594
+ message: "maximum usize" ;
625
595
}
626
596
} // panic_cases!
627
597
}
0 commit comments