Ejemplo n.º 1
0
        internal static void Main(string[] args)
        {

            if (null == args || args.Length == 0 )
                throw new ArgumentException("Args cannot be null or empty");

            string argsWithNewLines = ParseString(args[0]);            
            string[] argsSplit = argsWithNewLines.Split(new[] { "\n" }, StringSplitOptions.None);

            if (argsSplit.Length % 2 != 1)
                throw new ArgumentException("ArgsSplit should always be an odd number");

            // If external libraries were allowed, and the requirement would benefit could refactor to make use of DI,
            // moving eveerying other than the container bootstrapper to annother assembly containing Application
            var lawn = GetLawn(argsSplit[0]);
            var stage = new Stage(lawn); 

            // Ordinarilly I would ask for clarification early on regarding handling a variable number of Lawn Mowers, min max etc.
            // With that in mind I have implemented this aspect quite spefically to handle just the test input.
            // Supporting structure should make it easy extend/abstract this to cater for different business rules.            
            var mowerInitializationTuples = GetMowerInitializationTuples(argsSplit);
            stage.AddLawnMower(mowerInitializationTuples[0].Item1, mowerInitializationTuples[0].Item2, mowerInitializationTuples[0].Item3, mowerInitializationTuples[0].Item4);
            stage.AddLawnMower(mowerInitializationTuples[1].Item1, mowerInitializationTuples[1].Item2, mowerInitializationTuples[1].Item3, mowerInitializationTuples[1].Item4);

            stage.RunMowers();
            Console.ReadLine();
        }
        public void StageAddLawnMower_CalledTwice_AddsTwoLawnMowersToMowersWithMovementInstructionsAtExpectedIndex()
        {
            //Arrange
            string[] argsSplit = "5 5\n1 2 N\nLMLMLMLMM\n3 3 E\nMMRMMMRMRMM".Split(new[] { "\n" }, StringSplitOptions.None);
            var lawn = new Lawn(5, 5);
            var stage = new Stage(lawn);
            var mowerInitializationTuples = ProgramWithPublicMethods.GetMowerInitializationTuples(argsSplit);

            //Act
            stage.AddLawnMower(mowerInitializationTuples[0].Item1, mowerInitializationTuples[0].Item2, mowerInitializationTuples[0].Item3, mowerInitializationTuples[0].Item4);
            stage.AddLawnMower(mowerInitializationTuples[1].Item1, mowerInitializationTuples[1].Item2, mowerInitializationTuples[1].Item3, mowerInitializationTuples[1].Item4);

            //Assert lawnMower1 inputs
            Assert.AreEqual(1, stage.MowersWithMovementInstructions[0].Item1.XCord);
            Assert.AreEqual(2, stage.MowersWithMovementInstructions[0].Item1.YCord);
            Assert.AreEqual(CompassDirection.N, stage.MowersWithMovementInstructions[0].Item1.Heading);
            StringAssert.IsMatch("LMLMLMLMM", stage.MowersWithMovementInstructions[0].Item2);

            //Assert lawnMower2 inputs
            Assert.AreEqual(3, stage.MowersWithMovementInstructions[1].Item1.XCord);
            Assert.AreEqual(3, stage.MowersWithMovementInstructions[1].Item1.YCord);
            Assert.AreEqual(CompassDirection.E, stage.MowersWithMovementInstructions[1].Item1.Heading);
            StringAssert.IsMatch("MMRMMMRMRMM", stage.MowersWithMovementInstructions[1].Item2);

        }