public void IsAliveTest()
 {
     using (var client = new TestHeadlessGameHost(@"client", true))
     {
         var testGame = new TestTestGame();
         client.Run(testGame);
         Assert.IsTrue(testGame.IsRootAlive);
     }
 }
        public void TestPauseResume()
        {
            var gameCreated = new ManualResetEventSlim();

            var task = Task.Run(() =>
            {
                using (host = new HeadlessGameHost(@"host", false))
                {
                    game = new TestTestGame();
                    gameCreated.Set();
                    host.Run(game);
                }
            });

            Assert.IsTrue(gameCreated.Wait(timeout));
            Assert.IsTrue(game.BecameAlive.Wait(timeout));

            // check scheduling is working before suspend
            var completed = new ManualResetEventSlim();

            game.Schedule(() => completed.Set());
            Assert.IsTrue(completed.Wait(timeout / 10));

            host.Suspend();

            // in single-threaded execution, the main thread may already be in the process of updating one last time.
            int gameUpdates = 0;

            game.Scheduler.AddDelayed(() => ++ gameUpdates, 0, true);
            Assert.That(() => gameUpdates, Is.LessThan(2).After(timeout / 10));

            // check that scheduler doesn't process while suspended..
            completed.Reset();
            game.Schedule(() => completed.Set());
            Assert.IsFalse(completed.Wait(timeout / 10));

            // ..and does after resume.
            host.Resume();
            Assert.IsTrue(completed.Wait(timeout / 10));

            game.Exit();
            Assert.IsTrue(task.Wait(timeout));
        }
        public void TestPauseResume()
        {
            var gameCreated = new ManualResetEventSlim();

            var task = Task.Run(() =>
            {
                using (host = new HeadlessGameHost(@"host", false))
                {
                    game = new TestTestGame();
                    gameCreated.Set();
                    host.Run(game);
                }
            });

            Assert.IsTrue(gameCreated.Wait(timeout));
            Assert.IsTrue(game.BecameAlive.Wait(timeout));

            // check scheduling is working before suspend
            var completed = new ManualResetEventSlim();

            game.Schedule(() => completed.Set());
            Assert.IsTrue(completed.Wait(timeout / 10));

            host.Suspend();

            completed.Reset();

            // check that scheduler doesn't process while suspended..
            game.Schedule(() => completed.Set());
            Assert.IsFalse(completed.Wait(timeout / 10));

            host.Resume();

            // ..and does after resume.
            Assert.IsTrue(completed.Wait(timeout / 10));

            game.Exit();

            Assert.IsTrue(task.Wait(timeout));
        }
