chess/src/test/java/com/oracle/chess/client/htmljava/BoardModelTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 24 Sep 2013 22:20:24 +0200
branchchess
changeset 49 945fbfff28f3
permissions -rw-r--r--
Advanced version of the chess game
jaroslav@49
     1
/**
jaroslav@49
     2
 * The MIT License (MIT)
jaroslav@49
     3
 *
jaroslav@49
     4
 * Copyright (C) 2013 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@49
     5
 *
jaroslav@49
     6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
jaroslav@49
     7
 * of this software and associated documentation files (the "Software"), to deal
jaroslav@49
     8
 * in the Software without restriction, including without limitation the rights
jaroslav@49
     9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
jaroslav@49
    10
 * copies of the Software, and to permit persons to whom the Software is
jaroslav@49
    11
 * furnished to do so, subject to the following conditions:
jaroslav@49
    12
 *
jaroslav@49
    13
 * The above copyright notice and this permission notice shall be included in
jaroslav@49
    14
 * all copies or substantial portions of the Software.
jaroslav@49
    15
 *
jaroslav@49
    16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
jaroslav@49
    17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
jaroslav@49
    18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
jaroslav@49
    19
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
jaroslav@49
    20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jaroslav@49
    21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
jaroslav@49
    22
 * THE SOFTWARE.
jaroslav@49
    23
 */
jaroslav@49
    24
package com.oracle.chess.client.htmljava;
jaroslav@49
    25
jaroslav@49
    26
import com.oracle.chess.client.htmljava.BoardModel.PieceType;
jaroslav@49
    27
import java.util.Arrays;
jaroslav@49
    28
import java.util.Collections;
jaroslav@49
    29
import java.util.List;
jaroslav@49
    30
import static org.testng.Assert.*;
jaroslav@49
    31
import org.testng.annotations.Test;
jaroslav@49
    32
jaroslav@49
    33
/**
jaroslav@49
    34
 *
jaroslav@49
    35
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@49
    36
 */
jaroslav@49
    37
