public IEnumerator FastForwardDoesNotCompleteCondition()
        {
            // Given a teleport condition,
            GameObject obj = new GameObject("T1");
            TeleportationPropertyMock mockedProperty = obj.AddComponent <TeleportationPropertyMock>();

            yield return(new WaitForFixedUpdate());

            TeleportCondition condition = new TeleportCondition(mockedProperty);

            // When you activate it,
            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);
        }
        public IEnumerator CompleteWhenTeleported()
        {
            // Setup object with mocked teleport property and activate
            GameObject obj = new GameObject("T1");
            TeleportationPropertyMock mockedProperty = obj.AddComponent <TeleportationPropertyMock>();

            yield return(new WaitForFixedUpdate());

            TeleportCondition condition = new TeleportCondition(mockedProperty);

            condition.LifeCycle.Activate();

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

                condition.Update();
            }

            // When the object is teleported
            mockedProperty.EmitTeleported();

            yield return(null);

            condition.Update();

            // Assert that condition is now completed
            Assert.IsTrue(condition.IsCompleted);
        }
        public IEnumerator AutoCompleteActive()
        {
            // Given a teleport condition,
            GameObject obj = new GameObject("T1");
            TeleportationPropertyMock mockedProperty = obj.AddComponent <TeleportationPropertyMock>();

            yield return(new WaitForFixedUpdate());

            TeleportCondition condition = new TeleportCondition(mockedProperty);

            // When you activate and autocomplete it,
            condition.LifeCycle.Activate();

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

                condition.Update();
            }

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

            // Then it is completed.
            Assert.AreEqual(Stage.Active, condition.LifeCycle.Stage);
            Assert.IsTrue(condition.IsCompleted);
        }
        public IEnumerator ConditionNotCompleted()
        {
            // Setup object with mocked teleport property and activate
            GameObject obj = new GameObject("T1");
            TeleportationPropertyMock mockedProperty = obj.AddComponent <TeleportationPropertyMock>();
            TeleportCondition         condition      = new TeleportCondition(mockedProperty);

            condition.LifeCycle.Activate();

            float startTime = Time.time;

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

                condition.Update();
            }

            // Assert after doing nothing the condition is not completed.
            Assert.IsFalse(condition.IsCompleted);
        }
        public IEnumerator CompleteOnlyWhenTeleportedDuringStepExecution()
        {
            // Setup object with mocked teleport property and activate
            GameObject obj = new GameObject("T1");
            TeleportationPropertyMock mockedProperty = obj.AddComponent <TeleportationPropertyMock>();

            Assert.IsFalse(mockedProperty.WasUsedToTeleport);

            mockedProperty.EmitTeleported();

            Assert.IsTrue(mockedProperty.WasUsedToTeleport);

            yield return(new WaitForFixedUpdate());

            TeleportCondition condition = new TeleportCondition(mockedProperty);

            condition.LifeCycle.Activate();

            float startTime = Time.time;

            while (condition.IsCompleted == false && Time.time < startTime + 0.1f)
            {
                yield return(null);

                condition.Update();
            }

            Assert.IsFalse(mockedProperty.WasUsedToTeleport);

            // When the object is teleported
            mockedProperty.EmitTeleported();

            yield return(null);

            condition.Update();

            // Assert that condition is now completed due WasUsedToTeleport being true
            Assert.IsTrue(mockedProperty.WasUsedToTeleport);
            Assert.IsTrue(condition.IsCompleted);
        }