public async Task <IActionResult> AddShip(string battleId,
                                                  [FromBody] AddShipRequest addShipRequest)
        {
            try
            {
                var direction = (ShipDirection)Enum.Parse(typeof(ShipDirection), addShipRequest.ShipDirection, true);
                var ship      = await _battleService.AddShip(
                    battleId,
                    new Coordinate(addShipRequest.Column, addShipRequest.Row),
                    direction
                    );

                return(Created(Request.Path, ship));
            }
            catch (InvalidShipCreationException ex)
            {
                _logger.LogError(ex.Message);
                return(Conflict(ex));
            }
            catch (FailedShipCreationException ex)
            {
                _logger.LogError(ex.Message);
                return(BadRequest(ex));
            }
        }
        public void HasLost_WhenAllShipsSunk_ReturnTrue()
        {
            //Arrange
            var player = new Player("My Player");

            var request = new AddShipRequest
            {
                Direction = ShipDirection.Horizental,
                Origin    = new Coordinates(0, 0),
                Ship      = new Destroyer()
                {
                    Name = "Destroyer"
                }
            };

            //Act
            player.AddShip(request);
            player.ProcessAttack(new Coordinates(0, 0));
            player.ProcessAttack(new Coordinates(0, 1));
            player.ProcessAttack(new Coordinates(0, 2));

            //Assert
            var hasLost = player.HasLost();

            Assert.True(hasLost);
        }
        public async Task <IActionResult> AddShip(Guid boardId, Guid shipId, AddShipRequest addShipRequest)
        {
            var boardTask = _boardService.GetBoard(boardId);
            var shipTask  = _shipService.GetShip(shipId);
            var board     = await boardTask;
            var ship      = await shipTask;
            await _shipService.AddShipOnBoard(boardId, ship, addShipRequest);

            return(NoContent());
        }
Exemple #4
0
        private bool TryAddShipHorizental(AddShipRequest request)
        {
            if (!CanAddShipVertical(request))
            {
                return(false);
            }
            for (int i = request.Origin.Column; i < request.Ship.Size; i++)
            {
                Squares[request.Origin.Row, i].Status = request.Ship.ShipSquareStatus;
            }

            _ships.Add(request.Ship);
            return(true);
        }
Exemple #5
0
        public bool AddShip(AddShipRequest request)
        {
            var validator         = new AddShipRequestValidator();
            var validationResults = validator.Validate(request);

            if (validationResults.Errors.Any())
            {
                //in real world return the real errors.
                throw new ArgumentException($"Invalid Argument Exception.{nameof(request)}");
            }


            //only add ship if it is not already on board and
            return(PrimaryBoard.TryAddShip(request));
        }
        public async Task <IActionResult> Post([FromBody] AddShipRequest request)
        {
            var addShipCommand = new AddShipCommand(
                type: (ShipType)Enum.Parse <ShipType>(request.Type),
                name: new ShipName(request.Name),
                capacity: new Capacity(request.Capacity),
                shippingLine: new Id(request.ShippingLine)
                );

            await _commandProcessor.SendAsync(addShipCommand);

            var addedShip = await _queryProcessor.ExecuteAsync(new ShipByIdQuery(new Id(addShipCommand.Id)));

            return(Ok(addedShip));
        }
Exemple #7
0
        private bool CanAddShipHorizental(AddShipRequest request)
        {
            if (request.Origin.Column + request.Ship.Size >= Cols)
            {
                return(false);
            }

            for (int i = request.Origin.Column; i < request.Ship.Size; i++)
            {
                if (Squares[request.Origin.Row, i].Status != SquareStatus.Available)
                {
                    return(false);
                }
            }

            return(true);
        }
Exemple #8
0
        private bool CanAddShipVertical(AddShipRequest request)
        {
            if (request.Origin.Row + request.Ship.Size >= Rows)
            {
                return(false);
            }

            for (int i = request.Origin.Row; i < request.Ship.Size; i++)
            {
                if (Squares[i, request.Origin.Column].Status != SquareStatus.Available)
                {
                    return(false);
                }
            }

            return(true);
        }
        public void AddShip_WhenProvidedWithWrongCoordinates_ReturnFalse()
        {
            //Arrange
            var player = new Player("My Player");

            var request = new AddShipRequest
            {
                Direction = ShipDirection.Horizental,
                Origin    = new Coordinates(-1, -1),
                Ship      = new Destroyer()
                {
                    Name = "Destroyer"
                }
            };

            //Act & Assert
            Assert.Throws <ArgumentException>(() => player.AddShip(request));
        }
        public IActionResult AddShip([FromBody] AddShipRequest request)
        {
            // Note: This function won't handle the scenario that
            // the ship is partially or completely placed out of the board
            // because the request validation will fail the request before
            // entering this function.

            Logger.Info("AddShip request received.");
            var board = _boardsManager.GetBoard(request.BoardId);

            if (board == null)
            {
                Logger.Error($"The board [{request.BoardId}] can't be found.");
                return(CreateErrorResponse(StatusCodes.Status400BadRequest,
                                           $"The board [{request.BoardId}] doesn't exist"));
            }

            Result result;

            try
            {
                result = board.AddShip(new BattleShip(
                                           new Coordinate(request.HeadPosition.X.Value, request.HeadPosition.Y.Value),
                                           new Coordinate(request.TailPosition.X.Value, request.TailPosition.Y.Value)));
            }
            catch (Exception e) // BattleShip constructor will throw exception if the ship is not placed vertically or horizontally
            {
                Logger.Error(e.Message);
                return(CreateErrorResponse(StatusCodes.Status400BadRequest,
                                           $"The ship {request.HeadPosition}, {request.TailPosition} must be vertical or horizontal"));
            }

            if (result == Result.PositionsTaken)
            {
                Logger.Error($"The ship {request.HeadPosition}, {request.TailPosition} can't be placed because some positions have been taken by other ship.");

                return(CreateErrorResponse(StatusCodes.Status400BadRequest,
                                           $"The ship {request.HeadPosition}, {request.TailPosition} can't be placed because some positions have been taken by other ship"));
            }

            Logger.Info("The ship has been successfully added.");

            return(CreateSuccessResponse(StatusCodes.Status201Created));
        }
