public void MakePlayerMovement_WhenPlayerMadeSomeMovements_ShouldReturnCorrectStatus()
        {
            // Arrange
            var gridGeneratorMock = new Mock <IGridGenerator>();

            gridGeneratorMock.Setup(x => x.Generate(false)).Returns(() =>
            {
                var cpuGrid = new Grid();
                cpuGrid.AddShip(new Ship(new Coordinates(1, 1), Orientation.Horizontal, 2));

                return(cpuGrid);
            });
            gridGeneratorMock.Setup(x => x.Generate(true)).Returns(DummyGrid);

            var cpuMovementLogicMock = new Mock <ICpuMovementLogic>();

            cpuMovementLogicMock.Setup(x => x.MakeCpuMovement(It.IsAny <Grid>())).Returns(() => new Movement(new Coordinates(0, 0), CellStatus.Miss));

            BattleshipGameEngine engine = new BattleshipGameEngine(gridGeneratorMock.Object, cpuMovementLogicMock.Object);

            // Act
            // Assert
            if (engine.Status == GameStatus.CpuMovement)
            {
                engine.MakeCpuMovement();
            }

            // miss
            Assert.AreEqual(GameStatus.PlayerMovement, engine.Status);
            var cellStatu = engine.MakePlayerMovement(0, 0);

            Assert.AreEqual(CellStatus.Miss, cellStatu);
            Assert.AreEqual(GameStatus.CpuMovement, engine.Status);
            engine.MakeCpuMovement();

            // hit
            Assert.AreEqual(GameStatus.PlayerMovement, engine.Status);
            cellStatu = engine.MakePlayerMovement(1, 1);
            Assert.AreEqual(CellStatus.Hit, cellStatu);

            // sunk
            Assert.AreEqual(GameStatus.PlayerMovement, engine.Status);
            cellStatu = engine.MakePlayerMovement(1, 2);
            Assert.AreEqual(CellStatus.Sunk, cellStatu);
            Assert.AreEqual(GameStatus.PlayerWon, engine.Status);
        }
        public void MakeCpuMovement_WhenCpuHurries_ThrowException()
        {
            // Arrange
            var gridGeneratorMock = new Mock <IGridGenerator>();

            gridGeneratorMock.Setup(x => x.Generate(false)).Returns(DummyGrid);
            gridGeneratorMock.Setup(x => x.Generate(true)).Returns(DummyGrid);

            var cpuMovementLogicMock = new Mock <ICpuMovementLogic>();

            cpuMovementLogicMock.Setup(x => x.MakeCpuMovement(It.IsAny <Grid>())).Returns(() => new Movement(new Coordinates(0, 0), CellStatus.Miss));

            BattleshipGameEngine engine = new BattleshipGameEngine(gridGeneratorMock.Object, cpuMovementLogicMock.Object);

            // Act
            if (engine.Status == GameStatus.PlayerMovement)
            {
                engine.MakePlayerMovement(0, 0);
            }
            var cellStatu = engine.MakeCpuMovement();

            // Assert
            Assert.ThrowsException <Exception>(() => engine.MakeCpuMovement());
        }
        public void MakeCpuMovement_WhenCpuMadeSomeMovements_ShouldReturnCorrectStatus()
        {
            // Arrange
            var gridGeneratorMock = new Mock <IGridGenerator>();

            gridGeneratorMock.Setup(x => x.Generate(false)).Returns(DummyGrid);
            gridGeneratorMock.Setup(x => x.Generate(true)).Returns(() =>
            {
                var playerGrid = new Grid();
                playerGrid.AddShip(new Ship(new Coordinates(1, 1), Orientation.Horizontal, 2));

                return(playerGrid);
            });

            var callCount            = -1;
            var cpuMovementLogicMock = new Mock <ICpuMovementLogic>();

            cpuMovementLogicMock.Setup(x => x.MakeCpuMovement(It.IsAny <Grid>()))
            .Returns((Grid playerGrid) =>
            {
                callCount++;

                if (callCount == 0)
                {
                    return(new Movement(new Coordinates(0, 0), playerGrid.CheckCell(0, 0)));
                }
                else if (callCount == 1)
                {
                    return(new Movement(new Coordinates(1, 1), playerGrid.CheckCell(1, 1)));
                }
                else if (callCount == 2)
                {
                    return(new Movement(new Coordinates(1, 2), playerGrid.CheckCell(1, 2)));
                }
                else
                {
                    throw new Exception();
                }
            });

            BattleshipGameEngine engine = new BattleshipGameEngine(gridGeneratorMock.Object, cpuMovementLogicMock.Object);

            // Act
            // Assert
            if (engine.Status == GameStatus.PlayerMovement)
            {
                engine.MakePlayerMovement(0, 0);
            }

            Assert.AreEqual(GameStatus.CpuMovement, engine.Status);
            var cellStatus = engine.MakeCpuMovement();

            Assert.AreEqual(CellStatus.Miss, cellStatus);
            Assert.AreEqual(GameStatus.PlayerMovement, engine.Status);
            engine.MakePlayerMovement(0, 0);

            Assert.AreEqual(GameStatus.CpuMovement, engine.Status);
            cellStatus = engine.MakeCpuMovement();
            Assert.AreEqual(CellStatus.Hit, cellStatus);
            Assert.AreEqual(GameStatus.CpuMovement, engine.Status);

            cellStatus = engine.MakeCpuMovement();
            Assert.AreEqual(CellStatus.Sunk, cellStatus);
            Assert.AreEqual(GameStatus.CpuWon, engine.Status);

            cpuMovementLogicMock.Verify(x => x.MakeCpuMovement(It.IsAny <Grid>()), Times.Exactly(3));
        }
Exemple #4
0
        public void StartNewGame()
        {
            BattleshipGameEngine engine        = new BattleshipGameEngine(new RandomGridGenerator(), new DefaultCpuMovementLogic());
            CellStatus?          cpuCellStatus = null;

            while (true)
            {
                Console.Clear();
                Console.WriteLine("Player: ");
                engine.PlayerGrid.PrintPlayerGrid();

                Console.WriteLine();
                Console.WriteLine("CPU: ");
                engine.CpuGrid.PrintCpuGrid();

                if (cpuCellStatus == CellStatus.Miss)
                {
                    Console.WriteLine("The computer missed");
                }
                else if (cpuCellStatus == CellStatus.Hit)
                {
                    Console.WriteLine("The computer hit");
                }
                else if (cpuCellStatus == CellStatus.Sunk)
                {
                    Console.WriteLine("The computer has sunk your ship!");
                }

                if (cpuCellStatus == CellStatus.Hit || cpuCellStatus == CellStatus.Sunk)
                {
                    Console.WriteLine("Press ENTER to continue playing");
                    Console.ReadLine();
                }

                cpuCellStatus = null;

                if (engine.Status == GameStatus.PlayerMovement)
                {
                    var coordinates = ConsoleHelper.ReadCoordinates();
                    engine.MakePlayerMovement(coordinates.Row, coordinates.Column);
                    continue;
                }

                if (engine.Status == GameStatus.CpuMovement)
                {
                    cpuCellStatus = engine.MakeCpuMovement();
                    continue;
                }

                break;
            }

            if (engine.Status == GameStatus.PlayerWon)
            {
                Console.WriteLine("You won!");
            }
            else
            {
                Console.WriteLine("You lost!");
            }

            Console.ReadKey();
        }