@@ -610,3 +610,212 @@ impl<
610
610
}
611
611
}
612
612
613
+ #[ cfg( test) ]
614
+ mod test {
615
+ use super :: * ;
616
+
617
+ const TEST_SIZE : usize = 64 ;
618
+ const TEST_WORD : usize = 4 ;
619
+ const TEST_PAGE : usize = 16 ;
620
+ type TestFlash = MockFlash < TEST_SIZE , TEST_WORD , TEST_WORD , TEST_PAGE > ;
621
+
622
+ const fn gen_test_data < const N : usize > ( ) -> [ u8 ; N ] {
623
+ let mut data = [ 0u8 ; N ] ;
624
+ let mut i = 0 ;
625
+
626
+ while i < N {
627
+ data[ i] = i as u8 ;
628
+ i += 1 ;
629
+ }
630
+
631
+ data
632
+ }
633
+
634
+ const TEST_DATA : [ u8 ; 64 ] = gen_test_data ( ) ;
635
+
636
+ fn gen_ranges ( aligned : Option < bool > ) -> impl Iterator < Item = ( usize , usize ) > {
637
+ ( 0 ..TEST_SIZE ) . flat_map ( move |off| {
638
+ ( 0 ..=TEST_SIZE - off)
639
+ . filter ( move |len| {
640
+ aligned
641
+ . map ( |aligned| aligned == ( off % TEST_WORD == 0 && len % TEST_WORD == 0 ) )
642
+ . unwrap_or ( true )
643
+ } )
644
+ . map ( move |len| ( off, len) )
645
+ } )
646
+ }
647
+
648
+ #[ test]
649
+ fn aligned_test_ranges ( ) {
650
+ let mut ranges = gen_ranges ( true . into ( ) ) ;
651
+
652
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 0 ) ) ) ;
653
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 4 ) ) ) ;
654
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 8 ) ) ) ;
655
+ for _ in 0 ..13 {
656
+ ranges. next ( ) ;
657
+ }
658
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 64 ) ) ) ;
659
+ assert_eq ! ( ranges. next( ) , Some ( ( 4 , 0 ) ) ) ;
660
+ assert_eq ! ( ranges. next( ) , Some ( ( 4 , 4 ) ) ) ;
661
+ for _ in 0 ..13 {
662
+ ranges. next ( ) ;
663
+ }
664
+ assert_eq ! ( ranges. next( ) , Some ( ( 4 , 60 ) ) ) ;
665
+ assert_eq ! ( ranges. next( ) , Some ( ( 8 , 0 ) ) ) ;
666
+ for _ in 0 ..13 {
667
+ ranges. next ( ) ;
668
+ }
669
+ assert_eq ! ( ranges. next( ) , Some ( ( 8 , 56 ) ) ) ;
670
+ assert_eq ! ( ranges. next( ) , Some ( ( 12 , 0 ) ) ) ;
671
+ for _ in 0 ..12 {
672
+ ranges. next ( ) ;
673
+ }
674
+ assert_eq ! ( ranges. next( ) , Some ( ( 12 , 52 ) ) ) ;
675
+ assert_eq ! ( ranges. next( ) , Some ( ( 16 , 0 ) ) ) ;
676
+ for _ in 0 ..11 {
677
+ ranges. next ( ) ;
678
+ }
679
+ assert_eq ! ( ranges. next( ) , Some ( ( 16 , 48 ) ) ) ;
680
+ assert_eq ! ( ranges. next( ) , Some ( ( 20 , 0 ) ) ) ;
681
+ }
682
+
683
+ #[ test]
684
+ fn not_aligned_test_ranges ( ) {
685
+ let mut ranges = gen_ranges ( false . into ( ) ) ;
686
+
687
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 1 ) ) ) ;
688
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 2 ) ) ) ;
689
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 3 ) ) ) ;
690
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 5 ) ) ) ;
691
+ for _ in 0 ..43 {
692
+ ranges. next ( ) ;
693
+ }
694
+ assert_eq ! ( ranges. next( ) , Some ( ( 0 , 63 ) ) ) ;
695
+ assert_eq ! ( ranges. next( ) , Some ( ( 1 , 0 ) ) ) ;
696
+ }
697
+
698
+ #[ test]
699
+ fn aligned_read_raw ( ) {
700
+ let mut flash = TestFlash :: default ( ) ;
701
+ flash[ ..TEST_DATA . len ( ) ] . copy_from_slice ( & TEST_DATA ) ;
702
+ let mut buffer = [ 0 ; TEST_SIZE ] ;
703
+
704
+ for ( off, len) in gen_ranges ( true . into ( ) ) {
705
+ assert_eq ! ( flash. read( off as u32 , & mut buffer[ ..len] ) , Ok ( ( ) ) ) ;
706
+ assert_eq ! ( buffer[ ..len] , TEST_DATA [ off..] [ ..len] ) ;
707
+ }
708
+ }
709
+
710
+ #[ test]
711
+ fn not_aligned_read_raw ( ) {
712
+ let mut flash = TestFlash :: default ( ) ;
713
+ let mut buffer = [ 0 ; TEST_SIZE ] ;
714
+
715
+ for ( off, len) in gen_ranges ( false . into ( ) ) {
716
+ assert_eq ! (
717
+ flash. read( off as u32 , & mut buffer[ ..len] ) ,
718
+ Err ( NorFlashErrorKind :: NotAligned )
719
+ ) ;
720
+ }
721
+ }
722
+
723
+ #[ test]
724
+ fn aligned_read_rmw ( ) {
725
+ let mut flash = TestFlash :: default ( ) ;
726
+ flash[ ..TEST_DATA . len ( ) ] . copy_from_slice ( & TEST_DATA ) ;
727
+ let mut buffer = [ 0 ; TEST_SIZE ] ;
728
+
729
+ let mut flash_buffer = [ 0 ; TEST_PAGE ] ;
730
+ let mut flash = RmwNorFlashStorage :: new ( & mut flash, & mut flash_buffer) ;
731
+
732
+ for ( off, len) in gen_ranges ( true . into ( ) ) {
733
+ assert_eq ! ( flash. read( off as u32 , & mut buffer[ ..len] ) , Ok ( ( ) ) ) ;
734
+ assert_eq ! ( buffer[ ..len] , TEST_DATA [ off..] [ ..len] ) ;
735
+ }
736
+ }
737
+
738
+ #[ test]
739
+ fn not_aligned_read_rmw ( ) {
740
+ let mut flash = TestFlash :: default ( ) ;
741
+ flash[ ..TEST_DATA . len ( ) ] . copy_from_slice ( & TEST_DATA ) ;
742
+ let mut buffer = [ 0 ; TEST_SIZE ] ;
743
+
744
+ let mut flash_buffer = [ 0 ; TEST_PAGE ] ;
745
+ let mut flash = RmwNorFlashStorage :: new ( & mut flash, & mut flash_buffer) ;
746
+
747
+ for ( off, len) in gen_ranges ( false . into ( ) ) {
748
+ assert_eq ! ( flash. read( off as u32 , & mut buffer[ ..len] ) , Ok ( ( ) ) ) ;
749
+ assert_eq ! ( buffer[ ..len] , TEST_DATA [ off..] [ ..len] ) ;
750
+ }
751
+ }
752
+
753
+ #[ test]
754
+ fn aligned_write_raw ( ) {
755
+ let mut flash = TestFlash :: default ( ) ;
756
+
757
+ for ( off, len) in gen_ranges ( true . into ( ) ) {
758
+ assert_eq ! ( flash. erase( 0 , TEST_SIZE as u32 ) , Ok ( ( ) ) ) ;
759
+ assert_eq ! ( flash. write( off as u32 , & TEST_DATA [ ..len] ) , Ok ( ( ) ) ) ;
760
+ assert_eq ! ( flash[ off..] [ ..len] , TEST_DATA [ ..len] ) ;
761
+ }
762
+ }
763
+
764
+ #[ test]
765
+ fn not_aligned_write_raw ( ) {
766
+ let mut flash = TestFlash :: default ( ) ;
767
+
768
+ for ( off, len) in gen_ranges ( false . into ( ) ) {
769
+ assert_eq ! (
770
+ flash. write( off as u32 , & TEST_DATA [ ..len] ) ,
771
+ Err ( NorFlashErrorKind :: NotAligned )
772
+ ) ;
773
+ }
774
+ }
775
+
776
+ #[ test]
777
+ fn not_aligned_erase_raw ( ) {
778
+ let mut flash = TestFlash :: default ( ) ;
779
+
780
+ for ( off, len) in [
781
+ ( 1usize , TEST_PAGE ) ,
782
+ ( 0 , TEST_PAGE - 1 ) ,
783
+ ( TEST_PAGE , TEST_PAGE + 1 ) ,
784
+ ] {
785
+ assert_eq ! (
786
+ flash. erase( off as u32 , ( off + len) as u32 ) ,
787
+ Err ( NorFlashErrorKind :: NotAligned )
788
+ ) ;
789
+ }
790
+ }
791
+
792
+ #[ test]
793
+ fn aligned_write_rmw ( ) {
794
+ let mut flash = TestFlash :: default ( ) ;
795
+ let mut flash_buffer = [ 0u8 ; TEST_PAGE ] ;
796
+
797
+ for ( off, len) in gen_ranges ( true . into ( ) ) {
798
+ {
799
+ let mut flash = RmwNorFlashStorage :: new ( & mut flash, & mut flash_buffer) ;
800
+ println ! ( "{off}.. #{len}" ) ;
801
+ assert_eq ! ( flash. write( off as u32 , & TEST_DATA [ ..len] ) , Ok ( ( ) ) ) ;
802
+ }
803
+ assert_eq ! ( flash[ off..] [ ..len] , TEST_DATA [ ..len] ) ;
804
+ }
805
+ }
806
+
807
+ #[ test]
808
+ fn not_aligned_write_rmw ( ) {
809
+ let mut flash = TestFlash :: default ( ) ;
810
+ let mut flash_buffer = [ 0u8 ; TEST_PAGE ] ;
811
+
812
+ for ( off, len) in gen_ranges ( false . into ( ) ) {
813
+ {
814
+ let mut flash = RmwNorFlashStorage :: new ( & mut flash, & mut flash_buffer) ;
815
+ println ! ( "{off}.. #{len}" ) ;
816
+ assert_eq ! ( flash. write( off as u32 , & TEST_DATA [ ..len] ) , Ok ( ( ) ) ) ;
817
+ }
818
+ assert_eq ! ( flash[ off..] [ ..len] , TEST_DATA [ ..len] ) ;
819
+ }
820
+ }
821
+ }
0 commit comments