Example #1
0
  /** Test move counters, of class Position. */
  public void testMoveCounters() throws ChessParseError {
    String fen = "r1bqk2r/2ppbppp/p1n2n2/1pP1p3/B3P3/5N2/PP1P1PPP/RNBQK2R w KQkq b6 0 7";
    Position pos = TextIO.readFEN(fen);

    Move move = TextIO.stringToMove(pos, "Nc3");
    UndoInfo ui = new UndoInfo();
    pos.makeMove(move, ui);
    assertEquals(1, pos.halfMoveClock);
    assertEquals(7, pos.fullMoveCounter);
    pos.unMakeMove(move, ui);

    move = TextIO.stringToMove(pos, "O-O");
    pos.makeMove(move, ui);
    assertEquals(1, pos.halfMoveClock); // Castling does not reset 50 move counter
    assertEquals(7, pos.fullMoveCounter);
    pos.unMakeMove(move, ui);

    move = TextIO.stringToMove(pos, "a3");
    pos.makeMove(move, ui);
    assertEquals(0, pos.halfMoveClock); // Pawn move resets 50 move counter
    assertEquals(7, pos.fullMoveCounter);
    pos.unMakeMove(move, ui);

    move = TextIO.stringToMove(pos, "Nxe5");
    pos.makeMove(move, ui);
    assertEquals(0, pos.halfMoveClock); // Capture move resets 50 move counter
    assertEquals(7, pos.fullMoveCounter);
    pos.unMakeMove(move, ui);

    move = TextIO.stringToMove(pos, "cxb6");
    pos.makeMove(move, ui);
    assertEquals(0, pos.halfMoveClock); // EP capture move resets 50 move counter
    assertEquals(7, pos.fullMoveCounter);
    pos.unMakeMove(move, ui);

    move = TextIO.stringToMove(pos, "Kf1");
    pos.makeMove(move, ui);
    assertEquals(1, pos.halfMoveClock); // Loss of castling rights does not reset 50 move counter
    assertEquals(7, pos.fullMoveCounter);
    pos.unMakeMove(move, ui);

    Move firstMove = TextIO.stringToMove(pos, "Nc3");
    UndoInfo firstUi = new UndoInfo();
    pos.makeMove(move, firstUi);
    move = TextIO.stringToMove(pos, "O-O");
    pos.makeMove(move, ui);
    assertEquals(2, pos.halfMoveClock);
    assertEquals(8, pos.fullMoveCounter); // Black move increases fullMoveCounter
    pos.unMakeMove(move, ui);
    pos.unMakeMove(firstMove, firstUi);

    fen = "8/8/8/4k3/8/8/2p5/5K2 b - - 47 68";
    pos = TextIO.readFEN(fen);
    move = TextIO.stringToMove(pos, "c1Q");
    pos.makeMove(move, ui);
    assertEquals(0, pos.halfMoveClock); // Pawn promotion resets 50 move counter
    assertEquals(69, pos.fullMoveCounter);
  }
Example #2
0
  /** Test of hashCode method, of class Position. */
  public void testHashCode() throws ChessParseError {
    Position pos = TextIO.readFEN(TextIO.startPosFEN);
    long h1 = pos.zobristHash();
    assertEquals(h1, pos.computeZobristHash());
    UndoInfo ui = new UndoInfo();
    Move move = TextIO.stringToMove(pos, "e4");
    pos.makeMove(move, ui);
    assertTrue(h1 != pos.zobristHash());
    pos.unMakeMove(move, ui);
    assertTrue(h1 == pos.zobristHash());

    pos.setWhiteMove(!pos.whiteMove);
    long h4 = pos.zobristHash();
    assertEquals(h4, pos.computeZobristHash());
    assertTrue(h1 != pos.zobristHash());
    pos.setWhiteMove(!pos.whiteMove);
    assertTrue(h1 == pos.zobristHash());

    pos.setCastleMask(0);
    assertTrue(h1 != pos.zobristHash());

    pos = TextIO.readFEN("rnbqkbnr/pppp1ppp/8/2P1p3/8/8/PP1PPPPP/RNBQKBNR b KQkq - 0 1");
    h1 = pos.zobristHash();
    assertEquals(h1, pos.computeZobristHash());

    String[] moves = {
      "b5", "Nc3", "Nf6", "Nb1", "Ng8", "Nc3", "Nf6", "Nb1", "Ng8", "Nc3", "d5", "cxd6", "Qxd6",
      "h4", "Be6", "h5", "Nc6", "h6", "o-o-o", "hxg7", "Nf6", "gxh8Q", "Be7"
    };
    List<UndoInfo> uiList = new ArrayList<UndoInfo>();
    List<Long> hashList = new ArrayList<Long>();
    List<Move> moveList = new ArrayList<Move>();
    for (int i = 0; i < moves.length; i++) {
      uiList.add(new UndoInfo());
      Move m = TextIO.stringToMove(pos, moves[i]);
      moveList.add(m);
      pos.makeMove(m, uiList.get(i));
      long h = pos.zobristHash();
      assertEquals(h, pos.computeZobristHash());
      hashList.add(h);
    }
    assertTrue(!hashList.get(0).equals(hashList.get(4)));
    assertTrue(hashList.get(4).equals(hashList.get(8)));
    for (int i = moves.length - 1; i >= 0; i--) {
      pos.unMakeMove(moveList.get(i), uiList.get(i));
      long h = pos.zobristHash();
      assertEquals(h, pos.computeZobristHash());
      assertEquals(h, i > 0 ? hashList.get(i - 1) : h1);
    }
  }
