feat: simple behaviour controller tests added
This commit is contained in:
parent
57807c2a62
commit
3c23ac7f1e
267
Engine.Tests/BehaviourController_Tests.cs
Normal file
267
Engine.Tests/BehaviourController_Tests.cs
Normal file
@ -0,0 +1,267 @@
|
||||
using Syntriax.Engine.Core;
|
||||
using Syntriax.Engine.Core.Exceptions;
|
||||
|
||||
namespace Engine.Tests;
|
||||
|
||||
public class BehaviourController_Tests
|
||||
{
|
||||
[Fact]
|
||||
public void GetRequiredBehaviour()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
behaviourController.AddBehaviour<BehaviourX>();
|
||||
Assert.NotNull(behaviourController.GetRequiredBehaviour<BehaviourX>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetRequiredBehaviourRaisesExceptionIfNotFound()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
Assert.Throws<BehaviourNotFoundException>(behaviourController.GetRequiredBehaviour<BehaviourX>);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddSingleBehaviour()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
Assert.NotNull(behaviourController.AddBehaviour<BehaviourX>());
|
||||
Assert.NotNull(behaviourController.GetBehaviour<BehaviourX>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddMultipleBehaviours()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
BehaviourX behaviourX = behaviourController.AddBehaviour<BehaviourX>();
|
||||
BehaviourY behaviourY = behaviourController.AddBehaviour<BehaviourY>();
|
||||
|
||||
bool isXFound = false;
|
||||
bool isYFound = false;
|
||||
|
||||
foreach (IBehaviour behaviour in behaviourController.GetBehaviours<IBehaviour>())
|
||||
{
|
||||
if (behaviour == behaviourX) isXFound = true;
|
||||
if (behaviour == behaviourY) isYFound = true;
|
||||
}
|
||||
|
||||
Assert.True(isXFound && isYFound);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddThenRemoveBehaviour()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
behaviourController.AddBehaviour<BehaviourX>();
|
||||
behaviourController.RemoveBehaviour<BehaviourX>();
|
||||
Assert.Null(behaviourController.GetBehaviour<BehaviourX>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetOrAddBehaviourExtension()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
Assert.Null(behaviourController.GetBehaviour<BehaviourX>());
|
||||
Assert.NotNull(behaviourController.GetOrAddBehaviour<BehaviourX>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetOrAddBehaviourExtensionFallback()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
Assert.Null(behaviourController.GetBehaviour<IBehaviour>());
|
||||
Assert.NotNull(behaviourController.GetOrAddBehaviour<IBehaviour, BehaviourX>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RemoveSpecificBehaviourViaGeneric()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
behaviourController.AddBehaviour<BehaviourX>();
|
||||
behaviourController.AddBehaviour<BehaviourY>();
|
||||
behaviourController.RemoveBehaviour<BehaviourY>();
|
||||
|
||||
Assert.NotNull(behaviourController.GetBehaviour<BehaviourX>());
|
||||
Assert.Null(behaviourController.GetBehaviour<BehaviourY>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RemoveSpecificBehaviourViaReference()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
behaviourController.AddBehaviour<BehaviourX>();
|
||||
|
||||
BehaviourY behaviourYFirst = behaviourController.AddBehaviour<BehaviourY>();
|
||||
BehaviourY behaviourYSecond = behaviourController.AddBehaviour<BehaviourY>();
|
||||
|
||||
behaviourController.RemoveBehaviour(behaviourYFirst);
|
||||
|
||||
Assert.Equal(behaviourController.GetBehaviour<BehaviourY>(), behaviourYSecond);
|
||||
Assert.NotNull(behaviourController.GetBehaviour<BehaviourX>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddBehaviourSameTypeCreatesSeparateInstances()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
BehaviourY first = behaviourController.AddBehaviour<BehaviourY>();
|
||||
BehaviourY second = behaviourController.AddBehaviour<BehaviourY>();
|
||||
|
||||
Assert.NotSame(first, second);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void BehaviourAddedEvents()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
IBehaviourController? sender = null;
|
||||
IBehaviourController.BehaviourAddedArguments? arguments = null;
|
||||
|
||||
behaviourController.OnBehaviourAdded.AddListener((s, a) =>
|
||||
{
|
||||
sender = s;
|
||||
arguments = a;
|
||||
});
|
||||
|
||||
behaviourController.AddBehaviour<BehaviourX>();
|
||||
|
||||
Assert.NotNull(sender);
|
||||
Assert.NotNull(arguments);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void BehaviourRemovedEvents()
|
||||
{
|
||||
IBehaviourController behaviourController = CreateUniverseObject().BehaviourController;
|
||||
|
||||
IBehaviourController? sender = null;
|
||||
IBehaviourController.BehaviourRemovedArguments? arguments = null;
|
||||
|
||||
behaviourController.OnBehaviourRemoved.AddListener((s, a) =>
|
||||
{
|
||||
sender = s;
|
||||
arguments = a;
|
||||
});
|
||||
|
||||
behaviourController.AddBehaviour<BehaviourX>();
|
||||
behaviourController.RemoveBehaviour<BehaviourX>();
|
||||
|
||||
Assert.NotNull(sender);
|
||||
Assert.NotNull(arguments);
|
||||
}
|
||||
|
||||
#region Hierarchy Structure
|
||||
|
||||
private static IUniverseObject CreateUniverseObject()
|
||||
{
|
||||
UniverseObject universeObject = new();
|
||||
BehaviourController behaviourController = new();
|
||||
|
||||
universeObject.Assign(new StateEnable());
|
||||
universeObject.StateEnable.Assign(universeObject);
|
||||
|
||||
behaviourController.Assign(new StateEnable());
|
||||
behaviourController.StateEnable.Assign(behaviourController);
|
||||
|
||||
behaviourController.Assign(universeObject);
|
||||
universeObject.Assign(behaviourController);
|
||||
|
||||
universeObject.Initialize();
|
||||
behaviourController.Initialize();
|
||||
|
||||
return universeObject;
|
||||
}
|
||||
|
||||
public static IUniverseObject CreateParentChildScenario()
|
||||
{
|
||||
IUniverseObject parentUO = CreateUniverseObject().SetUniverseObject("Parent");
|
||||
IUniverseObject middleUO = CreateUniverseObject().SetUniverseObject("Middle", parentUO);
|
||||
IUniverseObject childUO = CreateUniverseObject().SetUniverseObject("Child", middleUO);
|
||||
|
||||
parentUO.BehaviourController.AddBehaviour<BehaviourY>();
|
||||
middleUO.BehaviourController.AddBehaviour<BehaviourX>();
|
||||
childUO.BehaviourController.AddBehaviour<BehaviourY>();
|
||||
|
||||
return middleUO;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParentChildScenarioGetBehaviourInParent()
|
||||
{
|
||||
IUniverseObject universeObject = CreateParentChildScenario();
|
||||
|
||||
Assert.NotNull(universeObject.BehaviourController.GetBehaviourInParent<BehaviourY>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParentChildScenarioGetBehaviourInChildren()
|
||||
{
|
||||
IUniverseObject universeObject = CreateParentChildScenario();
|
||||
|
||||
Assert.NotNull(universeObject.BehaviourController.GetBehaviourInChildren<BehaviourY>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParentChildScenarioGetBehaviourInChildrenOnSameObject()
|
||||
{
|
||||
IUniverseObject universeObject = CreateParentChildScenario();
|
||||
|
||||
Assert.NotNull(universeObject.BehaviourController.GetBehaviourInChildren<BehaviourX>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParentChildScenarioGetBehaviourInParentOnSameObject()
|
||||
{
|
||||
IUniverseObject universeObject = CreateParentChildScenario();
|
||||
|
||||
Assert.NotNull(universeObject.BehaviourController.GetBehaviourInParent<BehaviourX>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParentChildScenarioGetBehaviourInParentRaisesExceptionIfNotFound()
|
||||
{
|
||||
IUniverseObject universeObject = CreateParentChildScenario();
|
||||
|
||||
Assert.Throws<BehaviourNotFoundException>(universeObject.BehaviourController.GetRequiredBehaviourInParent<BehaviourZ>);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParentChildScenarioGetBehaviourInChildrenRaisesExceptionIfNotFound()
|
||||
{
|
||||
IUniverseObject universeObject = CreateParentChildScenario();
|
||||
|
||||
Assert.Throws<BehaviourNotFoundException>(universeObject.BehaviourController.GetRequiredBehaviourInChildren<BehaviourZ>);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParentChildScenarioGetBehaviourInChildrenOnSameObjectRaisesExceptionIfNotFound()
|
||||
{
|
||||
IUniverseObject universeObject = CreateParentChildScenario();
|
||||
|
||||
Assert.Throws<BehaviourNotFoundException>(universeObject.BehaviourController.GetRequiredBehaviourInChildren<BehaviourZ>);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParentChildScenarioGetBehaviourInParentOnSameObjectRaisesExceptionIfNotFound()
|
||||
{
|
||||
IUniverseObject universeObject = CreateParentChildScenario();
|
||||
|
||||
Assert.Throws<BehaviourNotFoundException>(universeObject.BehaviourController.GetRequiredBehaviourInParent<BehaviourZ>);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private class BehaviourX : BehaviourBase;
|
||||
private class BehaviourY : BehaviourBase;
|
||||
private class BehaviourZ : BehaviourBase;
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
namespace Engine.Tests;
|
||||
|
||||
public class UnitTest1
|
||||
{
|
||||
[Fact]
|
||||
public void Test1()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user