/ 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  }