public void PawnCanPerformEnPassant() { var moves = new List <ChessMove>() { //white pawn two up new ChessMove(new Position(6, 1), new Position(6, 3)), //black pawn two down new ChessMove(new Position(7, 6), new Position(7, 4)), //white pawn captures black pawn new ChessMove(new Position(6, 3), new Position(7, 4)), //black pawn two down new ChessMove(new Position(6, 6), new Position(6, 4)), //white pawn performs en passant new ChessMove(new Position(7, 4), new Position(6, 5)), }; var factory = new ChessGameFactory(); var game = factory.Create(); ChessPlayResult result = ChessPlayResult.SuccessfulMove; foreach (var move in moves) { Assert.AreEqual(ChessPlayResult.SuccessfulMove, result); result = game.Play(move, game.CurrentPlayer); } Assert.AreEqual(ChessPlayResult.SuccessfulMove, result); Assert.AreEqual(30, game.Pieces.Count()); }
public void QuickestBlackWinTest() { var moves = new List <ChessMove>() { //right bishop's white pawn two up new ChessMove(new Position(5, 1), new Position(5, 3)), //king's black pawn two down new ChessMove(new Position(4, 6), new Position(4, 4)), //right knight's white pawn two up new ChessMove(new Position(6, 1), new Position(6, 3)), //black queen checkmate new ChessMove(new Position(3, 7), new Position(7, 3)), }; var factory = new ChessGameFactory(); var game = factory.Create(); ChessPlayResult result = ChessPlayResult.SuccessfulMove; foreach (var move in moves) { Assert.AreEqual(ChessPlayResult.SuccessfulMove, result); result = game.Play(move, game.CurrentPlayer); } Assert.AreEqual(ChessPlayResult.BlackWin, result); }
public void KingCanCaptureOtherPieces() { var moves = new List <ChessMove>() { //white pawn two up new ChessMove(new Position(5, 1), new Position(5, 3)), //black pawn two down new ChessMove(new Position(3, 6), new Position(3, 4)), //white king up right new ChessMove(new Position(4, 0), new Position(5, 1)), //left black bishop move new ChessMove(new Position(2, 7), new Position(6, 3)), //white king up right new ChessMove(new Position(5, 1), new Position(6, 2)), //black pawn one down new ChessMove(new Position(3, 4), new Position(3, 3)), //white king capturing bishop new ChessMove(new Position(6, 2), new Position(6, 3)), }; var factory = new ChessGameFactory(); var game = factory.Create(); ChessPlayResult result = ChessPlayResult.SuccessfulMove; foreach (var move in moves) { Assert.AreEqual(ChessPlayResult.SuccessfulMove, result); result = game.Play(move, game.CurrentPlayer); } Assert.AreEqual(ChessPlayResult.SuccessfulMove, result); Assert.AreEqual(31, game.Pieces.Count()); }
public void ThereShouldBe20StartingMoves() { var factory = new ChessGameFactory(); var game = factory.Create(); var moves = game.GetAvailableLegalMoves(ChessColor.White).ToList(); Assert.AreEqual(20, moves.Count); }
public void TryingToMoveEmptySpaceReturnsInvalidMove() { var invalidMove = new ChessMove(new Position(2, 2), new Position(2, 3)); var factory = new ChessGameFactory(); var game = factory.Create(); var result = game.Play(invalidMove, ChessColor.White); Assert.AreEqual(ChessPlayResult.InvalidMove, result); }
public void ThereShouldBe20FirstBlackMoves() { var factory = new ChessGameFactory(); var game = factory.Create(); game.Play(new ChessMove(new Position(0, 1), new Position(0, 2)), ChessColor.White); var moves = game.GetAvailableLegalMoves(ChessColor.Black).ToList(); Assert.AreEqual(20, moves.Count); }
public void QuickestBlackPromotionTest() { var moves = new List <ChessMove>() { //leftmost white pawn two up new ChessMove(new Position(0, 1), new Position(0, 3)), //left knight's black pawn two down new ChessMove(new Position(1, 6), new Position(1, 4)), //left white rook two up new ChessMove(new Position(0, 0), new Position(0, 2)), //left knight's black pawn capture of white pawn new ChessMove(new Position(1, 4), new Position(0, 3)), //left white rook four right new ChessMove(new Position(0, 2), new Position(4, 2)), //left knight's black pawn one down new ChessMove(new Position(0, 3), new Position(0, 2)), //right white knight move new ChessMove(new Position(6, 0), new Position(7, 2)), //left knight's black pawn one down new ChessMove(new Position(0, 2), new Position(0, 1)), //right white knight move new ChessMove(new Position(7, 2), new Position(6, 4)), //left knight's black pawn reaching promotion area new ChessMove(new Position(0, 1), new Position(0, 0)), }; var factory = new ChessGameFactory(); var game = factory.Create(); ChessPlayResult result = ChessPlayResult.SuccessfulMove; foreach (var move in moves) { Assert.AreEqual(ChessPlayResult.SuccessfulMove, result); result = game.Play(move, game.CurrentPlayer); } Assert.AreEqual(ChessPlayResult.PromotionRequired, result); var promotionMove = new ChessMove(new Position(0, 0), new Position(0, 0), pawnPromotion: ChessPieceType.Queen); result = game.Play(promotionMove, game.CurrentPlayer); Assert.AreEqual(ChessPlayResult.SuccessfulMove, result); var blackQueens = game.Pieces .Where(p => p.Color == ChessColor.Black && p.PieceType == ChessPieceType.Queen) .ToList(); Assert.AreEqual(2, blackQueens.Count); }
public void QuickestBlackKingsideCastling() { var moves = new List <ChessMove>() { //leftmost white pawn one up new ChessMove(new Position(0, 1), new Position(0, 2)), //king's black pawn two down new ChessMove(new Position(4, 6), new Position(4, 4)), //left white rook 1 up new ChessMove(new Position(0, 0), new Position(0, 1)), //right black bishop capturing leftmost white pawn new ChessMove(new Position(5, 7), new Position(0, 2)), //second from left white pawn capturing black bishop new ChessMove(new Position(1, 1), new Position(0, 2)), //right black knight move new ChessMove(new Position(6, 7), new Position(5, 5)), //left white bishop move new ChessMove(new Position(2, 0), new Position(1, 1)), //black kingside castling new ChessMove(new Position(4, 7), new Position(7, 7)), }; var factory = new ChessGameFactory(); var game = factory.Create(); ChessPlayResult result = ChessPlayResult.SuccessfulMove; foreach (var move in moves) { Assert.AreEqual(ChessPlayResult.SuccessfulMove, result); System.Console.WriteLine(move); result = game.Play(move, game.CurrentPlayer); } Assert.AreEqual(ChessPlayResult.SuccessfulMove, result); var isBlackKingOnCorrectPosition = game.Pieces .Any(p => p.Color == ChessColor.Black && p.PieceType == ChessPieceType.King && p.Position == new Position(6, 7)); Assert.IsTrue(isBlackKingOnCorrectPosition); }
private void WaitingConnection() { IConnection connection = null; try { if (isServerSide) { connection = new TcpIPServerConnection(form.SocketInfo.Host, int.Parse(form.SocketInfo.Port)); for (int i = 0; i < 40; i++) { if (!isWaitingConnection) { break; } else if (connection.TryToOpen()) { game = ChessGameFactory.GetInstance().GetChessGame(connection); break; } else { Thread.Sleep(100); } } } else { connection = new TcpIPClientConnection(form.SocketInfo.Host, int.Parse(form.SocketInfo.Port)); for (int i = 0; i < 2; i++) { if (connection.TryToOpen()) { game = RemoteChessGameFactory.GetInstance().GetChessGame(connection); break; } else { Thread.Sleep(100); } } } } catch (ThreadAbortException) { isWaitingConnection = false; } catch (Exception e) when(e is ConnectionException || e is IOException) { isWaitingConnection = false; form.ShowMessageBox("Fail to connect. Port is busy", "Error"); form.Invoke((Action <bool>)form.StartStopWaitingConnBtnRename, new object[] { false }); } catch (Exception e) when(e is FormatException || e is OverflowException) { isWaitingConnection = false; form.ShowMessageBox("Wrong host or port format", "Error"); form.Invoke((Action <bool>)form.StartStopWaitingConnBtnRename, new object[] { false }); } finally { if (isWaitingConnection) { if (game == null) { form.Invoke((Action <bool>)form.StartStopWaitingConnBtnRename, new object[] { false }); isWaitingConnection = false; form.ShowMessageBox("Fail to connect", "Error"); } else { form.Invoke((ThreadStart)StartGame); } } if (!isWaitingConnection) { if (game != null) { try { game.Disconnect(); } catch (Exception e) when(e is ConnectionException || e is IOException) { } game = null; } if (connection != null) { connection.Close(); connection = null; } } isWaitingConnection = false; } }