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