feat(engine): capture-flags modifier descriptor
This commit is contained in:
parent
761adfb699
commit
ff8b8d9bb0
1 changed files with 103 additions and 0 deletions
103
packages/chess/src/modifiers/descriptors/capture-flags.test.ts
Normal file
103
packages/chess/src/modifiers/descriptors/capture-flags.test.ts
Normal file
|
|
@ -0,0 +1,103 @@
|
||||||
|
import { describe, it, expect } from "vitest";
|
||||||
|
import { Session } from "@paratype/rete";
|
||||||
|
import { MODIFIER_REGISTRY } from "../registry.js";
|
||||||
|
import { CaptureFlag } from "../../schema.js";
|
||||||
|
import "./capture-flags.js";
|
||||||
|
import { CAPTURE_FLAGS_DESCRIPTOR, hasCaptureFlag } from "./capture-flags.js";
|
||||||
|
|
||||||
|
describe("capture-flags descriptor — registry", () => {
|
||||||
|
it("registers in MODIFIER_REGISTRY under key 'capture-flags'", () => {
|
||||||
|
expect(MODIFIER_REGISTRY.has("capture-flags")).toBe(true);
|
||||||
|
expect(MODIFIER_REGISTRY.get("capture-flags")).toBe(CAPTURE_FLAGS_DESCRIPTOR);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("capture-flags descriptor — apply()", () => {
|
||||||
|
it("seeds CaptureFlags fact on piece entity in session", () => {
|
||||||
|
const session = new Session();
|
||||||
|
const pieceId = session.nextId();
|
||||||
|
session.insert(pieceId, "PieceType", "pawn");
|
||||||
|
|
||||||
|
CAPTURE_FLAGS_DESCRIPTOR.apply(session, pieceId, CaptureFlag.CANNOT_BE_CAPTURED);
|
||||||
|
|
||||||
|
expect(session.contains(pieceId, "CaptureFlags")).toBe(true);
|
||||||
|
expect(session.get(pieceId, "CaptureFlags")).toBe(CaptureFlag.CANNOT_BE_CAPTURED);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("capture-flags descriptor — describe()", () => {
|
||||||
|
it("returns 'no flags' for 0", () => {
|
||||||
|
expect(CAPTURE_FLAGS_DESCRIPTOR.describe(0)).toBe("no flags");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("describes combined CAN_CAPTURE_OWN | CANNOT_BE_CAPTURED flags", () => {
|
||||||
|
const combined = CaptureFlag.CAN_CAPTURE_OWN | CaptureFlag.CANNOT_BE_CAPTURED;
|
||||||
|
expect(CAPTURE_FLAGS_DESCRIPTOR.describe(combined)).toBe("can-capture-own, cannot-be-captured");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("describes all three flags", () => {
|
||||||
|
const allFlags = CaptureFlag.CAN_CAPTURE_OWN | CaptureFlag.CANNOT_BE_CAPTURED | CaptureFlag.EN_PASSANT;
|
||||||
|
expect(CAPTURE_FLAGS_DESCRIPTOR.describe(allFlags)).toBe(
|
||||||
|
"can-capture-own, cannot-be-captured, en-passant",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("describes a single flag", () => {
|
||||||
|
expect(CAPTURE_FLAGS_DESCRIPTOR.describe(CaptureFlag.EN_PASSANT)).toBe("en-passant");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("capture-flags descriptor — hasCaptureFlag()", () => {
|
||||||
|
it("returns true when the flag is set", () => {
|
||||||
|
const session = new Session();
|
||||||
|
const pieceId = session.nextId();
|
||||||
|
CAPTURE_FLAGS_DESCRIPTOR.apply(
|
||||||
|
session,
|
||||||
|
pieceId,
|
||||||
|
CaptureFlag.CAN_CAPTURE_OWN | CaptureFlag.CANNOT_BE_CAPTURED,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(hasCaptureFlag(session, pieceId, CaptureFlag.CANNOT_BE_CAPTURED)).toBe(true);
|
||||||
|
expect(hasCaptureFlag(session, pieceId, CaptureFlag.CAN_CAPTURE_OWN)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns false when the flag is not set", () => {
|
||||||
|
const session = new Session();
|
||||||
|
const pieceId = session.nextId();
|
||||||
|
CAPTURE_FLAGS_DESCRIPTOR.apply(session, pieceId, CaptureFlag.CAN_CAPTURE_OWN);
|
||||||
|
|
||||||
|
expect(hasCaptureFlag(session, pieceId, CaptureFlag.EN_PASSANT)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns false when CaptureFlags fact is absent", () => {
|
||||||
|
const session = new Session();
|
||||||
|
const pieceId = session.nextId();
|
||||||
|
|
||||||
|
expect(hasCaptureFlag(session, pieceId, CaptureFlag.CANNOT_BE_CAPTURED)).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("capture-flags descriptor — valueSchema", () => {
|
||||||
|
const schema = CAPTURE_FLAGS_DESCRIPTOR.valueSchema;
|
||||||
|
|
||||||
|
it("accepts 0 (no flags)", () => {
|
||||||
|
expect(() => schema.parse(0)).not.toThrow();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("accepts MAX_FLAGS (all flags OR'd together = 7)", () => {
|
||||||
|
const maxFlags = CaptureFlag.CAN_CAPTURE_OWN | CaptureFlag.CANNOT_BE_CAPTURED | CaptureFlag.EN_PASSANT;
|
||||||
|
expect(() => schema.parse(maxFlags)).not.toThrow();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("rejects -1 (below min)", () => {
|
||||||
|
expect(() => schema.parse(-1)).toThrow();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("rejects 8 (above MAX_FLAGS = 7)", () => {
|
||||||
|
expect(() => schema.parse(8)).toThrow();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("rejects non-integer values", () => {
|
||||||
|
expect(() => schema.parse(1.5)).toThrow();
|
||||||
|
});
|
||||||
|
});
|
||||||
Loading…
Add table
Add a link
Reference in a new issue