Example #3
0
 /** Test of getKingSq method, of class Position. */
 public void testGetKingSq() throws ChessParseError {
   Position pos = TextIO.readFEN(TextIO.startPosFEN);
   assertEquals(TextIO.getSquare("e1"), pos.getKingSq(true));
   assertEquals(TextIO.getSquare("e8"), pos.getKingSq(false));
   pos = TextIO.readFEN("r1bq1bnr/ppppkppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQ - 0 4");
   assertEquals(TextIO.getSquare("e1"), pos.getKingSq(true));
   assertEquals(TextIO.getSquare("e7"), pos.getKingSq(false));
   UndoInfo ui = new UndoInfo();
   pos.makeMove(TextIO.stringToMove(pos, "o-o"), ui);
   assertEquals(TextIO.getSquare("g1"), pos.getKingSq(true));
   assertEquals(TextIO.getSquare("e7"), pos.getKingSq(false));
   pos.makeMove(TextIO.stringToMove(pos, "Kd6"), ui);
   assertEquals(TextIO.getSquare("g1"), pos.getKingSq(true));
   assertEquals(TextIO.getSquare("d6"), pos.getKingSq(false));
 }
  /** Test of insert method, of class TranspositionTable. */
  @Test
  public void testInsert() throws ChessParseError {
    System.out.println("insert");
    TranspositionTable tt = new TranspositionTable(16);
    Position pos = TextIO.readFEN(TextIO.startPosFEN);
    String[] moves = {
      "e4", "e5", "Nf3", "Nc6", "Bb5", "a6", "Ba4", "b5", "Bb3", "Nf6", "O-O", "Be7", "Re1"
    };
    UndoInfo ui = new UndoInfo();
    for (int i = 0; i < moves.length; i++) {
      Move m = TextIO.stringToMove(pos, moves[i]);
      pos.makeMove(m, ui);
      int score = i * 17 + 3;
      m.score = score;
      int type = TranspositionTable.TTEntry.T_EXACT;
      int ply = i + 1;
      int depth = i * 2 + 5;
      tt.insert(pos.historyHash(), m, type, ply, depth, score * 2 + 3);
    }

    pos = TextIO.readFEN(TextIO.startPosFEN);
    for (int i = 0; i < moves.length; i++) {
      Move m = TextIO.stringToMove(pos, moves[i]);
      pos.makeMove(m, ui);
      TranspositionTable.TTEntry ent = tt.probe(pos.historyHash());
      assertEquals(TranspositionTable.TTEntry.T_EXACT, ent.type);
      int score = i * 17 + 3;
      int ply = i + 1;
      int depth = i * 2 + 5;
      assertEquals(score, ent.getScore(ply));
      assertEquals(depth, ent.getDepth());
      assertEquals(score * 2 + 3, ent.evalScore);
      Move tmpMove = new Move(0, 0, 0);
      ent.getMove(tmpMove);
      assertEquals(m, tmpMove);
    }
  }
