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