public void Start_Should_DisplayUpdatedBoard_When_PlayerEnteredMove()
        {
            int inputCount = 0;
            var fakeGame   = Mock.Of <IGame>();

            Mock.Get(fakeGame).Setup(x => x.Play(It.IsAny <int>())).Returns(true);
            Mock.Get(fakeGame).SetupGet(x => x[1]).Returns("X");
            Mock.Get(fakeGame).SetupGet(x => x[2]).Returns("O");

            var fakeView = Mock.Of <IConsoleInterface>();

            Mock.Get(fakeView).Setup(x => x.ReadLine())
            .Returns(() => $"{inputCount + 1}")
            .Callback(() =>
            {
                inputCount++;
                if (inputCount == 1)
                {
                    Mock.Get(fakeGame).SetupGet(x => x.Winner).Returns("Cat's Game."); // Force game to end.
                }
            });

            var presenter = new TicTacToePresenter(fakeView, fakeGame);

            presenter.Start();

            Mock.Get(fakeView).Verify(x => x.WriteLine("   |   |   "), Times.Exactly(2));
            Mock.Get(fakeView).Verify(x => x.WriteLine("___________"), Times.Exactly(2));
            Mock.Get(fakeView).Verify(x => x.WriteLine(" X | O |   "), Times.Once);
        }
        public void Start_Should_AskPlayerOForNextMove_When_GameHasNotYetEnded()
        {
            int inputCount = 0;
            var fakeGame   = Mock.Of <IGame>();

            Mock.Get(fakeGame).Setup(x => x.Play(It.IsAny <int>())).Returns(true);

            var fakeView = Mock.Of <IConsoleInterface>();

            Mock.Get(fakeView).Setup(x => x.ReadLine())
            .Returns($"{inputCount + 1}")
            .Callback(() =>
            {
                inputCount++;
                if (inputCount == 2)
                {
                    Mock.Get(fakeGame).SetupGet(x => x.Winner).Returns("Cat's Game."); // Force game to end.
                }
            });

            var presenter = new TicTacToePresenter(fakeView, fakeGame);

            presenter.Start();

            Mock.Get(fakeView).Verify(x => x.Write("Player O move: "), Times.Once);
            Mock.Get(fakeView).Verify(x => x.ReadLine(), Times.AtLeast(2));
        }
        public void Start_Should_NotAcceptInvalidInput_When_PlayerEnteredNonNumericValue()
        {
            var fakeGame = Mock.Of <IGame>();
            var fakeView = Mock.Of <IConsoleInterface>();

            Mock.Get(fakeView).Setup(x => x.ReadLine())
            .Returns("A")
            .Callback(() =>
            {
                Mock.Get(fakeGame).SetupGet(x => x.Winner).Returns("Cat's Game."); // Force game to end.
            });

            var presenter = new TicTacToePresenter(fakeView, fakeGame);

            presenter.Start();

            Mock.Get(fakeView).Verify(x => x.WriteLine("Your move is not valid."), Times.Once);
        }
        public void Start_Should_AskPlayerXForFirstMove()
        {
            var fakeGame = Mock.Of <IGame>();
            var fakeView = Mock.Of <IConsoleInterface>();

            Mock.Get(fakeView).Setup(x => x.ReadLine())
            .Returns("1")
            .Callback(() =>
            {
                Mock.Get(fakeGame).SetupGet(x => x.Winner).Returns("Cat's Game."); // Force game to end.
            });

            var presenter = new TicTacToePresenter(fakeView, fakeGame);

            presenter.Start();

            Mock.Get(fakeView).Verify(x => x.WriteLine("Player X will go first..."), Times.Once);
            Mock.Get(fakeView).Verify(x => x.Write("Player X move: "), Times.Once);
            Mock.Get(fakeView).Verify(x => x.ReadLine(), Times.Once);
        }
        public void Start_Should_DisplayWelcomeMessage()
        {
            var fakeGame = Mock.Of <IGame>();

            var fakeView = Mock.Of <IConsoleInterface>();

            Mock.Get(fakeView).Setup(x => x.ReadLine())
            .Returns("1")
            .Callback(() =>
            {
                Mock.Get(fakeGame).SetupGet(x => x.Winner).Returns("Cat's Game."); // Force game to end.
            });


            var presenter = new TicTacToePresenter(fakeView, fakeGame);

            presenter.Start();

            Mock.Get(fakeView).Verify(x => x.WriteLine("Welcome to Tic-Tac-Toe Game!"), Times.Once);
        }
        public void Start_Should_DisplayMessage_When_GameEndedWithATie()
        {
            var endGameWinner = "-";
            var fakeGame      = Mock.Of <IGame>();
            var fakeView      = Mock.Of <IConsoleInterface>();

            Mock.Get(fakeView).Setup(x => x.ReadLine())
            .Returns("1")
            .Callback(() =>
            {
                Mock.Get(fakeGame).SetupGet(x => x.Winner).Returns(endGameWinner); // Force game to end.
            });

            var presenter = new TicTacToePresenter(fakeView, fakeGame);

            presenter.Start();

            Mock.Get(fakeView).Verify(x => x.WriteLine("Cat's Game!"), Times.Once);
            Mock.Get(fakeView).Verify(x => x.WriteLine("Press any key to exit.."), Times.Once);
            Mock.Get(fakeView).Verify(x => x.ReadKey(), Times.Once);
        }