@@ -286,4 +286,48 @@ mod tests {
286286 "event\" with\\ special\n chars"
287287 ) ;
288288 }
289+
290+ #[ test]
291+ fn mixed_v1_v2_replay ( ) {
292+ let events = vec ! [
293+ RuntimeEvent :: new( "app-id" . to_string( ) , vec![ 1 , 2 ] , EventLogVersion :: V1 ) ,
294+ RuntimeEvent :: new( "compose-hash" . to_string( ) , vec![ 3 , 4 ] , EventLogVersion :: V2 ) ,
295+ RuntimeEvent :: new( "instance-id" . to_string( ) , vec![ 5 , 6 ] , EventLogVersion :: V1 ) ,
296+ ] ;
297+ let mr = replay_events :: < Sha384 > ( & events, None ) ;
298+ // Replay manually to verify
299+ let mut expected = Sha384 :: zeros ( ) ;
300+ expected = Sha384 :: hash ( ( expected, events[ 0 ] . digest :: < Sha384 > ( ) ) ) ;
301+ expected = Sha384 :: hash ( ( expected, events[ 1 ] . digest :: < Sha384 > ( ) ) ) ;
302+ expected = Sha384 :: hash ( ( expected, events[ 2 ] . digest :: < Sha384 > ( ) ) ) ;
303+ assert_eq ! ( mr, expected, "mixed v1/v2 replay must work correctly" ) ;
304+ }
305+
306+ #[ test]
307+ fn scale_roundtrip_preserves_event_data ( ) {
308+ use scale:: { Decode , Encode } ;
309+ // V1 event
310+ let v1 = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ 1 , 2 , 3 ] , EventLogVersion :: V1 ) ;
311+ let encoded = v1. encode ( ) ;
312+ let decoded = RuntimeEvent :: decode ( & mut & encoded[ ..] ) . unwrap ( ) ;
313+ assert_eq ! ( decoded. event, v1. event) ;
314+ assert_eq ! ( decoded. payload, v1. payload) ;
315+ // version is #[codec(skip)] so it defaults to V1 on decode
316+ assert_eq ! ( decoded. version, EventLogVersion :: V1 ) ;
317+ }
318+
319+ #[ test]
320+ fn scale_decode_old_format_without_version ( ) {
321+ use scale:: { Decode , Encode } ;
322+ // Encode a current RuntimeEvent (version is skipped by codec),
323+ // then decode — simulates reading data from before version was added
324+ let original =
325+ RuntimeEvent :: new ( "app-id" . to_string ( ) , vec ! [ 0xaa , 0xbb ] , EventLogVersion :: V2 ) ;
326+ let encoded = original. encode ( ) ;
327+ let decoded = RuntimeEvent :: decode ( & mut & encoded[ ..] ) . unwrap ( ) ;
328+ assert_eq ! ( decoded. event, "app-id" ) ;
329+ assert_eq ! ( decoded. payload, vec![ 0xaa , 0xbb ] ) ;
330+ // version is #[codec(skip)] so always decodes as default (V1)
331+ assert_eq ! ( decoded. version, EventLogVersion :: V1 ) ;
332+ }
289333}
0 commit comments