chess-base
Version:
chess board logic
240 lines (232 loc) • 7.26 kB
JavaScript
import { isEqual } from "../src/utils";
import { Chess } from "../src/chess";
const MOVES = [
{
TITLE: "PAWN PASSANT CAPTURE",
FEN: "rnbqkbnr/ppp2ppp/8/2Ppp3/3QP3/8/PP3PPP/RNB1KBNR w KQkq d6 0 1",
SQUARE_FROM: "c5",
SQUARE_TO: "d6",
RESULT: { type: "p", color: "b" },
RESULT_FEN: "rnbqkbnr/ppp2ppp/3P4/4p3/3QP3/8/PP3PPP/RNB1KBNR b KQkq - 0 1"
},
{
TITLE: "PAWN WHITE ADVANCE",
FEN: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
SQUARE_FROM: "e2",
SQUARE_TO: "e4",
RESULT: null,
RESULT_FEN: "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"
},
{
TITLE: "QUEEN WHITE MOVE",
FEN: "rnbqkbnr/ppp2ppp/8/3pp3/2PQP3/8/PP3PPP/RNB1KBNR w KQkq - 0 1",
SQUARE_FROM: "d4",
SQUARE_TO: "d3",
RESULT: null,
RESULT_FEN: "rnbqkbnr/ppp2ppp/8/3pp3/2P1P3/3Q4/PP3PPP/RNB1KBNR b KQkq - 1 1"
},
{
TITLE: "QUEEN BLACK MOVE",
FEN: "rnbqkbnr/ppp2ppp/8/3pp3/2PQP3/8/PP3PPP/RNB1KBNR b KQkq - 0 1",
SQUARE_FROM: "d8",
SQUARE_TO: "d7",
RESULT: null,
RESULT_FEN: "rnb1kbnr/pppq1ppp/8/3pp3/2PQP3/8/PP3PPP/RNB1KBNR w KQkq - 1 2"
},
{
TITLE: "PAWN PROMOTION",
FEN: "r1bqkbnr/pPp2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R w KQkq - 2 4",
SQUARE_FROM: "b7",
SQUARE_TO: "b8",
PROMOTION_TYPE: "q",
RESULT: null,
RESULT_FEN:
"rQbqkbnr/p1p2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R b KQkq - 0 4"
},
{
TITLE: "PAWN PROMOTION CAPTURE",
FEN: "r1bqkbnr/pPp2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R w KQkq - 2 4",
SQUARE_FROM: "b7",
SQUARE_TO: "a8",
PROMOTION_TYPE: "q",
RESULT: { type: "r", color: "b" },
RESULT_FEN:
"Q1bqkbnr/p1p2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R b KQkq - 0 4"
}
];
const MOVES_SAN = [
{
TITLE: "PAWN WHITE ADVANCE",
FEN: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
SQUARE_FROM: "e4",
RESULT: null,
RESULT_FEN: "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"
},
{
TITLE: "PAWN BLACK ADVANCE",
FEN: "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",
SQUARE_FROM: "e5",
RESULT: null,
RESULT_FEN: "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2"
},
{
TITLE: "MOVE KNIGHT",
FEN: "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2",
SQUARE_FROM: "Nf3",
RESULT: null,
RESULT_FEN: "rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2"
},
{
TITLE: "MOVE BISHOP AMBIGUOUS COLUMN D",
FEN: "3r3r/b7/3b4/R7/4Q2Q/8/8/R6Q b KQkq - 0 1",
SQUARE_FROM: "Bdb8",
RESULT: null,
RESULT_FEN: "1b1r3r/b7/8/R7/4Q2Q/8/8/R6Q w KQkq - 1 2"
},
{
TITLE: "MOVE BISHOP AMBIGUOUS COLUMN A",
FEN: "3r3r/b7/3b4/R7/4Q2Q/8/8/R6Q b KQkq - 0 1",
SQUARE_FROM: "Bab8",
RESULT: null,
RESULT_FEN: "1b1r3r/8/3b4/R7/4Q2Q/8/8/R6Q w KQkq - 1 2"
},
{
TITLE: "MOVE ROOK BLACK AMBIGUOUS COLUMN D",
FEN: "3r3r/b7/3b4/R7/4Q2Q/8/8/R6Q b KQkq - 0 1",
SQUARE_FROM: "Rdf8",
RESULT: null,
RESULT_FEN: "5r1r/b7/3b4/R7/4Q2Q/8/8/R6Q w KQkq - 1 2"
},
{
TITLE: "MOVE ROOK WHITE AMBIGUOUS ROW 1",
FEN: "3r3r/b7/3b4/R7/4Q2Q/8/8/R6Q w KQkq - 0 1",
SQUARE_FROM: "R1a3",
RESULT: null,
RESULT_FEN: "3r3r/b7/3b4/R7/4Q2Q/R7/8/7Q b Kkq - 1 1"
},
{
TITLE: "MOVE QUEEN WHITE AMBIGUOUS COLUMN h ROW 1",
FEN: "3r3r/b7/3b4/R7/4Q2Q/8/8/R6Q w KQkq - 0 1",
SQUARE_FROM: "Qh4e1",
RESULT: null,
RESULT_FEN: "3r3r/b7/3b4/R7/4Q3/8/8/R3Q2Q b KQkq - 1 1"
},
{
TITLE: "KING CASTLING VALID",
FEN: "r1bqkbnr/pPp2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R w KQkq - 2 4",
SQUARE_FROM: "O-O",
RESULT_FEN:
"r1bqkbnr/pPp2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQ1RK1 b kq - 3 4"
},
{
TITLE: "KING CASTLING VALID HALF",
FEN: "rnbq1rk1/p3bpp1/1p2pn1p/2ppN3/3P3B/2N1P3/PPP1BPPP/R2QK2R w KQ c6 0 9",
SQUARE_FROM: "e1g1",
RESULT_FEN:
"rnbq1rk1/p3bpp1/1p2pn1p/2ppN3/3P3B/2N1P3/PPP1BPPP/R2Q1RK1 b - - 1 9"
},
{
TITLE: "PAWN PASSANT CAPTURE",
FEN: "rnbqkbnr/ppp2ppp/8/2Ppp3/3QP3/8/PP3PPP/RNB1KBNR w KQkq d6 0 1",
SQUARE_FROM: "cxd6",
RESULT: { type: "p", color: "b" },
RESULT_FEN: "rnbqkbnr/ppp2ppp/3P4/4p3/3QP3/8/PP3PPP/RNB1KBNR b KQkq - 0 1"
},
{
TITLE: "PAWN PROMOTION",
FEN: "r1bqkbnr/pPp2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R w KQkq - 2 4",
SQUARE_FROM: "b8Q",
RESULT: null,
RESULT_FEN:
"rQbqkbnr/p1p2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R b KQkq - 0 4"
},
{
TITLE: "PAWN PROMOTION CAPTURE",
FEN: "r1bqkbnr/pPp2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R w KQkq - 2 4",
SQUARE_FROM: "bxa8Q",
RESULT: { type: "r", color: "b" },
RESULT_FEN:
"Q1bqkbnr/p1p2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R b KQkq - 0 4"
}
];
const MOVES_INVALID = [
{
TITLE: "PAWN PASSANT CAPTURE INVALID",
FEN: "rnbqkbnr/ppp2ppp/8/2Ppp3/3QP3/8/PP3PPP/RNB1KBNR w KQkq - 0 1",
SQUARE_FROM: "c5",
SQUARE_TO: "d6",
TRHOW: "move invalid"
},
{
TITLE: "KNIGTH MOVE INVALID",
FEN: "rnbqkb1r/ppp2ppp/8/2Ppn3/3PQ3/8/PP3PPP/RNB1KBNR b KQkq - 0 1",
SQUARE_FROM: "e5",
SQUARE_TO: "d3",
TRHOW: "target king"
},
{
TITLE: "PAWN PROMOTION PROMOTION TYPE INVALID",
FEN: "r1bqkbnr/pPp2ppp/2np4/4p3/2B5/4PN2/PPPP1PPP/RNBQK2R w KQkq - 2 4",
SQUARE_FROM: "b7",
SQUARE_TO: "b8",
PROMOTION_TYPE: "p",
TRHOW: "promotion type required"
}
];
const MOVES_INVALID_SAN = [
{
TITLE: "MOVE BISHOP AMBIGUOUS COLUMN A",
FEN: "3r3r/b7/3b4/R7/4Q2Q/8/8/R6Q b KQkq - 0 1",
SQUARE_FROM: "Bb8",
TRHOW: "Invalid SAN, amibiguous piece: d6,a7"
}
];
describe("Move", function() {
[...MOVES, ...MOVES_SAN].forEach(movement => {
it(movement.TITLE, function() {
testMove(new Chess(movement.FEN), movement);
});
});
[...MOVES_INVALID, ...MOVES_INVALID_SAN].forEach(movement => {
it(movement.TITLE, function() {
const chess = new Chess(movement.FEN);
try {
chess.move(
movement.SQUARE_FROM,
movement.SQUARE_TO,
movement.PROMOTION_TYPE
);
} catch (e) {
expect(e === movement.TRHOW).toBeTruthy(
["", `expect: ${movement.TRHOW}`, `actual: ${e}`, ""].join("\n")
);
}
expect(chess.toFen() === movement.FEN).toBeTruthy();
});
});
});
function testMove(chess, movement) {
const result = chess.move(
movement.SQUARE_FROM,
movement.SQUARE_TO,
movement.PROMOTION_TYPE
);
const fenResult = chess.toFen();
expect(
isEqual(result, movement.RESULT) && movement.RESULT_FEN === fenResult
).toBeTruthy(
[
"",
`${chess.toAscii(true)}`,
`${movement.TITLE} - FROM: ${movement.SQUARE_FROM}, TO: ${
movement.SQUARE_TO
}`,
`expected: ${JSON.stringify(movement.RESULT)}, current: ${JSON.stringify(
result
)}`,
`FEN expect: ${movement.RESULT_FEN}`,
`FEN result: ${fenResult}`,
""
].join("\n")
);
}