@@ -493,3 +493,212 @@ impl<
493
493
}
494
494
}
495
495
496
+ #[ cfg( test) ]
497
+ mod test {
498
+ use super :: * ;
499
+
500
+ const TEST_SIZE : usize = 64 ;
501
+ const TEST_WORD : usize = 4 ;
502
+ const TEST_PAGE : usize = 16 ;
503
+ type TestFlash = MockFlash < TEST_SIZE , TEST_WORD , TEST_WORD , TEST_PAGE > ;
504
+
505
+ const fn gen_test_data < const N : usize > ( ) -> [ u8 ; N ] {
506
+ let mut data = [ 0u8 ; N ] ;
507
+ let mut i = 0 ;
508
+
509
+ while i < N {
510
+ data[ i] = i as u8 ;
511
+ i += 1 ;
512
+ }
513
+
514
+ data
515
+ }
516
+
517
+ const TEST_DATA : [ u8 ; 64 ] = gen_test_data ( ) ;
518
+
519
+ fn gen_ranges ( aligned : Option < bool > ) -> impl Iterator < Item = ( usize , usize ) > {
520
+ ( 0 ..TEST_SIZE ) . flat_map ( move |off| {
521
+ ( 0 ..=TEST_SIZE - off)
522
+ . filter ( move |len| {
523
+ aligned
524
+ . map ( |aligned| aligned == ( off % TEST_WORD == 0 && len % TEST_WORD == 0 ) )
525
+ . unwrap_or ( true )
526
+ } )
527
+ . map ( move |len| ( off, len) )
528
+ } )
529
+ }
530
+
531
+ #[ test]
532
+ fn aligned_test_ranges ( ) {
533
+ let mut ranges = gen_ranges ( true . into ( ) ) ;
534
+
535
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 0 ) ) ) ;
536
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 4 ) ) ) ;
537
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 8 ) ) ) ;
538
+ for _ in 0 ..13 {
539
+ ranges. next ( ) ;
540
+ }
541
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 64 ) ) ) ;
542
+ assert_eq ! ( ranges. next( ) , Some ( ( 4 , 0 ) ) ) ;
543
+ assert_eq ! ( ranges. next( ) , Some ( ( 4 , 4 ) ) ) ;
544
+ for _ in 0 ..13 {
545
+ ranges. next ( ) ;
546
+ }
547
+ assert_eq ! ( ranges. next( ) , Some ( ( 4 , 60 ) ) ) ;
548
+ assert_eq ! ( ranges. next( ) , Some ( ( 8 , 0 ) ) ) ;
549
+ for _ in 0 ..13 {
550
+ ranges. next ( ) ;
551
+ }
552
+ assert_eq ! ( ranges. next( ) , Some ( ( 8 , 56 ) ) ) ;
553
+ assert_eq ! ( ranges. next( ) , Some ( ( 12 , 0 ) ) ) ;
554
+ for _ in 0 ..12 {
555
+ ranges. next ( ) ;
556
+ }
557
+ assert_eq ! ( ranges. next( ) , Some ( ( 12 , 52 ) ) ) ;
558
+ assert_eq ! ( ranges. next( ) , Some ( ( 16 , 0 ) ) ) ;
559
+ for _ in 0 ..11 {
560
+ ranges. next ( ) ;
561
+ }
562
+ assert_eq ! ( ranges. next( ) , Some ( ( 16 , 48 ) ) ) ;
563
+ assert_eq ! ( ranges. next( ) , Some ( ( 20 , 0 ) ) ) ;
564
+ }
565
+
566
+ #[ test]
567
+ fn not_aligned_test_ranges ( ) {
568
+ let mut ranges = gen_ranges ( false . into ( ) ) ;
569
+
570
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 1 ) ) ) ;
571
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 2 ) ) ) ;
572
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 3 ) ) ) ;
573
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 5 ) ) ) ;
574
+ for _ in 0 ..43 {
575
+ ranges. next ( ) ;
576
+ }
577
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 63 ) ) ) ;
578
+ assert_eq ! ( ranges. next( ) , Some ( ( 1 , 0 ) ) ) ;
579
+ }
580
+
581
+ #[ test]
582
+ fn aligned_read_raw ( ) {
583
+ let mut flash = TestFlash :: default ( ) ;
584
+ flash[ ..TEST_DATA . len ( ) ] . copy_from_slice ( & TEST_DATA ) ;
585
+ let mut buffer = [ 0 ; TEST_SIZE ] ;
586
+
587
+ for ( off, len) in gen_ranges ( true . into ( ) ) {
588
+ assert_eq ! ( flash. read( off as u32 , & mut buffer[ ..len] ) , Ok ( ( ) ) ) ;
589
+ assert_eq ! ( buffer[ ..len] , TEST_DATA [ off..] [ ..len] ) ;
590
+ }
591
+ }
592
+
593
+ #[ test]
594
+ fn not_aligned_read_raw ( ) {
595
+ let mut flash = TestFlash :: default ( ) ;
596
+ let mut buffer = [ 0 ; TEST_SIZE ] ;
597
+
598
+ for ( off, len) in gen_ranges ( false . into ( ) ) {
599
+ assert_eq ! (
600
+ flash. read( off as u32 , & mut buffer[ ..len] ) ,
601
+ Err ( NorFlashErrorKind :: NotAligned )
602
+ ) ;
603
+ }
604
+ }
605
+
606
+ #[ test]
607
+ fn aligned_read_rmw ( ) {
608
+ let mut flash = TestFlash :: default ( ) ;
609
+ flash[ ..TEST_DATA . len ( ) ] . copy_from_slice ( & TEST_DATA ) ;
610
+ let mut buffer = [ 0 ; TEST_SIZE ] ;
611
+
612
+ let mut flash_buffer = [ 0 ; TEST_PAGE ] ;
613
+ let mut flash = RmwNorFlashStorage :: new ( & mut flash, & mut flash_buffer) ;
614
+
615
+ for ( off, len) in gen_ranges ( true . into ( ) ) {
616
+ assert_eq ! ( flash. read( off as u32 , & mut buffer[ ..len] ) , Ok ( ( ) ) ) ;
617
+ assert_eq ! ( buffer[ ..len] , TEST_DATA [ off..] [ ..len] ) ;
618
+ }
619
+ }
620
+
621
+ #[ test]
622
+ fn not_aligned_read_rmw ( ) {
623
+ let mut flash = TestFlash :: default ( ) ;
624
+ flash[ ..TEST_DATA . len ( ) ] . copy_from_slice ( & TEST_DATA ) ;
625
+ let mut buffer = [ 0 ; TEST_SIZE ] ;
626
+
627
+ let mut flash_buffer = [ 0 ; TEST_PAGE ] ;
628
+ let mut flash = RmwNorFlashStorage :: new ( & mut flash, & mut flash_buffer) ;
629
+
630
+ for ( off, len) in gen_ranges ( false . into ( ) ) {
631
+ assert_eq ! ( flash. read( off as u32 , & mut buffer[ ..len] ) , Ok ( ( ) ) ) ;
632
+ assert_eq ! ( buffer[ ..len] , TEST_DATA [ off..] [ ..len] ) ;
633
+ }
634
+ }
635
+
636
+ #[ test]
637
+ fn aligned_write_raw ( ) {
638
+ let mut flash = TestFlash :: default ( ) ;
639
+
640
+ for ( off, len) in gen_ranges ( true . into ( ) ) {
641
+ assert_eq ! ( flash. erase( 0 , TEST_SIZE as u32 ) , Ok ( ( ) ) ) ;
642
+ assert_eq ! ( flash. write( off as u32 , & TEST_DATA [ ..len] ) , Ok ( ( ) ) ) ;
643
+ assert_eq ! ( flash[ off..] [ ..len] , TEST_DATA [ ..len] ) ;
644
+ }
645
+ }
646
+
647
+ #[ test]
648
+ fn not_aligned_write_raw ( ) {
649
+ let mut flash = TestFlash :: default ( ) ;
650
+
651
+ for ( off, len) in gen_ranges ( false . into ( ) ) {
652
+ assert_eq ! (
653
+ flash. write( off as u32 , & TEST_DATA [ ..len] ) ,
654
+ Err ( NorFlashErrorKind :: NotAligned )
655
+ ) ;
656
+ }
657
+ }
658
+
659
+ #[ test]
660
+ fn not_aligned_erase_raw ( ) {
661
+ let mut flash = TestFlash :: default ( ) ;
662
+
663
+ for ( off, len) in [
664
+ ( 1usize , TEST_PAGE ) ,
665
+ ( 0 , TEST_PAGE - 1 ) ,
666
+ ( TEST_PAGE , TEST_PAGE + 1 ) ,
667
+ ] {
668
+ assert_eq ! (
669
+ flash. erase( off as u32 , ( off + len) as u32 ) ,
670
+ Err ( NorFlashErrorKind :: NotAligned )
671
+ ) ;
672
+ }
673
+ }
674
+
675
+ #[ test]
676
+ fn aligned_write_rmw ( ) {
677
+ let mut flash = TestFlash :: default ( ) ;
678
+ let mut flash_buffer = [ 0u8 ; TEST_PAGE ] ;
679
+
680
+ for ( off, len) in gen_ranges ( true . into ( ) ) {
681
+ {
682
+ let mut flash = RmwNorFlashStorage :: new ( & mut flash, & mut flash_buffer) ;
683
+ println ! ( "{off}.. #{len}" ) ;
684
+ assert_eq ! ( flash. write( off as u32 , & TEST_DATA [ ..len] ) , Ok ( ( ) ) ) ;
685
+ }
686
+ assert_eq ! ( flash[ off..] [ ..len] , TEST_DATA [ ..len] ) ;
687
+ }
688
+ }
689
+
690
+ #[ test]
691
+ fn not_aligned_write_rmw ( ) {
692
+ let mut flash = TestFlash :: default ( ) ;
693
+ let mut flash_buffer = [ 0u8 ; TEST_PAGE ] ;
694
+
695
+ for ( off, len) in gen_ranges ( false . into ( ) ) {
696
+ {
697
+ let mut flash = RmwNorFlashStorage :: new ( & mut flash, & mut flash_buffer) ;
698
+ println ! ( "{off}.. #{len}" ) ;
699
+ assert_eq ! ( flash. write( off as u32 , & TEST_DATA [ ..len] ) , Ok ( ( ) ) ) ;
700
+ }
701
+ assert_eq ! ( flash[ off..] [ ..len] , TEST_DATA [ ..len] ) ;
702
+ }
703
+ }
704
+ }
0 commit comments