public void EasyBoardSettingsConstructorShouldSetExpectedBoardParameterValues()
        {
            var settings = new EasyBoardSettings();

            Assert.AreEqual(expected: 9, actual: settings.Rows);
            Assert.AreEqual(expected: 9, actual: settings.Cols);
            Assert.AreEqual(expected: 10, actual: settings.NumberOfBombs);
        }
        public void CalculateSurroundingBombsOnEmptyBoardShouldReturnZero()
        {
            var settings = new EasyBoardSettings();
            var subscribers = new List<IBoardObserver>()
            {
            };

            var board = new Board(settings, subscribers);
            this.FillBoard(board);

            int result = board.CalculateNumberOfSurroundingBombs(default(int), default(int));

            Assert.AreEqual(default(int), result);
        }
        public void BoardConstructorShouldSetProvidedParameters()
        {
            var settings = new EasyBoardSettings();
            var subscribers = new List<IBoardObserver>
            {
            };

            var board = new Board(settings, subscribers);

            Assert.AreEqual(settings.Rows, board.Rows);
            Assert.AreEqual(settings.Cols, board.Cols);
            Assert.AreEqual(settings.NumberOfBombs, board.NumberOfMines);
            Assert.AreEqual(subscribers, board.Subscribers);
            Assert.AreEqual(BoardState.Open, board.BoardState);
            Assert.AreNotEqual(default(ICell[,]), board.Cells);
        }
        public void CalculateSurroundingBombsOnCellWithBombShouldReturnZero()
        {
            var contentFactory = new ContentFactory();
            var settings = new EasyBoardSettings();
            var subscribers = new List<IBoardObserver>()
            {
            };

            var board = new Board(settings, subscribers);
            this.FillBoard(board);

            board.Cells[default(int), default(int)].Content = contentFactory.GetContent(ContentType.Bomb);

            int result = board.CalculateNumberOfSurroundingBombs(default(int), default(int));

            Assert.AreEqual(default(int), result);
        }
        public void UnsubscribeShouldRemoveTheObjectFromTheBoardSubscribers()
        {
            IBoardObserver mockedBoardObserver = new Mock<IBoardObserver>().Object;
            var settings = new EasyBoardSettings();
            var subscribers = new List<IBoardObserver>()
            {
                mockedBoardObserver
            };

            var board = new Board(settings, subscribers);

            Assert.AreEqual(default(int) + 1, board.Subscribers.Count);

            board.Unsubscribe(mockedBoardObserver);

            Assert.AreEqual(default(int), board.Subscribers.Count);
        }
        public void SubscribeShouldAddTheObjectToTheBoardSubscribers()
        {
            IBoardObserver mockedBoardObserver = new Mock<IBoardObserver>().Object;
            var settings = new EasyBoardSettings();
            var subscribers = new List<IBoardObserver>()
            {
            };

            var board = new Board(settings, subscribers);
            board.Subscribe(mockedBoardObserver);

            Assert.AreEqual(!default(bool), board.Subscribers.Contains(mockedBoardObserver));
        }
        public void IsAlreadyShownShouldReturnTrueWhenCalledUponRevealedCell()
        {
            var settings = new EasyBoardSettings();
            var subscribers = new List<IBoardObserver>()
            {
            };

            var board = new Board(settings, subscribers);
            this.FillBoard(board);
            board.RevealCell(default(int), default(int));

            bool result = board.IsAlreadyShown(default(int), default(int));

            Assert.AreEqual(!default(bool), result);
        }
        public void ChangeBoardStateShouldChangeBoardStateAndNotifySubscribers()
        {
            var templateNotification = new Notification(string.Empty, BoardState.Open);
            var mockedBoardObserver = new Mock<IBoardObserver>();
            mockedBoardObserver.Setup(o => o.Update(templateNotification)).Verifiable();

            var settings = new EasyBoardSettings();
            var subscribers = new List<IBoardObserver>()
            {
                mockedBoardObserver.Object
            };

            var board = new Board(settings, subscribers);
            board.ChangeBoardState(templateNotification);
            mockedBoardObserver.Verify(o => o.Update(templateNotification), Times.AtMostOnce);
        }
        /// <summary>
        /// Start Game logic
        /// </summary>
        public void Start(Grid root)
        {
            // Initialize the two basic objects needed for user interactions
            this.InputProvider = this.inputProvider ?? new WpfInputProvider();
            this.OutputRenderer = this.outputRenderer ?? new WpfRenderer(root);

            string testPlayerName = "John";

            // Create the active player
            var player = new Player(testPlayerName);

            BoardSettings testBoardSettings = new EasyBoardSettings();

            var board = new Board(testBoardSettings, new List<IBoardObserver>());
            var scoreboard = new Scoreboard();
            var contentFactory = new ContentFactory();
            var initializationStrategy = new StandardGameInitializationStrategy(contentFactory);
            var boardOperator = new CommandOperator(board, scoreboard);
            var engine = new StandardOnePlayerMinesweeperEngine(board, this.inputProvider, this.outputRenderer, boardOperator, scoreboard, player);

            engine.Initialize(initializationStrategy);
            board.Subscribe(engine);
            engine.Run();
        }