Example #4
0
        public void TestExitBlocking()
        {
            var gameCreated = new ManualResetEventSlim();

            var task = Task.Factory.StartNew(() =>
            {
                using (host = new ManualExitHeadlessGameHost())
                {
                    game = new TestTestGame();
                    gameCreated.Set();
                    host.Run(game);
                }
            }, TaskCreationOptions.LongRunning);

            gameCreated.Wait(timeout);
            Assert.IsTrue(game.BecameAlive.Wait(timeout));

            Assert.That(host.ExecutionState, Is.EqualTo(ExecutionState.Running));

            // block game from exiting.
            game.BlockExit.Value = true;
            requestExit();
            Assert.That(game.LastExitResult, Is.True);

            // exit should be blocked.
            Assert.That(task.IsCompleted, Is.False);
            Assert.That(host.ExecutionState, Is.EqualTo(ExecutionState.Running));

            // unblock game from exiting.
            game.BlockExit.Value = false;
            requestExit();
            Assert.That(game.LastExitResult, Is.False);

            // finally, the game should exit.
            task.Wait(timeout);
            Assert.That(host.ExecutionState, Is.EqualTo(ExecutionState.Stopped));
        }
        public void TestChildDisposedBeforeGame()
        {
            var gameCreated = new ManualResetEventSlim();

            var task = Task.Factory.StartNew(() =>
            {
                using (host = new TestRunHeadlessGameHost("host", new HostOptions(), bypassCleanup: false))
                {
                    game = new TestTestGame();
                    gameCreated.Set();
                    host.Run(game);
                }
            }, TaskCreationOptions.LongRunning);

            Assert.IsTrue(gameCreated.Wait(timeout));
            Assert.IsTrue(game.BecameAlive.Wait(timeout));

            var container = new DisposableContainer();

            game.Schedule(() => game.Add(container));

            Assert.IsTrue(container.BecameAlive.Wait(timeout));

            game.Schedule(() =>
            {
                game.ClearInternal(false);
                game.DisposeChildAsync(container);
            });

            game.Exit();

            Assert.IsTrue(task.Wait(timeout));

            game.Dispose();

            Assert.IsTrue(container.DisposedSuccessfully.Wait(timeout));
        }
        public void TestChildDisposedBeforeGame()
        {
            var gameCreated = new ManualResetEventSlim();

            var task = Task.Run(() =>
            {
                using (host = new HeadlessGameHost(@"host", false))
                {
                    game = new TestTestGame();
                    gameCreated.Set();
                    host.Run(game);
                }
            });

            Assert.IsTrue(gameCreated.Wait(timeout));
            Assert.IsTrue(game.BecameAlive.Wait(timeout));

            var container = new DisposableContainer();

            game.Schedule(() => game.Add(container));

            Assert.IsTrue(container.BecameAlive.Wait(timeout));

            game.Schedule(() =>
            {
                game.ClearInternal(false);
                game.DisposeChildAsync(container);
            });

            game.Exit();

            Assert.IsTrue(task.Wait(timeout));

            game.Dispose();

            Assert.IsTrue(container.DisposedSuccessfully.Wait(timeout));
        }
Example #7
0
        public void TestPauseResume(ExecutionMode threadMode)
        {
            var gameCreated = new ManualResetEventSlim();

            IBindable <GameThreadState> updateThreadState = null;

            var task = Task.Run(() =>
            {
                using (host = new ExecutionModeGameHost(@"host", threadMode))
                {
                    game = new TestTestGame();
                    gameCreated.Set();
                    host.Run(game);
                }
            });

            Assert.IsTrue(gameCreated.Wait(timeout));
            Assert.IsTrue(game.BecameAlive.Wait(timeout));

            // check scheduling is working before suspend
            var completed = new ManualResetEventSlim();

            game.Schedule(() =>
            {
                updateThreadState = host.UpdateThread.State.GetBoundCopy();
                updateThreadState.BindValueChanged(state =>
                {
                    if (state.NewValue != GameThreadState.Starting)
                    {
                        Assert.IsTrue(ThreadSafety.IsUpdateThread);
                    }
                });
                completed.Set();
            });

            Assert.IsTrue(completed.Wait(timeout / 10));
            Assert.AreEqual(GameThreadState.Running, updateThreadState.Value);

            host.Suspend();

            // in single-threaded execution, the main thread may already be in the process of updating one last time.
            int gameUpdates = 0;

            game.Scheduler.AddDelayed(() => ++ gameUpdates, 0, true);
            Assert.That(() => gameUpdates, Is.LessThan(2).After(timeout / 10));
            Assert.AreEqual(GameThreadState.Paused, updateThreadState.Value);

            // check that scheduler doesn't process while suspended..
            completed.Reset();
            game.Schedule(() => completed.Set());
            Assert.IsFalse(completed.Wait(timeout / 10));

            // ..and does after resume.
            host.Resume();
            Assert.IsTrue(completed.Wait(timeout / 10));
            Assert.AreEqual(GameThreadState.Running, updateThreadState.Value);

            game.Exit();
            Assert.IsTrue(task.Wait(timeout));
            Assert.AreEqual(GameThreadState.Exited, updateThreadState.Value);
        }