public void GenerateShipOfSize_Input1_ReturnsOneDeckShip()
        {
            var randomShipGenerator = new RandomShipGenerator(null);

            var result = randomShipGenerator.GenerateShipOfSize(1);

            Assert.That(result, Is.TypeOf <OneDeckShip>());
        }
        public void GenerateShipOfSize_Input2_ReturnsTwoDeckShipWithRotationGeneratedByRandom(
            ShipRotation shipRotationGeneratedByRandom)
        {
            var randomIndexGeneratorStub        = new Mock <IRandomGenerator>();
            var possibleRotationsForTwoDeckShip = new[] { ShipRotation._0, ShipRotation._90 };

            randomIndexGeneratorStub.Setup(r => r.GetRandomElementFromArrayAsInt(possibleRotationsForTwoDeckShip))
            .Returns((int)shipRotationGeneratedByRandom);
            var randomShipGenerator = new RandomShipGenerator(randomIndexGeneratorStub.Object);

            var result = randomShipGenerator.GenerateShipOfSize(2);

            Assert.Multiple(() =>
            {
                Assert.That(result, Is.TypeOf <TwoDeckShip>());
                Assert.That(result.Rotation, Is.EqualTo(shipRotationGeneratedByRandom));
            });
        }
        GenerateShipOfSize_Input4RandomReturnsSquareShipShape_ReturnsFourDeckShipWith0RotationAndSquareShipShape()
        {
            var randomIndexGeneratorStub    = new Mock <IRandomGenerator>();
            var fourDeckShipShapes          = Enum.GetValues(typeof(ShipShape));
            var squareFourDeckShipRotations = new[] { ShipRotation._0 };

            randomIndexGeneratorStub.Setup(r => r.GetRandomElementFromArrayAsInt(fourDeckShipShapes))
            .Returns((int)ShipShape.Square);
            randomIndexGeneratorStub.Setup(r => r.GetRandomElementFromArrayAsInt(squareFourDeckShipRotations))
            .Returns((int)ShipRotation._0);
            var randomShipGenerator = new RandomShipGenerator(randomIndexGeneratorStub.Object);

            var result = randomShipGenerator.GenerateShipOfSize(4);

            Assert.Multiple(() =>
            {
                Assert.That(result, Is.TypeOf <FourDeckShip>());
                Assert.That(result.Shape, Is.EqualTo(ShipShape.Square));
                Assert.That(result.Rotation, Is.EqualTo(ShipRotation._0));
            });
        }
        GenerateShipOfSize_Input4RandomReturnsLineOrZigzagShipShape_ReturnsFourDeckShipWithShapeAndRotationGeneratedByRandom(
            ShipShape shipShapeGeneratedByRandom, ShipRotation shipRotationGeneratedByRandom)
        {
            var randomIndexGeneratorStub = new Mock <IRandomGenerator>();
            var fourDeckShipShapes       = Enum.GetValues(typeof(ShipShape));
            var lineOrZigzagShapeFourDeckShipRotations = new[] { ShipRotation._0, ShipRotation._90 };

            randomIndexGeneratorStub.Setup(r => r.GetRandomElementFromArrayAsInt(fourDeckShipShapes))
            .Returns((int)shipShapeGeneratedByRandom);
            randomIndexGeneratorStub.Setup(r => r.GetRandomElementFromArrayAsInt(lineOrZigzagShapeFourDeckShipRotations))
            .Returns((int)shipRotationGeneratedByRandom);
            var randomShipGenerator = new RandomShipGenerator(randomIndexGeneratorStub.Object);

            var result = randomShipGenerator.GenerateShipOfSize(4);

            Assert.Multiple(() =>
            {
                Assert.That(result, Is.TypeOf <FourDeckShip>());
                Assert.That(result.Shape, Is.EqualTo(shipShapeGeneratedByRandom));
                Assert.That(result.Rotation, Is.EqualTo(shipRotationGeneratedByRandom));
            });
        }