Example #1
0
 public function testUndoMoveAndCheckHistory()
 {
     $chess = new ChessPublicator();
     $chess->clear();
     $chess->put(['type' => Chess::KING, 'color' => Chess::WHITE], 'a1');
     $chess->put(['type' => Chess::KING, 'color' => Chess::BLACK], 'h1');
     $chess->put(['type' => Chess::PAWN, 'color' => Chess::WHITE], 'a7');
     $fenStart = $chess->fen();
     // normal move
     $chess->load($fenStart);
     $move = ChessPublicator::buildMovePublic($chess->turn(), $chess->getBoard(), Chess::SQUARES['a7'], Chess::SQUARES['a8'], Chess::BITS['PROMOTION'], Chess::QUEEN);
     $chess->makeMovePublic($move);
     $chess->undoMovePublic();
     $this->assertSame($chess->fen(), $fenStart);
     // big pawn
     $chess->load($fenStart);
     $chess->put(['type' => Chess::PAWN, 'color' => Chess::WHITE], 'd2');
     $fenStart = $chess->fen();
     $move = ChessPublicator::buildMovePublic($chess->turn(), $chess->getBoard(), Chess::SQUARES['d2'], Chess::SQUARES['d4'], Chess::BITS['BIG_PAWN'], Chess::QUEEN);
     $chess->makeMovePublic($move);
     $chess->undoMovePublic();
     $this->assertSame($chess->fen(), $fenStart);
     // capture
     $chess->load($fenStart);
     $chess->put(['type' => Chess::PAWN, 'color' => Chess::BLACK], 'e5');
     $chess->put(['type' => Chess::PAWN, 'color' => Chess::WHITE], 'd4');
     $fenStart = $chess->fen();
     $move = ChessPublicator::buildMovePublic($chess->turn(), $chess->getBoard(), Chess::SQUARES['d4'], Chess::SQUARES['e5'], Chess::BITS['CAPTURE'], Chess::QUEEN);
     $chess->makeMovePublic($move);
     $chess->undoMovePublic();
     $this->assertSame($chess->fen(), $fenStart);
     // en passant
     $chess->load($fenStart);
     $chess->put(['type' => Chess::PAWN, 'color' => Chess::BLACK], 'g4');
     $chess->put(['type' => Chess::PAWN, 'color' => Chess::WHITE], 'h2');
     $fenTmp = $chess->fen();
     $move = ChessPublicator::buildMovePublic($chess->turn(), $chess->getBoard(), Chess::SQUARES['h2'], Chess::SQUARES['h4'], Chess::BITS['NORMAL']);
     $chess->makeMovePublic($move);
     $fenTmp1 = $chess->fen();
     $move = ChessPublicator::buildMovePublic($chess->turn(), $chess->getBoard(), Chess::SQUARES['g4'], Chess::SQUARES['h3'], Chess::BITS['EP_CAPTURE'], Chess::QUEEN);
     $chess->makeMovePublic($move);
     $chess->undoMovePublic();
     $this->assertSame($chess->fen(), $fenTmp1);
     $chess->undoMovePublic();
     $this->assertSame($chess->fen(), $fenTmp);
     $chess->remove('g4');
     $chess->remove('h2');
     $this->assertSame($chess->fen(), $fenStart);
     // castling king side
     $fenTmp = 'r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R w KQkq - 4 4';
     $chess->load($fenTmp);
     $move = ChessPublicator::buildMovePublic($chess->turn(), $chess->getBoard(), Chess::SQUARES['e1'], Chess::SQUARES['g1'], Chess::BITS['KSIDE_CASTLE']);
     $chess->makeMovePublic($move);
     $this->assertSame($chess->fen(), 'r1bqkb1r/pppp1ppp/2n2n2/1B2p3/4P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - 5 4');
     $chess->undoMovePublic();
     $this->assertSame($chess->fen(), $fenTmp);
     $chess->load($fenStart);
     $this->assertSame($chess->fen(), $fenStart);
     // castling queen side
     $fenTmp = 'r3kb1r/pppq1ppp/2np1n2/1B2p2b/4P3/3P1N1P/PPPB1PP1/RN1QR1K1 b kq - 2 8';
     $chess->load($fenTmp);
     $move = ChessPublicator::buildMovePublic($chess->turn(), $chess->getBoard(), Chess::SQUARES['e8'], Chess::SQUARES['c8'], Chess::BITS['QSIDE_CASTLE']);
     $chess->makeMovePublic($move);
     $this->assertSame($chess->fen(), '2kr1b1r/pppq1ppp/2np1n2/1B2p2b/4P3/3P1N1P/PPPB1PP1/RN1QR1K1 w - - 3 9');
     $chess->undoMovePublic();
     $this->assertSame($chess->fen(), $fenTmp);
     $chess->load($fenStart);
     $this->assertSame($chess->fen(), $fenStart);
 }