test: add more tests for loadFEN

This commit is contained in:
Cozma Rares
2023-04-15 00:28:42 +03:00
parent 1f15540d6f
commit 35fac25bf2
2 changed files with 259 additions and 2 deletions
+257
View File
@@ -48,4 +48,261 @@ describe("valid FEN strings", () => {
for (let i = 0; i < 64; i++)
expect(chess.getPiece(i)).toEqual(expected.getPiece(i));
});
test("1. e4", () => {
const builder = new Chess.Builder();
builder.addPiece("a1", { color: COLOR.WHITE, type: PIECE.ROOK });
builder.addPiece("b1", { color: COLOR.WHITE, type: PIECE.KNIGHT });
builder.addPiece("c1", { color: COLOR.WHITE, type: PIECE.BISHOP });
builder.addPiece("d1", { color: COLOR.WHITE, type: PIECE.QUEEN });
builder.addPiece("e1", { color: COLOR.WHITE, type: PIECE.KING });
builder.addPiece("f1", { color: COLOR.WHITE, type: PIECE.BISHOP });
builder.addPiece("g1", { color: COLOR.WHITE, type: PIECE.KNIGHT });
builder.addPiece("h1", { color: COLOR.WHITE, type: PIECE.ROOK });
builder.addPiece("a2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("b2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("c2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("d2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("e4", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("f2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("g2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("h2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("a8", { color: COLOR.BLACK, type: PIECE.ROOK });
builder.addPiece("b8", { color: COLOR.BLACK, type: PIECE.KNIGHT });
builder.addPiece("c8", { color: COLOR.BLACK, type: PIECE.BISHOP });
builder.addPiece("d8", { color: COLOR.BLACK, type: PIECE.QUEEN });
builder.addPiece("e8", { color: COLOR.BLACK, type: PIECE.KING });
builder.addPiece("f8", { color: COLOR.BLACK, type: PIECE.BISHOP });
builder.addPiece("g8", { color: COLOR.BLACK, type: PIECE.KNIGHT });
builder.addPiece("h8", { color: COLOR.BLACK, type: PIECE.ROOK });
builder.addPiece("a7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("b7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("c7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("d7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("e7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("f7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("g7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("h7", { color: COLOR.BLACK, type: PIECE.PAWN });
const expected = builder.build();
const chess = Chess.load(
"rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"
);
for (let i = 0; i < 64; i++)
expect(chess.getPiece(i)).toEqual(expected.getPiece(i));
});
test("1. e4 2. e5", () => {
const builder = new Chess.Builder();
builder.addPiece("a1", { color: COLOR.WHITE, type: PIECE.ROOK });
builder.addPiece("b1", { color: COLOR.WHITE, type: PIECE.KNIGHT });
builder.addPiece("c1", { color: COLOR.WHITE, type: PIECE.BISHOP });
builder.addPiece("d1", { color: COLOR.WHITE, type: PIECE.QUEEN });
builder.addPiece("e1", { color: COLOR.WHITE, type: PIECE.KING });
builder.addPiece("f1", { color: COLOR.WHITE, type: PIECE.BISHOP });
builder.addPiece("g1", { color: COLOR.WHITE, type: PIECE.KNIGHT });
builder.addPiece("h1", { color: COLOR.WHITE, type: PIECE.ROOK });
builder.addPiece("a2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("b2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("c2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("d2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("e4", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("f2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("g2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("h2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("a8", { color: COLOR.BLACK, type: PIECE.ROOK });
builder.addPiece("b8", { color: COLOR.BLACK, type: PIECE.KNIGHT });
builder.addPiece("c8", { color: COLOR.BLACK, type: PIECE.BISHOP });
builder.addPiece("d8", { color: COLOR.BLACK, type: PIECE.QUEEN });
builder.addPiece("e8", { color: COLOR.BLACK, type: PIECE.KING });
builder.addPiece("f8", { color: COLOR.BLACK, type: PIECE.BISHOP });
builder.addPiece("g8", { color: COLOR.BLACK, type: PIECE.KNIGHT });
builder.addPiece("h8", { color: COLOR.BLACK, type: PIECE.ROOK });
builder.addPiece("a7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("b7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("c7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("d7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("e5", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("f7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("g7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("h7", { color: COLOR.BLACK, type: PIECE.PAWN });
const expected = builder.build();
const chess = Chess.load(
"rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2"
);
for (let i = 0; i < 64; i++)
expect(chess.getPiece(i)).toEqual(expected.getPiece(i));
});
test("1. e4 2. e5 3. ke2", () => {
const builder = new Chess.Builder();
builder.addPiece("a1", { color: COLOR.WHITE, type: PIECE.ROOK });
builder.addPiece("b1", { color: COLOR.WHITE, type: PIECE.KNIGHT });
builder.addPiece("c1", { color: COLOR.WHITE, type: PIECE.BISHOP });
builder.addPiece("d1", { color: COLOR.WHITE, type: PIECE.QUEEN });
builder.addPiece("e2", { color: COLOR.WHITE, type: PIECE.KING });
builder.addPiece("f1", { color: COLOR.WHITE, type: PIECE.BISHOP });
builder.addPiece("g1", { color: COLOR.WHITE, type: PIECE.KNIGHT });
builder.addPiece("h1", { color: COLOR.WHITE, type: PIECE.ROOK });
builder.addPiece("a2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("b2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("c2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("d2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("e4", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("f2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("g2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("h2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("a8", { color: COLOR.BLACK, type: PIECE.ROOK });
builder.addPiece("b8", { color: COLOR.BLACK, type: PIECE.KNIGHT });
builder.addPiece("c8", { color: COLOR.BLACK, type: PIECE.BISHOP });
builder.addPiece("d8", { color: COLOR.BLACK, type: PIECE.QUEEN });
builder.addPiece("e8", { color: COLOR.BLACK, type: PIECE.KING });
builder.addPiece("f8", { color: COLOR.BLACK, type: PIECE.BISHOP });
builder.addPiece("g8", { color: COLOR.BLACK, type: PIECE.KNIGHT });
builder.addPiece("h8", { color: COLOR.BLACK, type: PIECE.ROOK });
builder.addPiece("a7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("b7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("c7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("d7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("e5", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("f7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("g7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("h7", { color: COLOR.BLACK, type: PIECE.PAWN });
const expected = builder.build();
const chess = Chess.load(
"rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPPKPPP/RNBQ1BNR b kq - 1 2"
);
for (let i = 0; i < 64; i++)
expect(chess.getPiece(i)).toEqual(expected.getPiece(i));
});
test("random position 1", () => {
const builder = new Chess.Builder();
builder.addPiece("a1", { color: COLOR.WHITE, type: PIECE.ROOK });
builder.addPiece("d6", { color: COLOR.WHITE, type: PIECE.BISHOP });
builder.addPiece("g3", { color: COLOR.WHITE, type: PIECE.QUEEN });
builder.addPiece("g1", { color: COLOR.WHITE, type: PIECE.KING });
builder.addPiece("d2", { color: COLOR.WHITE, type: PIECE.ROOK });
builder.addPiece("a3", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("f2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("g2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("h2", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("a8", { color: COLOR.BLACK, type: PIECE.ROOK });
builder.addPiece("c8", { color: COLOR.BLACK, type: PIECE.BISHOP });
builder.addPiece("c4", { color: COLOR.BLACK, type: PIECE.QUEEN });
builder.addPiece("g8", { color: COLOR.BLACK, type: PIECE.KING });
builder.addPiece("e8", { color: COLOR.BLACK, type: PIECE.ROOK });
builder.addPiece("a7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("b7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("e6", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("f6", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("g7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("h7", { color: COLOR.BLACK, type: PIECE.PAWN });
const expected = builder.build();
const chess = Chess.load(
"r1b1r1k1/pp4pp/3Bpp2/8/2q5/P5Q1/3R1PPP/R5K1 b - - 0 19"
);
for (let i = 0; i < 64; i++)
expect(chess.getPiece(i)).toEqual(expected.getPiece(i));
});
test("random position 2", () => {
const builder = new Chess.Builder();
builder.addPiece("e1", { color: COLOR.WHITE, type: PIECE.ROOK });
builder.addPiece("f5", { color: COLOR.WHITE, type: PIECE.BISHOP });
builder.addPiece("g3", { color: COLOR.WHITE, type: PIECE.KING });
builder.addPiece("a4", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("b4", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("h2", { color: COLOR.BLACK, type: PIECE.ROOK });
builder.addPiece("b8", { color: COLOR.BLACK, type: PIECE.KING });
builder.addPiece("a6", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("b7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("c7", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("e2", { color: COLOR.BLACK, type: PIECE.PAWN });
builder.addPiece("h5", { color: COLOR.BLACK, type: PIECE.PAWN });
const expected = builder.build();
const chess = Chess.load("1k6/1pp5/p7/5B1p/PP6/6K1/4p2r/4R3 b - - 3 43");
for (let i = 0; i < 64; i++)
expect(chess.getPiece(i)).toEqual(expected.getPiece(i));
});
test("random position 3", () => {
const builder = new Chess.Builder();
builder.addPiece("f6", { color: COLOR.WHITE, type: PIECE.QUEEN });
builder.addPiece("g1", { color: COLOR.WHITE, type: PIECE.KING });
builder.addPiece("f4", { color: COLOR.WHITE, type: PIECE.PAWN });
builder.addPiece("c6", { color: COLOR.BLACK, type: PIECE.KING });
builder.addPiece("b2", { color: COLOR.BLACK, type: PIECE.PAWN });
const expected = builder.build();
const chess = Chess.load("8/8/2k2Q2/8/5P2/8/1p6/6K1 b - - 1 48");
for (let i = 0; i < 64; i++)
expect(chess.getPiece(i)).toEqual(expected.getPiece(i));
});
});
describe("invalid FEN strings", () => {
test("string doesn't contain 6 fields", () => {
expect(() => Chess.load("8/8/2k2Q2/8/5P2/8/1p6/6K1 b - 1 48")).toThrowError(
/^Invalid FEN - string must contain 6 space delimited fields$/
);
});
test("missing white king", () => {
expect(() => Chess.load("8/8/2k2Q2/8/5P2/8/1p6/8 b - - 1 48")).toThrowError(
/^Invalid FEN - board position is missing white king$/
);
});
test("invalid turn", () => {
expect(() =>
Chess.load("1k6/1pp5/p7/5B1p/PP6/6K1/4p2r/4R3 a - - 3 43")
).toThrowError(/^Invalid FEN - invalid side to move$/);
});
test("invalid castling rights", () => {
expect(() =>
Chess.load("1k6/1pp5/p7/5B1p/PP6/6K1/4p2r/4R3 b abc - 3 43")
).toThrowError(/^Invalid FEN - string contains invalid castling rights$/);
});
});
@@ -12,7 +12,7 @@ describe("valid FEN strings", () => {
).toBe(undefined);
});
test("2. e5", () => {
test("1. e4 2. e5", () => {
expect(
validateFEN(
"rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2"
@@ -20,7 +20,7 @@ describe("valid FEN strings", () => {
).toBe(undefined);
});
test("3. ke2", () => {
test("1. e4 2. e5 3. ke2", () => {
expect(
validateFEN("rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPPKPPP/RNBQ1BNR b kq - 1 2")
).toBe(undefined);