@@ -47,14 +47,13 @@ impl Timestamp {
4747 }
4848 }
4949
50- // TODO add tests for the method
5150 /// Serialize a `Timestamp` to FAT format
5251 pub fn serialize_to_fat ( self ) -> [ u8 ; 4 ] {
5352 let mut data = [ 0u8 ; 4 ] ;
5453
55- let hours = ( u16:: from ( self . hours ) << 11 ) & 0xF800 ;
56- let minutes = ( u16:: from ( self . minutes ) << 5 ) & 0x07E0 ;
57- let seconds = ( u16:: from ( self . seconds / 2 ) ) & 0x001F ;
54+ let hours = ( u16:: from ( self . hours ) << 11 ) & ( 0x1F << 11 ) ;
55+ let minutes = ( u16:: from ( self . minutes ) << 5 ) & ( 0x3F << 5 ) ;
56+ let seconds = ( u16:: from ( self . seconds / 2 ) ) & 0x1F ;
5857 data[ ..2 ] . copy_from_slice ( & ( hours | minutes | seconds) . to_le_bytes ( ) [ ..] ) ;
5958
6059 let year = if self . year_since_1970 < 10 {
@@ -81,7 +80,7 @@ impl Timestamp {
8180 seconds : u8 ,
8281 ) -> Result < Timestamp , & ' static str > {
8382 Ok ( Timestamp {
84- year_since_1970 : if ( 1970 ..=( 1970 + 255 ) ) . contains ( & year) {
83+ year_since_1970 : if ( 1970 ..=2097 ) . contains ( & year) {
8584 ( year - 1970 ) as u8
8685 } else {
8786 return Err ( "Bad year" ) ;
@@ -136,6 +135,55 @@ impl core::fmt::Display for Timestamp {
136135 }
137136}
138137
138+ #[ cfg( test) ]
139+ mod tests {
140+ use super :: * ;
141+
142+ #[ test]
143+ fn date_encode1 ( ) {
144+ // 2018-12-09T19:22:00
145+ let ts = Timestamp :: from_calendar ( 2018 , 12 , 9 , 19 , 21 , 38 ) . unwrap ( ) ;
146+
147+ let bytes = ts. serialize_to_fat ( ) ;
148+
149+ // values taken from disk.img test image
150+ assert_eq ! ( bytes, [ 0xb3 , 0x9a , 0x89 , 0x4d ] , "{:02x?} is wrong" , & bytes) ;
151+ }
152+
153+ #[ test]
154+ fn date_decode1 ( ) {
155+ // 2018-12-09T19:22:00
156+ let ts = Timestamp :: from_calendar ( 2018 , 12 , 9 , 19 , 21 , 38 ) . unwrap ( ) ;
157+
158+ // values taken from disk.img test image
159+ let actual_ts = Timestamp :: from_fat ( 0x4d89 , 0x9ab3 ) ;
160+
161+ assert_eq ! ( ts, actual_ts) ;
162+ }
163+
164+ #[ test]
165+ fn date_encode2 ( ) {
166+ // 2024-10-25T16:31:14
167+ let ts = Timestamp :: from_calendar ( 2024 , 10 , 25 , 16 , 31 , 14 ) . unwrap ( ) ;
168+
169+ let bytes = ts. serialize_to_fat ( ) ;
170+
171+ // values taken from disk.img test image
172+ assert_eq ! ( bytes, [ 0xe7 , 0x83 , 0x59 , 0x59 ] , "{:02x?} is wrong" , & bytes) ;
173+ }
174+
175+ #[ test]
176+ fn date_decode2 ( ) {
177+ // 2024-10-25T16:31:14
178+ let ts = Timestamp :: from_calendar ( 2024 , 10 , 25 , 16 , 31 , 14 ) . unwrap ( ) ;
179+
180+ // values taken from disk.img test image
181+ let actual_ts = Timestamp :: from_fat ( 0x5959 , 0x83e7 ) ;
182+ assert_eq ! ( ts, actual_ts) ;
183+ }
184+ //
185+ }
186+
139187// ****************************************************************************
140188//
141189// End Of File
0 commit comments