Exemple #11
0
        public ActionResult AddShip([FromBody] AddShipRequest addShipRequest)
        {
            if (addShipRequest == null)
            {
                return(BadRequest($"{nameof(addShipRequest)} must not be null"));
            }

            if (addShipRequest.End == null || addShipRequest.Start == null)
            {
                return(BadRequest("Coordinate must not be null"));
            }
            var result = Board.Add(addShipRequest.Start, addShipRequest.End);

            if (!result.Valid)
            {
                return(BadRequest(result.ErrorMessage));
            }
            return(Ok());
        }
Exemple #12
0
        public IActionResult AddShip([FromBody] AddShipRequest addShipRequest)
        {
            try
            {
                var validation = _gameStateService.ValidateAddShipRequest(
                    addShipRequest.XPosition,
                    addShipRequest.YPosition,
                    addShipRequest.Orientation,
                    addShipRequest.Size,
                    addShipRequest.AddToPlayerOne);

                if (!validation.IsValid)
                {
                    return(BadRequest(
                               ApiErrorResponse.GetCustomBadRequest(
                                   "One or more game rules were not respected.",
                                   HttpContext.TraceIdentifier,
                                   new List <string> {
                        validation.Error
                    })));
                }

                _gameStateService.AddShipOnPlayersBoard(addShipRequest.XPosition,
                                                        addShipRequest.YPosition,
                                                        addShipRequest.Orientation,
                                                        addShipRequest.Size,
                                                        addShipRequest.AddToPlayerOne);

                return(StatusCode(201, _gameStateService.GetGameStatus()));
            }
            catch (Exception e)
            {
                return(StatusCode(500,
                                  ApiErrorResponse.GetCustomInternalServerError(
                                      "An unexpected error occured. Please contact API team.",
                                      HttpContext.TraceIdentifier,
                                      new List <string> {
                    e.Message
                })));
            }
        }
        public void AddShip_WhenShipIsAdded_ReturnsSuccess()
        {
            //Arrange
            var player = new Player("My Player");


            var request = new AddShipRequest
            {
                Direction = ShipDirection.Horizental,
                Origin    = new Coordinates(0, 0),
                Ship      = new BattleShip()
                {
                    Name = "BattleShip"
                }
            };
            //Act
            var result = player.AddShip(request);

            //Assert
            Assert.True(result);
        }
        public void AddShip_WhenAddedShipIsAlreadyPresent_ReturnsFalse()
        {
            //Arrange
            var player = new Player("My Player");

            var request = new AddShipRequest
            {
                Direction = ShipDirection.Horizental,
                Origin    = new Coordinates(0, 0),
                Ship      = new BattleShip()
                {
                    Name = "BattleShip"
                }
            };

            //Act
            player.AddShip(request);
            var result = player.AddShip(request);

            //Assert
            Assert.False(result);
        }
Exemple #15
0
        public bool TryAddShip(AddShipRequest request)
        {
            lock (request)
            {
                if (_ships.FirstOrDefault(x => x.ShipSquareStatus == request.Ship.ShipSquareStatus) != null)
                {
                    return(false);
                }

                switch (request.Direction)
                {
                case ShipDirection.Horizental:
                    return(TryAddShipHorizental(request));

                case ShipDirection.Vertical:
                    return(TryAddShipVertical(request));

                default:
                    return(false);
                }
            }
        }
        public IActionResult AddShip([FromBody] AddShipRequest request)
        {
            if (_gameState == null)
            {
                var msg = "The Game has not been created yet, please create first";
                _logger.Debug(msg);
                throw new ApplicationException(msg);
            }

            Player currentPlayer;

            if (request.playerId == PlayerId.Player1)
            {
                currentPlayer = _gameState.player1;
            }
            else
            {
                currentPlayer = _gameState.player2;
            }

            _gameService.AddShip(request.shipId, request.lengthOrWidth, request.startingRow, request.startingColumn, request.orientation, currentPlayer);
            return(Ok());
        }
 public async Task AddShipOnBoard(Guid boardId, Ship ship, AddShipRequest addShipRequest)
 {
     var shipPositions = new List <object>();
     var index         = 0;
     //Write code to place a ship in backend(database)
 }