@@ -559,7 +559,7 @@ public void ReduceCloseLog_ShouldRemoveSpecifiedLog()
559559 }
560560
561561 [ Fact ]
562- public void ReduceLoadEvents_ShouldUpdateLogWithEvents ( )
562+ public void ReduceLoadEvents_ShouldIsolateStateFromOriginalList ( )
563563 {
564564 // Arrange
565565 var logData = new EventLogData ( Constants . LogNameTestLog , PathType . LogName , [ ] ) ;
@@ -576,12 +576,16 @@ public void ReduceLoadEvents_ShouldUpdateLogWithEvents()
576576 // Act
577577 var newState = EventLogReducers . ReduceLoadEvents ( state , action ) ;
578578
579- // Assert
579+ // ImmutableArray is inherently isolated — creating a new one doesn't affect the state
580+ var extendedEvents = events . Add ( EventUtils . CreateTestEvent ( 300 ) ) ;
581+
582+ // Assert - state should not reflect the extension
580583 Assert . Equal ( 2 , newState . ActiveLogs [ Constants . LogNameTestLog ] . Events . Count ) ;
584+ Assert . Equal ( 3 , extendedEvents . Length ) ;
581585 }
582586
583587 [ Fact ]
584- public void ReduceLoadEvents_ShouldIsolateStateFromOriginalList ( )
588+ public void ReduceLoadEvents_ShouldUpdateLogWithEvents ( )
585589 {
586590 // Arrange
587591 var logData = new EventLogData ( Constants . LogNameTestLog , PathType . LogName , [ ] ) ;
@@ -598,12 +602,105 @@ public void ReduceLoadEvents_ShouldIsolateStateFromOriginalList()
598602 // Act
599603 var newState = EventLogReducers . ReduceLoadEvents ( state , action ) ;
600604
601- // ImmutableArray is inherently isolated — creating a new one doesn't affect the state
602- var extendedEvents = events . Add ( EventUtils . CreateTestEvent ( 300 ) ) ;
603-
604- // Assert - state should not reflect the extension
605+ // Assert
605606 Assert . Equal ( 2 , newState . ActiveLogs [ Constants . LogNameTestLog ] . Events . Count ) ;
606- Assert . Equal ( 3 , extendedEvents . Length ) ;
607+ }
608+
609+ [ Fact ]
610+ public void ReduceLoadEvents_WhenLogIdDoesNotMatch_ShouldReturnStateUnchanged ( )
611+ {
612+ // Arrange — open a log, then create stale logData with a different ID
613+ var state = new EventLogState ( ) ;
614+
615+ state = EventLogReducers . ReduceOpenLog ( state ,
616+ new EventLogAction . OpenLog ( Constants . LogNameTestLog , PathType . LogName ) ) ;
617+
618+ // Create stale logData with a new ID (simulating a previous load instance)
619+ var staleLogData = new EventLogData ( Constants . LogNameTestLog , PathType . LogName , [ ] ) ;
620+ var events = ImmutableArray . Create ( EventUtils . CreateTestEvent ( 100 ) ) ;
621+
622+ // Act — stale LoadEvents with mismatched ID
623+ var newState = EventLogReducers . ReduceLoadEvents ( state , new EventLogAction . LoadEvents ( staleLogData , events ) ) ;
624+
625+ // Assert — state unchanged, original log preserved with its ID and empty events
626+ var originalId = state . ActiveLogs [ Constants . LogNameTestLog ] . Id ;
627+ Assert . NotEqual ( originalId , staleLogData . Id ) ;
628+ Assert . Equal ( originalId , newState . ActiveLogs [ Constants . LogNameTestLog ] . Id ) ;
629+ Assert . Empty ( newState . ActiveLogs [ Constants . LogNameTestLog ] . Events ) ;
630+ }
631+
632+ [ Fact ]
633+ public void ReduceLoadEvents_WhenLogIdMatches_ShouldUpdateLog ( )
634+ {
635+ // Arrange
636+ var state = new EventLogState ( ) ;
637+
638+ state = EventLogReducers . ReduceOpenLog ( state ,
639+ new EventLogAction . OpenLog ( Constants . LogNameTestLog , PathType . LogName ) ) ;
640+
641+ var logData = state . ActiveLogs [ Constants . LogNameTestLog ] ;
642+ var events = ImmutableArray . Create ( EventUtils . CreateTestEvent ( 100 ) ) ;
643+
644+ // Act — LoadEvents with matching ID
645+ var newState = EventLogReducers . ReduceLoadEvents ( state , new EventLogAction . LoadEvents ( logData , events ) ) ;
646+
647+ // Assert — events applied
648+ Assert . Single ( newState . ActiveLogs [ Constants . LogNameTestLog ] . Events ) ;
649+ }
650+
651+ [ Fact ]
652+ public void ReduceLoadEvents_WhenLogNotInActiveLogs_ShouldReturnStateUnchanged ( )
653+ {
654+ // Arrange — no logs open
655+ var state = new EventLogState ( ) ;
656+ var logData = new EventLogData ( Constants . LogNameTestLog , PathType . LogName , [ ] ) ;
657+ var events = ImmutableArray . Create ( EventUtils . CreateTestEvent ( 100 ) ) ;
658+
659+ // Act — stale LoadEvents arrives for a closed log
660+ var newState = EventLogReducers . ReduceLoadEvents ( state , new EventLogAction . LoadEvents ( logData , events ) ) ;
661+
662+ // Assert — state unchanged, log NOT resurrected
663+ Assert . Same ( state , newState ) ;
664+ Assert . Empty ( newState . ActiveLogs ) ;
665+ }
666+
667+ [ Fact ]
668+ public void ReduceLoadEventsPartial_WhenLogIdDoesNotMatch_ShouldReturnStateUnchanged ( )
669+ {
670+ // Arrange
671+ var state = new EventLogState ( ) ;
672+
673+ state = EventLogReducers . ReduceOpenLog ( state ,
674+ new EventLogAction . OpenLog ( Constants . LogNameTestLog , PathType . LogName ) ) ;
675+
676+ var staleLogData = new EventLogData ( Constants . LogNameTestLog , PathType . LogName , [ ] ) ;
677+ var events = ImmutableArray . Create ( EventUtils . CreateTestEvent ( 100 ) ) ;
678+
679+ // Act — stale partial with mismatched ID
680+ var newState = EventLogReducers . ReduceLoadEventsPartial ( state ,
681+ new EventLogAction . LoadEventsPartial ( staleLogData , events ) ) ;
682+
683+ // Assert — state unchanged, original log preserved with its ID
684+ var originalId = state . ActiveLogs [ Constants . LogNameTestLog ] . Id ;
685+ Assert . NotEqual ( originalId , staleLogData . Id ) ;
686+ Assert . Equal ( originalId , newState . ActiveLogs [ Constants . LogNameTestLog ] . Id ) ;
687+ Assert . Empty ( newState . ActiveLogs [ Constants . LogNameTestLog ] . Events ) ;
688+ }
689+
690+ [ Fact ]
691+ public void ReduceLoadEventsPartial_WhenLogNotInActiveLogs_ShouldReturnStateUnchanged ( )
692+ {
693+ // Arrange — no logs open
694+ var state = new EventLogState ( ) ;
695+ var logData = new EventLogData ( Constants . LogNameTestLog , PathType . LogName , [ ] ) ;
696+ var events = ImmutableArray . Create ( EventUtils . CreateTestEvent ( 100 ) ) ;
697+
698+ // Act
699+ var newState = EventLogReducers . ReduceLoadEventsPartial ( state ,
700+ new EventLogAction . LoadEventsPartial ( logData , events ) ) ;
701+
702+ // Assert
703+ Assert . Same ( state , newState ) ;
607704 }
608705
609706 [ Fact ]
0 commit comments