406 lines
13 KiB
C#
406 lines
13 KiB
C#
using NUnit.Framework;
|
|
using FluentAssertions;
|
|
|
|
using Encompass;
|
|
using System.Collections.Generic;
|
|
using System;
|
|
using System.Linq;
|
|
using Encompass.Exceptions;
|
|
|
|
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;
|
|
|
|
[Receives(typeof(EntityMessage))]
|
|
[Reads(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;
|
|
}
|
|
|
|
[Receives(typeof(AddComponentTestMessage))]
|
|
[Reads(typeof(MockComponent))]
|
|
class AddComponentTestEngine : 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 AddComponentTestEngine());
|
|
|
|
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.SendMessage(addComponentTestMessage);
|
|
|
|
var world = worldBuilder.Build();
|
|
|
|
world.Update(0.01);
|
|
}
|
|
|
|
[Test]
|
|
public void AddMultipleComponentOfSameTypeToEntity()
|
|
{
|
|
var worldBuilder = new WorldBuilder();
|
|
|
|
MockComponent mockComponent;
|
|
mockComponent.myInt = 3;
|
|
mockComponent.myString = "hello";
|
|
|
|
var entity = worldBuilder.CreateEntity();
|
|
worldBuilder.AddComponent(entity, mockComponent);
|
|
worldBuilder.AddComponent(entity, mockComponent);
|
|
|
|
Assert.Throws<MultipleComponentOfSameTypeException>(() => worldBuilder.Build());
|
|
}
|
|
|
|
[Reads(typeof(MockComponent))]
|
|
[Writes(typeof(MockComponent))]
|
|
class MultipleAddEngine : Engine
|
|
{
|
|
public override void Update(double dt)
|
|
{
|
|
foreach (var (mockComponentID, mockComponent) in ReadComponents<MockComponent>())
|
|
{
|
|
var entity = GetEntityByComponentID(mockComponentID);
|
|
|
|
SetComponent(entity, new MockComponent());
|
|
}
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void EngineAddMultipleComponentOfSameTypeToEntity()
|
|
{
|
|
var worldBuilder = new WorldBuilder();
|
|
worldBuilder.AddEngine(new MultipleAddEngine());
|
|
|
|
var entity = worldBuilder.CreateEntity();
|
|
worldBuilder.AddComponent(entity, new MockComponent());
|
|
|
|
var world = worldBuilder.Build();
|
|
|
|
Assert.Throws<MultipleComponentOfSameTypeException>(() => world.Update(0.01));
|
|
}
|
|
|
|
[Reads(typeof(MockComponent))]
|
|
[Writes(typeof(MockComponent))]
|
|
class AddAndRemoveComponentEngine : Engine
|
|
{
|
|
public override void Update(double dt)
|
|
{
|
|
foreach (var (mockComponentID, mockComponent) in ReadComponents<MockComponent>())
|
|
{
|
|
var entity = GetEntityByComponentID(mockComponentID);
|
|
SetComponent(entity, mockComponent);
|
|
RemoveComponent(mockComponentID);
|
|
}
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void AddMultipleComponentSameFrameAsRemove()
|
|
{
|
|
var worldBuilder = new WorldBuilder();
|
|
worldBuilder.AddEngine(new AddAndRemoveComponentEngine());
|
|
|
|
var entity = worldBuilder.CreateEntity();
|
|
worldBuilder.AddComponent(entity, new MockComponent());
|
|
|
|
var world = worldBuilder.Build();
|
|
|
|
Assert.DoesNotThrow(() => world.Update(0.01));
|
|
}
|
|
|
|
struct AddMockComponentMessage : IMessage
|
|
{
|
|
public Entity entity;
|
|
public MockComponent mockComponent;
|
|
}
|
|
|
|
[Sends(typeof(AddMockComponentMessage))]
|
|
class EmitMockComponentMessageEngine : Engine
|
|
{
|
|
private Entity entity;
|
|
|
|
public EmitMockComponentMessageEngine(Entity entity)
|
|
{
|
|
this.entity = entity;
|
|
}
|
|
|
|
public override void Update(double dt)
|
|
{
|
|
MockComponent mockComponent;
|
|
mockComponent.myInt = 10;
|
|
mockComponent.myString = "four";
|
|
|
|
AddMockComponentMessage addMockComponentMessage;
|
|
addMockComponentMessage.entity = entity;
|
|
addMockComponentMessage.mockComponent = mockComponent;
|
|
SendMessage(addMockComponentMessage);
|
|
}
|
|
}
|
|
|
|
[WritesPending(typeof(MockComponent))]
|
|
[Receives(typeof(AddMockComponentMessage))]
|
|
[Writes(typeof(MockComponent))]
|
|
class AddMockComponentEngine : Engine
|
|
{
|
|
public override void Update(double dt)
|
|
{
|
|
foreach (var message in ReadMessages<AddMockComponentMessage>())
|
|
{
|
|
SetComponent(message.entity, message.mockComponent);
|
|
}
|
|
}
|
|
}
|
|
|
|
[ReadsPending(typeof(MockComponent))]
|
|
class HasMockComponentEngine : Engine
|
|
{
|
|
private Entity entity;
|
|
|
|
public HasMockComponentEngine(Entity entity)
|
|
{
|
|
this.entity = entity;
|
|
}
|
|
|
|
public override void Update(double dt)
|
|
{
|
|
Assert.IsTrue(HasComponent<MockComponent>(entity));
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void AddComponentAndReadSameFrame()
|
|
{
|
|
var worldBuilder = new WorldBuilder();
|
|
var entity = worldBuilder.CreateEntity();
|
|
|
|
worldBuilder.AddEngine(new EmitMockComponentMessageEngine(entity));
|
|
worldBuilder.AddEngine(new AddMockComponentEngine());
|
|
worldBuilder.AddEngine(new HasMockComponentEngine(entity));
|
|
|
|
var world = worldBuilder.Build();
|
|
|
|
world.Update(0.01);
|
|
}
|
|
|
|
[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.SendMessage(entityMessage);
|
|
|
|
var world = worldBuilder.Build();
|
|
|
|
world.Update(0.01);
|
|
|
|
Assert.AreEqual((componentID, mockComponent), gottenMockComponentIDPair);
|
|
}
|
|
|
|
struct HasComponentTestMessage : IMessage
|
|
{
|
|
public Entity entity;
|
|
}
|
|
|
|
[Receives(typeof(HasComponentTestMessage))]
|
|
[Reads(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.SendMessage(hasComponentTestMessage);
|
|
|
|
var world = worldBuilder.Build();
|
|
|
|
world.Update(0.01);
|
|
}
|
|
|
|
struct RemoveComponentTestMessage : IMessage
|
|
{
|
|
public Entity entity;
|
|
public Guid componentID;
|
|
}
|
|
|
|
[Receives(typeof(RemoveComponentTestMessage))]
|
|
class RemoveComponentTestEngine : Engine
|
|
{
|
|
public override void Update(double dt)
|
|
{
|
|
foreach (var removeComponentMessage in ReadMessages<RemoveComponentTestMessage>())
|
|
{
|
|
RemoveComponent(removeComponentMessage.componentID);
|
|
}
|
|
}
|
|
}
|
|
|
|
[Receives(typeof(RemoveComponentTestMessage))]
|
|
[Sends(typeof(CheckHasMockComponentMessage))]
|
|
class DoRemoveCheckEngine : Engine
|
|
{
|
|
private Entity entity;
|
|
|
|
public DoRemoveCheckEngine(Entity entity)
|
|
{
|
|
this.entity = entity;
|
|
}
|
|
|
|
public override void Update(double dt)
|
|
{
|
|
if (SomeMessage<RemoveComponentTestMessage>())
|
|
{
|
|
CheckHasMockComponentMessage checkHasMockComponentMessage;
|
|
checkHasMockComponentMessage.entity = entity;
|
|
checkHasMockComponentMessage.shouldHaveComponent = true;
|
|
SendMessage(checkHasMockComponentMessage);
|
|
}
|
|
else
|
|
{
|
|
CheckHasMockComponentMessage checkHasMockComponentMessage;
|
|
checkHasMockComponentMessage.entity = entity;
|
|
checkHasMockComponentMessage.shouldHaveComponent = false;
|
|
SendMessage(checkHasMockComponentMessage);
|
|
}
|
|
}
|
|
}
|
|
|
|
[Receives(typeof(CheckHasMockComponentMessage))]
|
|
[Reads(typeof(MockComponent))]
|
|
class CheckHasMockComponentEngine : Engine
|
|
{
|
|
public override void Update(double dt)
|
|
{
|
|
foreach (var checkHasMockComponentMessage in ReadMessages<CheckHasMockComponentMessage>())
|
|
{
|
|
Assert.IsTrue(HasComponent<MockComponent>(checkHasMockComponentMessage.entity));
|
|
}
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveComponent()
|
|
{
|
|
var worldBuilder = new WorldBuilder();
|
|
var entity = worldBuilder.CreateEntity();
|
|
|
|
worldBuilder.AddEngine(new RemoveComponentTestEngine());
|
|
worldBuilder.AddEngine(new CheckHasMockComponentEngine());
|
|
worldBuilder.AddEngine(new DoRemoveCheckEngine(entity));
|
|
|
|
MockComponent mockComponent;
|
|
mockComponent.myInt = 3;
|
|
mockComponent.myString = "hello";
|
|
|
|
var componentID = worldBuilder.AddComponent(entity, mockComponent);
|
|
|
|
RemoveComponentTestMessage removeComponentMessage;
|
|
removeComponentMessage.entity = entity;
|
|
removeComponentMessage.componentID = componentID;
|
|
worldBuilder.SendMessage(removeComponentMessage);
|
|
|
|
var world = worldBuilder.Build();
|
|
|
|
world.Update(0.01f);
|
|
}
|
|
|
|
struct CheckHasMockComponentMessage : IMessage
|
|
{
|
|
public Entity entity;
|
|
public bool shouldHaveComponent;
|
|
}
|
|
|
|
[Receives(typeof(CheckHasMockComponentMessage))]
|
|
[ReadsPending(typeof(MockComponent))]
|
|
class CheckHasPendingMockComponentEngine : Engine
|
|
{
|
|
public override void Update(double dt)
|
|
{
|
|
foreach (var checkHasMockComponentMessage in ReadMessages<CheckHasMockComponentMessage>())
|
|
{
|
|
Assert.IsTrue(HasComponent<MockComponent>(checkHasMockComponentMessage.entity));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|