@@ -512,3 +512,212 @@ impl<
512
512
}
513
513
}
514
514
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