From d9756e0c3d04164a7a1400a191de6bd9a04a135b Mon Sep 17 00:00:00 2001 From: Evan Hemsley Date: Sat, 15 Jun 2019 11:40:42 -0700 Subject: [PATCH] update component uses a callback now --- src/Engine.cs | 15 +++++++++++++-- test/EngineTest.cs | 45 ++++++++++++++++++++++++--------------------- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/Engine.cs b/src/Engine.cs index 0400795..c4bdb3c 100644 --- a/src/Engine.cs +++ b/src/Engine.cs @@ -38,11 +38,22 @@ namespace Encompass { return this.componentManager.GetActiveComponentByType(); } - protected void UpdateComponent(TComponent originalComponent, TComponent newComponent) where TComponent : struct, IComponent { + internal void UpdateComponentInWorld(TComponent originalComponent, TComponent newComponent) where TComponent : struct, IComponent { if (mutateComponentTypes.Contains(typeof(TComponent))) { this.componentManager.UpdateComponent(originalComponent, newComponent); } else { - throw new IllegalComponentMutationException("Engine {0} tried to mutate undeclared Component {1}", this.GetType().ToString(), typeof(TComponent).ToString()); + throw new IllegalComponentMutationException("Engine {0} tried to mutate undeclared Component {1}", this.GetType().Name, typeof(TComponent).Name); + } + } + + protected void UpdateComponent(TComponent component, Func updateFunction) where TComponent : struct, IComponent { + var updatedComponent = updateFunction(component); + this.UpdateComponentInWorld(component, updatedComponent); + } + + protected void UpdateComponents(IEnumerable components, Func updateFunction) where TComponent : struct, IComponent { + foreach (var component in components) { + this.UpdateComponent(component, updateFunction); } } } diff --git a/test/EngineTest.cs b/test/EngineTest.cs index ae43df8..20df383 100644 --- a/test/EngineTest.cs +++ b/test/EngineTest.cs @@ -8,14 +8,14 @@ using System; namespace Tests { public class EngineTest { - static IEnumerable components; - static MockComponent component; + static IEnumerable resultComponents; + static MockComponent resultComponent; public class ReadComponentsTestEngine : Engine { public override void Update(float dt) { - components = this.ReadComponents(); + resultComponents = this.ReadComponents(); } } @@ -23,7 +23,7 @@ namespace Tests { { public override void Update(float dt) { - component = this.ReadComponent(); + resultComponent = this.ReadComponent(); } } @@ -50,8 +50,8 @@ namespace Tests { world.Update(0.01f); - Assert.Contains(mockComponent, components.ToList()); - Assert.Contains(mockComponentB, components.ToList()); + Assert.Contains(mockComponent, resultComponents.ToList()); + Assert.Contains(mockComponentB, resultComponents.ToList()); } [Test] @@ -72,7 +72,7 @@ namespace Tests { world.Update(0.01f); - Assert.AreEqual(mockComponent, component); + Assert.AreEqual(mockComponent, resultComponent); } [Test] @@ -104,12 +104,13 @@ namespace Tests { { public override void Update(float dt) { - var originalComponent = this.ReadComponent(); - var newComponent = this.ReadComponent(); - newComponent.myInt = 420; - newComponent.myString = "blaze it"; - this.UpdateComponent(originalComponent, newComponent); - component = this.ReadComponent(); + var component = this.ReadComponent(); + this.UpdateComponent(component, (MockComponent comp) => { + comp.myInt = 420; + comp.myString = "blaze it"; + return comp; + }); + resultComponent = this.ReadComponent(); } } @@ -131,19 +132,20 @@ namespace Tests { world.Update(0.01f); - Assert.AreEqual(420, component.myInt); - Assert.AreEqual("blaze it", component.myString); + Assert.AreEqual(420, resultComponent.myInt); + Assert.AreEqual("blaze it", resultComponent.myString); } public class UndeclaredUpdateComponentTestEngine : Engine { public override void Update(float dt) { - var originalComponent = this.ReadComponent(); - var newComponent = this.ReadComponent(); - newComponent.myInt = 420; - newComponent.myString = "blaze it"; - this.UpdateComponent(originalComponent, newComponent); + var component = this.ReadComponent(); + this.UpdateComponent(component, (MockComponent comp) => { + comp.myInt = 420; + comp.myString = "blaze it"; + return comp; + }); component = this.ReadComponent(); } } @@ -164,7 +166,8 @@ namespace Tests { var world = worldBuilder.Build(); - Assert.Throws(() => world.Update(0.01f)); + var ex =Assert.Throws(() => world.Update(0.01f)); + Assert.That(ex.Message, Is.EqualTo("Engine UndeclaredUpdateComponentTestEngine tried to mutate undeclared Component MockComponent")); } } }