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