Beispiel #1
0
        [Test] public void Cancelling()
        {
            Scene scene = new Scene();

            scene.Activate();

            CoroutineObject obj       = new CoroutineObject();
            Coroutine       coroutine = scene.StartCoroutine(this.BasicRoutine(obj));

            // All code until first yield is already executed
            Assert.AreEqual(10, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Running);

            scene.Update();

            // All code until second yield is executed
            Assert.AreEqual(20, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Running);

            coroutine.Cancel();
            scene.Update();

            // Coroutine disposed
            Assert.AreEqual(20, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Cancelled);

            scene.Update();

            // No further changes
            Assert.AreEqual(20, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Cancelled);
        }
Beispiel #2
0
        private IEnumerable <WaitUntil> WaitSeconds(CoroutineObject obj, int seconds)
        {
            obj.Value = 10;
            yield return(WaitUntil.Seconds(seconds));

            obj.Value = 20;
        }
Beispiel #3
0
        [Test] public void WaitTwoSeconds()
        {
            Scene scene = new Scene();

            scene.Activate();

            int             secondsToWait = 2;
            CoroutineObject obj           = new CoroutineObject();
            Coroutine       coroutine     = scene.StartCoroutine(this.WaitSeconds(obj, secondsToWait));

            // All code until first yield is already executed
            Assert.AreEqual(10, obj.Value);
            TimeSpan startTime = Time.GameTimer;

            // Waiting...
            while (obj.Value == 10)
            {
                scene.Update();
                Time.FrameTick(true, true);
            }

            double secondsElapsed = (Time.GameTimer - startTime).TotalSeconds;

            Assert.AreEqual(20, obj.Value);

            // Not being overly precise about the 2 seconds wait..
            Assert.GreaterOrEqual(secondsElapsed, secondsToWait);
            Assert.LessOrEqual(secondsElapsed, secondsToWait + Time.SecondsPerFrame * 10);

            Assert.True(coroutine.Status == CoroutineStatus.Complete);
        }
Beispiel #4
0
        private IEnumerable <WaitUntil> BasicRoutine(CoroutineObject obj)
        {
            obj.Value = 10;
            yield return(WaitUntil.NextFrame);

            obj.Value = 20;
            yield return(WaitUntil.NextFrame);

            yield return(WaitUntil.Frames(2));

            obj.Value = 30;
        }
Beispiel #5
0
        [Test] public void Basics()
        {
            Scene scene = new Scene();

            scene.Activate();

            CoroutineObject obj       = new CoroutineObject();
            Coroutine       coroutine = scene.StartCoroutine(this.BasicRoutine(obj));

            // All code until first yield is already executed
            Assert.AreEqual(10, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Running);

            scene.Update();

            // All code until second yield is executed
            Assert.AreEqual(20, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Running);

            scene.Update();

            // Yelded null, value didn't change, need to wait one more update
            Assert.AreEqual(20, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Running);

            scene.Update();
            // Yielded condition is waiting for two frames now..
            Assert.AreEqual(20, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Running);

            scene.Update();
            // All remaining code has been executed
            Assert.AreEqual(30, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Complete);

            scene.Update();

            // No further changes
            Assert.AreEqual(30, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Complete);
        }
Beispiel #6
0
        [Test] public void Resuming()
        {
            Scene scene = new Scene();

            scene.Activate();

            CoroutineObject obj       = new CoroutineObject();
            Coroutine       coroutine = scene.StartCoroutine(this.BasicRoutine(obj));

            // All code until first yield is already executed
            Assert.AreEqual(10, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Running);

            coroutine.Pause();
            scene.Update();

            // No changes, since the coroutine is now paused
            Assert.AreEqual(10, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Paused);

            int rnd = MathF.Rnd.Next(ushort.MaxValue);

            for (int i = 0; i < rnd; i++)
            {
                scene.Update();
            }

            // No matter how many updates
            Assert.AreEqual(10, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Paused);

            coroutine.Resume();
            scene.Update();

            // All code until second yield is executed
            Assert.AreEqual(20, obj.Value);
            Assert.True(coroutine.Status == CoroutineStatus.Running);
        }