@@ -610,3 +610,212 @@ impl<
610610 }
611611}
612612
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