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