public class BoardModelTest {
jaroslav@49
    38
    
jaroslav@49
    39
    public BoardModelTest() {
jaroslav@49
    40
    }
jaroslav@49
    41
    
jaroslav@49
    42
    @Test public void whiteRockLeftBottom() {
jaroslav@49
    43
        Board b = Rules.createBoard();
jaroslav@49
    44
        Row bottom = b.getRows().get(7);
jaroslav@49
    45
        Square left = bottom.getColumns().get(0);
jaroslav@49
    46
        assertEquals(left.getPiece(), PieceType.ROCK, "Rock is on bottom left square");
jaroslav@49
    47
        assertEquals(left.getPieceColor(), Color.W, "It is white");
jaroslav@49
    48
        assertEquals(left.getColor(), Color.B, "Square is black");
jaroslav@49
    49
    }
jaroslav@49
    50
jaroslav@49
    51
    @Test public void e2e4e7e6() {
jaroslav@49
    52
        Board b = Rules.createBoard();
jaroslav@49
    53
        b.setGameId("myId");
jaroslav@49
    54
        setPlayer(b, Color.W);
jaroslav@49
    55
        assertEquals(b.getTurn(), Color.W);
jaroslav@49
    56
        
jaroslav@49
    57
        Square e2 = BoardModel.findSquare(b, 'E', 2);
jaroslav@49
    58
        assertNotNull(e2);
jaroslav@49
    59
        BoardModel.selected(b, e2);
jaroslav@49
    60
        assertEquals(BoardModel.findSelectedSquare(b), e2, "E2 is selected");
jaroslav@49
    61
        
jaroslav@49
    62
        Square e4 = BoardModel.findSquare(b, 'E', 4);
jaroslav@49
    63
        assertNotNull(e4);
jaroslav@49
    64
        
jaroslav@49
    65
        BoardModel.selected(b, e4);
jaroslav@49
    66
        
jaroslav@49
    67
        assertTrue(e4.isPending(), "e4 marked as pending move");
jaroslav@49
    68
        assertNull(e2.getPiece(), "No pawn at e2");
jaroslav@49
    69
jaroslav@49
    70
        // ignore all other figures than the two pawns
jaroslav@49
    71
        BoardModel.moveResponse(b, null, Collections.singletonList("Pe4"), 
jaroslav@49
    72
            Collections.singletonList("Pe7"), Color.B, null
jaroslav@49
    73
        );
jaroslav@49
    74
jaroslav@49
    75
        assertFalse(e4.isPending(), "e4 now the move is real");
jaroslav@49
    76
        assertNull(e2.getPiece(), "No pawn at e2");
jaroslav@49
    77
        assertEquals(e4.getPiece(), BoardModel.PieceType.PAWN, "Pawn moved successfully");
jaroslav@49
    78
        assertNull(BoardModel.findSelectedSquare(b), "No square selected");
jaroslav@49
    79
        
jaroslav@49
    80
        BoardModel.selected(b, e4);
jaroslav@49
    81
        assertNull(BoardModel.findSelectedSquare(b), "No square selected, it is blacks turn");
jaroslav@49
    82
jaroslav@49
    83
        List<Move> mvs1 = b.getMoves();
jaroslav@49
    84
        assertEquals(1, mvs1.size(), "First move was made: " + mvs1);
jaroslav@49
    85
        Move firstMove = mvs1.get(0);
jaroslav@49
    86
        assertEquals(firstMove.getPiece(), PieceType.PAWN, "Moving with pawn");
jaroslav@49
    87
        assertEquals(firstMove.getRound(), 1, "First round of moves");
jaroslav@49
    88
        assertEquals(firstMove.getTurn(), Color.W, "Moved by white");
jaroslav@49
    89
        assertTrue(firstMove.isWhiteMove(), "Really moved by white");
jaroslav@49
    90
        
jaroslav@49
    91
        assertTrue(b.isBlackTurn(), "black's turn");
jaroslav@49
    92
        
jaroslav@49
    93
        
jaroslav@49
    94
        Square e7 = BoardModel.findSquare(b, 'E', 7);
jaroslav@49
    95
        BoardModel.selected(b, e7);
jaroslav@49
    96
        assertNull(BoardModel.findSelectedSquare(b), "Can't select anything when I am white player");
jaroslav@49
    97
        
jaroslav@49
    98
        Move blackMv = BoardModel.MoveImpl.valueOf("E7E6");
jaroslav@49
    99
        BoardModel.moveUpdate(b, blackMv, 
jaroslav@49
   100
            Collections.singletonList("PE4"), 
jaroslav@49
   101
            Collections.singletonList("PE6"), 
jaroslav@49
   102
            Color.W, null
jaroslav@49
   103
        );
jaroslav@49
   104
        
jaroslav@49
   105
        assertNull(e7.getPiece(), "Piece has been moved");
jaroslav@49
   106
        
jaroslav@49
   107
        List<Move> mvs = b.getMoves();
jaroslav@49
   108
        assertEquals(2, mvs.size(), "There are two moves now: " + mvs);
jaroslav@49
   109
        Move secondMove = mvs.get(1);
jaroslav@49
   110
        assertEquals(secondMove.getPiece(), PieceType.PAWN, "Moving with pawn");
jaroslav@49
   111
        assertEquals(secondMove.getRound(), 1, "Still 1st round of moves");
jaroslav@49
   112
        assertEquals(secondMove.getTurn(), Color.B, "Moved by black");
jaroslav@49
   113
        assertFalse(secondMove.isWhiteMove(), "Really moved by black");
jaroslav@49
   114
    }
jaroslav@49
   115
jaroslav@49
   116
    @Test public void unselect() {
jaroslav@49
   117
        Board b = Rules.createBoard();
jaroslav@49
   118
        b.setGameId("myId");
jaroslav@49
   119
        setPlayer(b, Color.W);
jaroslav@49
   120
        assertEquals(b.getTurn(), Color.W);
jaroslav@49
   121
        
jaroslav@49
   122
        Square e2 = BoardModel.findSquare(b, 'E', 2);
jaroslav@49
   123
        assertNotNull(e2);
jaroslav@49
   124
        BoardModel.selected(b, e2);
jaroslav@49
   125
        assertEquals(BoardModel.findSelectedSquare(b), e2, "E2 is selected");
jaroslav@49
   126
        
jaroslav@49
   127
        BoardModel.selected(b, e2);
jaroslav@49
   128
        assertNull(BoardModel.findSelectedSquare(b), "E2 is unselected");
jaroslav@49
   129
        
jaroslav@49
   130
        for (Row row : b.getRows()) {
jaroslav@49
   131
            for (Square s : row.getColumns()) {
jaroslav@49
   132
                assertFalse(s.isAccessible(), "No square is accessible anymore: " + s);
jaroslav@49
   133
            }
jaroslav@49
   134
        }
jaroslav@49
   135
    }
jaroslav@49
   136
    
jaroslav@49
   137
    @Test public void discaredMove() {
jaroslav@49
   138
        Board b = Rules.createBoard();
jaroslav@49
   139
        b.setGameId("myId");
jaroslav@49
   140
        setPlayer(b, Color.W);
jaroslav@49
   141
        assertEquals(b.getTurn(), Color.W);
jaroslav@49
   142
        
jaroslav@49
   143
        Square e2 = BoardModel.findSquare(b, 'E', 2);
jaroslav@49
   144
        assertNotNull(e2);
jaroslav@49
   145
        BoardModel.selected(b, e2);
jaroslav@49
   146
        assertEquals(BoardModel.findSelectedSquare(b), e2, "E2 is selected");
jaroslav@49
   147
        
jaroslav@49
   148
        Square e4 = BoardModel.findSquare(b, 'E', 4);
jaroslav@49
   149
        assertNotNull(e4);
jaroslav@49
   150
        
jaroslav@49
   151
        BoardModel.selected(b, e4);
jaroslav@49
   152
        
jaroslav@49
   153
        assertTrue(e4.isPending(), "e4 marked as pending move");
jaroslav@49
   154
        assertNull(e2.getPiece(), "No pawn at e2");
jaroslav@49
   155
        
jaroslav@49
   156
        assertEquals(b.getMoves().size(), 1, "One move recorded");
jaroslav@49
   157
        assertEquals(b.getMoves().get(0), b.getPendingMove(), "Pending move is waiting");
jaroslav@49
   158
jaroslav@49
   159
        // ignore all other figures than the two pawns
jaroslav@49
   160
        BoardModel.moveResponse(b, "No way, can't play like this", Collections.singletonList("PE2"), 
jaroslav@49
   161
            Collections.singletonList("Pe7"), Color.W, null
jaroslav@49
   162
        );
jaroslav@49
   163
        
jaroslav@49
   164
        assertEquals(b.getAlertMessage(), "No way, can't play like this");
jaroslav@49
   165
        assertNull(e4.getPiece(), "No piece on e4");
jaroslav@49
   166
        assertEquals(e2.getPiece(), PieceType.PAWN, "Pawn is back");
jaroslav@49
   167
        
jaroslav@49
   168
        assertEquals(b.getMoves().size(), 0, "Move was discarded");
jaroslav@49
   169
        assertNull(b.getPendingMove(), "No pending moves");
jaroslav@49
   170
    }
jaroslav@49
   171
    
jaroslav@49
   172
    @Test public void cantSelectEmptySquare() {
jaroslav@49
   173
        Board b = Rules.createBoard();
jaroslav@49
   174
        Square e3 = BoardModel.findSquare(b, 'E', 3);
jaroslav@49
   175
        assertNotNull(e3);
jaroslav@49
   176
        BoardModel.selected(b, e3);
jaroslav@49
   177
        assertNull(BoardModel.findSelectedSquare(b), "No square is selected");
jaroslav@49
   178
    }
jaroslav@49
   179
jaroslav@49
   180
    @Test public void cantTakeOwnPiece() {
jaroslav@49
   181
        Board b = Rules.createBoard();
jaroslav@49
   182
        setPlayer(b, Color.W);
jaroslav@49
   183
        Square e1 = BoardModel.findSquare(b, 'E', 1);
jaroslav@49
   184
        assertNotNull(e1);
jaroslav@49
   185
        BoardModel.selected(b, e1);
jaroslav@49
   186
        assertEquals(BoardModel.findSelectedSquare(b), e1, "E1 is selected");
jaroslav@49
   187
        
jaroslav@49
   188
        Square e2 = BoardModel.findSquare(b, 'E', 2);
jaroslav@49
   189
        assertNotNull(e2);
jaroslav@49
   190
        
jaroslav@49
   191
        BoardModel.selected(b, e2);
jaroslav@49
   192
        
jaroslav@49
   193
        assertNotNull(e1.getPiece(), "King remains at e1");
jaroslav@49
   194
        assertEquals(e2.getPiece(), BoardModel.PieceType.PAWN, "Pawn remains");
jaroslav@49
   195
        assertEquals(BoardModel.findSelectedSquare(b), e2, "e2 now selected");
jaroslav@49
   196
        
jaroslav@49
   197
    }
jaroslav@49
   198
    
jaroslav@49
   199
    @Test public void knightMustMoveToF3() {
jaroslav@49
   200
        Board b = Rules.createBoard();
jaroslav@49
   201
        setPlayer(b, Color.W);
jaroslav@49
   202
        Square g1 = BoardModel.findSquare(b, 'G', 1);
jaroslav@49
   203
        BoardModel.selected(b, g1);
jaroslav@49
   204
        
jaroslav@49
   205
        Square f3 = BoardModel.findSquare(b, 'F', 3);
jaroslav@49
   206
        assertTrue(f3.isAccessible(), "This is a field where knight can move");
jaroslav@49
   207
jaroslav@49
   208
        Square g3 = BoardModel.findSquare(b, 'G', 3);
jaroslav@49
   209
        assertFalse(g3.isAccessible(), "Not a place for knight");
jaroslav@49
   210
jaroslav@49
   211
        Square e2 = BoardModel.findSquare(b, 'E', 2);
jaroslav@49
   212
        assertFalse(e2.isAccessible(), "Not a place either, occupied");
jaroslav@49
   213
jaroslav@49
   214
        BoardModel.selected(b, g3);
jaroslav@49
   215
        
jaroslav@49
   216
        assertNull(g3.getPiece(), "No figure was moved");
jaroslav@49
   217
        assertTrue(g1.isSelected(), "Original square still selected");
jaroslav@49
   218
        
jaroslav@49
   219
        BoardModel.selected(b, f3);
jaroslav@49
   220
        
jaroslav@49
   221
        assertEquals(f3.getPiece(), PieceType.KNIGHT, "Moved");
jaroslav@49
   222
        assertFalse(g3.isSelected(), "No longer selected");
jaroslav@49
   223
    }
jaroslav@49
   224
    
jaroslav@49
   225
    @Test public void pawnCanTakeToSide() {
jaroslav@49
   226
        Board b = Rules.createBoard();
jaroslav@49
   227
        Square e2 = BoardModel.findSquare(b, 'E', 2);
jaroslav@49
   228
        Square e4 = BoardModel.findSquare(b, 'E', 4);
jaroslav@49
   229
        Square d7 = BoardModel.findSquare(b, 'D', 7);
jaroslav@49
   230
        Square d5 = BoardModel.findSquare(b, 'D', 5);
jaroslav@49
   231
        
jaroslav@49
   232
        BoardModel.selected(b, e2);
jaroslav@49
   233
        BoardModel.selected(b, e4);
jaroslav@49
   234
        
jaroslav@49
   235
        // ignore all other figures than the two pawns
jaroslav@49
   236
        BoardModel.moveResponse(b, null, Collections.singletonList("PE4"), 
jaroslav@49
   237
            Collections.singletonList("PD7"), Color.B, null
jaroslav@49
   238
        );
jaroslav@49
   239
        
jaroslav@49
   240
        setPlayer(b, Color.B);
jaroslav@49
   241
        
jaroslav@49
   242
        BoardModel.selected(b, d7);
jaroslav@49
   243
        BoardModel.selected(b, d5);
jaroslav@49
   244
        
jaroslav@49
   245
        // ignore all other figures than the two pawns
jaroslav@49
   246
        BoardModel.moveResponse(b, null, Collections.singletonList("PE4"), 
jaroslav@49
   247
            Collections.singletonList("PD5"), Color.W, null
jaroslav@49
   248
        );
jaroslav@49
   249
        
jaroslav@49
   250
        setPlayer(b, Color.W);
jaroslav@49
   251
        
jaroslav@49
   252
        BoardModel.selected(b, e4);
jaroslav@49
   253
        assertTrue(d5.isAccessible(), "Can take on d5");
jaroslav@49
   254
        BoardModel.selected(b, d5);
jaroslav@49
   255
        assertNull(e4.getPiece(), "No pawn on e4");
jaroslav@49
   256
        assertEquals(d5.getPieceColor(), Color.W, "White Pawn on d5");
jaroslav@49
   257
    }
jaroslav@49
   258
    
jaroslav@49
   259
    @Test public void pawnCanJumpOnAnother() {
jaroslav@49
   260
        Board b = Rules.createBoard();
jaroslav@49
   261
        Square e2 = BoardModel.findSquare(b, 'E', 2);
jaroslav@49
   262
        Square e4 = BoardModel.findSquare(b, 'E', 4);
jaroslav@49
   263
        Square d7 = BoardModel.findSquare(b, 'D', 7);
jaroslav@49
   264
        Square d5 = BoardModel.findSquare(b, 'D', 5);
jaroslav@49
   265
        Square e7 = BoardModel.findSquare(b, 'E', 7);
jaroslav@49
   266
        Square e6 = BoardModel.findSquare(b, 'E', 6);
jaroslav@49
   267
        Square e5 = BoardModel.findSquare(b, 'E', 5);
jaroslav@49
   268
        
jaroslav@49
   269
        BoardModel.selected(b, e2);
jaroslav@49
   270
        BoardModel.selected(b, e4);
jaroslav@49
   271
        
jaroslav@49
   272
        // ignore all other figures than the three pawns
jaroslav@49
   273
        BoardModel.moveResponse(b, null, Collections.singletonList("PE4"), 
jaroslav@49
   274
            Arrays.asList("PD7", "PE7"), Color.B, null
jaroslav@49
   275
        );
jaroslav@49
   276
        
jaroslav@49
   277
        setPlayer(b, Color.B);
jaroslav@49
   278
        
jaroslav@49
   279
        BoardModel.selected(b, d7);
jaroslav@49
   280
        BoardModel.selected(b, d5);
jaroslav@49
   281
        
jaroslav@49
   282
        // ignore all other figures than the three pawns
jaroslav@49
   283
        BoardModel.moveResponse(b, null, Collections.singletonList("PE4"), 
jaroslav@49
   284
            Arrays.asList("PD5", "PE7"), Color.W, null
jaroslav@49
   285
        );
jaroslav@49
   286
        
jaroslav@49
   287
        setPlayer(b, Color.W);
jaroslav@49
   288
        
jaroslav@49
   289
        BoardModel.selected(b, e4);
jaroslav@49
   290
        BoardModel.selected(b, e5);
jaroslav@49
   291
        
jaroslav@49
   292
        // ignore all other figures than the three pawns
jaroslav@49
   293
        BoardModel.moveResponse(b, null, Collections.singletonList("PE5"), 
jaroslav@49
   294
            Arrays.asList("PD5", "PE7"), Color.B, null
jaroslav@49
   295
        );
jaroslav@49
   296
        
jaroslav@49
   297
        setPlayer(b, Color.B);
jaroslav@49
   298
        
jaroslav@49
   299
        BoardModel.selected(b, e7);
jaroslav@49
   300
        assertTrue(e6.isAccessible(), "Can move by one piece");
jaroslav@49
   301
        assertFalse(e5.isAccessible(), "Can't move where other pawn is");
jaroslav@49
   302
    }
jaroslav@49
   303
    
jaroslav@49
   304
    @Test public void showFirstMove() {
jaroslav@49
   305
        Board b = Rules.createBoard();
jaroslav@49
   306
        setPlayer(b, Color.W);
jaroslav@49
   307
        Square e2 = BoardModel.findSquare(b, 'E', 2);
jaroslav@49
   308
        Square e4 = BoardModel.findSquare(b, 'E', 4);
jaroslav@49
   309
        Square d7 = BoardModel.findSquare(b, 'D', 7);
jaroslav@49
   310
        Square d5 = BoardModel.findSquare(b, 'D', 5);
jaroslav@49
   311
        
jaroslav@49
   312
        BoardModel.selected(b, e2);
jaroslav@49
   313
        BoardModel.selected(b, e4);
jaroslav@49
   314
        
jaroslav@49
   315
        // ignore all other figures than the two pawns
jaroslav@49
   316
        BoardModel.moveResponse(b, null, Collections.singletonList("Pe4"), 
jaroslav@49
   317
            Collections.singletonList("PD7"), Color.B, null
jaroslav@49
   318
        );
jaroslav@49
   319
        
jaroslav@49
   320
        Move blackMv = BoardModel.MoveImpl.valueOf("D7D5");
jaroslav@49
   321
        BoardModel.moveUpdate(b, blackMv, 
jaroslav@49
   322
            Collections.singletonList("PE4"), 
jaroslav@49
   323
            Collections.singletonList("PD5"), 
jaroslav@49
   324
            Color.W, null
jaroslav@49
   325
        );
jaroslav@49
   326
        
jaroslav@49
   327
jaroslav@49
   328
        assertEquals(b.getMoves().size(), 2, "Two moves");
jaroslav@49
   329
        BoardModel.showPosition(b, b.getMoves().get(0));
jaroslav@49
   330
        
jaroslav@49
   331
        assertEquals(b.getRows().size(), 8, "Still eight rows");
jaroslav@49
   332
        assertEquals(b.getRows().get(0).getColumns().size(), 8, "Eight columns");
jaroslav@49
   333
        
jaroslav@49
   334
        assertNull(e2.getPiece(), "e2 is empty");
jaroslav@49
   335
        assertEquals(e4.getPiece(), PieceType.PAWN, "e4 has pawn");
jaroslav@49
   336
        assertEquals(d7.getPiece(), PieceType.PAWN, "d7 has pawn");
jaroslav@49
   337
        assertNull(d5.getPiece(), "Second move is not made");
jaroslav@49
   338
        assertNull(b.getTurn(), "Nobody to make a move");
jaroslav@49
   339
    }
jaroslav@49
   340
    
jaroslav@49
   341
    @Test public void initialPositionReadFromAServer() {
jaroslav@49
   342
        List<String> blacks = Arrays.asList(
jaroslav@49
   343
            "Pa7",
jaroslav@49
   344
            "Pb7",
jaroslav@49
   345
            "Pc7",
jaroslav@49
   346
            "Pd7",
jaroslav@49
   347
            "Pe7",
jaroslav@49
   348
            "Pf7",
jaroslav@49
   349
            "Pg7",
jaroslav@49
   350
            "Ph7",
jaroslav@49
   351
            "Ra8",
jaroslav@49
   352
            "Nb8",
jaroslav@49
   353
            "Bc8",
jaroslav@49
   354
            "Qd8",
jaroslav@49
   355
            "Ke8",
jaroslav@49
   356
            "Bf8",
jaroslav@49
   357
            "Ng8",
jaroslav@49
   358
            "Rh8"
jaroslav@49
   359
        );
jaroslav@49
   360
        List<String> whites = Arrays.asList(
jaroslav@49
   361
            "Ra1",
jaroslav@49
   362
            "Nb1",
jaroslav@49
   363
            "Bc1",
jaroslav@49
   364
            "Qd1",
jaroslav@49
   365
            "Ke1",
jaroslav@49
   366
            "Bf1",
jaroslav@49
   367
            "Ng1",
jaroslav@49
   368
            "Rh1",
jaroslav@49
   369
            "Pa2",
jaroslav@49
   370
            "Pb2",
jaroslav@49
   371
            "Pc2",
jaroslav@49
   372
            "Pd2",
jaroslav@49
   373
            "Pe2",
jaroslav@49
   374
            "Pf2",
jaroslav@49
   375
            "Pg2",
jaroslav@49
   376
            "Ph2"
jaroslav@49
   377
        );
jaroslav@49
   378
        
jaroslav@49
   379
        Board b = Rules.createBoard();
jaroslav@49
   380
        Rules.initBoard(b, whites, blacks, Color.W);
jaroslav@49
   381
        
jaroslav@49
   382
        Board b2 = Rules.createBoard();
jaroslav@49
   383
        Rules.initBoard(b2);
jaroslav@49
   384
        
jaroslav@49
   385
        for (int i = 0; i < 7; i++) {
jaroslav@49
   386
            for (int j = 0; j < 7; j++) {
jaroslav@49
   387
                Square s = b.getRows().get(i).getColumns().get(j);
jaroslav@49
   388
                Square s2 = b2.getRows().get(i).getColumns().get(j);
jaroslav@49
   389
                
jaroslav@49
   390
                assertEquals(s.getPiece(), s2.getPiece(), "Same piece at " + i + "/" + j);
jaroslav@49
   391
                assertEquals(s.getPieceColor(), s2.getPieceColor(), "Same piece color at " + i + "/" + j);
jaroslav@49
   392
            }
jaroslav@49
   393
        }
jaroslav@49
   394
    }
jaroslav@49
   395
    
jaroslav@49
   396
    @Test public void allowSmallRochade() {
jaroslav@49
   397
        Board b = Rules.createBoard();
jaroslav@49
   398
        setPlayer(b, Color.W);
jaroslav@49
   399
        Square f1 = BoardModel.findSquare(b, 'F', 1);
jaroslav@49
   400
        f1.setPiece(null);
jaroslav@49
   401
        f1.setPieceColor(null);
jaroslav@49
   402
        Square g1 = BoardModel.findSquare(b, 'G', 1);
jaroslav@49
   403
        g1.setPiece(null);
jaroslav@49
   404
        g1.setPieceColor(null);
jaroslav@49
   405
        Square e1 = BoardModel.findSquare(b, 'E', 1);
jaroslav@49
   406
        
jaroslav@49
   407
        BoardModel.selected(b, e1);
jaroslav@49
   408
        assertTrue(g1.isAccessible(), "Can do 0-0");
jaroslav@49
   409
    }
jaroslav@49
   410
    
jaroslav@49
   411
    @Test public void allowSmallRochadeForBlack() {
jaroslav@49
   412
        Board b = Rules.createBoard();
jaroslav@49
   413
        setPlayer(b, Color.B);
jaroslav@49
   414
        b.setTurn(Color.B);
jaroslav@49
   415
        Square f8 = BoardModel.findSquare(b, 'F', 8);
jaroslav@49
   416
        f8.setPiece(null);
jaroslav@49
   417
        f8.setPieceColor(null);
jaroslav@49
   418
        Square g8 = BoardModel.findSquare(b, 'G', 8);
jaroslav@49
   419
        g8.setPiece(null);
jaroslav@49
   420
        g8.setPieceColor(null);
jaroslav@49
   421
        Square e8 = BoardModel.findSquare(b, 'E', 8);
jaroslav@49
   422
        
jaroslav@49
   423
        BoardModel.selected(b, e8);
jaroslav@49
   424
        assertTrue(g8.isAccessible(), "Can do 0-0");
jaroslav@49
   425
    }
jaroslav@49
   426
    
jaroslav@49
   427
    @Test public void disallowSmallRochadeWhenNoRock() {
jaroslav@49
   428
        Board b = Rules.createBoard();
jaroslav@49
   429
        setPlayer(b, Color.W);
jaroslav@49
   430
        Square f1 = BoardModel.findSquare(b, 'F', 1);
jaroslav@49
   431
        f1.setPiece(null);
jaroslav@49
   432
        f1.setPieceColor(null);
jaroslav@49
   433
        Square g1 = BoardModel.findSquare(b, 'G', 1);
jaroslav@49
   434
        g1.setPiece(null);
jaroslav@49
   435
        g1.setPieceColor(null);
jaroslav@49
   436
        Square h1 = BoardModel.findSquare(b, 'H', 1);
jaroslav@49
   437
        h1.setPiece(null);
jaroslav@49
   438
        h1.setPieceColor(null);
jaroslav@49
   439
        Square e1 = BoardModel.findSquare(b, 'E', 1);
jaroslav@49
   440
        
jaroslav@49
   441
        BoardModel.selected(b, e1);
jaroslav@49
   442
        assertFalse(g1.isAccessible(), "Cannot do 0-0 when there is no rock");
jaroslav@49
   443
    }
jaroslav@49
   444
    
jaroslav@49
   445
    @Test public void disallowSmallRochadeWhenBishop() {
jaroslav@49
   446
        Board b = Rules.createBoard();
jaroslav@49
   447
        setPlayer(b, Color.W);
jaroslav@49
   448
        Square g1 = BoardModel.findSquare(b, 'G', 1);
jaroslav@49
   449
        g1.setPiece(null);
jaroslav@49
   450
        Square e1 = BoardModel.findSquare(b, 'E', 1);
jaroslav@49
   451
        
jaroslav@49
   452
        BoardModel.selected(b, e1);
jaroslav@49
   453
        assertFalse(g1.isAccessible(), "Cannot do 0-0 when there is bishop");
jaroslav@49
   454
    }
jaroslav@49
   455
jaroslav@49
   456
    @Test public void disallowSmallRochadeWhenKnight() {
jaroslav@49
   457
        Board b = Rules.createBoard();
jaroslav@49
   458
        setPlayer(b, Color.W);
jaroslav@49
   459
        Square f1 = BoardModel.findSquare(b, 'F', 1);
jaroslav@49
   460
        f1.setPiece(null);
jaroslav@49
   461
        Square e1 = BoardModel.findSquare(b, 'E', 1);
jaroslav@49
   462
        
jaroslav@49
   463
        BoardModel.selected(b, e1);
jaroslav@49
   464
        assertFalse(f1.isAccessible(), "Cannot do 0-0 when there is knight");
jaroslav@49
   465
    }
jaroslav@49
   466
    
jaroslav@49
   467
    @Test public void allowBigRochadeForBlack() {
jaroslav@49
   468
        Board b = Rules.createBoard();
jaroslav@49
   469
        setPlayer(b, Color.B);
jaroslav@49
   470
        b.setTurn(Color.B);
jaroslav@49
   471
        Square b8 = BoardModel.findSquare(b, 'B', 8);
jaroslav@49
   472
        b8.setPiece(null);
jaroslav@49
   473
        b8.setPieceColor(null);
jaroslav@49
   474
        Square c8 = BoardModel.findSquare(b, 'C', 8);
jaroslav@49
   475
        c8.setPiece(null);
jaroslav@49
   476
        c8.setPieceColor(null);
jaroslav@49
   477
        Square d8 = BoardModel.findSquare(b, 'D', 8);
jaroslav@49
   478
        d8.setPiece(null);
jaroslav@49
   479
        d8.setPieceColor(null);
jaroslav@49
   480
        Square e8 = BoardModel.findSquare(b, 'E', 8);
jaroslav@49
   481
        
jaroslav@49
   482
        BoardModel.selected(b, e8);
jaroslav@49
   483
        assertTrue(c8.isAccessible(), "Can do 0-0-0");
jaroslav@49
   484
    }
jaroslav@49
   485
    
jaroslav@49
   486
    @Test public void enPassant() {
jaroslav@49
   487
        Board b = Rules.createBoard();
jaroslav@49
   488
        setPlayer(b, Color.B);
jaroslav@49
   489
        b.setTurn(Color.B);
jaroslav@49
   490
jaroslav@49
   491
        Square e7 = BoardModel.findSquare(b, 'E', 7);
jaroslav@49
   492
        Square e4 = BoardModel.findSquare(b, 'E', 4);
jaroslav@49
   493
        movePiece(e7, e4);
jaroslav@49
   494
        
jaroslav@49
   495
        Move move = new Move();
jaroslav@49
   496
        move.setFrom(position('D', 2));
jaroslav@49
   497
        move.setTo(position('D', 4));
jaroslav@49
   498
        move.setPiece(PieceType.PAWN);
jaroslav@49
   499
        b.getMoves().add(move);
jaroslav@49
   500
        
jaroslav@49
   501
        Square d2 = BoardModel.findSquare(b, 'D', 2);
jaroslav@49
   502
        Square d4 = BoardModel.findSquare(b, 'D', 4);
jaroslav@49
   503
        movePiece(d2, d4);
jaroslav@49
   504
        
jaroslav@49
   505
        BoardModel.selected(b, e4);
jaroslav@49
   506
        
jaroslav@49
   507
        Square e3 = BoardModel.findSquare(b, 'E', 3);
jaroslav@49
   508
        assertTrue(e3.isAccessible(), "Obviously can move to e3");
jaroslav@49
   509
        
jaroslav@49
   510
        Square d3 = BoardModel.findSquare(b, 'D', 3);
jaroslav@49
   511
        assertTrue(d3.isAccessible(), "Can also take on d3");
jaroslav@49
   512
    }
jaroslav@49
   513
jaroslav@49
   514
    private void movePiece(Square from, Square to) {
jaroslav@49
   515
        to.setPiece(from.getPiece());
jaroslav@49
   516
        to.setPieceColor(from.getPieceColor());
jaroslav@49
   517
        from.setPiece(null);
jaroslav@49
   518
        from.setPieceColor(null);
jaroslav@49
   519
    }
jaroslav@49
   520
jaroslav@49
   521
    private Position position(char c, int i) {
jaroslav@49
   522
        Position p = new Position();
jaroslav@49
   523
        p.setX(c);
jaroslav@49
   524
        p.setY(i);
jaroslav@49
   525
        return p;
jaroslav@49
   526
    }
jaroslav@49
   527
    
jaroslav@49
   528
    private static void setPlayer(Board b, Color c) {
jaroslav@49
   529
        b.setWhitePlayer("x");
jaroslav@49
   530
        b.setBlackPlayer("y");
jaroslav@49
   531
        if (c == Color.B) {
jaroslav@49
   532
            b.setPlayer("y");
jaroslav@49
   533
        } else {
jaroslav@49
   534
            b.setPlayer("x");
jaroslav@49
   535
        }
jaroslav@49
   536
    }
jaroslav@49
   537
}