From e0b49a0c19b3c4d1852ba85c420ee226c1efc7c6 Mon Sep 17 00:00:00 2001 From: Noah Stolk <31079637+NoahStolk@users.noreply.github.com> Date: Sun, 15 Oct 2023 01:58:28 +0200 Subject: [PATCH] Fix not adding new entity type and not incrementing next entity IDs on event insert --- .../ReplayEventsData.cs | 15 ++ .../ReplayEventsEditingTests.cs | 129 ++++++++++++++++++ 2 files changed, 144 insertions(+) diff --git a/src/DevilDaggersInfo.Core.Replay/ReplayEventsData.cs b/src/DevilDaggersInfo.Core.Replay/ReplayEventsData.cs index 0a2f112..3b69f05 100644 --- a/src/DevilDaggersInfo.Core.Replay/ReplayEventsData.cs +++ b/src/DevilDaggersInfo.Core.Replay/ReplayEventsData.cs @@ -93,6 +93,21 @@ public void InsertEvent(int index, IEvent e) throw new ArgumentOutOfRangeException(nameof(index)); _events.Insert(index, e); + if (e is IEntitySpawnEvent spawnEvent) + { + // TODO: EntityId should be automatically calculated and not taken from the event. + _entityTypes.Insert(spawnEvent.EntityId, spawnEvent.EntityType); + + // Increment all entity IDs that are higher than the added entity ID. + for (int i = 0; i < _events.Count; i++) + { + if (i == index) + continue; + + if (_events[i] is IEntitySpawnEvent otherSpawnEvent && otherSpawnEvent.EntityId >= spawnEvent.EntityId) + otherSpawnEvent.EntityId++; + } + } int? containingTick = null; for (int i = 0; i < _eventOffsetsPerTick.Count; i++) diff --git a/src/test/DevilDaggersInfo.Core.Replay.Test/ReplayEventsEditingTests.cs b/src/test/DevilDaggersInfo.Core.Replay.Test/ReplayEventsEditingTests.cs index 1e951f4..c135c5a 100644 --- a/src/test/DevilDaggersInfo.Core.Replay.Test/ReplayEventsEditingTests.cs +++ b/src/test/DevilDaggersInfo.Core.Replay.Test/ReplayEventsEditingTests.cs @@ -300,4 +300,133 @@ public void RemoveAllEventsReverse() Assert.AreEqual(EntityType.Zero, _replay.EventsData.EntityTypes[0]); } + + [TestMethod] + public void InsertGemEventAtStart() + { + _replay.EventsData.InsertEvent(0, new GemEvent()); + + // There should be one new event. + Assert.AreEqual(_eventCount + 1, _replay.EventsData.Events.Count); + + // There shouldn't be any new ticks or entities. + Assert.AreEqual(_tickCount, _replay.EventsData.EventOffsetsPerTick.Count); + Assert.AreEqual(_entityCount, _replay.EventsData.EntityTypes.Count); + + // Original data should be unchanged. + ValidateOriginalEntityTypes(); + + // Entity IDs should be unchanged, but their indexes should be incremented. + AssertEntityId(_replay.EventsData.Events[3], 1); + AssertEntityId(_replay.EventsData.Events[4], 2); + AssertEntityId(_replay.EventsData.Events[25], 3); + AssertEntityId(_replay.EventsData.Events[46], 4); + AssertEntityId(_replay.EventsData.Events[67], 5); + + int expectedOffset = 0; + for (int i = 0; i < _tickCount; i++) + { + int offset = _replay.EventsData.EventOffsetsPerTick[i]; + Assert.AreEqual(expectedOffset, offset); + + expectedOffset++; // Inputs event. + + if (i == 0) + expectedOffset += 2; // Hit event 53333... and Gem event. + else if (i == 1) + expectedOffset += 2; // Squid and Skull spawn events. + else if (i is 21 or 41 or 61) + expectedOffset++; // Skull spawn event. + } + } + + [TestMethod] + public void InsertGemEvent() + { + _replay.EventsData.InsertEvent(10, new GemEvent()); + + // There should be one new event. + Assert.AreEqual(_eventCount + 1, _replay.EventsData.Events.Count); + + // There shouldn't be any new ticks or entities. + Assert.AreEqual(_tickCount, _replay.EventsData.EventOffsetsPerTick.Count); + Assert.AreEqual(_entityCount, _replay.EventsData.EntityTypes.Count); + + // Original data should be unchanged. + ValidateOriginalEntityTypes(); + + // Entity IDs should be unchanged, but their indexes should be incremented. + AssertEntityId(_replay.EventsData.Events[2], 1); + AssertEntityId(_replay.EventsData.Events[3], 2); + AssertEntityId(_replay.EventsData.Events[25], 3); + AssertEntityId(_replay.EventsData.Events[46], 4); + AssertEntityId(_replay.EventsData.Events[67], 5); + + int expectedOffset = 0; + for (int i = 0; i < _tickCount; i++) + { + int offset = _replay.EventsData.EventOffsetsPerTick[i]; + Assert.AreEqual(expectedOffset, offset); + + expectedOffset++; // Inputs event. + + if (i == 0) + expectedOffset++; // Hit event 53333... + else if (i == 1) + expectedOffset += 2; // Squid and Skull spawn events. + else if (i == 7) + expectedOffset++; // Gem event. + else if (i is 21 or 41 or 61) + expectedOffset++; // Skull spawn event. + } + } + + // TODO: Add tests: InsertSpawnEventAtStart, InsertInputsEventAtStart, InsertInputsEvent. + + [TestMethod] + public void InsertSpawnEvent() + { + _replay.EventsData.InsertEvent(10, new ThornSpawnEvent(3, -1, default, 0)); + + // There should be one new event and one new entity. + Assert.AreEqual(_eventCount + 1, _replay.EventsData.Events.Count); + Assert.AreEqual(_entityCount + 1, _replay.EventsData.EntityTypes.Count); + + // There shouldn't be any new ticks. + Assert.AreEqual(_tickCount, _replay.EventsData.EventOffsetsPerTick.Count); + + // The new entity should be a Thorn. + Assert.AreEqual(EntityType.Zero, _replay.EventsData.EntityTypes[0]); + Assert.AreEqual(EntityType.Squid1, _replay.EventsData.EntityTypes[1]); + Assert.AreEqual(EntityType.Skull1, _replay.EventsData.EntityTypes[2]); + Assert.AreEqual(EntityType.Thorn, _replay.EventsData.EntityTypes[3]); + Assert.AreEqual(EntityType.Skull1, _replay.EventsData.EntityTypes[4]); + Assert.AreEqual(EntityType.Skull1, _replay.EventsData.EntityTypes[5]); + Assert.AreEqual(EntityType.Skull1, _replay.EventsData.EntityTypes[6]); + + AssertEntityId(_replay.EventsData.Events[2], 1); + AssertEntityId(_replay.EventsData.Events[3], 2); + AssertEntityId(_replay.EventsData.Events[10], 3); + AssertEntityId(_replay.EventsData.Events[25], 4); + AssertEntityId(_replay.EventsData.Events[46], 5); + AssertEntityId(_replay.EventsData.Events[67], 6); + + int expectedOffset = 0; + for (int i = 0; i < _tickCount; i++) + { + int offset = _replay.EventsData.EventOffsetsPerTick[i]; + Assert.AreEqual(expectedOffset, offset); + + expectedOffset++; // Inputs event. + + if (i == 0) + expectedOffset++; // Hit event 53333... + else if (i == 1) + expectedOffset += 2; // Squid and Skull spawn events. + else if (i == 7) + expectedOffset++; // Thorn spawn event. + else if (i is 21 or 41 or 61) + expectedOffset++; // Skull spawn event. + } + } }