/ GUNRPG.Tests / CombatEventTimelineRendererTests.cs
CombatEventTimelineRendererTests.cs
1 using GUNRPG.Core.Events; 2 using GUNRPG.Core.Operators; 3 using GUNRPG.Core.Rendering; 4 using Xunit; 5 6 namespace GUNRPG.Tests; 7 8 public class CombatEventTimelineRendererTests 9 { 10 [Fact] 11 public void BuildTimelineEntries_SortsByTimeThenActor() 12 { 13 var player = new Operator("Player"); 14 var enemy = new Operator("Enemy"); 15 var renderer = new CombatEventTimelineRenderer(); 16 17 var events = new List<ISimulationEvent> 18 { 19 new MicroReactionEvent(10, player.Id, 0, actionDurationMs: 0), 20 new MicroReactionEvent(10, enemy.Id, 1, actionDurationMs: 0), 21 new MicroReactionEvent(5, player.Id, 2, actionDurationMs: 0) 22 }; 23 24 var entries = renderer.BuildTimelineEntries( 25 events, 26 player, 27 enemy, 28 new List<CombatEventTimelineEntry> { new("ADS", 1, 3, "Player", "Complete") }); 29 30 Assert.Equal(4, entries.Count); 31 Assert.Equal(1, entries[0].StartTimeMs); 32 Assert.Equal("ADS", entries[0].EventType); 33 Assert.Equal("Player", entries[0].ActorName); 34 Assert.Equal(5, entries[1].StartTimeMs); 35 Assert.Equal("MicroReaction", entries[1].EventType); 36 Assert.Equal("Player", entries[1].ActorName); 37 Assert.Equal("Enemy", entries[2].ActorName); 38 Assert.Equal("Player", entries[3].ActorName); 39 } 40 41 [Fact] 42 public void BuildTimelineEntries_ClampsNegativeStartsAndUsesDurations() 43 { 44 var player = new Operator("Player"); 45 var enemy = new Operator("Enemy"); 46 var renderer = new CombatEventTimelineRenderer(); 47 48 var events = new List<ISimulationEvent> 49 { 50 new ReloadCompleteEvent(100, player, 0, actionDurationMs: 200), 51 new MovementIntervalEvent(200, enemy, distance: 1f, sequenceNumber: 1, intervalDurationMs: 150) 52 }; 53 54 var entries = renderer.BuildTimelineEntries(events, player, enemy); 55 56 Assert.Equal(0, entries[0].StartTimeMs); 57 Assert.Equal(100, entries[0].EndTimeMs); 58 Assert.Equal(50, entries[1].StartTimeMs); 59 Assert.Equal(200, entries[1].EndTimeMs); 60 } 61 }