feat: simple behaviour controller tests added

This commit is contained in:
Syntriax 2025-08-04 15:04:05 +03:00
parent 57807c2a62
commit 3c23ac7f1e
2 changed files with 267 additions and 10 deletions

View 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;
}

View File

@ -1,10 +0,0 @@
namespace Engine.Tests;
public class UnitTest1
{
[Fact]
public void Test1()
{
}
}