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)); }
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(); }