1.1 --- a/chess/src/test/java/org/apidesign/html/demo/chess/BoardModelTest.java Tue Sep 24 22:20:24 2013 +0200
1.2 +++ b/chess/src/test/java/org/apidesign/html/demo/chess/BoardModelTest.java Tue Sep 24 22:37:17 2013 +0200
1.3 @@ -23,8 +23,13 @@
1.4 */
1.5 package org.apidesign.html.demo.chess;
1.6
1.7 -import org.apidesign.html.demo.chess.BoardModel.ColorType;
1.8 +import org.apidesign.html.demo.chess.Color;
1.9 +import org.apidesign.html.demo.chess.Rules;
1.10 +import org.apidesign.html.demo.chess.BoardModel;
1.11 import org.apidesign.html.demo.chess.BoardModel.PieceType;
1.12 +import java.util.Arrays;
1.13 +import java.util.Collections;
1.14 +import java.util.List;
1.15 import static org.testng.Assert.*;
1.16 import org.testng.annotations.Test;
1.17
1.18 @@ -36,11 +41,21 @@
1.19
1.20 public BoardModelTest() {
1.21 }
1.22 -
1.23 +
1.24 + @Test public void whiteRockLeftBottom() {
1.25 + Board b = Rules.createBoard();
1.26 + Row bottom = b.getRows().get(7);
1.27 + Square left = bottom.getColumns().get(0);
1.28 + assertEquals(left.getPiece(), PieceType.ROCK, "Rock is on bottom left square");
1.29 + assertEquals(left.getPieceColor(), Color.W, "It is white");
1.30 + assertEquals(left.getColor(), Color.B, "Square is black");
1.31 + }
1.32
1.33 @Test public void e2e4e7e6() {
1.34 - Board b = BoardModel.createBoard();
1.35 - assertEquals(b.getTurn(), ColorType.WHITE);
1.36 + Board b = Rules.createBoard();
1.37 + b.setGameId("myId");
1.38 + setPlayer(b, Color.W);
1.39 + assertEquals(b.getTurn(), Color.W);
1.40
1.41 Square e2 = BoardModel.findSquare(b, 'E', 2);
1.42 assertNotNull(e2);
1.43 @@ -52,26 +67,113 @@
1.44
1.45 BoardModel.selected(b, e4);
1.46
1.47 + assertTrue(e4.isPending(), "e4 marked as pending move");
1.48 + assertNull(e2.getPiece(), "No pawn at e2");
1.49 +
1.50 + // ignore all other figures than the two pawns
1.51 + BoardModel.moveResponse(b, null, Collections.singletonList("Pe4"),
1.52 + Collections.singletonList("Pe7"), Color.B, null
1.53 + );
1.54 +
1.55 + assertFalse(e4.isPending(), "e4 now the move is real");
1.56 assertNull(e2.getPiece(), "No pawn at e2");
1.57 assertEquals(e4.getPiece(), BoardModel.PieceType.PAWN, "Pawn moved successfully");
1.58 assertNull(BoardModel.findSelectedSquare(b), "No square selected");
1.59
1.60 BoardModel.selected(b, e4);
1.61 assertNull(BoardModel.findSelectedSquare(b), "No square selected, it is blacks turn");
1.62 +
1.63 + List<Move> mvs1 = b.getMoves();
1.64 + assertEquals(1, mvs1.size(), "First move was made: " + mvs1);
1.65 + Move firstMove = mvs1.get(0);
1.66 + assertEquals(firstMove.getPiece(), PieceType.PAWN, "Moving with pawn");
1.67 + assertEquals(firstMove.getRound(), 1, "First round of moves");
1.68 + assertEquals(firstMove.getTurn(), Color.W, "Moved by white");
1.69 + assertTrue(firstMove.isWhiteMove(), "Really moved by white");
1.70
1.71 assertTrue(b.isBlackTurn(), "black's turn");
1.72
1.73
1.74 Square e7 = BoardModel.findSquare(b, 'E', 7);
1.75 BoardModel.selected(b, e7);
1.76 - assertEquals(BoardModel.findSelectedSquare(b), e7);
1.77 + assertNull(BoardModel.findSelectedSquare(b), "Can't select anything when I am white player");
1.78
1.79 - BoardModel.selected(b, BoardModel.findSquare(b, 'E', 6));
1.80 + Move blackMv = BoardModel.MoveImpl.valueOf("E7E6");
1.81 + BoardModel.moveUpdate(b, blackMv,
1.82 + Collections.singletonList("PE4"),
1.83 + Collections.singletonList("PE6"),
1.84 + Color.W, null
1.85 + );
1.86 +
1.87 assertNull(e7.getPiece(), "Piece has been moved");
1.88 +
1.89 + List<Move> mvs = b.getMoves();
1.90 + assertEquals(2, mvs.size(), "There are two moves now: " + mvs);
1.91 + Move secondMove = mvs.get(1);
1.92 + assertEquals(secondMove.getPiece(), PieceType.PAWN, "Moving with pawn");
1.93 + assertEquals(secondMove.getRound(), 1, "Still 1st round of moves");
1.94 + assertEquals(secondMove.getTurn(), Color.B, "Moved by black");
1.95 + assertFalse(secondMove.isWhiteMove(), "Really moved by black");
1.96 + }
1.97 +
1.98 + @Test public void unselect() {
1.99 + Board b = Rules.createBoard();
1.100 + b.setGameId("myId");
1.101 + setPlayer(b, Color.W);
1.102 + assertEquals(b.getTurn(), Color.W);
1.103 +
1.104 + Square e2 = BoardModel.findSquare(b, 'E', 2);
1.105 + assertNotNull(e2);
1.106 + BoardModel.selected(b, e2);
1.107 + assertEquals(BoardModel.findSelectedSquare(b), e2, "E2 is selected");
1.108 +
1.109 + BoardModel.selected(b, e2);
1.110 + assertNull(BoardModel.findSelectedSquare(b), "E2 is unselected");
1.111 +
1.112 + for (Row row : b.getRows()) {
1.113 + for (Square s : row.getColumns()) {
1.114 + assertFalse(s.isAccessible(), "No square is accessible anymore: " + s);
1.115 + }
1.116 + }
1.117 + }
1.118 +
1.119 + @Test public void discaredMove() {
1.120 + Board b = Rules.createBoard();
1.121 + b.setGameId("myId");
1.122 + setPlayer(b, Color.W);
1.123 + assertEquals(b.getTurn(), Color.W);
1.124 +
1.125 + Square e2 = BoardModel.findSquare(b, 'E', 2);
1.126 + assertNotNull(e2);
1.127 + BoardModel.selected(b, e2);
1.128 + assertEquals(BoardModel.findSelectedSquare(b), e2, "E2 is selected");
1.129 +
1.130 + Square e4 = BoardModel.findSquare(b, 'E', 4);
1.131 + assertNotNull(e4);
1.132 +
1.133 + BoardModel.selected(b, e4);
1.134 +
1.135 + assertTrue(e4.isPending(), "e4 marked as pending move");
1.136 + assertNull(e2.getPiece(), "No pawn at e2");
1.137 +
1.138 + assertEquals(b.getMoves().size(), 1, "One move recorded");
1.139 + assertEquals(b.getMoves().get(0), b.getPendingMove(), "Pending move is waiting");
1.140 +
1.141 + // ignore all other figures than the two pawns
1.142 + BoardModel.moveResponse(b, "No way, can't play like this", Collections.singletonList("PE2"),
1.143 + Collections.singletonList("Pe7"), Color.W, null
1.144 + );
1.145 +
1.146 + assertEquals(b.getAlertMessage(), "No way, can't play like this");
1.147 + assertNull(e4.getPiece(), "No piece on e4");
1.148 + assertEquals(e2.getPiece(), PieceType.PAWN, "Pawn is back");
1.149 +
1.150 + assertEquals(b.getMoves().size(), 0, "Move was discarded");
1.151 + assertNull(b.getPendingMove(), "No pending moves");
1.152 }
1.153
1.154 @Test public void cantSelectEmptySquare() {
1.155 - Board b = BoardModel.createBoard();
1.156 + Board b = Rules.createBoard();
1.157 Square e3 = BoardModel.findSquare(b, 'E', 3);
1.158 assertNotNull(e3);
1.159 BoardModel.selected(b, e3);
1.160 @@ -79,7 +181,8 @@
1.161 }
1.162
1.163 @Test public void cantTakeOwnPiece() {
1.164 - Board b = BoardModel.createBoard();
1.165 + Board b = Rules.createBoard();
1.166 + setPlayer(b, Color.W);
1.167 Square e1 = BoardModel.findSquare(b, 'E', 1);
1.168 assertNotNull(e1);
1.169 BoardModel.selected(b, e1);
1.170 @@ -97,7 +200,8 @@
1.171 }
1.172
1.173 @Test public void knightMustMoveToF3() {
1.174 - Board b = BoardModel.createBoard();
1.175 + Board b = Rules.createBoard();
1.176 + setPlayer(b, Color.W);
1.177 Square g1 = BoardModel.findSquare(b, 'G', 1);
1.178 BoardModel.selected(b, g1);
1.179
1.180 @@ -122,7 +226,7 @@
1.181 }
1.182
1.183 @Test public void pawnCanTakeToSide() {
1.184 - Board b = BoardModel.createBoard();
1.185 + Board b = Rules.createBoard();
1.186 Square e2 = BoardModel.findSquare(b, 'E', 2);
1.187 Square e4 = BoardModel.findSquare(b, 'E', 4);
1.188 Square d7 = BoardModel.findSquare(b, 'D', 7);
1.189 @@ -130,13 +234,307 @@
1.190
1.191 BoardModel.selected(b, e2);
1.192 BoardModel.selected(b, e4);
1.193 +
1.194 + // ignore all other figures than the two pawns
1.195 + BoardModel.moveResponse(b, null, Collections.singletonList("PE4"),
1.196 + Collections.singletonList("PD7"), Color.B, null
1.197 + );
1.198 +
1.199 + setPlayer(b, Color.B);
1.200 +
1.201 BoardModel.selected(b, d7);
1.202 BoardModel.selected(b, d5);
1.203
1.204 + // ignore all other figures than the two pawns
1.205 + BoardModel.moveResponse(b, null, Collections.singletonList("PE4"),
1.206 + Collections.singletonList("PD5"), Color.W, null
1.207 + );
1.208 +
1.209 + setPlayer(b, Color.W);
1.210 +
1.211 BoardModel.selected(b, e4);
1.212 assertTrue(d5.isAccessible(), "Can take on d5");
1.213 BoardModel.selected(b, d5);
1.214 assertNull(e4.getPiece(), "No pawn on e4");
1.215 - assertEquals(d5.getPieceColor(), ColorType.WHITE, "White Pawn on d5");
1.216 + assertEquals(d5.getPieceColor(), Color.W, "White Pawn on d5");
1.217 + }
1.218 +
1.219 + @Test public void pawnCanJumpOnAnother() {
1.220 + Board b = Rules.createBoard();
1.221 + Square e2 = BoardModel.findSquare(b, 'E', 2);
1.222 + Square e4 = BoardModel.findSquare(b, 'E', 4);
1.223 + Square d7 = BoardModel.findSquare(b, 'D', 7);
1.224 + Square d5 = BoardModel.findSquare(b, 'D', 5);
1.225 + Square e7 = BoardModel.findSquare(b, 'E', 7);
1.226 + Square e6 = BoardModel.findSquare(b, 'E', 6);
1.227 + Square e5 = BoardModel.findSquare(b, 'E', 5);
1.228 +
1.229 + BoardModel.selected(b, e2);
1.230 + BoardModel.selected(b, e4);
1.231 +
1.232 + // ignore all other figures than the three pawns
1.233 + BoardModel.moveResponse(b, null, Collections.singletonList("PE4"),
1.234 + Arrays.asList("PD7", "PE7"), Color.B, null
1.235 + );
1.236 +
1.237 + setPlayer(b, Color.B);
1.238 +
1.239 + BoardModel.selected(b, d7);
1.240 + BoardModel.selected(b, d5);
1.241 +
1.242 + // ignore all other figures than the three pawns
1.243 + BoardModel.moveResponse(b, null, Collections.singletonList("PE4"),
1.244 + Arrays.asList("PD5", "PE7"), Color.W, null
1.245 + );
1.246 +
1.247 + setPlayer(b, Color.W);
1.248 +
1.249 + BoardModel.selected(b, e4);
1.250 + BoardModel.selected(b, e5);
1.251 +
1.252 + // ignore all other figures than the three pawns
1.253 + BoardModel.moveResponse(b, null, Collections.singletonList("PE5"),
1.254 + Arrays.asList("PD5", "PE7"), Color.B, null
1.255 + );
1.256 +
1.257 + setPlayer(b, Color.B);
1.258 +
1.259 + BoardModel.selected(b, e7);
1.260 + assertTrue(e6.isAccessible(), "Can move by one piece");
1.261 + assertFalse(e5.isAccessible(), "Can't move where other pawn is");
1.262 + }
1.263 +
1.264 + @Test public void showFirstMove() {
1.265 + Board b = Rules.createBoard();
1.266 + setPlayer(b, Color.W);
1.267 + Square e2 = BoardModel.findSquare(b, 'E', 2);
1.268 + Square e4 = BoardModel.findSquare(b, 'E', 4);
1.269 + Square d7 = BoardModel.findSquare(b, 'D', 7);
1.270 + Square d5 = BoardModel.findSquare(b, 'D', 5);
1.271 +
1.272 + BoardModel.selected(b, e2);
1.273 + BoardModel.selected(b, e4);
1.274 +
1.275 + // ignore all other figures than the two pawns
1.276 + BoardModel.moveResponse(b, null, Collections.singletonList("Pe4"),
1.277 + Collections.singletonList("PD7"), Color.B, null
1.278 + );
1.279 +
1.280 + Move blackMv = BoardModel.MoveImpl.valueOf("D7D5");
1.281 + BoardModel.moveUpdate(b, blackMv,
1.282 + Collections.singletonList("PE4"),
1.283 + Collections.singletonList("PD5"),
1.284 + Color.W, null
1.285 + );
1.286 +
1.287 +
1.288 + assertEquals(b.getMoves().size(), 2, "Two moves");
1.289 + BoardModel.showPosition(b, b.getMoves().get(0));
1.290 +
1.291 + assertEquals(b.getRows().size(), 8, "Still eight rows");
1.292 + assertEquals(b.getRows().get(0).getColumns().size(), 8, "Eight columns");
1.293 +
1.294 + assertNull(e2.getPiece(), "e2 is empty");
1.295 + assertEquals(e4.getPiece(), PieceType.PAWN, "e4 has pawn");
1.296 + assertEquals(d7.getPiece(), PieceType.PAWN, "d7 has pawn");
1.297 + assertNull(d5.getPiece(), "Second move is not made");
1.298 + assertNull(b.getTurn(), "Nobody to make a move");
1.299 + }
1.300 +
1.301 + @Test public void initialPositionReadFromAServer() {
1.302 + List<String> blacks = Arrays.asList(
1.303 + "Pa7",
1.304 + "Pb7",
1.305 + "Pc7",
1.306 + "Pd7",
1.307 + "Pe7",
1.308 + "Pf7",
1.309 + "Pg7",
1.310 + "Ph7",
1.311 + "Ra8",
1.312 + "Nb8",
1.313 + "Bc8",
1.314 + "Qd8",
1.315 + "Ke8",
1.316 + "Bf8",
1.317 + "Ng8",
1.318 + "Rh8"
1.319 + );
1.320 + List<String> whites = Arrays.asList(
1.321 + "Ra1",
1.322 + "Nb1",
1.323 + "Bc1",
1.324 + "Qd1",
1.325 + "Ke1",
1.326 + "Bf1",
1.327 + "Ng1",
1.328 + "Rh1",
1.329 + "Pa2",
1.330 + "Pb2",
1.331 + "Pc2",
1.332 + "Pd2",
1.333 + "Pe2",
1.334 + "Pf2",
1.335 + "Pg2",
1.336 + "Ph2"
1.337 + );
1.338 +
1.339 + Board b = Rules.createBoard();
1.340 + Rules.initBoard(b, whites, blacks, Color.W);
1.341 +
1.342 + Board b2 = Rules.createBoard();
1.343 + Rules.initBoard(b2);
1.344 +
1.345 + for (int i = 0; i < 7; i++) {
1.346 + for (int j = 0; j < 7; j++) {
1.347 + Square s = b.getRows().get(i).getColumns().get(j);
1.348 + Square s2 = b2.getRows().get(i).getColumns().get(j);
1.349 +
1.350 + assertEquals(s.getPiece(), s2.getPiece(), "Same piece at " + i + "/" + j);
1.351 + assertEquals(s.getPieceColor(), s2.getPieceColor(), "Same piece color at " + i + "/" + j);
1.352 + }
1.353 + }
1.354 + }
1.355 +
1.356 + @Test public void allowSmallRochade() {
1.357 + Board b = Rules.createBoard();
1.358 + setPlayer(b, Color.W);
1.359 + Square f1 = BoardModel.findSquare(b, 'F', 1);
1.360 + f1.setPiece(null);
1.361 + f1.setPieceColor(null);
1.362 + Square g1 = BoardModel.findSquare(b, 'G', 1);
1.363 + g1.setPiece(null);
1.364 + g1.setPieceColor(null);
1.365 + Square e1 = BoardModel.findSquare(b, 'E', 1);
1.366 +
1.367 + BoardModel.selected(b, e1);
1.368 + assertTrue(g1.isAccessible(), "Can do 0-0");
1.369 + }
1.370 +
1.371 + @Test public void allowSmallRochadeForBlack() {
1.372 + Board b = Rules.createBoard();
1.373 + setPlayer(b, Color.B);
1.374 + b.setTurn(Color.B);
1.375 + Square f8 = BoardModel.findSquare(b, 'F', 8);
1.376 + f8.setPiece(null);
1.377 + f8.setPieceColor(null);
1.378 + Square g8 = BoardModel.findSquare(b, 'G', 8);
1.379 + g8.setPiece(null);
1.380 + g8.setPieceColor(null);
1.381 + Square e8 = BoardModel.findSquare(b, 'E', 8);
1.382 +
1.383 + BoardModel.selected(b, e8);
1.384 + assertTrue(g8.isAccessible(), "Can do 0-0");
1.385 + }
1.386 +
1.387 + @Test public void disallowSmallRochadeWhenNoRock() {
1.388 + Board b = Rules.createBoard();
1.389 + setPlayer(b, Color.W);
1.390 + Square f1 = BoardModel.findSquare(b, 'F', 1);
1.391 + f1.setPiece(null);
1.392 + f1.setPieceColor(null);
1.393 + Square g1 = BoardModel.findSquare(b, 'G', 1);
1.394 + g1.setPiece(null);
1.395 + g1.setPieceColor(null);
1.396 + Square h1 = BoardModel.findSquare(b, 'H', 1);
1.397 + h1.setPiece(null);
1.398 + h1.setPieceColor(null);
1.399 + Square e1 = BoardModel.findSquare(b, 'E', 1);
1.400 +
1.401 + BoardModel.selected(b, e1);
1.402 + assertFalse(g1.isAccessible(), "Cannot do 0-0 when there is no rock");
1.403 + }
1.404 +
1.405 + @Test public void disallowSmallRochadeWhenBishop() {
1.406 + Board b = Rules.createBoard();
1.407 + setPlayer(b, Color.W);
1.408 + Square g1 = BoardModel.findSquare(b, 'G', 1);
1.409 + g1.setPiece(null);
1.410 + Square e1 = BoardModel.findSquare(b, 'E', 1);
1.411 +
1.412 + BoardModel.selected(b, e1);
1.413 + assertFalse(g1.isAccessible(), "Cannot do 0-0 when there is bishop");
1.414 + }
1.415 +
1.416 + @Test public void disallowSmallRochadeWhenKnight() {
1.417 + Board b = Rules.createBoard();
1.418 + setPlayer(b, Color.W);
1.419 + Square f1 = BoardModel.findSquare(b, 'F', 1);
1.420 + f1.setPiece(null);
1.421 + Square e1 = BoardModel.findSquare(b, 'E', 1);
1.422 +
1.423 + BoardModel.selected(b, e1);
1.424 + assertFalse(f1.isAccessible(), "Cannot do 0-0 when there is knight");
1.425 + }
1.426 +
1.427 + @Test public void allowBigRochadeForBlack() {
1.428 + Board b = Rules.createBoard();
1.429 + setPlayer(b, Color.B);
1.430 + b.setTurn(Color.B);
1.431 + Square b8 = BoardModel.findSquare(b, 'B', 8);
1.432 + b8.setPiece(null);
1.433 + b8.setPieceColor(null);
1.434 + Square c8 = BoardModel.findSquare(b, 'C', 8);
1.435 + c8.setPiece(null);
1.436 + c8.setPieceColor(null);
1.437 + Square d8 = BoardModel.findSquare(b, 'D', 8);
1.438 + d8.setPiece(null);
1.439 + d8.setPieceColor(null);
1.440 + Square e8 = BoardModel.findSquare(b, 'E', 8);
1.441 +
1.442 + BoardModel.selected(b, e8);
1.443 + assertTrue(c8.isAccessible(), "Can do 0-0-0");
1.444 + }
1.445 +
1.446 + @Test public void enPassant() {
1.447 + Board b = Rules.createBoard();
1.448 + setPlayer(b, Color.B);
1.449 + b.setTurn(Color.B);
1.450 +
1.451 + Square e7 = BoardModel.findSquare(b, 'E', 7);
1.452 + Square e4 = BoardModel.findSquare(b, 'E', 4);
1.453 + movePiece(e7, e4);
1.454 +
1.455 + Move move = new Move();
1.456 + move.setFrom(position('D', 2));
1.457 + move.setTo(position('D', 4));
1.458 + move.setPiece(PieceType.PAWN);
1.459 + b.getMoves().add(move);
1.460 +
1.461 + Square d2 = BoardModel.findSquare(b, 'D', 2);
1.462 + Square d4 = BoardModel.findSquare(b, 'D', 4);
1.463 + movePiece(d2, d4);
1.464 +
1.465 + BoardModel.selected(b, e4);
1.466 +
1.467 + Square e3 = BoardModel.findSquare(b, 'E', 3);
1.468 + assertTrue(e3.isAccessible(), "Obviously can move to e3");
1.469 +
1.470 + Square d3 = BoardModel.findSquare(b, 'D', 3);
1.471 + assertTrue(d3.isAccessible(), "Can also take on d3");
1.472 + }
1.473 +
1.474 + private void movePiece(Square from, Square to) {
1.475 + to.setPiece(from.getPiece());
1.476 + to.setPieceColor(from.getPieceColor());
1.477 + from.setPiece(null);
1.478 + from.setPieceColor(null);
1.479 + }
1.480 +
1.481 + private Position position(char c, int i) {
1.482 + Position p = new Position();
1.483 + p.setX(c);
1.484 + p.setY(i);
1.485 + return p;
1.486 + }
1.487 +
1.488 + private static void setPlayer(Board b, Color c) {
1.489 + b.setWhitePlayer("x");
1.490 + b.setBlackPlayer("y");
1.491 + if (c == Color.B) {
1.492 + b.setPlayer("y");
1.493 + } else {
1.494 + b.setPlayer("x");
1.495 + }
1.496 }
1.497 }