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); }
public function testInCheck() { $chess = new ChessPublicator(); $chess->clear(); $chess->put(['type' => Chess::KING, 'color' => Chess::WHITE], 'e7'); $chess->put(['type' => Chess::QUEEN, 'color' => Chess::BLACK], 'e4'); $this->assertSame($chess->turn(), Chess::WHITE); $this->assertSame($chess->inCheck(), true); $chess->remove('e7'); $chess->put(['type' => Chess::KING, 'color' => Chess::WHITE], 'f7'); $this->assertSame($chess->inCheck(), false); }