@@ -434,3 +434,125 @@ impl<F> ops::IndexMut<ops::RangeFull> for FieldVec<F> {
434
434
& mut self . inner_a [ ..self . len ] [ index]
435
435
}
436
436
}
437
+
438
+ #[ cfg( test) ]
439
+ mod tests {
440
+ use super :: * ;
441
+ use crate :: { Fe1024 , Fe32 } ;
442
+
443
+ #[ test]
444
+ fn push_pop ( ) {
445
+ let mut x: FieldVec < _ > = ( 0 ..NO_ALLOC_MAX_LENGTH ) . collect ( ) ;
446
+ let x_1: FieldVec < _ > = ( 0 ..NO_ALLOC_MAX_LENGTH - 1 ) . collect ( ) ;
447
+
448
+ assert_eq ! ( x. len( ) , NO_ALLOC_MAX_LENGTH ) ;
449
+ assert ! ( !x. is_empty( ) ) ;
450
+
451
+ assert_eq ! ( x. pop( ) , Some ( NO_ALLOC_MAX_LENGTH - 1 ) ) ;
452
+ assert_eq ! ( x, x_1) ;
453
+ x. push ( NO_ALLOC_MAX_LENGTH - 1 ) ;
454
+
455
+ let mut y: FieldVec < _ > = None . into_iter ( ) . collect ( ) ;
456
+ for i in 0 ..NO_ALLOC_MAX_LENGTH {
457
+ y. push ( i) ;
458
+ assert_eq ! ( y[ i] , i) ;
459
+ y[ i] = i + 1 ;
460
+ assert_eq ! ( y[ i] , i + 1 ) ;
461
+ y[ i] -= 1 ;
462
+ }
463
+ assert_eq ! ( x, y) ;
464
+
465
+ for i in ( 0 ..NO_ALLOC_MAX_LENGTH ) . rev ( ) {
466
+ assert_eq ! ( y. pop( ) , Some ( i) ) ;
467
+ }
468
+ assert_eq ! ( y. len( ) , 0 ) ;
469
+ assert ! ( y. is_empty( ) ) ;
470
+ }
471
+
472
+ #[ test]
473
+ fn iter_slice ( ) {
474
+ let mut x: FieldVec < _ > = ( 0 ..NO_ALLOC_MAX_LENGTH ) . collect ( ) ;
475
+ assert ! ( x. iter( ) . copied( ) . eq( 0 ..NO_ALLOC_MAX_LENGTH ) ) ;
476
+ assert ! ( x[ ..] . iter( ) . copied( ) . eq( 0 ..NO_ALLOC_MAX_LENGTH ) ) ;
477
+ assert ! ( x[ 0 ..] . iter( ) . copied( ) . eq( 0 ..NO_ALLOC_MAX_LENGTH ) ) ;
478
+ assert ! ( x[ ..NO_ALLOC_MAX_LENGTH ] . iter( ) . copied( ) . eq( 0 ..NO_ALLOC_MAX_LENGTH ) ) ;
479
+ assert ! ( x[ 1 ..] . iter( ) . copied( ) . eq( 1 ..NO_ALLOC_MAX_LENGTH ) ) ;
480
+ assert ! ( x[ ..NO_ALLOC_MAX_LENGTH - 1 ] . iter( ) . copied( ) . eq( 0 ..NO_ALLOC_MAX_LENGTH - 1 ) ) ;
481
+ assert ! ( x[ 1 ..NO_ALLOC_MAX_LENGTH - 1 ] . iter( ) . copied( ) . eq( 1 ..NO_ALLOC_MAX_LENGTH - 1 ) ) ;
482
+
483
+ // mutable slicing
484
+ x[ ..] . reverse ( ) ;
485
+ assert ! ( x. iter( ) . copied( ) . eq( ( 0 ..NO_ALLOC_MAX_LENGTH ) . rev( ) ) ) ;
486
+ x[ ..NO_ALLOC_MAX_LENGTH ] . reverse ( ) ;
487
+ assert ! ( x. iter( ) . copied( ) . eq( 0 ..NO_ALLOC_MAX_LENGTH ) ) ;
488
+ x[ 0 ..] . reverse ( ) ;
489
+ assert ! ( x. iter( ) . copied( ) . eq( ( 0 ..NO_ALLOC_MAX_LENGTH ) . rev( ) ) ) ;
490
+ x[ 0 ..NO_ALLOC_MAX_LENGTH ] . reverse ( ) ;
491
+ assert ! ( x. iter( ) . copied( ) . eq( 0 ..NO_ALLOC_MAX_LENGTH ) ) ;
492
+
493
+ for elem in x. iter_mut ( ) {
494
+ * elem += 1 ;
495
+ }
496
+ assert ! ( x. iter( ) . copied( ) . eq( 1 ..NO_ALLOC_MAX_LENGTH + 1 ) ) ;
497
+ }
498
+
499
+ #[ test]
500
+ fn field_ops ( ) {
501
+ let qs: FieldVec < _ > = FieldVec :: from_powers ( Fe32 :: Q , NO_ALLOC_MAX_LENGTH - 1 ) ;
502
+ let ps: FieldVec < _ > = FieldVec :: from_powers ( Fe32 :: P , NO_ALLOC_MAX_LENGTH - 1 ) ;
503
+ let pzr: FieldVec < _ > = FieldVec :: from_powers ( Fe32 :: Z , 3 ) ;
504
+
505
+ assert_eq ! ( qs. len( ) , NO_ALLOC_MAX_LENGTH ) ;
506
+ assert_eq ! ( ps. len( ) , NO_ALLOC_MAX_LENGTH ) ;
507
+ assert_eq ! ( pzr. len( ) , 4 ) ;
508
+
509
+ let pzr = pzr. lift :: < Fe32 > ( ) ; // should work and be a no-op
510
+
511
+ // This is somewhat weird behavior but mathematically reasonable. The
512
+ // `from_powers` constructor shouldn't ever be called with 0 as a base.
513
+ // If you need a particular different output from this call, feel free
514
+ // to change this test....but think twice about what you're doing.
515
+ assert ! ( qs. iter( ) . copied( ) . eq( Some ( Fe32 :: P )
516
+ . into_iter( )
517
+ . chain( iter:: repeat( Fe32 :: Q ) . take( NO_ALLOC_MAX_LENGTH - 1 ) ) ) ) ;
518
+ // These checks though are correct and unambiguous.
519
+ assert ! ( ps. iter( ) . copied( ) . eq( iter:: repeat( Fe32 :: P ) . take( NO_ALLOC_MAX_LENGTH ) ) ) ;
520
+ assert_eq ! ( pzr. iter( ) . copied( ) . collect:: <Vec <_>>( ) , [ Fe32 :: P , Fe32 :: Z , Fe32 :: Y , Fe32 :: G , ] ) ;
521
+
522
+ let pow2 = pzr. clone ( ) . mul_pointwise ( & pzr) ;
523
+ assert_eq ! ( pow2. iter( ) . copied( ) . collect:: <Vec <_>>( ) , [ Fe32 :: P , Fe32 :: Y , Fe32 :: S , Fe32 :: J , ] ) ;
524
+
525
+ let lifted = pzr. lift :: < Fe1024 > ( ) ;
526
+ assert_eq ! (
527
+ lifted. iter( ) . copied( ) . collect:: <Vec <_>>( ) ,
528
+ [
529
+ Fe1024 :: from( Fe32 :: P ) ,
530
+ Fe1024 :: from( Fe32 :: Z ) ,
531
+ Fe1024 :: from( Fe32 :: Y ) ,
532
+ Fe1024 :: from( Fe32 :: G ) ,
533
+ ]
534
+ ) ;
535
+ }
536
+
537
+ #[ test]
538
+ fn construct_too_far ( ) {
539
+ let x: FieldVec < _ > = ( 0 ..NO_ALLOC_MAX_LENGTH + 1 ) . collect ( ) ;
540
+ let y: FieldVec < _ > = FieldVec :: from_powers ( Fe32 :: Q , NO_ALLOC_MAX_LENGTH ) ;
541
+ assert_eq ! ( x. len( ) , NO_ALLOC_MAX_LENGTH + 1 ) ;
542
+ assert_eq ! ( y. len( ) , NO_ALLOC_MAX_LENGTH + 1 ) ;
543
+ }
544
+
545
+ #[ test]
546
+ #[ cfg_attr( not( feature = "alloc" ) , should_panic) ]
547
+ fn access_too_far ( ) {
548
+ let x: FieldVec < _ > = ( 0 ..NO_ALLOC_MAX_LENGTH + 1 ) . collect ( ) ;
549
+ let _ = x[ 0 ] ;
550
+ }
551
+
552
+ #[ test]
553
+ #[ cfg_attr( not( feature = "alloc" ) , should_panic) ]
554
+ fn push_too_far ( ) {
555
+ let mut x: FieldVec < _ > = ( 0 ..NO_ALLOC_MAX_LENGTH ) . collect ( ) ;
556
+ x. push ( 100 ) ;
557
+ }
558
+ }
0 commit comments