/ GUNRPG.Tests / EventQueueTests.cs
EventQueueTests.cs
  1  using GUNRPG.Core.Events;
  2  using GUNRPG.Core.Operators;
  3  using Xunit;
  4  
  5  namespace GUNRPG.Tests;
  6  
  7  public class EventQueueTests
  8  {
  9      private class TestEvent : ISimulationEvent
 10      {
 11          public long EventTimeMs { get; }
 12          public Guid OperatorId { get; }
 13          public int SequenceNumber { get; }
 14          public bool Executed { get; private set; }
 15  
 16          public TestEvent(long timeMs, Guid operatorId, int sequence)
 17          {
 18              EventTimeMs = timeMs;
 19              OperatorId = operatorId;
 20              SequenceNumber = sequence;
 21          }
 22  
 23          public bool Execute()
 24          {
 25              Executed = true;
 26              return false;
 27          }
 28      }
 29  
 30  
 31      [Fact]
 32      public void EventQueue_StartsEmpty()
 33      {
 34          var queue = new EventQueue();
 35          Assert.Equal(0, queue.Count);
 36      }
 37  
 38      [Fact]
 39      public void Schedule_AddsEvent()
 40      {
 41          var queue = new EventQueue();
 42          var evt = new TestEvent(100, Guid.NewGuid(), 0);
 43          
 44          queue.Schedule(evt);
 45          
 46          Assert.Equal(1, queue.Count);
 47      }
 48  
 49      [Fact]
 50      public void DequeueNext_ReturnsEventsInOrder()
 51      {
 52          var queue = new EventQueue();
 53          var operatorId = Guid.NewGuid();
 54          
 55          var evt1 = new TestEvent(100, operatorId, 0);
 56          var evt2 = new TestEvent(50, operatorId, 1);
 57          var evt3 = new TestEvent(200, operatorId, 2);
 58          
 59          queue.Schedule(evt1);
 60          queue.Schedule(evt2);
 61          queue.Schedule(evt3);
 62          
 63          var first = queue.DequeueNext();
 64          Assert.Equal(50, first!.EventTimeMs);
 65          
 66          var second = queue.DequeueNext();
 67          Assert.Equal(100, second!.EventTimeMs);
 68          
 69          var third = queue.DequeueNext();
 70          Assert.Equal(200, third!.EventTimeMs);
 71      }
 72  
 73      [Fact]
 74      public void RemoveEventsForOperator_RemovesAllOperatorEvents()
 75      {
 76          var queue = new EventQueue();
 77          var op1 = Guid.Parse("00000000-0000-0000-0000-000000000001");
 78          var op2 = Guid.Parse("00000000-0000-0000-0000-000000000002");
 79          
 80          queue.Schedule(new TestEvent(100, op1, 0));
 81          queue.Schedule(new TestEvent(150, op2, 1));
 82          queue.Schedule(new TestEvent(200, op1, 2));
 83          
 84          Assert.Equal(3, queue.Count);
 85          
 86          queue.RemoveEventsForOperator(op1);
 87          
 88          Assert.Equal(1, queue.Count);
 89          var remaining = queue.DequeueNext();
 90          Assert.Equal(op2, remaining!.OperatorId);
 91      }
 92  
 93      [Fact]
 94      public void Clear_RemovesAllEvents()
 95      {
 96          var queue = new EventQueue();
 97          queue.Schedule(new TestEvent(100, Guid.NewGuid(), 0));
 98          queue.Schedule(new TestEvent(200, Guid.NewGuid(), 1));
 99          
100          queue.Clear();
101          
102          Assert.Equal(0, queue.Count);
103      }
104  
105      [Fact]
106      public void EventQueue_OrdersEventsByTimeThenOperator()
107      {
108          var queue = new EventQueue();
109          var op1 = Guid.Parse("00000000-0000-0000-0000-000000000001");
110          var op2 = Guid.Parse("00000000-0000-0000-0000-000000000002");
111  
112          queue.Schedule(new TestEvent(50, op2, 1));
113          queue.Schedule(new TestEvent(50, op1, 0));
114          queue.Schedule(new TestEvent(25, op1, 2));
115  
116          var first = queue.DequeueNext();
117          var second = queue.DequeueNext();
118          var third = queue.DequeueNext();
119  
120          Assert.Equal(25, first!.EventTimeMs);
121          Assert.Equal(50, second!.EventTimeMs);
122          Assert.Equal(50, third!.EventTimeMs);
123          Assert.Contains(second.OperatorId, new[] { op1, op2 });
124          Assert.Contains(third.OperatorId, new[] { op1, op2 });
125          Assert.NotEqual(second.OperatorId, third.OperatorId);
126      }
127  }