public void ChangeSelection_PieceSelected_OldPieceIsNotSelected()
        {
            // Arrange
            var stubPoints = TestHelper.CreatePointsWithBounds(5);

            var stubBoardService = Substitute.For <IBoardService>();

            stubBoardService.CreateInitialBoard()
            .Returns(new Tuple <List <PointModel>, List <List <PointModel> > >(stubPoints, null));

            var mockBoardModel = Substitute.For <BoardModel>(stubBoardService);

            var stubEventSubscriber = new MockEventSubscriber();

            mockBoardModel.NewPieceAdded    += stubEventSubscriber.Handle;
            mockBoardModel.SelectionChanged += stubEventSubscriber.Handle;

            var stubPlayer = Substitute.For <PlayerModel>(1, Colors.Yellow);

            var boardController = new BoardController(mockBoardModel);

            boardController.AddNewPiece(stubPoints[2], stubPlayer);

            boardController.AddNewPiece(stubPoints[4], stubPlayer);

            // Act
            boardController.ChangeSelection(stubPoints[4], stubPlayer, true);

            // Assert
            var oldPoint = mockBoardModel.Points.Where(p => p.Bounds.Contains(stubPoints[2].Bounds)).First();

            Assert.IsFalse(oldPoint.Piece.IsSelected);
        }
        public void AddNewPiece_InvalidPosition_NoPieceIsAdded(
            int pieceCount, int newPointModelIndex, int stubPointModelIndex)
        {
            // Arrange
            var stubPoints = TestHelper.CreatePointsWithBounds(pieceCount);

            var stubBoardService = Substitute.For <IBoardService>();

            stubBoardService.CreateInitialBoard()
            .Returns(new Tuple <List <PointModel>, List <List <PointModel> > >(stubPoints, null));

            var mockBoardModel = Substitute.For <BoardModel>(stubBoardService);

            var stubEventSubscriber = new MockEventSubscriber();

            mockBoardModel.NewPieceAdded += stubEventSubscriber.Handle;

            var stubPlayer = Substitute.For <PlayerModel>(1, Colors.Yellow);

            var boardController = new BoardController(mockBoardModel);

            boardController.AddNewPiece(stubPoints[stubPointModelIndex], stubPlayer);

            // Act
            boardController.AddNewPiece(stubPoints[newPointModelIndex], stubPlayer);

            // Assert
            Assert.AreEqual(1, mockBoardModel.Points.Count(p => p.Piece != null));
        }
        public void AddNewPiece_Position_NewPieceAddedRaised(
            int pointCount, int newPointModelIndex, int stubPointModelIndex, int expectedCallCount)
        {
            // Arrange
            var stubPoints = TestHelper.CreatePointsWithBounds(pointCount);

            var stubBoardService = Substitute.For <IBoardService>();

            stubBoardService.CreateInitialBoard()
            .Returns(new Tuple <List <PointModel>, List <List <PointModel> > >(stubPoints, null));

            var stubBoardModel = Substitute.For <BoardModel>(stubBoardService);

            var mockEventSubscriber = new MockEventSubscriber();

            stubBoardModel.NewPieceAdded += mockEventSubscriber.Handle;

            var stubPlayer = Substitute.For <PlayerModel>(1, Colors.Yellow);

            var boardController = new BoardController(stubBoardModel);

            boardController.AddNewPiece(stubPoints[stubPointModelIndex], stubPlayer);
            mockEventSubscriber.Reset();

            // Act
            boardController.AddNewPiece(stubPoints[newPointModelIndex], stubPlayer);

            // Assert
            Assert.AreEqual(expectedCallCount, mockEventSubscriber.HitCount);
        }
        public void AddNewPiece_EmptyPointAtPosition_ReturnsNewPieceAndIsNotNull()
        {
            // Arrange
            var stubPoints = TestHelper.CreatePointsWithBounds(5);

            var stubBoardService = Substitute.For <IBoardService>();

            stubBoardService.CreateInitialBoard()
            .Returns(new Tuple <List <PointModel>, List <List <PointModel> > >(stubPoints, null));

            var stubBoardModel = Substitute.For <BoardModel>(stubBoardService);

            var stubEventSubscriber = new MockEventSubscriber();

            stubBoardModel.NewPieceAdded += stubEventSubscriber.Handle;

            var stubPlayer = Substitute.For <PlayerModel>(1, Colors.Yellow);

            var boardController = new BoardController(stubBoardModel);

            // Act
            boardController.AddNewPiece(stubPoints[0], stubPlayer);

            // Assert
            Assert.IsNotNull(stubPoints[0].Piece);
        }
        public void ChangeSelection_ValidPoint_PieceIsSelected()
        {
            // Arrange
            var stubPoints = TestHelper.CreatePointsWithBounds(5);

            var stubBoardService = Substitute.For <IBoardService>();

            stubBoardService.CreateInitialBoard()
            .Returns(new Tuple <List <PointModel>, List <List <PointModel> > >(stubPoints, null));

            var mockBoardModel = Substitute.For <BoardModel>(stubBoardService);

            var stubEventSubscriber = new MockEventSubscriber();

            mockBoardModel.NewPieceAdded    += stubEventSubscriber.Handle;
            mockBoardModel.SelectionChanged += stubEventSubscriber.Handle;

            var stubPlayer = Substitute.For <PlayerModel>(1, Colors.Yellow);

            var boardController = new BoardController(mockBoardModel);

            boardController.AddNewPiece(stubPoints[2], stubPlayer);

            // Act
            boardController.ChangeSelection(stubPoints[2], stubPlayer, true);

            // Assert
            var selectedCount = mockBoardModel.Points.Count(p => p.Piece != null && p.Piece.IsSelected);

            Assert.AreEqual(1, selectedCount);
        }
        public void RemovePiece_ValidPosition_PieceIsRemoved()
        {
            // Arrange
            var stubPoints = TestHelper.CreatePointsWithBounds(5);

            var stubBoardService = Substitute.For <IBoardService>();

            stubBoardService.CreateInitialBoard()
            .Returns(new Tuple <List <PointModel>, List <List <PointModel> > >(stubPoints, null));

            var mockBoardModel = Substitute.For <BoardModel>(stubBoardService);

            var stubEventSubscriber = new MockEventSubscriber();

            mockBoardModel.NewPieceAdded += stubEventSubscriber.Handle;
            mockBoardModel.PieceRemoved  += stubEventSubscriber.Handle;

            var stubPlayer = Substitute.For <PlayerModel>(1, Colors.Yellow);

            var boardController = new BoardController(mockBoardModel);

            boardController.AddNewPiece(stubPoints[1], stubPlayer);

            // Act
            boardController.RemovePiece(stubPoints[1]);

            // Assert
            var expectedPoint = mockBoardModel.Points.Where(p => p.Bounds.Contains(stubPoints[1].Bounds)).First();

            Assert.IsNull(expectedPoint.Piece);
        }
        public void MoveSelectedPiece_InvalidNewPoint_PieceIsNotMoved(
            int pointCount, int newPointModelIndex, int stubPointModelIndex)
        {
            // Arrange
            var stubPoints = TestHelper.CreatePointsWithBounds(pointCount);

            var stubBoardService = Substitute.For <IBoardService>();

            stubBoardService.CreateInitialBoard()
            .Returns(new Tuple <List <PointModel>, List <List <PointModel> > >(stubPoints, null));

            var mockBoardModel = Substitute.For <BoardModel>(stubBoardService);

            var stubEventSubscriber = new MockEventSubscriber();

            mockBoardModel.NewPieceAdded    += stubEventSubscriber.Handle;
            mockBoardModel.SelectionChanged += stubEventSubscriber.Handle;
            mockBoardModel.PieceMoved       += stubEventSubscriber.Handle;

            var stubPlayer = Substitute.For <PlayerModel>(1, Colors.Yellow);

            var boardController = new BoardController(mockBoardModel);

            boardController.AddNewPiece(stubPoints[stubPointModelIndex], stubPlayer);
            boardController.ChangeSelection(stubPoints[stubPointModelIndex], stubPlayer, true);

            // Act
            boardController.MoveSelectedPiece(stubPoints[newPointModelIndex]);

            // Assert
            var expectedPoint = mockBoardModel.Points.Where(p => p.Bounds.Contains(stubPoints[stubPointModelIndex].Bounds)).First();

            Assert.IsNotNull(expectedPoint.Piece);
        }
        public void MoveSelectedPiece_ValidSelectedPoint_PieceIsMovedToCorrectPoint()
        {
            // Arrange
            var stubPoints = TestHelper.CreatePointsWithBounds(5);

            stubPoints[2].Neighbors = new List <PointModel> {
                stubPoints[3]
            };

            var stubBoardService = Substitute.For <IBoardService>();

            stubBoardService.CreateInitialBoard()
            .Returns(new Tuple <List <PointModel>, List <List <PointModel> > >(stubPoints, null));

            var mockBoardModel = Substitute.For <BoardModel>(stubBoardService);

            var stubEventSubscriber = new MockEventSubscriber();

            mockBoardModel.NewPieceAdded    += stubEventSubscriber.Handle;
            mockBoardModel.SelectionChanged += stubEventSubscriber.Handle;
            mockBoardModel.PieceMoved       += stubEventSubscriber.Handle;

            var stubPlayer = Substitute.For <PlayerModel>(1, Colors.Yellow);

            var boardController = new BoardController(mockBoardModel);

            boardController.AddNewPiece(stubPoints[1], stubPlayer);
            boardController.ChangeSelection(stubPoints[1], stubPlayer, true);

            // Act
            boardController.MoveSelectedPiece(stubPoints[2]);

            // Assert
            var expectedPoint = mockBoardModel.Points.Where(p => p.Bounds.Contains(stubPoints[2].Bounds)).First();

            Assert.AreEqual(stubPoints[2].Piece, expectedPoint.Piece);
        }