Example #1
0
        private bool CheckNoCollision(Battleship ship)
        {
            var positions       = Ships.SelectMany(s => s.ShipParts).Select(p => p.Position);
            var collisionPoints = positions.Where(p => ship.ShipParts.Select(s => s.Position).Contains(p));

            return(!collisionPoints.Any());
        }
Example #2
0
        public void ShouldCreateCorrectShipParts_Vertical()
        {
            var startPosition = new Position()
            {
                X = 0, Y = 0
            };
            var battleship = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition, Orientation.Vertical, 5);

            battleship.ShipParts.Count.Should().Be(5);
            var positions = battleship.ShipParts.Select(s => s.Position).ToList();

            positions[0].Should().Be(new Position {
                X = 0, Y = 0
            });
            positions[1].Should().Be(new Position {
                X = 0, Y = 1
            });
            positions[2].Should().Be(new Position {
                X = 0, Y = 2
            });
            positions[3].Should().Be(new Position {
                X = 0, Y = 3
            });
            positions[4].Should().Be(new Position {
                X = 0, Y = 4
            });
        }
Example #3
0
        public void ShipToBigToFitIntoBoard()
        {
            var startPosition = new Position()
            {
                X = 0, Y = 0
            };
            var battleship = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition, Orientation.Horizontal, 11);

            Assert.Throws <InvalidRequestException>(() => _board.AddBattleship(battleship));
        }
Example #4
0
        public void ShouldAddAShipSuccessfully()
        {
            var startPosition = new Position()
            {
                X = 1, Y = 1
            };
            var battleship = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition, Orientation.Horizontal, 3);
            var ship       = _board.AddBattleship(battleship);

            ship.Id.Should().Be(1);
        }
Example #5
0
 private bool CheckBatteshipFitIntoBoard(Battleship ship)
 {
     if (ship.ShipParts.Select(p => p.Position.X).Max() >= Width)
     {
         return(false);
     }
     if (ship.ShipParts.Select(p => p.Position.Y).Max() >= Height)
     {
         return(false);
     }
     return(true);
 }
Example #6
0
        public void AttackedAndBeingHit()
        {
            var startPosition = new Position()
            {
                X = 1, Y = 1
            };
            var battleship = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition, Orientation.Vertical, 5);

            battleship.Attacked(new Position {
                X = 1, Y = 5
            }).Should().BeTrue();
        }
Example #7
0
        public void AttackedAndMissed()
        {
            var startPosition = new Position()
            {
                X = 0, Y = 0
            };
            var battleship = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition, Orientation.Vertical, 5);

            battleship.Attacked(new Position {
                X = 1, Y = 1
            }).Should().BeFalse();
        }
 public Battleship AddShipToBoard(int boardId, Battleship ship)
 {
     lock (_lock)
     {
         var board = _boards.FirstOrDefault(b => b.Id == boardId);
         if (board == null)
         {
             throw new InvalidRequestException("Wrong board id; the specified board could not be found.");
         }
         board.AddBattleship(ship);
         return(ship);
     }
 }
Example #9
0
        public void SecondShipCollideWithFirstShip()
        {
            var startPosition = new Position()
            {
                X = 0, Y = 0
            };
            var battleship1 = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition, Orientation.Horizontal, 5);
            var battleship2 = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition, Orientation.Vertical, 5);
            var ship        = _board.AddBattleship(battleship1);

            ship.Id.Should().Be(1);
            Assert.Throws <ShipCollisionException>(() => _board.AddBattleship(battleship2));
        }
Example #10
0
        public void ShipTooBigToAddToTheBoard()
        {
            var board = _provider.CreateBoard(new Board {
                Height = 10, Width = 20
            });

            board.Id.Should().Be(1);
            var startPosition1 = new Position()
            {
                X = 0, Y = 0
            };
            var battleship1 = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition1, Orientation.Horizontal, 21);

            Assert.Throws <InvalidRequestException>(() => board.AddBattleship(battleship1));
            board.Ships.Count.Should().Be(0);
        }
Example #11
0
        public void ShouldCreateCorrectShipParts_Horizontal()
        {
            var startPosition = new Position()
            {
                X = 1, Y = 1
            };
            var battleship = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition, Orientation.Horizontal, 3);

            battleship.ShipParts.Count.Should().Be(3);
            var positions = battleship.ShipParts.Select(s => s.Position).ToList();

            positions[0].Should().Be(new Position {
                X = 1, Y = 1
            });
            positions[1].Should().Be(new Position {
                X = 2, Y = 1
            });
            positions[2].Should().Be(new Position {
                X = 3, Y = 1
            });
        }
Example #12
0
        public Battleship AddBattleship(Battleship ship)
        {
            // Check battleship size
            var fitBoardSize = CheckBatteshipFitIntoBoard(ship);

            if (!fitBoardSize)
            {
                throw new InvalidRequestException("The battleship can not fit into the specified board");
            }

            // Detect if the ship has collision with existing ships on the board
            var noCollision = CheckNoCollision(ship);

            if (!noCollision)
            {
                throw new ShipCollisionException();
            }

            ship.Id = Ships.Count + 1;
            Ships.Add(ship);
            return(ship);
        }
Example #13
0
        public void SecondShipCollideWIthTheFirst()
        {
            var board = _provider.CreateBoard(new Board {
                Height = 10, Width = 20
            });

            board.Id.Should().Be(1);
            var startPosition1 = new Position()
            {
                X = 1, Y = 1
            };
            var battleship1 = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition1, Orientation.Horizontal, 5);

            board.AddBattleship(battleship1);
            board.Ships.Count.Should().Be(1);
            var startPosition2 = new Position()
            {
                X = 2, Y = 0
            };
            var battleship2 = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition1, Orientation.Vertical, 5);

            Assert.Throws <ShipCollisionException>(() => board.AddBattleship(battleship2));
            board.Ships.Count.Should().Be(1);
        }
Example #14
0
        public void ShouldAddTwoShipsToTheBoard()
        {
            var board = _provider.CreateBoard(new Board {
                Height = 10, Width = 20
            });

            board.Id.Should().Be(1);
            var startPosition1 = new Position()
            {
                X = 0, Y = 0
            };
            var battleship1 = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition1, Orientation.Horizontal, 5);

            board.AddBattleship(battleship1);
            board.Ships.Count.Should().Be(1);
            var startPosition2 = new Position()
            {
                X = 5, Y = 0
            };
            var battleship2 = new OfxCodeExercise.Battleship.Lib.Battleship(1, startPosition2, Orientation.Horizontal, 5);

            board.AddBattleship(battleship2);
            board.Ships.Count.Should().Be(2);
        }