diff --git a/test/EngineTest.cs b/test/EngineTest.cs index 7d5b73d..b36541d 100644 --- a/test/EngineTest.cs +++ b/test/EngineTest.cs @@ -1238,6 +1238,217 @@ namespace Tests queriedEntities.ToArray().Should().BeEquivalentTo(new Entity[] { entityD }); } + + [Reads(typeof(MockComponent))] + [WritesPending(typeof(MockComponentB))] + [Writes(typeof(MockComponentB), 0)] + class AddPendingComponentEngine : Engine + { + public override void Update(double dt) + { + foreach (var entity in QueryEntities().With()) + { + SetComponent(entity, new MockComponentB()); + } + } + } + + [ReadsPending(typeof(MockComponentB))] + class EntityQueryWithPendingComponentsEngine : Engine + { + private List entities; + + public EntityQueryWithPendingComponentsEngine(List entities) + { + this.entities = entities; + } + + public override void Update(double dt) + { + entities.Clear(); + + entities.AddRange(QueryEntities().With()); + } + } + + [Test] + public void EntitiesWithPendingComponents() + { + var worldBuilder = new WorldBuilder(); + + var entity = worldBuilder.CreateEntity(); + var entityB = worldBuilder.CreateEntity(); + + worldBuilder.SetComponent(entity, new MockComponent()); + + var queriedEntities = new List(); + worldBuilder.AddEngine(new AddPendingComponentEngine()); + worldBuilder.AddEngine(new EntityQueryWithPendingComponentsEngine(queriedEntities)); + + var world = worldBuilder.Build(); + + world.Update(0.01); + + queriedEntities.ToArray().Should().BeEquivalentTo(new Entity[] { entity }); + } + + [ReadsPending(typeof(MockComponentB))] + class EntityQueryWithoutPendingComponentsEngine : Engine + { + private List entities; + + public EntityQueryWithoutPendingComponentsEngine(List entities) + { + this.entities = entities; + } + + public override void Update(double dt) + { + entities.Clear(); + + entities.AddRange(QueryEntities().Without()); + } + } + + [Test] + public void EntitiesWithoutPendingComponents() + { + var worldBuilder = new WorldBuilder(); + + var entity = worldBuilder.CreateEntity(); + var entityB = worldBuilder.CreateEntity(); + + worldBuilder.SetComponent(entity, new MockComponent()); + + var queriedEntities = new List(); + worldBuilder.AddEngine(new AddPendingComponentEngine()); + worldBuilder.AddEngine(new EntityQueryWithoutPendingComponentsEngine(queriedEntities)); + + var world = worldBuilder.Build(); + + world.Update(0.01); + + queriedEntities.ToArray().Should().BeEquivalentTo(new Entity[] { entityB }); + } + + [Reads(typeof(MockComponentC), typeof(MockComponentD))] + [WritesPending(typeof(MockComponent), typeof(MockComponentB))] + [Writes(typeof(MockComponent), 0)] + [Writes(typeof(MockComponentB), 0)] + class ConditionallyAddPendingComponentsEngine : Engine + { + public override void Update(double dt) + { + foreach (var entity in QueryEntities().With()) + { + SetComponent(entity, new MockComponent()); + } + + foreach (var entity in QueryEntities().With()) + { + SetComponent(entity, new MockComponent()); + SetComponent(entity, new MockComponentB()); + } + } + } + + [ReadsPending(typeof(MockComponent), typeof(MockComponentB))] + class EntityQueryWithAndWithoutPendingComponentsEngine : Engine + { + private List entities; + + public EntityQueryWithAndWithoutPendingComponentsEngine(List entities) + { + this.entities = entities; + } + + public override void Update(double dt) + { + entities.Clear(); + + entities.AddRange(QueryEntities().With().Without()); + } + } + + [Test] + public void EntitiesWithAndWithoutPendingComponents() + { + var worldBuilder = new WorldBuilder(); + + var entity = worldBuilder.CreateEntity(); + var entityB = worldBuilder.CreateEntity(); + var entityC = worldBuilder.CreateEntity(); + + worldBuilder.SetComponent(entityB, new MockComponentC()); + worldBuilder.SetComponent(entityC, new MockComponentD()); + + var queriedEntities = new List(); + worldBuilder.AddEngine(new ConditionallyAddPendingComponentsEngine()); + worldBuilder.AddEngine(new EntityQueryWithAndWithoutPendingComponentsEngine(queriedEntities)); + + var world = worldBuilder.Build(); + + world.Update(0.01); + + queriedEntities.ToArray().Should().BeEquivalentTo(new Entity[] { entityB }); + } + + [Reads(typeof(MockComponentC))] + [WritesPending(typeof(MockComponentB))] + [Writes(typeof(MockComponentB), 0)] + class ConditionallyAddPendingComponentEngine : Engine + { + public override void Update(double dt) + { + foreach (var entity in QueryEntities().With()) + { + SetComponent(entity, new MockComponentB()); + } + } + } + + [ReadsPending(typeof(MockComponentB))] + [Reads(typeof(MockComponent))] + class EntityQueryWithPendingAndNonPendingComponents : Engine + { + private List entities; + + public EntityQueryWithPendingAndNonPendingComponents(List entities) + { + this.entities = entities; + } + + public override void Update(double dt) + { + entities.Clear(); + + entities.AddRange(QueryEntities().With().With()); + } + } + + [Test] + public void EntitiesWithPendingAndNonPendingComponents() + { + var worldBuilder = new WorldBuilder(); + + var entity = worldBuilder.CreateEntity(); + var entityB = worldBuilder.CreateEntity(); + var entityC = worldBuilder.CreateEntity(); + + worldBuilder.SetComponent(entityB, new MockComponent()); + worldBuilder.SetComponent(entityB, new MockComponentC()); + worldBuilder.SetComponent(entityC, new MockComponentD()); + + var queriedEntities = new List(); + worldBuilder.AddEngine(new ConditionallyAddPendingComponentEngine()); + worldBuilder.AddEngine(new EntityQueryWithPendingAndNonPendingComponents(queriedEntities)); + + var world = worldBuilder.Build(); + + world.Update(0.01); + + queriedEntities.ToArray().Should().BeEquivalentTo(new Entity[] { entityB }); + } } } }