diff --git a/encompass-cs/Collections/TypedComponentStore.cs b/encompass-cs/Collections/TypedComponentStore.cs index 07db0f1..89dfd8f 100644 --- a/encompass-cs/Collections/TypedComponentStore.cs +++ b/encompass-cs/Collections/TypedComponentStore.cs @@ -22,6 +22,7 @@ namespace Encompass public TComponent Get(int entityID) { + if (!store.ContainsKey(entityID)) { throw new Exceptions.NoComponentOfTypeOnEntityException("No component of type {0} exists on Entity with ID {1}", typeof(TComponent), entityID); } return store[entityID]; } diff --git a/encompass-cs/Exceptions/ComponentNotFoundException.cs b/encompass-cs/Exceptions/ComponentNotFoundException.cs deleted file mode 100644 index 5f1a988..0000000 --- a/encompass-cs/Exceptions/ComponentNotFoundException.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace Encompass.Exceptions -{ - public class ComponentNotFoundException : Exception - { - public ComponentNotFoundException( - string format, - params object[] args - ) : base(string.Format(format, args)) { } - } -} diff --git a/encompass-cs/Exceptions/ComponentTypeMismatchException.cs b/encompass-cs/Exceptions/ComponentTypeMismatchException.cs deleted file mode 100644 index 17caf96..0000000 --- a/encompass-cs/Exceptions/ComponentTypeMismatchException.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace Encompass.Exceptions -{ - public class ComponentTypeMismatchException : Exception - { - public ComponentTypeMismatchException( - string format, - params object[] args - ) : base(string.Format(format, args)) { } - } -} diff --git a/encompass-cs/Exceptions/RepeatUpdateComponentException.cs b/encompass-cs/Exceptions/RepeatUpdateComponentException.cs deleted file mode 100644 index 4b178fb..0000000 --- a/encompass-cs/Exceptions/RepeatUpdateComponentException.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace Encompass.Exceptions -{ - public class RepeatUpdateComponentException : Exception - { - public RepeatUpdateComponentException( - string format, - params object[] args - ) : base(string.Format(format, args)) { } - } -} diff --git a/test/EngineTest.cs b/test/EngineTest.cs index 1836d1d..e9068d9 100644 --- a/test/EngineTest.cs +++ b/test/EngineTest.cs @@ -833,7 +833,7 @@ namespace Tests worldBuilder.AddEngine(new ReadEntityByComponentTypeEngine()); var entity = worldBuilder.CreateEntity(); - worldBuilder.SetComponent(entity, new MockComponent { }); + worldBuilder.SetComponent(entity, new MockComponent()); var world = worldBuilder.Build(); world.Update(0.01); @@ -841,7 +841,69 @@ namespace Tests entity.Should().BeEquivalentTo(readEntity); } + struct MockComponentB : IComponent + { + public MockComponentB(int value) + { + this.value = value; + } + int value; + } + + static MockComponentB getComponentResult; + + [Reads(typeof(MockComponent), typeof(MockComponentB))] + class GetComponentEngine : Engine + { + public override void Update(double dt) + { + getComponentResult = GetComponent(ReadEntity()); + } + } + + [Test] + public void GetComponent() + { + var worldBuilder = new WorldBuilder(); + + var entity = worldBuilder.CreateEntity(); + + worldBuilder.SetComponent(entity, new MockComponent()); + worldBuilder.SetComponent(entity, new MockComponentB(3)); + worldBuilder.AddEngine(new GetComponentEngine()); + + var world = worldBuilder.Build(); + + world.Update(0.01); + + getComponentResult.Should().BeEquivalentTo(new MockComponentB(3)); + } + + [Reads(typeof(MockComponent), typeof(MockComponentB))] + class GetComponentExceptionEngine : Engine + { + public override void Update(double dt) + { + foreach (var entity in ReadEntities()) + { + GetComponent(entity); + } + } + } + + [Test] + public void GetComponentWhenComponentIsNotOnEntity() + { + var worldBuilder = new WorldBuilder(); + worldBuilder.AddEngine(new GetComponentExceptionEngine()); + + var entity = worldBuilder.CreateEntity(); + worldBuilder.SetComponent(entity, new MockComponent()); + + var world = worldBuilder.Build(); + Assert.Throws(() => world.Update(0.01)); + } static Entity[] readEntities; @@ -1606,6 +1668,25 @@ namespace Tests Assert.DoesNotThrow(() => world.Update(0.2)); Assert.DoesNotThrow(() => world.Update(0.25)); } + + [Test] + public void DestroyedEntitiesAreRemovedFromTracking() + { + var worldBuilder = new WorldBuilder(); + + var entity = worldBuilder.CreateEntity(); + worldBuilder.SetComponent(entity, new MockComponent()); + + worldBuilder.AddEngine(new DestroyWithEngine()); + worldBuilder.AddEngine(new ReadEntitiesWithComponentTypeEngine()); + + var world = worldBuilder.Build(); + + world.Update(0.01); + world.Update(0.01); + + readEntities.Should().BeEmpty(); + } } } }