Example #5
0
  /** Test of drawRuleEquals, of class Position. */
  public void testDrawRuleEquals() throws ChessParseError {
    Position pos = TextIO.readFEN(TextIO.startPosFEN);
    Position origPos = new Position(pos);
    UndoInfo ui = new UndoInfo();
    pos.makeMove(TextIO.stringToMove(pos, "Nf3"), ui);
    assertEquals(false, pos.drawRuleEquals(origPos));
    pos.makeMove(TextIO.stringToMove(pos, "Nf6"), ui);
    assertEquals(false, pos.drawRuleEquals(origPos));
    pos.makeMove(TextIO.stringToMove(pos, "Ng1"), ui);
    assertEquals(false, pos.drawRuleEquals(origPos));
    pos.makeMove(TextIO.stringToMove(pos, "Ng8"), ui);
    assertEquals(true, pos.drawRuleEquals(origPos));
    assertEquals(false, pos.equals(origPos)); // Move counters have changed

    String fen = "r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - 0 1";
    pos = TextIO.readFEN(fen);
    origPos = new Position(pos);
    pos.makeMove(TextIO.stringToMove(pos, "Ke2"), ui);
    assertEquals(false, pos.drawRuleEquals(origPos));
    pos.makeMove(TextIO.stringToMove(pos, "Be7"), ui);
    assertEquals(false, pos.drawRuleEquals(origPos));
    pos.makeMove(TextIO.stringToMove(pos, "Ke1"), ui);
    assertEquals(false, pos.drawRuleEquals(origPos));
    pos.makeMove(TextIO.stringToMove(pos, "Bf8"), ui);
    assertEquals(false, pos.drawRuleEquals(origPos)); // Not equal, castling rights lost

    pos = TextIO.readFEN(TextIO.startPosFEN);
    pos.makeMove(TextIO.stringToMove(pos, "c4"), ui);
    pos.makeMove(TextIO.stringToMove(pos, "a6"), ui);
    pos.makeMove(TextIO.stringToMove(pos, "c5"), ui);
    pos.makeMove(TextIO.stringToMove(pos, "b5"), ui);
    assertEquals(Position.getSquare(1, 5), pos.getEpSquare());
    origPos = new Position(pos);
    pos.makeMove(TextIO.stringToMove(pos, "Nc3"), ui);
    pos.makeMove(TextIO.stringToMove(pos, "Nc6"), ui);
    pos.makeMove(TextIO.stringToMove(pos, "Nb1"), ui);
    pos.makeMove(TextIO.stringToMove(pos, "Nb8"), ui);
    assertEquals(false, pos.drawRuleEquals(origPos)); // Not equal, en passant rights lost
  }
  /** Test of TTEntry nested class, of class TranspositionTable. */
  @Test
  public void testTTEntry() throws ChessParseError {
    System.out.println("TTEntry");
    final int mate0 = Search.MATE0;
    Position pos = TextIO.readFEN(TextIO.startPosFEN);
    Move move = TextIO.stringToMove(pos, "e4");

    // Test "normal" (non-mate) score
    int score = 17;
    int ply = 3;
    TTEntry ent1 = new TTEntry();
    ent1.key = 1;
    ent1.setMove(move);
    ent1.setScore(score, ply);
    ent1.setDepth(3);
    ent1.generation = 0;
    ent1.type = TranspositionTable.TTEntry.T_EXACT;
    ent1.setHashSlot(0);
    Move tmpMove = new Move(0, 0, 0);
    ent1.getMove(tmpMove);
    assertEquals(move, tmpMove);
    assertEquals(score, ent1.getScore(ply));
    assertEquals(score, ent1.getScore(ply + 3)); // Non-mate score, should be ply-independent

    // Test positive mate score
    TTEntry ent2 = new TTEntry();
    score = mate0 - 6;
    ply = 3;
    ent2.key = 3;
    move = new Move(8, 0, Piece.BQUEEN);
    ent2.setMove(move);
    ent2.setScore(score, ply);
    ent2.setDepth(99);
    ent2.generation = 0;
    ent2.type = TranspositionTable.TTEntry.T_EXACT;
    ent2.setHashSlot(0);
    ent2.getMove(tmpMove);
    assertEquals(move, tmpMove);
    assertEquals(score, ent2.getScore(ply));
    assertEquals(score + 2, ent2.getScore(ply - 2));

    // Compare ent1 and ent2
    assertTrue(!ent1.betterThan(ent2, 0)); // More depth is good
    assertTrue(ent2.betterThan(ent1, 0));

    ent2.generation = 1;
    assertTrue(!ent2.betterThan(ent1, 0)); // ent2 has wrong generation
    assertTrue(ent2.betterThan(ent1, 1)); // ent1 has wrong generation

    ent2.generation = 0;
    ent1.setDepth(7);
    ent2.setDepth(7);
    ent1.type = TranspositionTable.TTEntry.T_GE;
    assertTrue(ent2.betterThan(ent1, 0));
    ent2.type = TranspositionTable.TTEntry.T_LE;
    assertTrue(!ent2.betterThan(ent1, 0)); // T_GE is equally good as T_LE
    assertTrue(!ent1.betterThan(ent2, 0));

    // Test negative mate score
    TTEntry ent3 = new TTEntry();
    score = -mate0 + 5;
    ply = 3;
    ent3.key = 3;
    move = new Move(8, 0, Piece.BQUEEN);
    ent3.setMove(move);
    ent3.setScore(score, ply);
    ent3.setDepth(99);
    ent3.generation = 0;
    ent3.type = TranspositionTable.TTEntry.T_EXACT;
    ent3.setHashSlot(0);
    ent3.getMove(tmpMove);
    assertEquals(move, tmpMove);
    assertEquals(score, ent3.getScore(ply));
    assertEquals(score - 2, ent3.getScore(ply - 2));
  }