move all methods off of Entity
							parent
							
								
									9b58473ae8
								
							
						
					
					
						commit
						64f6e13216
					
				|  | @ -18,10 +18,6 @@ namespace Encompass | |||
|         private readonly List<Guid> activeComponents = new List<Guid>(); | ||||
|         private readonly List<Guid> inactiveComponents = new List<Guid>(); | ||||
| 
 | ||||
|         private readonly HashSet<Guid> componentsToActivate = new HashSet<Guid>(); | ||||
|         private readonly HashSet<Guid> componentsToDeactivate = new HashSet<Guid>(); | ||||
|         private readonly HashSet<Guid> componentsToRemove = new HashSet<Guid>(); | ||||
| 
 | ||||
|         //shared references with EntityManager | ||||
|         private readonly HashSet<Guid> entitiesWithAddedComponents; | ||||
|         private readonly HashSet<Guid> entitiesWithRemovedComponents; | ||||
|  | @ -60,7 +56,7 @@ namespace Encompass | |||
|             componentIDToEntityID[componentID] = entityID; | ||||
| 
 | ||||
|             inactiveComponents.Add(componentID); | ||||
|             MarkForActivation(componentID); | ||||
|             Activate(componentID); | ||||
| 
 | ||||
|             entitiesWithAddedComponents.Add(entityID); | ||||
| 
 | ||||
