@@ -493,3 +493,212 @@ impl<
493493 }
494494}
495495
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