refactor so entity and components use GUID
parent
e4705dc7ea
commit
7c787290eb
|
@ -6,133 +6,111 @@ namespace Encompass
|
||||||
{
|
{
|
||||||
internal class ComponentManager
|
internal class ComponentManager
|
||||||
{
|
{
|
||||||
private Dictionary<uint, List<IComponent>> entityIDToComponents = new Dictionary<uint, List<IComponent>>();
|
private Dictionary<Guid, IComponent> IDToComponent = new Dictionary<Guid, IComponent>();
|
||||||
private Dictionary<IComponent, uint> componentToEntityID = new Dictionary<IComponent, uint>();
|
private Dictionary<Guid, List<Guid>> entityIDToComponentIDs = new Dictionary<Guid, List<Guid>>();
|
||||||
|
private Dictionary<Guid, Guid> componentIDToEntityID = new Dictionary<Guid, Guid>();
|
||||||
|
|
||||||
private Dictionary<Type, List<IComponent>> activeComponents = new Dictionary<Type, List<IComponent>>();
|
private Dictionary<Type, List<Guid>> activeComponents = new Dictionary<Type, List<Guid>>();
|
||||||
private Dictionary<Type, List<IComponent>> inactiveComponents = new Dictionary<Type, List<IComponent>>();
|
private Dictionary<Type, List<Guid>> inactiveComponents = new Dictionary<Type, List<Guid>>();
|
||||||
|
|
||||||
private List<IComponent> componentsToActivate = new List<IComponent>();
|
private List<Guid> componentsToActivate = new List<Guid>();
|
||||||
private List<IComponent> componentsToDeactivate = new List<IComponent>();
|
private List<Guid> componentsToDeactivate = new List<Guid>();
|
||||||
private List<IComponent> componentsToRemove = new List<IComponent>();
|
private List<Guid> componentsToRemove = new List<Guid>();
|
||||||
|
|
||||||
internal void AddComponent<TComponent>(uint entityID, TComponent component) where TComponent : struct, IComponent
|
internal Guid AddComponent<TComponent>(Guid entityID, TComponent component) where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
if (!entityIDToComponents.ContainsKey(entityID))
|
var componentID = Guid.NewGuid();
|
||||||
|
|
||||||
|
IDToComponent[componentID] = component;
|
||||||
|
|
||||||
|
if (!entityIDToComponentIDs.ContainsKey(entityID))
|
||||||
{
|
{
|
||||||
entityIDToComponents.Add(entityID, new List<IComponent>());
|
entityIDToComponentIDs.Add(entityID, new List<Guid>());
|
||||||
}
|
}
|
||||||
|
|
||||||
entityIDToComponents[entityID].Add(component);
|
entityIDToComponentIDs[entityID].Add(componentID);
|
||||||
componentToEntityID[component] = entityID;
|
componentIDToEntityID[componentID] = entityID;
|
||||||
|
|
||||||
if (!activeComponents.ContainsKey(typeof(TComponent)))
|
if (!activeComponents.ContainsKey(typeof(TComponent)))
|
||||||
{
|
{
|
||||||
activeComponents.Add(typeof(TComponent), new List<IComponent>());
|
activeComponents.Add(typeof(TComponent), new List<Guid>());
|
||||||
inactiveComponents.Add(typeof(TComponent), new List<IComponent>());
|
inactiveComponents.Add(typeof(TComponent), new List<Guid>());
|
||||||
}
|
}
|
||||||
|
|
||||||
MarkForActivation(component);
|
MarkForActivation(componentID);
|
||||||
|
|
||||||
|
return componentID;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IEnumerable<IComponent> GetComponentsByEntity(uint entityID)
|
internal IEnumerable<KeyValuePair<Guid, IComponent>> GetComponentsByEntity(Guid entityID)
|
||||||
{
|
{
|
||||||
return entityIDToComponents[entityID];
|
return entityIDToComponentIDs[entityID].Select((id) => new KeyValuePair<Guid, IComponent>(id, IDToComponent[id]));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IEnumerable<TComponent> GetActiveComponentsByType<TComponent>() where TComponent : struct, IComponent
|
internal IEnumerable<KeyValuePair<Guid, TComponent>> GetActiveComponentsByType<TComponent>() where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return activeComponents[typeof(TComponent)].Cast<TComponent>();
|
return activeComponents[typeof(TComponent)].Select((id) => new KeyValuePair<Guid, TComponent>(id, (TComponent)IDToComponent[id]));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal TComponent GetActiveComponentByType<TComponent>() where TComponent : struct, IComponent
|
internal KeyValuePair<Guid, TComponent> GetActiveComponentByType<TComponent>() where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return GetActiveComponentsByType<TComponent>().Single();
|
return GetActiveComponentsByType<TComponent>().Single();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IEnumerable<TComponent> GetComponentsByEntityAndType<TComponent>(uint entityID) where TComponent : struct, IComponent
|
internal IEnumerable<KeyValuePair<Guid, TComponent>> GetComponentsByEntityAndType<TComponent>(Guid entityID) where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
var entity_components = GetComponentsByEntity(entityID).Cast<TComponent>();
|
var entity_components = GetComponentsByEntity(entityID).Select((kv) => new KeyValuePair<Guid, TComponent>(kv.Key, (TComponent)kv.Value));
|
||||||
var active_components_by_type = GetActiveComponentsByType<TComponent>();
|
var active_components_by_type = GetActiveComponentsByType<TComponent>();
|
||||||
return entity_components.Intersect(active_components_by_type).Cast<TComponent>();
|
return entity_components.Intersect(active_components_by_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal bool EntityHasComponentOfType<TComponent>(uint entityID) where TComponent : struct, IComponent
|
internal bool EntityHasComponentOfType<TComponent>(Guid entityID) where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return GetComponentsByEntityAndType<TComponent>(entityID).Any();
|
return GetComponentsByEntityAndType<TComponent>(entityID).Any();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Replaces the component with another. */
|
internal void UpdateComponent<TComponent>(Guid componentID, TComponent newComponentValue) where TComponent : struct, IComponent
|
||||||
internal void UpdateComponent<TComponent>(TComponent originalComponent, TComponent newComponent) where TComponent : struct, IComponent
|
|
||||||
{
|
{
|
||||||
var entityID = componentToEntityID[originalComponent];
|
var entityID = componentIDToEntityID[componentID];
|
||||||
|
IDToComponent[componentID] = newComponentValue;
|
||||||
entityIDToComponents[entityID].Remove(originalComponent);
|
|
||||||
entityIDToComponents[entityID].Add(newComponent);
|
|
||||||
|
|
||||||
componentToEntityID.Remove(originalComponent);
|
|
||||||
componentToEntityID.Add(newComponent, entityID);
|
|
||||||
|
|
||||||
if (activeComponents[originalComponent.GetType()].Remove(originalComponent))
|
|
||||||
{
|
|
||||||
activeComponents[originalComponent.GetType()].Add(newComponent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inactiveComponents[originalComponent.GetType()].Remove(originalComponent))
|
internal void RemoveAllComponentsFromEntity(Guid entityID)
|
||||||
{
|
{
|
||||||
inactiveComponents[originalComponent.GetType()].Add(newComponent);
|
var componentIDs = entityIDToComponentIDs[entityID];
|
||||||
|
|
||||||
|
foreach (var componentID in componentIDs)
|
||||||
|
{
|
||||||
|
var component = IDToComponent[componentID];
|
||||||
|
activeComponents[component.GetType()].Remove(componentID);
|
||||||
|
inactiveComponents[component.GetType()].Remove(componentID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (componentsToActivate.Remove(originalComponent))
|
entityIDToComponentIDs.Remove(entityID);
|
||||||
{
|
|
||||||
componentsToActivate.Add(newComponent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (componentsToDeactivate.Remove(originalComponent))
|
internal void MarkForActivation(Guid componentID)
|
||||||
{
|
{
|
||||||
componentsToDeactivate.Add(newComponent);
|
componentsToActivate.Add(componentID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (componentsToRemove.Remove(originalComponent))
|
internal void MarkForDeactivation(Guid componentID)
|
||||||
{
|
{
|
||||||
componentsToRemove.Add(newComponent);
|
componentsToDeactivate.Add(componentID);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void RemoveAllComponentsFromEntity(uint entityID)
|
internal void MarkForRemoval(Guid componentID)
|
||||||
{
|
{
|
||||||
var components = GetComponentsByEntity(entityID);
|
componentsToRemove.Add(componentID);
|
||||||
|
|
||||||
foreach (var component in components)
|
|
||||||
{
|
|
||||||
activeComponents[component.GetType()].Remove(component);
|
|
||||||
inactiveComponents[component.GetType()].Remove(component);
|
|
||||||
}
|
|
||||||
|
|
||||||
entityIDToComponents.Remove(entityID);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void MarkForActivation(IComponent component)
|
|
||||||
{
|
|
||||||
componentsToActivate.Add(component);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void MarkForDeactivation(IComponent component)
|
|
||||||
{
|
|
||||||
componentsToDeactivate.Add(component);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void MarkForRemoval(IComponent component)
|
|
||||||
{
|
|
||||||
componentsToRemove.Add(component);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ActivateComponents()
|
internal void ActivateComponents()
|
||||||
{
|
{
|
||||||
foreach (var component in componentsToActivate)
|
foreach (var componentID in componentsToActivate)
|
||||||
{
|
{
|
||||||
activeComponents[component.GetType()].Add(component);
|
var component = IDToComponent[componentID];
|
||||||
inactiveComponents[component.GetType()].Remove(component);
|
activeComponents[component.GetType()].Add(componentID);
|
||||||
|
inactiveComponents[component.GetType()].Remove(componentID);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentsToActivate.Clear();
|
componentsToActivate.Clear();
|
||||||
|
@ -140,19 +118,23 @@ namespace Encompass
|
||||||
|
|
||||||
internal void DeactivateComponents()
|
internal void DeactivateComponents()
|
||||||
{
|
{
|
||||||
foreach (var component in componentsToDeactivate)
|
foreach (var componentID in componentsToDeactivate)
|
||||||
{
|
{
|
||||||
activeComponents[component.GetType()].Remove(component);
|
var component = IDToComponent[componentID];
|
||||||
inactiveComponents[component.GetType()].Add(component);
|
activeComponents[component.GetType()].Remove(componentID);
|
||||||
|
inactiveComponents[component.GetType()].Add(componentID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentsToDeactivate.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void RemoveComponents()
|
internal void RemoveComponents()
|
||||||
{
|
{
|
||||||
foreach (var component in componentsToRemove)
|
foreach (var componentID in componentsToRemove)
|
||||||
{
|
{
|
||||||
activeComponents[component.GetType()].Remove(component);
|
var component = IDToComponent[componentID];
|
||||||
inactiveComponents[component.GetType()].Remove(component);
|
activeComponents[component.GetType()].Remove(componentID);
|
||||||
|
inactiveComponents[component.GetType()].Remove(componentID);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentsToRemove.Clear();
|
componentsToRemove.Clear();
|
||||||
|
|
|
@ -58,21 +58,21 @@ namespace Encompass
|
||||||
return this.entityManager.CreateEntity();
|
return this.entityManager.CreateEntity();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected IEnumerable<TComponent> ReadComponents<TComponent>() where TComponent : struct, IComponent
|
protected IEnumerable<KeyValuePair<Guid, TComponent>> ReadComponents<TComponent>() where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return this.componentManager.GetActiveComponentsByType<TComponent>();
|
return this.componentManager.GetActiveComponentsByType<TComponent>();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TComponent ReadComponent<TComponent>() where TComponent : struct, IComponent
|
protected KeyValuePair<Guid, TComponent> ReadComponent<TComponent>() where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return this.componentManager.GetActiveComponentByType<TComponent>();
|
return this.componentManager.GetActiveComponentByType<TComponent>();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void UpdateComponentInWorld<TComponent>(TComponent originalComponent, TComponent newComponent) where TComponent : struct, IComponent
|
internal void UpdateComponentInWorld<TComponent>(Guid componentID, TComponent newComponent) where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
if (mutateComponentTypes.Contains(typeof(TComponent)))
|
if (mutateComponentTypes.Contains(typeof(TComponent)))
|
||||||
{
|
{
|
||||||
this.componentManager.UpdateComponent(originalComponent, newComponent);
|
this.componentManager.UpdateComponent(componentID, newComponent);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -80,18 +80,9 @@ namespace Encompass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void UpdateComponent<TComponent>(TComponent component, Func<TComponent, TComponent> updateFunction) where TComponent : struct, IComponent
|
protected void UpdateComponent<TComponent>(Guid componentID, TComponent newComponentValue) where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
var updatedComponent = updateFunction(component);
|
this.UpdateComponentInWorld(componentID, newComponentValue);
|
||||||
this.UpdateComponentInWorld(component, updatedComponent);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void UpdateComponents<TComponent>(IEnumerable<TComponent> components, Func<TComponent, TComponent> updateFunction) where TComponent : struct, IComponent
|
|
||||||
{
|
|
||||||
foreach (var component in components)
|
|
||||||
{
|
|
||||||
this.UpdateComponent(component, updateFunction);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void EmitMessage<TMessage>(TMessage message) where TMessage : struct, IMessage
|
protected void EmitMessage<TMessage>(TMessage message) where TMessage : struct, IMessage
|
||||||
|
|
|
@ -1,31 +1,32 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace Encompass
|
namespace Encompass
|
||||||
{
|
{
|
||||||
public struct Entity
|
public struct Entity
|
||||||
{
|
{
|
||||||
public readonly uint id;
|
public readonly Guid id;
|
||||||
|
|
||||||
private ComponentManager componentManager;
|
private ComponentManager componentManager;
|
||||||
|
|
||||||
internal Entity(uint id, ComponentManager componentManager)
|
internal Entity(Guid id, ComponentManager componentManager)
|
||||||
{
|
{
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.componentManager = componentManager;
|
this.componentManager = componentManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddComponent<TComponent>(TComponent component) where TComponent : struct, IComponent
|
public Guid AddComponent<TComponent>(TComponent component) where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
componentManager.AddComponent<TComponent>(id, component);
|
return componentManager.AddComponent<TComponent>(id, component);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<TComponent> GetComponents<TComponent>() where TComponent : struct, IComponent
|
public IEnumerable<KeyValuePair<Guid, TComponent>> GetComponents<TComponent>() where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return componentManager.GetComponentsByEntityAndType<TComponent>(id);
|
return componentManager.GetComponentsByEntityAndType<TComponent>(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TComponent GetComponent<TComponent>() where TComponent : struct, IComponent
|
public KeyValuePair<Guid, TComponent> GetComponent<TComponent>() where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return GetComponents<TComponent>().First();
|
return GetComponents<TComponent>().First();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Encompass
|
namespace Encompass
|
||||||
{
|
{
|
||||||
internal class EntityManager
|
internal class EntityManager
|
||||||
{
|
{
|
||||||
private uint nextID = 1;
|
|
||||||
|
|
||||||
private List<Entity> entities = new List<Entity>();
|
private List<Entity> entities = new List<Entity>();
|
||||||
private Dictionary<uint, Entity> IDToEntity = new Dictionary<uint, Entity>();
|
private Dictionary<Guid, Entity> IDToEntity = new Dictionary<Guid, Entity>();
|
||||||
|
|
||||||
private List<Entity> entitiesMarkedForDestroy = new List<Entity>();
|
private List<Entity> entitiesMarkedForDestroy = new List<Entity>();
|
||||||
|
|
||||||
|
@ -25,7 +24,7 @@ namespace Encompass
|
||||||
return new Entity(NextID(), componentManager);
|
return new Entity(NextID(), componentManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Entity GetEntity(uint id)
|
public Entity GetEntity(Guid id)
|
||||||
{
|
{
|
||||||
return this.IDToEntity[id];
|
return this.IDToEntity[id];
|
||||||
}
|
}
|
||||||
|
@ -43,11 +42,9 @@ namespace Encompass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private uint NextID()
|
private Guid NextID()
|
||||||
{
|
{
|
||||||
var id = this.nextID;
|
return Guid.NewGuid();
|
||||||
this.nextID++;
|
|
||||||
return id;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using System.Linq;
|
using FluentAssertions;
|
||||||
|
|
||||||
using Encompass;
|
using Encompass;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Tests
|
namespace Tests
|
||||||
{
|
{
|
||||||
public class EngineTest
|
public class EngineTest
|
||||||
{
|
{
|
||||||
static IEnumerable<MockComponent> resultComponents;
|
static List<KeyValuePair<Guid, MockComponent>> resultComponents;
|
||||||
static MockComponent resultComponent;
|
static MockComponent resultComponent;
|
||||||
|
|
||||||
static List<MockMessage> resultMessages;
|
static List<MockMessage> resultMessages;
|
||||||
|
@ -18,7 +20,7 @@ namespace Tests
|
||||||
{
|
{
|
||||||
public override void Update(float dt)
|
public override void Update(float dt)
|
||||||
{
|
{
|
||||||
resultComponents = this.ReadComponents<MockComponent>();
|
resultComponents = this.ReadComponents<MockComponent>().ToList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +28,7 @@ namespace Tests
|
||||||
{
|
{
|
||||||
public override void Update(float dt)
|
public override void Update(float dt)
|
||||||
{
|
{
|
||||||
resultComponent = this.ReadComponent<MockComponent>();
|
resultComponent = this.ReadComponent<MockComponent>().Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,15 +48,16 @@ namespace Tests
|
||||||
mockComponentB.myInt = 1;
|
mockComponentB.myInt = 1;
|
||||||
mockComponentB.myString = "howdy";
|
mockComponentB.myString = "howdy";
|
||||||
|
|
||||||
entity.AddComponent(mockComponent);
|
var componentAID = entity.AddComponent(mockComponent);
|
||||||
entity.AddComponent(mockComponentB);
|
var componentBID = entity.AddComponent(mockComponentB);
|
||||||
|
|
||||||
var world = worldBuilder.Build();
|
var world = worldBuilder.Build();
|
||||||
|
|
||||||
world.Update(0.01f);
|
world.Update(0.01f);
|
||||||
|
|
||||||
Assert.Contains(mockComponent, resultComponents.ToList());
|
var resultComponentValues = resultComponents.Select((kv) => kv.Value);
|
||||||
Assert.Contains(mockComponentB, resultComponents.ToList());
|
resultComponentValues.Should().Contain(mockComponent);
|
||||||
|
resultComponentValues.Should().Contain(mockComponentB);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -107,14 +110,13 @@ namespace Tests
|
||||||
{
|
{
|
||||||
public override void Update(float dt)
|
public override void Update(float dt)
|
||||||
{
|
{
|
||||||
var component = this.ReadComponent<MockComponent>();
|
(var componentID, var component) = this.ReadComponent<MockComponent>();
|
||||||
this.UpdateComponent(component, (MockComponent comp) =>
|
|
||||||
{
|
component.myInt = 420;
|
||||||
comp.myInt = 420;
|
component.myString = "blaze it";
|
||||||
comp.myString = "blaze it";
|
this.UpdateComponent(componentID, component);
|
||||||
return comp;
|
|
||||||
});
|
resultComponent = this.ReadComponent<MockComponent>().Value;
|
||||||
resultComponent = this.ReadComponent<MockComponent>();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,14 +146,13 @@ namespace Tests
|
||||||
{
|
{
|
||||||
public override void Update(float dt)
|
public override void Update(float dt)
|
||||||
{
|
{
|
||||||
var component = this.ReadComponent<MockComponent>();
|
(var componentID, var component) = this.ReadComponent<MockComponent>();
|
||||||
this.UpdateComponent(component, (MockComponent comp) =>
|
|
||||||
{
|
component.myInt = 420;
|
||||||
comp.myInt = 420;
|
component.myString = "blaze it";
|
||||||
comp.myString = "blaze it";
|
this.UpdateComponent(componentID, component);
|
||||||
return comp;
|
|
||||||
});
|
component = this.ReadComponent<MockComponent>().Value;
|
||||||
component = this.ReadComponent<MockComponent>();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using FluentAssertions;
|
||||||
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
using Encompass;
|
using Encompass;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Tests {
|
namespace Tests
|
||||||
struct MockComponent : IComponent {
|
{
|
||||||
|
struct MockComponent : IComponent
|
||||||
|
{
|
||||||
public string myString;
|
public string myString;
|
||||||
public int myInt;
|
public int myInt;
|
||||||
}
|
}
|
||||||
|
@ -27,7 +33,7 @@ namespace Tests {
|
||||||
// world.Update();
|
// world.Update();
|
||||||
|
|
||||||
Assert.IsTrue(entity.HasComponent<MockComponent>());
|
Assert.IsTrue(entity.HasComponent<MockComponent>());
|
||||||
Assert.AreEqual(mockComponent, entity.GetComponent<MockComponent>());
|
Assert.That(entity.GetComponent<MockComponent>().Value, Is.EqualTo(mockComponent));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -48,15 +54,16 @@ namespace Tests {
|
||||||
mockComponentC.myInt = 1;
|
mockComponentC.myInt = 1;
|
||||||
mockComponentC.myString = "howdy";
|
mockComponentC.myString = "howdy";
|
||||||
|
|
||||||
entity.AddComponent<MockComponent>(mockComponentA);
|
var componentAID = entity.AddComponent<MockComponent>(mockComponentA);
|
||||||
entity.AddComponent<MockComponent>(mockComponentB);
|
var componentBID = entity.AddComponent<MockComponent>(mockComponentB);
|
||||||
entity.AddComponent<MockComponent>(mockComponentC);
|
var componentCID = entity.AddComponent<MockComponent>(mockComponentC);
|
||||||
|
|
||||||
var world = worldBuilder.Build();
|
var world = worldBuilder.Build();
|
||||||
|
|
||||||
Assert.Contains(mockComponentA, entity.GetComponents<MockComponent>().ToList());
|
var components = entity.GetComponents<MockComponent>();
|
||||||
Assert.Contains(mockComponentB, entity.GetComponents<MockComponent>().ToList());
|
components.Should().Contain(new KeyValuePair<Guid, MockComponent>(componentAID, mockComponentA));
|
||||||
Assert.Contains(mockComponentC, entity.GetComponents<MockComponent>().ToList());
|
components.Should().Contain(new KeyValuePair<Guid, MockComponent>(componentBID, mockComponentB));
|
||||||
|
components.Should().Contain(new KeyValuePair<Guid, MockComponent>(componentCID, mockComponentC));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -69,11 +76,11 @@ namespace Tests {
|
||||||
mockComponent.myInt = 3;
|
mockComponent.myInt = 3;
|
||||||
mockComponent.myString = "hello";
|
mockComponent.myString = "hello";
|
||||||
|
|
||||||
entity.AddComponent<MockComponent>(mockComponent);
|
var componentID = entity.AddComponent<MockComponent>(mockComponent);
|
||||||
|
|
||||||
var world = worldBuilder.Build();
|
var world = worldBuilder.Build();
|
||||||
|
|
||||||
Assert.AreEqual(mockComponent, entity.GetComponent<MockComponent>());
|
Assert.AreEqual(new KeyValuePair<Guid, MockComponent>(componentID, mockComponent), entity.GetComponent<MockComponent>());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|
Loading…
Reference in New Issue