public IEnumerator FastForwardDoesNotCompleteCondition()
        {
            // Given an activated object in collider condition,
            ObjectInColliderCondition condition = new ObjectInColliderCondition(TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>(), TrackedTrainingSceneObject);

            bool isColliding = false;

            TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>().EnteredTrigger += (sender, args) => isColliding = true;

            condition.LifeCycle.Activate();

            while (condition.LifeCycle.Stage != Stage.Active)
            {
                yield return(null);

                condition.Update();
            }

            // When you fast-forward it
            condition.LifeCycle.MarkToFastForward();

            // Then nothing happens.
            Assert.AreEqual(Stage.Active, condition.LifeCycle.Stage);
            Assert.IsFalse(condition.IsCompleted);
            Assert.IsFalse(isColliding);
        }
        public IEnumerator AutoCompleteActive()
        {
            // Given an object in an activated collider condition,
            ObjectInColliderCondition condition = new ObjectInColliderCondition(TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>(), TrackedTrainingSceneObject);

            bool isColliding = false;

            TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>().EnteredTrigger += (sender, args) => isColliding = true;

            condition.LifeCycle.Activate();

            while (condition.LifeCycle.Stage != Stage.Active)
            {
                yield return(null);

                condition.Update();
            }

            // When you autocomplete it,
            condition.Autocomplete();

            // Then condition is activated and the object is moved into collider.
            Assert.AreEqual(Stage.Active, condition.LifeCycle.Stage);
            Assert.IsTrue(isColliding);
            Assert.IsTrue(condition.IsCompleted);
            yield break;
        }
        public IEnumerator NotCompleted()
        {
            // Activate collider condition
            ObjectInColliderCondition condition = new ObjectInColliderCondition(TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>(), TrackedTrainingSceneObject);

            condition.LifeCycle.Activate();

            while (condition.LifeCycle.Stage != Stage.Active)
            {
                yield return(null);

                condition.Update();
            }

            // Assert that condition is not completed
            Assert.IsFalse(condition.IsCompleted, "TargetInColliderCondition should not be completed!");
        }
        public IEnumerator DontCompleteWhenTargetObjectLeavesColliderEarly()
        {
            // Set the target duration
            const float targetDuration = 0.1f;

            // Activate collider condition
            ObjectInColliderCondition condition = new ObjectInColliderCondition(TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>(), TrackedTrainingSceneObject, targetDuration);

            condition.LifeCycle.Activate();

            while (condition.LifeCycle.Stage != Stage.Active)
            {
                yield return(null);

                condition.Update();
            }

            // Move tracked object to the target position
            TrackedObject.transform.position = TargetPositionObject.transform.position;

            float startTime = Time.time;

            while (Time.time < startTime + targetDuration * 0.3f)
            {
                yield return(null);

                condition.Update();
            }

            // Move tracked object away from target position before condition is completed
            TrackedObject.transform.position = PositionFarFromTarget;

            startTime = Time.time;
            while (Time.time < startTime + targetDuration * 0.8f)
            {
                yield return(null);

                condition.Update();
            }

            // Assert that condition is not completed
            Assert.IsFalse(condition.IsCompleted, "TargetInColliderCondition should not be completed!");
        }
        public IEnumerator CompleteWhenTargetObjectIsInsideColliderWithDuration()
        {
            // Set the target duration
            const float targetDuration = 0.1f;

            // Activate collider condition
            ObjectInColliderCondition condition = new ObjectInColliderCondition(TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>(), TrackedTrainingSceneObject, targetDuration);

            condition.LifeCycle.Activate();

            while (condition.LifeCycle.Stage != Stage.Active)
            {
                yield return(null);

                condition.Update();
            }

            // Move tracked object to the target position
            TrackedObject.transform.position = TargetPositionObject.transform.position;

            Assert.IsFalse(condition.IsCompleted);

            yield return(null);

            condition.Update();

            float startTime = Time.time;

            while (condition.IsCompleted == false)
            {
                yield return(null);

                condition.Update();
            }

            float duration = Time.time - startTime;

            // Assert that condition is completed after the specified time.
            Assert.AreEqual(targetDuration, duration, Time.deltaTime);
            Assert.IsTrue(condition.IsCompleted, "TargetInColliderCondition should be completed!");
        }
        public IEnumerator CompleteWhenTargetObjectIsAtExactPositionAsColliderOnStart()
        {
            // Move tracked object at the target position
            TrackedObject.transform.position = TargetPositionObject.transform.position;
            yield return(null);

            // Activate collider condition
            ObjectInColliderCondition condition = new ObjectInColliderCondition(TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>(), TrackedTrainingSceneObject);

            condition.LifeCycle.Activate();

            while (condition.IsCompleted == false)
            {
                yield return(null);

                condition.Update();
            }

            // Assert that condition is now completed
            Assert.IsTrue(condition.IsCompleted, "TargetInColliderCondition should be completed!");
        }
        public IEnumerator CompleteWhenTargetObjectIsInsideCollider()
        {
            // Activate collider condition
            ObjectInColliderCondition condition = new ObjectInColliderCondition(TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>(), TrackedTrainingSceneObject);

            condition.LifeCycle.Activate();

            yield return(null);

            condition.Update();

            // Move tracked object to the target position
            TrackedObject.transform.position = TargetPositionObject.transform.position - PositionOffsetNearTarget;
            yield return(null);

            condition.Update();
            yield return(null);

            condition.Update();

            // Assert that condition is now completed
            Assert.IsTrue(condition.IsCompleted, "TargetInColliderCondition should be completed!");
        }
        public IEnumerator DontCompleteWhenWrongObjectEntersCollider()
        {
            // In addition to setup phase, also setup an additional object
            GameObject wrongObj = new GameObject("Wrong Object");

            wrongObj.transform.position = PositionFarFromTarget;
            wrongObj.AddComponent <BoxCollider>();
            wrongObj.AddComponent <Rigidbody>();
            TrainingSceneObject wrongTrainingSceneObject = wrongObj.AddComponent <TrainingSceneObject>();

            // Activate collider condition
            ObjectInColliderCondition condition = new ObjectInColliderCondition(TargetTrainingSceneObject.GetProperty <ColliderWithTriggerProperty>(), TrackedTrainingSceneObject);

            condition.LifeCycle.Activate();

            while (condition.LifeCycle.Stage != Stage.Active)
            {
                yield return(null);

                condition.Update();
            }

            // Move tracked object to the target position
            wrongTrainingSceneObject.transform.position = TargetPositionObject.transform.position;

            float startTime = Time.time;

            while (Time.time < startTime + 0.1f)
            {
                yield return(null);

                condition.Update();
            }

            // Assert that condition is not completed
            Assert.IsFalse(condition.IsCompleted, "TargetInColliderCondition should not be completed!");
        }