diff --git a/Engine.Tests/BehaviourController_Tests.cs b/Engine.Tests/BehaviourController_Tests.cs new file mode 100644 index 0000000..3fca482 --- /dev/null +++ b/Engine.Tests/BehaviourController_Tests.cs @@ -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(); + Assert.NotNull(behaviourController.GetRequiredBehaviour()); + } + + [Fact] + public void GetRequiredBehaviourRaisesExceptionIfNotFound() + { + IBehaviourController behaviourController = CreateUniverseObject().BehaviourController; + + Assert.Throws(behaviourController.GetRequiredBehaviour); + } + + [Fact] + public void AddSingleBehaviour() + { + IBehaviourController behaviourController = CreateUniverseObject().BehaviourController; + + Assert.NotNull(behaviourController.AddBehaviour()); + Assert.NotNull(behaviourController.GetBehaviour()); + } + + [Fact] + public void AddMultipleBehaviours() + { + IBehaviourController behaviourController = CreateUniverseObject().BehaviourController; + + BehaviourX behaviourX = behaviourController.AddBehaviour(); + BehaviourY behaviourY = behaviourController.AddBehaviour(); + + bool isXFound = false; + bool isYFound = false; + + foreach (IBehaviour behaviour in behaviourController.GetBehaviours()) + { + if (behaviour == behaviourX) isXFound = true; + if (behaviour == behaviourY) isYFound = true; + } + + Assert.True(isXFound && isYFound); + } + + [Fact] + public void AddThenRemoveBehaviour() + { + IBehaviourController behaviourController = CreateUniverseObject().BehaviourController; + + behaviourController.AddBehaviour(); + behaviourController.RemoveBehaviour(); + Assert.Null(behaviourController.GetBehaviour()); + } + + [Fact] + public void GetOrAddBehaviourExtension() + { + IBehaviourController behaviourController = CreateUniverseObject().BehaviourController; + + Assert.Null(behaviourController.GetBehaviour()); + Assert.NotNull(behaviourController.GetOrAddBehaviour()); + } + + [Fact] + public void GetOrAddBehaviourExtensionFallback() + { + IBehaviourController behaviourController = CreateUniverseObject().BehaviourController; + + Assert.Null(behaviourController.GetBehaviour()); + Assert.NotNull(behaviourController.GetOrAddBehaviour()); + } + + [Fact] + public void RemoveSpecificBehaviourViaGeneric() + { + IBehaviourController behaviourController = CreateUniverseObject().BehaviourController; + + behaviourController.AddBehaviour(); + behaviourController.AddBehaviour(); + behaviourController.RemoveBehaviour(); + + Assert.NotNull(behaviourController.GetBehaviour()); + Assert.Null(behaviourController.GetBehaviour()); + } + + [Fact] + public void RemoveSpecificBehaviourViaReference() + { + IBehaviourController behaviourController = CreateUniverseObject().BehaviourController; + + behaviourController.AddBehaviour(); + + BehaviourY behaviourYFirst = behaviourController.AddBehaviour(); + BehaviourY behaviourYSecond = behaviourController.AddBehaviour(); + + behaviourController.RemoveBehaviour(behaviourYFirst); + + Assert.Equal(behaviourController.GetBehaviour(), behaviourYSecond); + Assert.NotNull(behaviourController.GetBehaviour()); + } + + [Fact] + public void AddBehaviourSameTypeCreatesSeparateInstances() + { + IBehaviourController behaviourController = CreateUniverseObject().BehaviourController; + + BehaviourY first = behaviourController.AddBehaviour(); + BehaviourY second = behaviourController.AddBehaviour(); + + 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(); + + 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(); + behaviourController.RemoveBehaviour(); + + 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(); + middleUO.BehaviourController.AddBehaviour(); + childUO.BehaviourController.AddBehaviour(); + + return middleUO; + } + + [Fact] + public void ParentChildScenarioGetBehaviourInParent() + { + IUniverseObject universeObject = CreateParentChildScenario(); + + Assert.NotNull(universeObject.BehaviourController.GetBehaviourInParent()); + } + + [Fact] + public void ParentChildScenarioGetBehaviourInChildren() + { + IUniverseObject universeObject = CreateParentChildScenario(); + + Assert.NotNull(universeObject.BehaviourController.GetBehaviourInChildren()); + } + + [Fact] + public void ParentChildScenarioGetBehaviourInChildrenOnSameObject() + { + IUniverseObject universeObject = CreateParentChildScenario(); + + Assert.NotNull(universeObject.BehaviourController.GetBehaviourInChildren()); + } + + [Fact] + public void ParentChildScenarioGetBehaviourInParentOnSameObject() + { + IUniverseObject universeObject = CreateParentChildScenario(); + + Assert.NotNull(universeObject.BehaviourController.GetBehaviourInParent()); + } + + [Fact] + public void ParentChildScenarioGetBehaviourInParentRaisesExceptionIfNotFound() + { + IUniverseObject universeObject = CreateParentChildScenario(); + + Assert.Throws(universeObject.BehaviourController.GetRequiredBehaviourInParent); + } + + [Fact] + public void ParentChildScenarioGetBehaviourInChildrenRaisesExceptionIfNotFound() + { + IUniverseObject universeObject = CreateParentChildScenario(); + + Assert.Throws(universeObject.BehaviourController.GetRequiredBehaviourInChildren); + } + + [Fact] + public void ParentChildScenarioGetBehaviourInChildrenOnSameObjectRaisesExceptionIfNotFound() + { + IUniverseObject universeObject = CreateParentChildScenario(); + + Assert.Throws(universeObject.BehaviourController.GetRequiredBehaviourInChildren); + } + + [Fact] + public void ParentChildScenarioGetBehaviourInParentOnSameObjectRaisesExceptionIfNotFound() + { + IUniverseObject universeObject = CreateParentChildScenario(); + + Assert.Throws(universeObject.BehaviourController.GetRequiredBehaviourInParent); + } + + #endregion + + private class BehaviourX : BehaviourBase; + private class BehaviourY : BehaviourBase; + private class BehaviourZ : BehaviourBase; +} diff --git a/Engine.Tests/UnitTest1.cs b/Engine.Tests/UnitTest1.cs deleted file mode 100644 index bcddf8e..0000000 --- a/Engine.Tests/UnitTest1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Engine.Tests; - -public class UnitTest1 -{ - [Fact] - public void Test1() - { - - } -}