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