268 lines
8.8 KiB
C#
268 lines
8.8 KiB
C#
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;
|
|
}
|