public void WhenLastMoveWasNotPromotionReturnTheSameChessMove()
        {
            var movementHistoryMock = new Mock <IMovementHistory>(MockBehavior.Strict);
            var piecesMock          = new Mock <IEnumerable <IChessPiece> >(MockBehavior.Strict);

            var notPromotionMove = new ChessMove(new Position(0, 1), new Position(0, 3));

            var piecePromoter = new PiecePromoter(movementHistoryMock.Object);

            var result = piecePromoter
                         .DepromoteIfPromotionMove(notPromotionMove, piecesMock.Object);

            Assert.AreEqual(notPromotionMove, result);
        }
        public void WhenLastMoveWasPromotionDepromotePieceAndReturnLastMove()
        {
            var movementHistoryMock = new Mock <IMovementHistory>(MockBehavior.Strict);
            var promotedPawn        = new Mock <IChessPiece>(MockBehavior.Strict);

            var promoteType = ChessPieceType.Queen;

            var promotionMove = new ChessMove(new Position(0, 0), new Position(0, 0),
                                              pawnPromotion: promoteType);

            var pawnPosition = new Position(3, 0);

            var lastMove = new ChessMove(new Position(3, 1), pawnPosition);

            promotedPawn
            .SetupGet(p => p.Position)
            .Returns(pawnPosition);
            promotedPawn
            .Setup(p => p.Depromote());

            movementHistoryMock
            .Setup(h => h.RemoveLastMove())
            .Returns(lastMove);

            var piecePromoter = new PiecePromoter(movementHistoryMock.Object);

            var pieces = new List <IChessPiece>()
            {
                promotedPawn.Object
            };
            var result = piecePromoter
                         .DepromoteIfPromotionMove(promotionMove, pieces);

            Assert.AreEqual(lastMove, result);
            promotedPawn
            .Verify(p => p.Depromote());
            movementHistoryMock
            .Verify(h => h.RemoveLastMove());
        }