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