|  | @ -158,91 +154,58 @@ namespace Encompass | |||
|         { | ||||
|             var componentIDs = entityIDToComponentIDs[entityID]; | ||||
| 
 | ||||
|             foreach (var componentID in componentIDs) | ||||
|             for (int i = componentIDs.Count - 1; i >= 0; i--) | ||||
|             { | ||||
|                 MarkForRemoval(componentID); | ||||
|                 Remove(componentIDs[i]); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         internal void MarkForActivation(Guid componentID) | ||||
|         internal void Activate(Guid componentID) | ||||
|         { | ||||
|             componentsToActivate.Add(componentID); | ||||
|             if (inactiveComponents.Remove(componentID)) | ||||
|             { | ||||
|                 activeComponents.Add(componentID); | ||||
|             } | ||||
| 
 | ||||
|             var entityID = GetEntityIDByComponentID(componentID); | ||||
|             entitiesWithAddedComponents.Add(entityID); | ||||
|         } | ||||
| 
 | ||||
|         internal void MarkForDeactivation(Guid componentID) | ||||
|         internal void Deactivate(Guid componentID) | ||||
|         { | ||||
|             componentsToDeactivate.Add(componentID); | ||||
|             if (activeComponents.Remove(componentID)) | ||||
|             { | ||||
|                 inactiveComponents.Add(componentID); | ||||
|             } | ||||
| 
 | ||||
|             var entityID = GetEntityIDByComponentID(componentID); | ||||
|             entitiesWithRemovedComponents.Add(entityID); | ||||
|         } | ||||
| 
 | ||||
|         internal void MarkForRemoval(Guid componentID) | ||||
|         internal void Remove(Guid componentID) | ||||
|         { | ||||
|             componentsToRemove.Add(componentID); | ||||
|             var component = IDToComponent[componentID]; | ||||
|             var type = componentIDToType[componentID]; | ||||
| 
 | ||||
|             activeComponents.Remove(componentID); | ||||
|             inactiveComponents.Remove(componentID); | ||||
| 
 | ||||
|             var entityID = componentIDToEntityID[componentID]; | ||||
|             if (entityIDToComponentIDs.ContainsKey(entityID)) | ||||
|             { | ||||
|                 entityIDToComponentIDs[entityID].Remove(componentID); | ||||
|             } | ||||
| 
 | ||||
|             IDToComponent.Remove(componentID); | ||||
|             componentIDToType.Remove(componentID); | ||||
|             componentIDToEntityID.Remove(componentID); | ||||
|             typeToComponentIDs[type].Remove(componentID); | ||||
| 
 | ||||
|             drawLayerManager.UnRegisterComponentWithLayer(componentID); | ||||
| 
 | ||||
|             var entityID = GetEntityIDByComponentID(componentID); | ||||
|             entitiesWithRemovedComponents.Add(entityID); | ||||
|         } | ||||
| 
 | ||||
|         internal void ActivateMarkedComponents() | ||||
|         { | ||||
|             foreach (var componentID in componentsToActivate) | ||||
|             { | ||||
|                 var component = IDToComponent[componentID]; | ||||
|                 if (inactiveComponents.Remove(componentID)) | ||||
|                 { | ||||
|                     activeComponents.Add(componentID); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             componentsToActivate.Clear(); | ||||
|         } | ||||
| 
 | ||||
|         internal void DeactivateMarkedComponents() | ||||
|         { | ||||
|             foreach (var componentID in componentsToDeactivate) | ||||
|             { | ||||
|                 var component = IDToComponent[componentID]; | ||||
|                 if (activeComponents.Remove(componentID)) | ||||
|                 { | ||||
|                     inactiveComponents.Add(componentID); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             componentsToDeactivate.Clear(); | ||||
|         } | ||||
| 
 | ||||
|         public void RemoveMarkedComponents() | ||||
|         { | ||||
|             foreach (var componentID in componentsToRemove) | ||||
|             { | ||||
|                 var component = IDToComponent[componentID]; | ||||
|                 var type = componentIDToType[componentID]; | ||||
| 
 | ||||
|                 activeComponents.Remove(componentID); | ||||
|                 inactiveComponents.Remove(componentID); | ||||
| 
 | ||||
|                 var entityID = componentIDToEntityID[componentID]; | ||||
|                 if (entityIDToComponentIDs.ContainsKey(entityID)) | ||||
|                 { | ||||
|                     entityIDToComponentIDs[entityID].Remove(componentID); | ||||
|                 } | ||||
| 
 | ||||
|                 IDToComponent.Remove(componentID); | ||||
|                 componentIDToType.Remove(componentID); | ||||
|                 componentIDToEntityID.Remove(componentID); | ||||
|                 typeToComponentIDs[type].Remove(componentID); | ||||
| 
 | ||||
|                 drawLayerManager.UnRegisterComponentWithLayer(componentID); | ||||
|             } | ||||
| 
 | ||||
|             componentsToRemove.Clear(); | ||||
|         } | ||||
| 
 | ||||
|         public void RegisterDestroyedEntity(Guid entityID) | ||||
|         { | ||||
|             entityIDToComponentIDs.Remove(entityID); | ||||
|  |  | |||
|  | @ -107,6 +107,68 @@ namespace Encompass | |||
|             return componentManager.GetActiveComponentByType<TComponent>(); | ||||
|         } | ||||
| 
 | ||||
|         protected Guid AddComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct, IComponent | ||||
|         { | ||||
|             if (!writeTypes.Contains(typeof(TComponent))) | ||||
|             { | ||||
|                 throw new IllegalWriteException("Engine {0} tried to write undeclared Component {1}", this.GetType().Name, typeof(TComponent).Name); | ||||
|             } | ||||
| 
 | ||||
|             return componentManager.AddComponent(entity.ID, component); | ||||
|         } | ||||
| 
 | ||||
|         protected Guid AddDrawComponent<TComponent>(Entity entity, TComponent component, int layer = 0) where TComponent : struct, IComponent | ||||
|         { | ||||
|             if (!writeTypes.Contains(typeof(TComponent))) | ||||
|             { | ||||
|                 throw new IllegalWriteException("Engine {0} tried to write undeclared Component {1}", this.GetType().Name, typeof(TComponent).Name); | ||||
|             } | ||||
| 
 | ||||
|             return componentManager.AddDrawComponent(entity.ID, component, layer); | ||||
|         } | ||||
| 
 | ||||
|         protected void ActivateComponent(Guid componentID) | ||||
|         { | ||||
|             var type = componentManager.GetComponentTypeByID(componentID); | ||||
|             if (!writeTypes.Contains(type)) | ||||
|             { | ||||
|                 throw new IllegalWriteException("Engine {0} tried to write undeclared Component {1}", this.GetType().Name, type.Name); | ||||
|             } | ||||
| 
 | ||||
|             componentManager.Activate(componentID); | ||||
|         } | ||||
| 
 | ||||
|         protected void DeactivateComponent(Guid componentID) | ||||
|         { | ||||
|             var type = componentManager.GetComponentTypeByID(componentID); | ||||
|             if (!writeTypes.Contains(type)) | ||||
|             { | ||||
|                 throw new IllegalWriteException("Engine {0} tried to write undeclared Component {1}", this.GetType().Name, type.Name); | ||||
|             } | ||||
| 
 | ||||
|             componentManager.Deactivate(componentID); | ||||
|         } | ||||
| 
 | ||||
|         protected IEnumerable<ValueTuple<Guid, TComponent>> GetComponents<TComponent>(Entity entity) where TComponent : struct, IComponent | ||||
|         { | ||||
|             if (!readTypes.Contains(typeof(TComponent))) | ||||
|             { | ||||
|                 throw new IllegalReadException("Engine {0} tried to read undeclared Component {1}", this.GetType().Name, typeof(TComponent).Name); | ||||
|             } | ||||
| 
 | ||||
|             return componentManager.GetComponentsByEntityAndType<TComponent>(entity.ID); | ||||
|         } | ||||
| 
 | ||||
|         protected ValueTuple<Guid, TComponent> GetComponent<TComponent>(Entity entity) where TComponent : struct, IComponent | ||||
|         { | ||||
|             return GetComponents<TComponent>(entity).First(); | ||||
|         } | ||||
| 
 | ||||
|         protected bool HasComponent<TComponent>(Entity entity) where TComponent : struct, IComponent | ||||
|         { | ||||
|             return componentManager.EntityHasComponentOfType<TComponent>(entity.ID); | ||||
|         } | ||||
| 
 | ||||
|         internal void UpdateComponentInWorld<TComponent>(Guid componentID, TComponent newComponent) where TComponent : struct, IComponent | ||||
|         { | ||||
|             if (!writeTypes.Contains(typeof(TComponent))) | ||||
|  | @ -157,5 +219,16 @@ namespace Encompass | |||
|         { | ||||
|             entityManager.MarkForDestroy(entityID); | ||||
|         } | ||||
| 
 | ||||
|         protected void RemoveComponent(Guid componentID) | ||||
|         { | ||||
|             var type = componentManager.GetComponentTypeByID(componentID); | ||||
|             if (!writeTypes.Contains(type)) | ||||
|             { | ||||
|                 throw new IllegalWriteException("Engine {0} tried to write undeclared Component {1}", this.GetType().Name, type.Name); | ||||
|             } | ||||
| 
 | ||||
|             componentManager.Remove(componentID); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,69 +1,14 @@ | |||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| 
 | ||||
| namespace Encompass | ||||
| { | ||||
|     public struct Entity | ||||
|     { | ||||
|         public readonly Guid id; | ||||
|         public readonly Guid ID; | ||||
| 
 | ||||
|         private readonly ComponentManager componentManager; | ||||
| 
 | ||||
|         internal Entity(Guid id, ComponentManager componentManager) | ||||
|         internal Entity(Guid id) | ||||
|         { | ||||
|             this.id = id; | ||||
|             this.componentManager = componentManager; | ||||
|         } | ||||
| 
 | ||||
|         public Guid AddComponent<TComponent>(TComponent component) where TComponent : struct, IComponent | ||||
|         { | ||||
|             return componentManager.AddComponent(id, component); | ||||
|         } | ||||
| 
 | ||||
|         public Guid AddDrawComponent<TComponent>(TComponent component, int layer = 0) where TComponent : struct, IComponent | ||||
|         { | ||||
|             return componentManager.AddDrawComponent(id, component, layer); | ||||
|         } | ||||
| 
 | ||||
|         public IEnumerable<ValueTuple<Guid, TComponent>> GetComponents<TComponent>() where TComponent : struct, IComponent | ||||
|         { | ||||
|             return componentManager.GetComponentsByEntityAndType<TComponent>(id); | ||||
|         } | ||||
| 
 | ||||
|         public ValueTuple<Guid, TComponent> GetComponent<TComponent>() where TComponent : struct, IComponent | ||||
|         { | ||||
|             return GetComponents<TComponent>().First(); | ||||
|         } | ||||
| 
 | ||||
|         public bool HasComponent<TComponent>() where TComponent : struct, IComponent | ||||
|         { | ||||
|             return componentManager.EntityHasComponentOfType<TComponent>(id); | ||||
|         } | ||||
| 
 | ||||
|         internal bool HasComponent(Type type) | ||||
|         { | ||||
|             return componentManager.EntityHasComponentOfType(id, type); | ||||
|         } | ||||
| 
 | ||||
|         public void ActivateComponent(Guid componentID) | ||||
|         { | ||||
|             componentManager.MarkForActivation(componentID); | ||||
|         } | ||||
| 
 | ||||
|         public void DeactivateComponent(Guid componentID) | ||||
|         { | ||||
|             componentManager.MarkForDeactivation(componentID); | ||||
|         } | ||||
| 
 | ||||
|         public void RemoveComponent(Guid componentID) | ||||
|         { | ||||
|             componentManager.MarkForRemoval(componentID); | ||||
|         } | ||||
| 
 | ||||
|         internal void RemoveAllComponents() | ||||
|         { | ||||
|             componentManager.RemoveAllComponentsFromEntity(id); | ||||
|             this.ID = id; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ namespace Encompass | |||
|         public Entity CreateEntity() | ||||
|         { | ||||
|             var id = NextID(); | ||||
|             var entity = new Entity(id, componentManager); | ||||
|             var entity = new Entity(id); | ||||
|             IDToEntity[id] = entity; | ||||
|             componentManager.RegisterEntity(id); | ||||
|             return entity; | ||||
|  | @ -56,8 +56,7 @@ namespace Encompass | |||
|         { | ||||
|             foreach (var entityID in entitiesMarkedForDestroy) | ||||
|             { | ||||
|                 var entity = IDToEntity[entityID]; | ||||
|                 entity.RemoveAllComponents(); | ||||
|                 componentManager.RemoveAllComponentsFromEntity(entityID); | ||||
|                 IDToEntity.Remove(entityID); | ||||
|                 entityToEntityTrackers.Remove(entityID); | ||||
|                 componentManager.RegisterDestroyedEntity(entityID); | ||||
|  |  | |||
|  | @ -1,13 +1,13 @@ | |||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| using System.Linq; | ||||
| 
 | ||||
| namespace Encompass | ||||
| { | ||||
|     public abstract class Renderer | ||||
|     { | ||||
|         private EntityManager entityManager; | ||||
|         private ComponentManager componentManager; | ||||
|         internal EntityManager entityManager; | ||||
|         internal ComponentManager componentManager; | ||||
| 
 | ||||
|         internal void AssignEntityManager(EntityManager entityManager) | ||||
|         { | ||||
|  | @ -48,5 +48,15 @@ namespace Encompass | |||
|         { | ||||
|             return componentManager.GetActiveComponentByType<TComponent>(); | ||||
|         } | ||||
| 
 | ||||
|         protected IEnumerable<ValueTuple<Guid, TComponent>> GetComponents<TComponent>(Entity entity) where TComponent : struct, IComponent | ||||
|         { | ||||
|             return componentManager.GetComponentsByEntityAndType<TComponent>(entity.ID); | ||||
|         } | ||||
| 
 | ||||
|         protected ValueTuple<Guid, TComponent> GetComponent<TComponent>(Entity entity) where TComponent : struct, IComponent | ||||
|         { | ||||
|             return GetComponents<TComponent>(entity).First(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -35,10 +35,6 @@ namespace Encompass | |||
|             messageManager.ClearMessages(); | ||||
|             entityManager.DestroyMarkedEntities(); | ||||
| 
 | ||||
|             componentManager.ActivateMarkedComponents(); | ||||
|             componentManager.DeactivateMarkedComponents(); | ||||
|             componentManager.RemoveMarkedComponents(); | ||||
| 
 | ||||
|             entityManager.CheckEntitiesWithAddedComponents(); | ||||
|             entityManager.CheckEntitiesWithRemovedComponents(); | ||||
|         } | ||||
|  |  | |||
|  | @ -41,6 +41,21 @@ namespace Encompass | |||
|             messageManager.AddMessage(message); | ||||
|         } | ||||
| 
 | ||||
|         public Guid AddComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct, IComponent | ||||
|         { | ||||
|             return componentManager.AddComponent(entity.ID, component); | ||||
|         } | ||||
| 
 | ||||
|         public Guid AddDrawComponent<TComponent>(Entity entity, TComponent component, int layer = 0) where TComponent : struct, IComponent | ||||
|         { | ||||
|             return componentManager.AddDrawComponent(entity.ID, component, layer); | ||||
|         } | ||||
| 
 | ||||
|         public void DeactivateComponent(Guid componentID) | ||||
|         { | ||||
|             componentManager.Deactivate(componentID); | ||||
|         } | ||||
| 
 | ||||
|         public Engine AddEngine<TEngine>(TEngine engine) where TEngine : Engine | ||||
|         { | ||||
|             engine.AssignEntityManager(entityManager); | ||||
|  | @ -214,10 +229,6 @@ namespace Encompass | |||
|                 renderManager | ||||
|             ); | ||||
| 
 | ||||
|             componentManager.ActivateMarkedComponents(); | ||||
|             componentManager.DeactivateMarkedComponents(); | ||||
|             componentManager.RemoveMarkedComponents(); | ||||
| 
 | ||||
|             entityManager.CheckEntitiesWithAddedComponents(); | ||||
|             entityManager.CheckEntitiesWithRemovedComponents(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -47,8 +47,8 @@ namespace Encompass | |||
| 
 | ||||
|         private bool CheckEntity(Entity entity) | ||||
|         { | ||||
|             return EntityChecker.CheckEntity(entity, componentTypes) | ||||
|                 && entity.HasComponent(DrawComponentType); | ||||
|             return EntityChecker.CheckEntity(componentManager, entity, componentTypes) | ||||
|                 && componentManager.EntityHasComponentOfType(entity.ID, DrawComponentType); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -6,9 +6,9 @@ namespace Encompass | |||
| { | ||||
|     internal static class EntityChecker | ||||
|     { | ||||
|         public static bool CheckEntity(Entity entity, IEnumerable<Type> componentTypes) | ||||
|         public static bool CheckEntity(ComponentManager componentManager, Entity entity, IEnumerable<Type> componentTypes) | ||||
|         { | ||||
|             return componentTypes.All((componentType) => entity.HasComponent(componentType)); | ||||
|             return componentTypes.All((componentType) => componentManager.EntityHasComponentOfType(entity.ID, componentType)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,377 @@ | |||
| using NUnit.Framework; | ||||
| using FluentAssertions; | ||||
| 
 | ||||
| using Encompass; | ||||
| using System.Collections.Generic; | ||||
| using System; | ||||
| using System.Linq; | ||||
| 
 | ||||
| namespace Tests | ||||
| { | ||||
|     public class ComponentTests | ||||
|     { | ||||
|         struct MockComponent : IComponent | ||||
|         { | ||||
|             public string myString; | ||||
|             public int myInt; | ||||
|         } | ||||
| 
 | ||||
|         struct EntityMessage : IMessage | ||||
|         { | ||||
|             public Entity entity; | ||||
|         } | ||||
| 
 | ||||
|         static IEnumerable<(Guid, MockComponent)> gottenMockComponentIDPairs = Enumerable.Empty<(Guid, MockComponent)>(); | ||||
|         static (Guid, MockComponent) gottenMockComponentIDPair; | ||||
| 
 | ||||
|         [Reads(typeof(EntityMessage), typeof(MockComponent))] | ||||
|         class GetMockComponentsEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 gottenMockComponentIDPairs = Enumerable.Empty<(Guid, MockComponent)>(); | ||||
| 
 | ||||
|                 foreach (var entityMessage in ReadMessages<EntityMessage>()) | ||||
|                 { | ||||
|                     gottenMockComponentIDPairs = GetComponents<MockComponent>(entityMessage.entity); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Reads(typeof(EntityMessage), typeof(MockComponent))] | ||||
|         class GetMockComponentEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 foreach (var entityMessage in ReadMessages<EntityMessage>()) | ||||
|                 { | ||||
|                     gottenMockComponentIDPair = GetComponent<MockComponent>(entityMessage.entity); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         struct AddComponentTestMessage : IMessage | ||||
|         { | ||||
|             public Entity entity; | ||||
|             public MockComponent mockComponent; | ||||
|         } | ||||
| 
 | ||||
|         [Reads(typeof(AddComponentTestMessage), typeof(MockComponent))] | ||||
|         class AddComponentEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 foreach (var addComponentTestMessage in ReadMessages<AddComponentTestMessage>()) | ||||
|                 { | ||||
|                     Assert.IsTrue(HasComponent<MockComponent>(addComponentTestMessage.entity)); | ||||
|                     Assert.That(GetComponent<MockComponent>(addComponentTestMessage.entity).Item2, Is.EqualTo(addComponentTestMessage.mockComponent)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void AddComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             worldBuilder.AddEngine(new AddComponentEngine()); | ||||
|             worldBuilder.AddEngine(new GetMockComponentEngine()); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             AddComponentTestMessage addComponentTestMessage; | ||||
|             addComponentTestMessage.entity = entity; | ||||
|             addComponentTestMessage.mockComponent = mockComponent; | ||||
|             worldBuilder.EmitMessage(addComponentTestMessage); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void GetComponents() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             worldBuilder.AddEngine(new GetMockComponentsEngine()); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponentA; | ||||
|             mockComponentA.myInt = 3; | ||||
|             mockComponentA.myString = "hello"; | ||||
| 
 | ||||
|             MockComponent mockComponentB; | ||||
|             mockComponentB.myInt = 5; | ||||
|             mockComponentB.myString = "wassup"; | ||||
| 
 | ||||
|             MockComponent mockComponentC; | ||||
|             mockComponentC.myInt = 1; | ||||
|             mockComponentC.myString = "howdy"; | ||||
| 
 | ||||
|             var componentAID = worldBuilder.AddComponent(entity, mockComponentA); | ||||
|             var componentBID = worldBuilder.AddComponent(entity, mockComponentB); | ||||
|             var componentCID = worldBuilder.AddComponent(entity, mockComponentC); | ||||
| 
 | ||||
|             EntityMessage entityMessage; | ||||
|             entityMessage.entity = entity; | ||||
|             worldBuilder.EmitMessage(entityMessage); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01); | ||||
| 
 | ||||
|             gottenMockComponentIDPairs.Should().Contain((componentAID, mockComponentA)); | ||||
|             gottenMockComponentIDPairs.Should().Contain((componentBID, mockComponentB)); | ||||
|             gottenMockComponentIDPairs.Should().Contain((componentCID, mockComponentC)); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void GetComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             worldBuilder.AddEngine(new GetMockComponentEngine()); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             var componentID = worldBuilder.AddComponent<MockComponent>(entity, mockComponent); | ||||
| 
 | ||||
|             EntityMessage entityMessage; | ||||
|             entityMessage.entity = entity; | ||||
|             worldBuilder.EmitMessage(entityMessage); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01); | ||||
| 
 | ||||
|             Assert.AreEqual((componentID, mockComponent), gottenMockComponentIDPair); | ||||
|         } | ||||
| 
 | ||||
|         struct HasComponentTestMessage : IMessage | ||||
|         { | ||||
|             public Entity entity; | ||||
|         } | ||||
| 
 | ||||
|         [Reads(typeof(HasComponentTestMessage), typeof(MockComponent))] | ||||
|         class HasComponentTestEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 foreach (var hasComponentTestEngine in ReadMessages<HasComponentTestMessage>()) | ||||
|                 { | ||||
|                     Assert.IsTrue(HasComponent<MockComponent>(hasComponentTestEngine.entity)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void HasComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             worldBuilder.AddEngine(new HasComponentTestEngine()); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             HasComponentTestMessage hasComponentTestMessage; | ||||
|             hasComponentTestMessage.entity = entity; | ||||
|             worldBuilder.EmitMessage(hasComponentTestMessage); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01); | ||||
|         } | ||||
| 
 | ||||
|         struct HasComponentWhenInactiveTestMessage : IMessage | ||||
|         { | ||||
|             public Entity entity; | ||||
|         } | ||||
| 
 | ||||
|         [Reads(typeof(HasComponentWhenInactiveTestMessage))] | ||||
|         class HasComponentWhenInactiveTestEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 foreach (var hasComponentTestEngine in ReadMessages<HasComponentWhenInactiveTestMessage>()) | ||||
|                 { | ||||
|                     Assert.IsFalse(HasComponent<MockComponent>(hasComponentTestEngine.entity)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void HasComponentWhenInactive() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             worldBuilder.AddEngine(new HasComponentWhenInactiveTestEngine()); | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|              | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             var componentID = worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             HasComponentWhenInactiveTestMessage testMessage; | ||||
|             testMessage.entity = entity; | ||||
|             worldBuilder.EmitMessage(testMessage); | ||||
| 
 | ||||
|             worldBuilder.DeactivateComponent(componentID); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
|         } | ||||
| 
 | ||||
|         struct RemoveComponentTestMessage : IMessage | ||||
|         { | ||||
|             public Entity entity; | ||||
|             public Guid componentID; | ||||
|         } | ||||
| 
 | ||||
|         [Reads(typeof(RemoveComponentTestMessage), typeof(MockComponent))] | ||||
|         [Writes(typeof(MockComponent))] | ||||
|         class RemoveComponentTestEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 foreach (var removeComponentMessage in ReadMessages<RemoveComponentTestMessage>()) | ||||
|                 { | ||||
|                     RemoveComponent(removeComponentMessage.componentID); | ||||
| 
 | ||||
|                     Assert.IsFalse(HasComponent<MockComponent>(removeComponentMessage.entity)); | ||||
|                     Assert.IsEmpty(GetComponents<MockComponent>(removeComponentMessage.entity)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void RemoveComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             worldBuilder.AddEngine(new RemoveComponentTestEngine()); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             var componentID = worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             RemoveComponentTestMessage removeComponentMessage; | ||||
|             removeComponentMessage.entity = entity; | ||||
|             removeComponentMessage.componentID = componentID; | ||||
|             worldBuilder.EmitMessage(removeComponentMessage); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
|         } | ||||
| 
 | ||||
|         struct ActivateComponentMessage : IMessage | ||||
|         { | ||||
|             public Entity entity; | ||||
|             public Guid componentID; | ||||
|         } | ||||
| 
 | ||||
|         [Reads(typeof(ActivateComponentMessage))] | ||||
|         [Writes(typeof(MockComponent))] | ||||
|         class ActivateComponentEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 foreach (var activateComponentMessage in ReadMessages<ActivateComponentMessage>()) | ||||
|                 { | ||||
|                     ActivateComponent(activateComponentMessage.componentID); | ||||
|                     Assert.IsTrue(HasComponent<MockComponent>(activateComponentMessage.entity)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void ActivateComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             worldBuilder.AddEngine(new ActivateComponentEngine()); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             var componentID = worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             worldBuilder.DeactivateComponent(componentID); | ||||
| 
 | ||||
|             ActivateComponentMessage activateMessage; | ||||
|             activateMessage.entity = entity; | ||||
|             activateMessage.componentID = componentID; | ||||
|             worldBuilder.EmitMessage(activateMessage); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
|         } | ||||
| 
 | ||||
|         struct DeactivateComponentMessage : IMessage | ||||
|         { | ||||
|             public Entity entity; | ||||
|             public Guid componentID; | ||||
|         } | ||||
| 
 | ||||
|         [Reads(typeof(DeactivateComponentMessage))] | ||||
|         [Writes(typeof(MockComponent))] | ||||
|         class DeactivateComponentEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|             { | ||||
|                 foreach (var deactivateComponentMessage in ReadMessages<DeactivateComponentMessage>()) | ||||
|                 { | ||||
|                     DeactivateComponent(deactivateComponentMessage.componentID); | ||||
|                     Assert.IsFalse(HasComponent<MockComponent>(deactivateComponentMessage.entity)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void DeactivateComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             worldBuilder.AddEngine(new DeactivateComponentEngine()); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             var componentID = worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             DeactivateComponentMessage deactivateComponentMessage; | ||||
|             deactivateComponentMessage.entity = entity; | ||||
|             deactivateComponentMessage.componentID = componentID; | ||||
|             worldBuilder.EmitMessage(deactivateComponentMessage); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -10,6 +10,12 @@ using Encompass.Exceptions; | |||
| 
 | ||||
| namespace Tests | ||||
| { | ||||
|     struct MockComponent : IComponent | ||||
|     {  | ||||
|         public int myInt; | ||||
|         public string myString; | ||||
|     } | ||||
| 
 | ||||
|     public class EngineTest | ||||
|     { | ||||
|         static List<ValueTuple<Guid, MockComponent>> resultComponents; | ||||
|  | @ -51,11 +57,11 @@ namespace Tests | |||
|             mockComponentB.myInt = 1; | ||||
|             mockComponentB.myString = "howdy"; | ||||
| 
 | ||||
|             var componentAID = entity.AddComponent(mockComponent); | ||||
|             var componentBID = entity.AddComponent(mockComponentB); | ||||
|             var inactiveComponentAID = entity.AddComponent(mockComponent); | ||||
|             var componentAID = worldBuilder.AddComponent(entity, mockComponent); | ||||
|             var componentBID = worldBuilder.AddComponent(entity, mockComponentB); | ||||
|             var inactiveComponentAID = worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             entity.DeactivateComponent(inactiveComponentAID); | ||||
|             worldBuilder.DeactivateComponent(inactiveComponentAID); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  | @ -79,7 +85,7 @@ namespace Tests | |||
|             mockComponent.myInt = 0; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             entity.AddComponent(mockComponent); | ||||
|             worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  | @ -104,8 +110,8 @@ namespace Tests | |||
|             mockComponentB.myInt = 1; | ||||
|             mockComponentB.myString = "howdy"; | ||||
| 
 | ||||
|             entity.AddComponent(mockComponent); | ||||
|             entity.AddComponent(mockComponentB); | ||||
|             worldBuilder.AddComponent(entity, mockComponent); | ||||
|             worldBuilder.AddComponent(entity, mockComponentB); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  | @ -140,7 +146,7 @@ namespace Tests | |||
|             mockComponent.myInt = 0; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             entity.AddComponent(mockComponent); | ||||
|             worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  | @ -177,7 +183,7 @@ namespace Tests | |||
|             mockComponent.myInt = 0; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             entity.AddComponent(mockComponent); | ||||
|             worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  | @ -359,8 +365,8 @@ namespace Tests | |||
|             componentB.myString = "hello"; | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|             entity.AddComponent(componentA); | ||||
|             entity.AddComponent(componentB); | ||||
|             worldBuilder.AddComponent(entity, componentA); | ||||
|             worldBuilder.AddComponent(entity, componentB); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
|             world.Update(0.01f); | ||||
|  | @ -434,11 +440,11 @@ namespace Tests | |||
|             mockComponent.myInt = 2; | ||||
|             mockComponent.myString = "blah"; | ||||
| 
 | ||||
|             entity.AddComponent(destroyerComponent); | ||||
|             var componentID = entity.AddComponent(mockComponent); | ||||
|             worldBuilder.AddComponent(entity, destroyerComponent); | ||||
|             var componentID = worldBuilder.AddComponent(entity, mockComponent); | ||||
| 
 | ||||
|             entityB.AddComponent(destroyerComponent); | ||||
|             var componentBID = entityB.AddComponent(mockComponent); | ||||
|             worldBuilder.AddComponent(entityB, destroyerComponent); | ||||
|             var componentBID = worldBuilder.AddComponent(entityB, mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  | @ -448,7 +454,8 @@ namespace Tests | |||
|             Assert.That(results, Does.Not.Contain((componentBID, mockComponent))); | ||||
|         } | ||||
| 
 | ||||
|         [Reads(typeof(DestroyerComponent))] | ||||
|         [Reads(typeof(DestroyerComponent), typeof(MockComponent))] | ||||
|         [Writes(typeof(MockComponent))] | ||||
|         class DestroyAndAddComponentEngine : Engine | ||||
|         { | ||||
|             public override void Update(double dt) | ||||
|  | @ -457,9 +464,9 @@ namespace Tests | |||
|                 { | ||||
|                     var componentID = componentPair.Item1; | ||||
|                     var entity = GetEntityByComponentID(componentID); | ||||
|                     var (id, _) = entity.GetComponent<MockComponent>(); | ||||
|                     entity.RemoveComponent(id); | ||||
|                     Destroy(entity.id); | ||||
|                     var (id, _) = GetComponent<MockComponent>(entity); | ||||
|                     RemoveComponent(id); | ||||
|                     Destroy(entity.ID); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | @ -473,8 +480,8 @@ namespace Tests | |||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             entity.AddComponent(new DestroyerComponent()); | ||||
|             entity.AddComponent(new MockComponent()); | ||||
|             worldBuilder.AddComponent(entity, new DestroyerComponent()); | ||||
|             worldBuilder.AddComponent(entity, new MockComponent()); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  | @ -504,7 +511,7 @@ namespace Tests | |||
|             component.myString = "howdy"; | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|             entity.AddComponent(component); | ||||
|             worldBuilder.AddComponent(entity, component); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
|             world.Update(0.01f); | ||||
|  | @ -534,7 +541,7 @@ namespace Tests | |||
|             component.myString = "howdy"; | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|             entity.AddComponent(component); | ||||
|             worldBuilder.AddComponent(entity, component); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
|             world.Update(0.01f); | ||||
|  | @ -565,7 +572,7 @@ namespace Tests | |||
|             component.myString = "howdy"; | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|             entity.AddComponent(component); | ||||
|             worldBuilder.AddComponent(entity, component); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  | @ -598,9 +605,9 @@ namespace Tests | |||
|             var entityTwo = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             EntityIDComponent entityIDComponent; | ||||
|             entityIDComponent.entityID = entityTwo.id; | ||||
|             entityIDComponent.entityID = entityTwo.ID; | ||||
| 
 | ||||
|             entity.AddComponent(entityIDComponent); | ||||
|             worldBuilder.AddComponent(entity, entityIDComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -32,27 +32,27 @@ namespace Tests | |||
|             TestDrawComponent testDrawComponent = default(TestDrawComponent); | ||||
| 
 | ||||
|             var entityToTrack = worldBuilder.CreateEntity(); | ||||
|             entityToTrack.AddComponent(aComponent); | ||||
|             entityToTrack.AddComponent(bComponent); | ||||
|             entityToTrack.AddComponent(testDrawComponent); | ||||
|             worldBuilder.AddComponent(entityToTrack, aComponent); | ||||
|             worldBuilder.AddComponent(entityToTrack, bComponent); | ||||
|             worldBuilder.AddComponent(entityToTrack, testDrawComponent); | ||||
| 
 | ||||
|             var entityNotToTrack = worldBuilder.CreateEntity(); | ||||
|             entityNotToTrack.AddComponent(aComponent); | ||||
|             entityNotToTrack.AddComponent(testDrawComponent); | ||||
|             worldBuilder.AddComponent(entityNotToTrack, aComponent); | ||||
|             worldBuilder.AddComponent(entityNotToTrack, testDrawComponent); | ||||
| 
 | ||||
|             var entityWithoutDrawComponent = worldBuilder.CreateEntity(); | ||||
|             entityWithoutDrawComponent.AddComponent(aComponent); | ||||
|             entityWithoutDrawComponent.AddComponent(bComponent); | ||||
|             worldBuilder.AddComponent(entityWithoutDrawComponent, aComponent); | ||||
|             worldBuilder.AddComponent(entityWithoutDrawComponent, bComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
| 
 | ||||
|             Console.WriteLine(renderer.IsTracking(entityNotToTrack.id)); | ||||
|             Console.WriteLine(renderer.IsTracking(entityNotToTrack.ID)); | ||||
| 
 | ||||
|             Assert.IsTrue(renderer.IsTracking(entityToTrack.id)); | ||||
|             Assert.IsFalse(renderer.IsTracking(entityNotToTrack.id)); | ||||
|             Assert.IsFalse(renderer.IsTracking(entityWithoutDrawComponent.id)); | ||||
|             Assert.IsTrue(renderer.IsTracking(entityToTrack.ID)); | ||||
|             Assert.IsFalse(renderer.IsTracking(entityNotToTrack.ID)); | ||||
|             Assert.IsFalse(renderer.IsTracking(entityWithoutDrawComponent.ID)); | ||||
|         } | ||||
| 
 | ||||
|         static bool called = false; | ||||
|  | @ -75,19 +75,17 @@ namespace Tests | |||
|             TestDrawComponent testDrawComponent = default(TestDrawComponent); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|             entity.AddComponent(aComponent); | ||||
|             entity.AddComponent(bComponent); | ||||
|             var testDrawComponentID = entity.AddDrawComponent(testDrawComponent, 1); | ||||
|             worldBuilder.AddComponent(entity, aComponent); | ||||
|             worldBuilder.AddComponent(entity, bComponent); | ||||
|             var testDrawComponentID = worldBuilder.AddDrawComponent(entity, testDrawComponent, 1); | ||||
| 
 | ||||
|             worldBuilder.DeactivateComponent(testDrawComponentID); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
| 
 | ||||
|             entity.DeactivateComponent(testDrawComponentID); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
| 
 | ||||
|             Assert.IsFalse(renderer.IsTracking(entity.id)); | ||||
|             Assert.IsFalse(renderer.IsTracking(entity.ID)); | ||||
| 
 | ||||
|             world.Draw(); | ||||
| 
 | ||||
|  | @ -101,7 +99,7 @@ namespace Tests | |||
|         { | ||||
|             public override void Render(Entity entity) | ||||
|             { | ||||
|                 resultComponents = entity.GetComponents<TestDrawComponent>(); | ||||
|                 resultComponents = GetComponents<TestDrawComponent>(entity); | ||||
|                 calledOnDraw = true; | ||||
|             } | ||||
|         } | ||||
|  | @ -117,16 +115,16 @@ namespace Tests | |||
|             TestDrawComponent testDrawComponent; | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|             entity.AddComponent(aComponent); | ||||
|             entity.AddComponent(cComponent); | ||||
|             var testDrawComponentID = entity.AddDrawComponent(testDrawComponent, 2); | ||||
|             worldBuilder.AddComponent(entity, aComponent); | ||||
|             worldBuilder.AddComponent(entity, cComponent); | ||||
|             var testDrawComponentID = worldBuilder.AddDrawComponent(entity, testDrawComponent, 2); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
|             world.Draw(); | ||||
| 
 | ||||
|             Assert.IsTrue(renderer.IsTracking(entity.id)); | ||||
|             Assert.IsTrue(renderer.IsTracking(entity.ID)); | ||||
|             Assert.IsTrue(calledOnDraw); | ||||
|             resultComponents.Should().Contain(new ValueTuple<Guid, TestDrawComponent>(testDrawComponentID, testDrawComponent)); | ||||
|         } | ||||
|  |  | |||
|  | @ -1,172 +0,0 @@ | |||
| using NUnit.Framework; | ||||
| using FluentAssertions; | ||||
| 
 | ||||
| using Encompass; | ||||
| using System.Collections.Generic; | ||||
| using System; | ||||
| 
 | ||||
| namespace Tests | ||||
| { | ||||
|     struct MockComponent : IComponent | ||||
|     { | ||||
|         public string myString; | ||||
|         public int myInt; | ||||
|     } | ||||
| 
 | ||||
|     public class EntityTest | ||||
|     { | ||||
|         [Test] | ||||
|         public void AddComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             entity.AddComponent(mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             Assert.IsTrue(entity.HasComponent<MockComponent>()); | ||||
|             Assert.That(entity.GetComponent<MockComponent>().Item2, Is.EqualTo(mockComponent)); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void GetComponents() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponentA; | ||||
|             mockComponentA.myInt = 3; | ||||
|             mockComponentA.myString = "hello"; | ||||
| 
 | ||||
|             MockComponent mockComponentB; | ||||
|             mockComponentB.myInt = 5; | ||||
|             mockComponentB.myString = "wassup"; | ||||
| 
 | ||||
|             MockComponent mockComponentC; | ||||
|             mockComponentC.myInt = 1; | ||||
|             mockComponentC.myString = "howdy"; | ||||
| 
 | ||||
|             var componentAID = entity.AddComponent(mockComponentA); | ||||
|             var componentBID = entity.AddComponent(mockComponentB); | ||||
|             var componentCID = entity.AddComponent(mockComponentC); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             var components = entity.GetComponents<MockComponent>(); | ||||
|             components.Should().Contain(new ValueTuple<Guid, MockComponent>(componentAID, mockComponentA)); | ||||
|             components.Should().Contain(new ValueTuple<Guid, MockComponent>(componentBID, mockComponentB)); | ||||
|             components.Should().Contain(new ValueTuple<Guid, MockComponent>(componentCID, mockComponentC)); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void GetComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             var componentID = entity.AddComponent<MockComponent>(mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             Assert.AreEqual(new ValueTuple<Guid, MockComponent>(componentID, mockComponent), entity.GetComponent<MockComponent>()); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void HasComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             entity.AddComponent(mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             Assert.IsTrue(entity.HasComponent<MockComponent>()); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void HasComponentWhenInactive() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|              | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             var componentID = entity.AddComponent(mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             entity.DeactivateComponent(componentID); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
| 
 | ||||
|             Assert.IsFalse(entity.HasComponent<MockComponent>()); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void RemoveComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             var componentID = entity.AddComponent(mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             entity.RemoveComponent(componentID); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
| 
 | ||||
|             Assert.IsFalse(entity.HasComponent<MockComponent>()); | ||||
|             Assert.IsEmpty(entity.GetComponents<MockComponent>()); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void ReactivateComponent() | ||||
|         { | ||||
|             var worldBuilder = new WorldBuilder(); | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
| 
 | ||||
|             MockComponent mockComponent; | ||||
|             mockComponent.myInt = 3; | ||||
|             mockComponent.myString = "hello"; | ||||
| 
 | ||||
|             var componentID = entity.AddComponent(mockComponent); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             entity.DeactivateComponent(componentID); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
| 
 | ||||
|             Assert.IsFalse(entity.HasComponent<MockComponent>()); | ||||
|             Assert.IsEmpty(entity.GetComponents<MockComponent>()); | ||||
| 
 | ||||
|             entity.ActivateComponent(componentID); | ||||
| 
 | ||||
|             world.Update(0.01f); | ||||
| 
 | ||||
|             Assert.IsTrue(entity.HasComponent<MockComponent>()); | ||||
|             Assert.IsNotEmpty(entity.GetComponents<MockComponent>()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -32,7 +32,7 @@ namespace Tests | |||
|                 AComponent aComponent; | ||||
| 
 | ||||
|                 var entity = worldBuilder.CreateEntity(); | ||||
|                 var componentID = entity.AddComponent(aComponent); | ||||
|                 var componentID = worldBuilder.AddComponent(entity, aComponent); | ||||
| 
 | ||||
|                 var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  | @ -52,8 +52,8 @@ namespace Tests | |||
|                 AComponent aComponentTwo; | ||||
| 
 | ||||
|                 var entity = worldBuilder.CreateEntity(); | ||||
|                 var componentID = entity.AddComponent(aComponent); | ||||
|                 var componentTwoID = entity.AddComponent(aComponentTwo); | ||||
|                 var componentID = worldBuilder.AddComponent(entity, aComponent); | ||||
|                 var componentTwoID = worldBuilder.AddComponent(entity, aComponentTwo); | ||||
|                 var world = worldBuilder.Build(); | ||||
| 
 | ||||
|                 world.Update(0.01f); | ||||
|  |  | |||
|  | @ -23,12 +23,14 @@ namespace Tests | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Writes(typeof(TestComponent))] | ||||
|         class TestSpawner : Spawner<SpawnMessageA> | ||||
|         { | ||||
|             protected override void Spawn(SpawnMessageA message) | ||||
|             { | ||||
|                 resultEntity = CreateEntity(); | ||||
|                 resultEntity.AddComponent(new TestComponent()); | ||||
|                 AddComponent(resultEntity, new TestComponent()); | ||||
|                 Assert.Pass(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -42,14 +44,6 @@ namespace Tests | |||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|             world.Update(0.01); | ||||
| 
 | ||||
|             Assert.That(resultEntity.HasComponent<TestComponent>(), Is.True); | ||||
| 
 | ||||
|             var id = resultEntity.id; | ||||
| 
 | ||||
|             world.Update(0.01); | ||||
| 
 | ||||
|             Assert.That(resultEntity.id, Is.Not.EqualTo(id)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -44,26 +44,26 @@ namespace Tests | |||
|             TestDrawComponent testDrawComponent = default(TestDrawComponent); | ||||
| 
 | ||||
|             var entity = worldBuilder.CreateEntity(); | ||||
|             entity.AddComponent(testComponent); | ||||
|             entity.AddDrawComponent(testDrawComponent, 3); | ||||
|             worldBuilder.AddComponent(entity, testComponent); | ||||
|             worldBuilder.AddDrawComponent(entity, testDrawComponent, 3); | ||||
| 
 | ||||
|             TestDrawComponent testDrawComponentTwo = default(TestDrawComponent); | ||||
| 
 | ||||
|             var entityTwo = worldBuilder.CreateEntity(); | ||||
|             entityTwo.AddComponent(testComponent); | ||||
|             entityTwo.AddDrawComponent(testDrawComponentTwo, 1); | ||||
|             worldBuilder.AddComponent(entityTwo, testComponent); | ||||
|             worldBuilder.AddDrawComponent(entityTwo, testDrawComponentTwo, 1); | ||||
| 
 | ||||
|             TestDrawComponent testDrawComponentThree = default(TestDrawComponent); | ||||
| 
 | ||||
|             var entityThree = worldBuilder.CreateEntity(); | ||||
|             entityThree.AddComponent(testComponent); | ||||
|             entityThree.AddDrawComponent(testDrawComponentThree, 5); | ||||
|             worldBuilder.AddComponent(entityThree, testComponent); | ||||
|             worldBuilder.AddDrawComponent(entityThree, testDrawComponentThree, 5); | ||||
| 
 | ||||
|             TestDrawComponent testDrawComponentFour = default(TestDrawComponent); | ||||
| 
 | ||||
|             var entityFour = worldBuilder.CreateEntity(); | ||||
|             entityFour.AddComponent(testComponent); | ||||
|             entityFour.AddDrawComponent(testDrawComponentFour, -5); | ||||
|             worldBuilder.AddComponent(entityFour, testComponent); | ||||
|             worldBuilder.AddDrawComponent(entityFour, testDrawComponentFour, -5); | ||||
| 
 | ||||
|             var world = worldBuilder.Build(); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue