@@ -55,3 +55,45 @@ impl Mvendorid {
55
55
} )
56
56
}
57
57
}
58
+
59
+ #[ cfg( test) ]
60
+ mod tests {
61
+ use super :: * ;
62
+
63
+ #[ test]
64
+ fn test_mvendorid ( ) {
65
+ ( 0 ..u32:: BITS )
66
+ . map ( |r| ( ( 1u64 << r) - 1 ) as usize )
67
+ . for_each ( |raw| {
68
+ let exp_bank = raw >> 7 ;
69
+ let exp_offset = raw & ( Mvendorid :: CONTINUATION as usize ) ;
70
+ let exp_parity = ( ( 1 - ( exp_offset. count_ones ( ) % 2 ) ) << 7 ) as u8 ;
71
+ let exp_mvendorid = Mvendorid :: from_bits ( raw) ;
72
+
73
+ assert_eq ! ( exp_mvendorid. bank( ) , exp_bank) ;
74
+ assert_eq ! ( exp_mvendorid. offset( ) , exp_offset) ;
75
+
76
+ let mut jedec_iter = exp_mvendorid. jedec_manufacturer ( ) ;
77
+ ( 0 ..exp_bank)
78
+ . for_each ( |_| assert_eq ! ( jedec_iter. next( ) , Some ( Mvendorid :: CONTINUATION ) ) ) ;
79
+ assert_eq ! ( jedec_iter. next( ) , Some ( exp_parity | ( exp_offset as u8 ) ) ) ;
80
+ assert_eq ! ( jedec_iter. next( ) , None ) ;
81
+ } ) ;
82
+
83
+ // ISA example used as a concrete test vector.
84
+
85
+ let exp_bank = 0xc ;
86
+ let exp_offset = 0x0a ;
87
+ let exp_decoded_offset = 0x8a ;
88
+ let raw_mvendorid = 0x60a ;
89
+ let exp_mvendorid = Mvendorid :: from_bits ( raw_mvendorid) ;
90
+
91
+ assert_eq ! ( exp_mvendorid. bank( ) , exp_bank) ;
92
+ assert_eq ! ( exp_mvendorid. offset( ) , exp_offset) ;
93
+
94
+ let mut jedec_iter = exp_mvendorid. jedec_manufacturer ( ) ;
95
+ ( 0 ..exp_bank) . for_each ( |_| assert_eq ! ( jedec_iter. next( ) , Some ( Mvendorid :: CONTINUATION ) ) ) ;
96
+ assert_eq ! ( jedec_iter. next( ) , Some ( exp_decoded_offset) ) ;
97
+ assert_eq ! ( jedec_iter. next( ) , None ) ;
98
+ }
99
+ }
0 commit comments