public IChessGame Create() { var piecesFactory = new PiecesFactory(); var movementHistory = new MovementHistory(); var piecePromoter = new PiecePromoter(movementHistory); var castlingMover = new CastlingMover(movementHistory); var enPassantMover = new EnPassantMover(movementHistory); var pieceMover = new PieceMover(movementHistory, piecePromoter, castlingMover, enPassantMover); var chessBoard = new ChessBoard(piecesFactory, pieceMover); List <IMovement> movements = new(); var pawnMovement = new PawnMovement(chessBoard); var enPassantMovement = new EnPassantMovement(chessBoard); var kingMovement = new KingMovement(chessBoard); var horizontalMovement = new HorizontalMovement(chessBoard); var verticalMovement = new VerticalMovement(chessBoard); var pdiagonalMovement = new PositiveDiagonalMovement(chessBoard); var ndiagonalMovement = new NegativeDiagonalMovement(chessBoard); var knightMovement = new KnightMovement(chessBoard); movements.Add(pawnMovement); movements.Add(enPassantMovement); movements.Add(kingMovement); movements.Add(horizontalMovement); movements.Add(verticalMovement); movements.Add(pdiagonalMovement); movements.Add(ndiagonalMovement); movements.Add(knightMovement); var movementComposite = new MovementComposite(movements); List <IMovement> movementsWithCastling = new(); var queensideCastlingMovement = new QueensideCastlingMovement(chessBoard, movementComposite); var kingsideCastlingMovement = new KingsideCastlingMovement(chessBoard, movementComposite); movementsWithCastling.Add(movementComposite); movementsWithCastling.Add(queensideCastlingMovement); movementsWithCastling.Add(kingsideCastlingMovement); var movementCompositeWithCastling = new MovementComposite(movementsWithCastling); var promotionDetector = new PromotionDetector(chessBoard); var checkDetector = new CheckDetector(chessBoard, movementCompositeWithCastling); var legalMovement = new LegalMovement(chessBoard, movementCompositeWithCastling, checkDetector); var moveValidator = new MoveValidator(chessBoard, legalMovement, promotionDetector); var gameFinishedDetector = new GameFinishedDetector(checkDetector, legalMovement); return(new ChessGame(chessBoard, moveValidator, promotionDetector, gameFinishedDetector, legalMovement)); }
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 WhenMoveIsNotPromotionReturnFalse() { 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 .PromoteIfPromotionMove(notPromotionMove, piecesMock.Object); Assert.IsFalse(result); }
public void WhenMoveIsPromotionPromotePawnAndReturnTrue() { 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 moves = new List <ChessMove>() { new ChessMove(new Position(0, 1), new Position(0, 3)), new ChessMove(new Position(3, 1), pawnPosition), }; promotedPawn .SetupGet(p => p.Position) .Returns(pawnPosition); promotedPawn .Setup(p => p.Promote(promoteType)); movementHistoryMock .SetupGet(h => h.ChessMoves) .Returns(moves); movementHistoryMock .Setup(h => h.Add(promotionMove)); var piecePromoter = new PiecePromoter(movementHistoryMock.Object); var pieces = new List <IChessPiece>() { promotedPawn.Object }; var result = piecePromoter .PromoteIfPromotionMove(promotionMove, pieces); Assert.IsTrue(result); promotedPawn .Verify(p => p.Promote(promoteType)); movementHistoryMock .Verify(h => h.Add(promotionMove)); }
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()); }