using Zinnia.Tracking.Follow.Modifier; using Zinnia.Tracking.Follow.Modifier.Property; namespace Test.Zinnia.Tracking.Follow.Modifier { using NUnit.Framework; using Test.Zinnia.Utility.Mock; using UnityEngine; public class FollowModifierTest { private GameObject containingObject; private FollowModifier subject; [SetUp] public void SetUp() { containingObject = new GameObject("FollowModifierTest"); subject = containingObject.AddComponent(); } [TearDown] public void TearDown() { Object.DestroyImmediate(containingObject); } [Test] public void Modify() { UnityEventListenerMock premodifiedMock = new UnityEventListenerMock(); UnityEventListenerMock modifiedMock = new UnityEventListenerMock(); subject.Premodified.AddListener(premodifiedMock.Listen); subject.Modified.AddListener(modifiedMock.Listen); GameObject source = new GameObject("FollowModifierTest"); GameObject target = new GameObject("FollowModifierTest"); GameObject offset = new GameObject("FollowModifierTest"); PropertyModifierMock positionMock = source.AddComponent(); PropertyModifierMock rotationMock = source.AddComponent(); PropertyModifierMock scaleMock = source.AddComponent(); Assert.IsNull(subject.CachedSource); Assert.IsNull(subject.CachedTarget); Assert.IsNull(subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); subject.PositionModifier = positionMock; subject.RotationModifier = rotationMock; subject.ScaleModifier = scaleMock; subject.Modify(source, target, offset); Assert.AreEqual(source, subject.CachedSource); Assert.AreEqual(target, subject.CachedTarget); Assert.AreEqual(offset, subject.CachedOffset); Assert.IsTrue(premodifiedMock.Received); Assert.IsTrue(modifiedMock.Received); Assert.IsTrue(positionMock.modified); Assert.IsTrue(rotationMock.modified); Assert.IsTrue(scaleMock.modified); Object.DestroyImmediate(source); Object.DestroyImmediate(target); Object.DestroyImmediate(offset); } [Test] public void ModifyNoOffset() { UnityEventListenerMock premodifiedMock = new UnityEventListenerMock(); UnityEventListenerMock modifiedMock = new UnityEventListenerMock(); subject.Premodified.AddListener(premodifiedMock.Listen); subject.Modified.AddListener(modifiedMock.Listen); GameObject source = new GameObject("FollowModifierTest"); GameObject target = new GameObject("FollowModifierTest"); PropertyModifierMock positionMock = source.AddComponent(); PropertyModifierMock rotationMock = source.AddComponent(); PropertyModifierMock scaleMock = source.AddComponent(); Assert.IsNull(subject.CachedSource); Assert.IsNull(subject.CachedTarget); Assert.IsNull(subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); subject.PositionModifier = positionMock; subject.RotationModifier = rotationMock; subject.ScaleModifier = scaleMock; subject.Modify(source, target); Assert.AreEqual(source, subject.CachedSource); Assert.AreEqual(target, subject.CachedTarget); Assert.IsNull(subject.CachedOffset); Assert.IsTrue(premodifiedMock.Received); Assert.IsTrue(modifiedMock.Received); Assert.IsTrue(positionMock.modified); Assert.IsTrue(rotationMock.modified); Assert.IsTrue(scaleMock.modified); Object.DestroyImmediate(source); Object.DestroyImmediate(target); } [Test] public void ModifyNoSource() { UnityEventListenerMock premodifiedMock = new UnityEventListenerMock(); UnityEventListenerMock modifiedMock = new UnityEventListenerMock(); subject.Premodified.AddListener(premodifiedMock.Listen); subject.Modified.AddListener(modifiedMock.Listen); GameObject target = new GameObject("FollowModifierTest"); GameObject offset = new GameObject("FollowModifierTest"); PropertyModifierMock positionMock = target.AddComponent(); PropertyModifierMock rotationMock = target.AddComponent(); PropertyModifierMock scaleMock = target.AddComponent(); Assert.IsNull(subject.CachedSource); Assert.IsNull(subject.CachedTarget); Assert.IsNull(subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); subject.PositionModifier = positionMock; subject.RotationModifier = rotationMock; subject.ScaleModifier = scaleMock; subject.Modify(null, target, offset); Assert.IsNull(subject.CachedSource); Assert.AreEqual(target, subject.CachedTarget); Assert.AreEqual(offset, subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); Object.DestroyImmediate(target); Object.DestroyImmediate(offset); } [Test] public void ModifyNoTarget() { UnityEventListenerMock premodifiedMock = new UnityEventListenerMock(); UnityEventListenerMock modifiedMock = new UnityEventListenerMock(); subject.Premodified.AddListener(premodifiedMock.Listen); subject.Modified.AddListener(modifiedMock.Listen); GameObject source = new GameObject("FollowModifierTest"); GameObject offset = new GameObject("FollowModifierTest"); PropertyModifierMock positionMock = source.AddComponent(); PropertyModifierMock rotationMock = source.AddComponent(); PropertyModifierMock scaleMock = source.AddComponent(); Assert.IsNull(subject.CachedSource); Assert.IsNull(subject.CachedTarget); Assert.IsNull(subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); subject.PositionModifier = positionMock; subject.RotationModifier = rotationMock; subject.ScaleModifier = scaleMock; subject.Modify(source, null, offset); Assert.AreEqual(source, subject.CachedSource); Assert.IsNull(subject.CachedTarget); Assert.AreEqual(offset, subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); Object.DestroyImmediate(source); Object.DestroyImmediate(offset); } [Test] public void ModifyInactiveGameObject() { UnityEventListenerMock premodifiedMock = new UnityEventListenerMock(); UnityEventListenerMock modifiedMock = new UnityEventListenerMock(); subject.Premodified.AddListener(premodifiedMock.Listen); subject.Modified.AddListener(modifiedMock.Listen); GameObject source = new GameObject("FollowModifierTest"); GameObject target = new GameObject("FollowModifierTest"); GameObject offset = new GameObject("FollowModifierTest"); PropertyModifierMock positionMock = source.AddComponent(); PropertyModifierMock rotationMock = source.AddComponent(); PropertyModifierMock scaleMock = source.AddComponent(); Assert.IsNull(subject.CachedSource); Assert.IsNull(subject.CachedTarget); Assert.IsNull(subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); subject.PositionModifier = positionMock; subject.RotationModifier = rotationMock; subject.ScaleModifier = scaleMock; subject.gameObject.SetActive(false); subject.Modify(source, target, offset); Assert.IsNull(subject.CachedSource); Assert.IsNull(subject.CachedTarget); Assert.IsNull(subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); Object.DestroyImmediate(source); Object.DestroyImmediate(target); Object.DestroyImmediate(offset); } [Test] public void ModifyInactiveComponent() { UnityEventListenerMock premodifiedMock = new UnityEventListenerMock(); UnityEventListenerMock modifiedMock = new UnityEventListenerMock(); subject.Premodified.AddListener(premodifiedMock.Listen); subject.Modified.AddListener(modifiedMock.Listen); GameObject source = new GameObject("FollowModifierTest"); GameObject target = new GameObject("FollowModifierTest"); GameObject offset = new GameObject("FollowModifierTest"); PropertyModifierMock positionMock = source.AddComponent(); PropertyModifierMock rotationMock = source.AddComponent(); PropertyModifierMock scaleMock = source.AddComponent(); Assert.IsNull(subject.CachedSource); Assert.IsNull(subject.CachedTarget); Assert.IsNull(subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); subject.PositionModifier = positionMock; subject.RotationModifier = rotationMock; subject.ScaleModifier = scaleMock; subject.enabled = false; subject.Modify(source, target, offset); Assert.IsNull(subject.CachedSource); Assert.IsNull(subject.CachedTarget); Assert.IsNull(subject.CachedOffset); Assert.IsFalse(premodifiedMock.Received); Assert.IsFalse(modifiedMock.Received); Assert.IsFalse(positionMock.modified); Assert.IsFalse(rotationMock.modified); Assert.IsFalse(scaleMock.modified); Object.DestroyImmediate(source); Object.DestroyImmediate(target); Object.DestroyImmediate(offset); } [Test] public void ClearScaleModifier() { Assert.IsNull(subject.ScaleModifier); PropertyModifierMock modifier = containingObject.AddComponent(); subject.ScaleModifier = modifier; Assert.AreEqual(modifier, subject.ScaleModifier); subject.ClearScaleModifier(); Assert.IsNull(subject.ScaleModifier); } [Test] public void ClearScaleModifierInactiveGameObject() { Assert.IsNull(subject.ScaleModifier); PropertyModifierMock modifier = containingObject.AddComponent(); subject.ScaleModifier = modifier; Assert.AreEqual(modifier, subject.ScaleModifier); subject.gameObject.SetActive(false); subject.ClearScaleModifier(); Assert.AreEqual(modifier, subject.ScaleModifier); } [Test] public void ClearScaleModifierInactiveComponent() { Assert.IsNull(subject.ScaleModifier); PropertyModifierMock modifier = containingObject.AddComponent(); subject.ScaleModifier = modifier; Assert.AreEqual(modifier, subject.ScaleModifier); subject.enabled = false; subject.ClearScaleModifier(); Assert.AreEqual(modifier, subject.ScaleModifier); } [Test] public void ClearRotationModifier() { Assert.IsNull(subject.RotationModifier); PropertyModifierMock modifier = containingObject.AddComponent(); subject.RotationModifier = modifier; Assert.AreEqual(modifier, subject.RotationModifier); subject.ClearRotationModifier(); Assert.IsNull(subject.RotationModifier); } [Test] public void ClearRotationModifierInactiveGameObject() { Assert.IsNull(subject.RotationModifier); PropertyModifierMock modifier = containingObject.AddComponent(); subject.RotationModifier = modifier; Assert.AreEqual(modifier, subject.RotationModifier); subject.gameObject.SetActive(false); subject.ClearRotationModifier(); Assert.AreEqual(modifier, subject.RotationModifier); } [Test] public void ClearRotationModifierInactiveComponent() { Assert.IsNull(subject.RotationModifier); PropertyModifierMock modifier = containingObject.AddComponent(); subject.RotationModifier = modifier; Assert.AreEqual(modifier, subject.RotationModifier); subject.enabled = false; subject.ClearRotationModifier(); Assert.AreEqual(modifier, subject.RotationModifier); } [Test] public void ClearPositionModifier() { Assert.IsNull(subject.PositionModifier); PropertyModifierMock modifier = containingObject.AddComponent(); subject.PositionModifier = modifier; Assert.AreEqual(modifier, subject.PositionModifier); subject.ClearPositionModifier(); Assert.IsNull(subject.PositionModifier); } [Test] public void ClearPositionModifierInactiveGameObject() { Assert.IsNull(subject.PositionModifier); PropertyModifierMock modifier = containingObject.AddComponent(); subject.PositionModifier = modifier; Assert.AreEqual(modifier, subject.PositionModifier); subject.gameObject.SetActive(false); subject.ClearPositionModifier(); Assert.AreEqual(modifier, subject.PositionModifier); } [Test] public void ClearPositionModifierInactiveComponent() { Assert.IsNull(subject.PositionModifier); PropertyModifierMock modifier = containingObject.AddComponent(); subject.PositionModifier = modifier; Assert.AreEqual(modifier, subject.PositionModifier); subject.enabled = false; subject.ClearPositionModifier(); Assert.AreEqual(modifier, subject.PositionModifier); } } public class PropertyModifierMock : PropertyModifier { public bool modified; protected override void DoModify(GameObject source, GameObject target, GameObject offset = null) { modified = true; } } }