public void GetsGnomesAtPosition()
        {
            // Arrange
            var gnome1         = MockRepository.GenerateMock <IGnome>();
            var gnome2         = MockRepository.GenerateMock <IGnome>();
            var gnome3         = MockRepository.GenerateMock <IGnome>();
            var gnome4         = MockRepository.GenerateMock <IGnome>();
            var boardPosition1 = new BoardPosition(1, 1, null);
            var boardPosition2 = new BoardPosition(1, 2, null);
            var boardPosition3 = new BoardPosition(2, 1, null);
            var positions      = new Dictionary <IGnome, BoardPosition>
            {
                { gnome1, boardPosition1 },
                { gnome2, boardPosition2 },
                { gnome3, boardPosition3 },
                { gnome4, boardPosition1 },
            };
            var gnomeHandler = new GnomeHandler(null, positions, null);

            // Act
            var gnomesAtPosition = gnomeHandler.GetGnomesAtPosition(boardPosition1);

            // Assert
            Assert.AreEqual(2, gnomesAtPosition.Count());
            Assert.AreEqual(1, gnomesAtPosition.Count(x => x == gnome1));
            Assert.AreEqual(1, gnomesAtPosition.Count(x => x == gnome4));
        }
        public void PlacesGnomesOnBoard()
        {
            // Arrange
            var logger       = MockRepository.GenerateMock <ILogger>();
            var dir          = TestContext.CurrentContext.TestDirectory;
            var board        = new Board($"{dir}/Maps/Map1.txt", logger);
            var positions    = new Dictionary <IGnome, BoardPosition>();
            var gnomeHandler = new GnomeHandler(board, positions, logger);
            var gnomes       = new List <Gnome>
            {
                new Gnome(1, 1, 2, null),
                new Gnome(2, 1, 4, null),
                new Gnome(1, 2, 2, null),
                new Gnome(2, 2, 4, null),
            };

            // Act
            gnomeHandler.PlaceGnomesOnBoard(gnomes);

            // Assert
            // assert all positions are unique
            Assert.AreEqual(4, positions.Count());
            Assert.AreEqual(true, positions.Values.All(x => 1 == positions.Values.Count(y => y.Column == x.Column && y.Row == x.Row)));

            // assert all gnomes on valid tiles
            Assert.AreEqual(true, positions.Values.All(x => x.Tile.CanMoveThrough));

            // assert all gnomes are unique
            Assert.AreEqual(true, positions.Keys.All(x => 1 == gnomes.Count(y => y == x)));
        }
        public void GnomesKilled()
        {
            // Arrange
            var gnome1    = MockRepository.GenerateMock <IGnome>();
            var gnome2    = MockRepository.GenerateMock <IGnome>();
            var positions = new Dictionary <IGnome, BoardPosition>
            {
                { gnome1, new BoardPosition() },
                { gnome2, new BoardPosition() },
            };
            var gnomeHandler = new GnomeHandler(null, positions, null);

            // Act
            gnomeHandler.KillGnome(gnome1);

            // Assert
            Assert.AreEqual(1, positions.Count);
            Assert.AreEqual(true, positions.ContainsKey(gnome2));
            Assert.AreEqual(false, positions.ContainsKey(gnome1));
        }
        public void MultipleGnomesSurvive(bool expectMultipleSurvive)
        {
            // Arrange
            var positions = new Dictionary <IGnome, BoardPosition>
            {
                { MockRepository.GenerateMock <IGnome>(), new BoardPosition() }
            };

            if (expectMultipleSurvive)
            {
                positions.Add(MockRepository.GenerateMock <IGnome>(), new BoardPosition());
            }
            var gnomeHandler = new GnomeHandler(null, positions, null);

            // Act
            var multipleSurvive = gnomeHandler.MultipleGnomesSurvive();

            // Assert
            Assert.AreEqual(expectMultipleSurvive, multipleSurvive);
        }
        public void GnomesMoved()
        {
            // Arrange
            var gnome1    = MockRepository.GenerateMock <IGnome>();
            var gnome2    = MockRepository.GenerateMock <IGnome>();
            var positions = new Dictionary <IGnome, BoardPosition>
            {
                { gnome1, new BoardPosition() },
                { gnome2, new BoardPosition() },
            };
            var board        = MockRepository.GenerateMock <IBoard>();
            var logger       = MockRepository.GenerateMock <ILogger>();
            var gnomeHandler = new GnomeHandler(board, positions, logger);

            // Act
            gnomeHandler.MoveGnomes();

            // Assert
            gnome1.AssertWasCalled(x => x.Move(), options => options.Repeat.Once());
            gnome2.AssertWasCalled(x => x.Move(), options => options.Repeat.Once());
        }