66 lines
1.7 KiB
TypeScript
66 lines
1.7 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
CLASSIC_SAMPLE,
|
|
SAMPLE_CATALOG,
|
|
SAMPLE_PUZZLES,
|
|
} from "../../src/data/samples";
|
|
import {
|
|
GENERATOR_VARIANTS,
|
|
solveExact,
|
|
solveLogically,
|
|
} from "../../src/solver";
|
|
|
|
describe("bundled original samples", () => {
|
|
const fastUniquenessSamples = SAMPLE_CATALOG.map(({ puzzle }) => puzzle);
|
|
|
|
it.each(fastUniquenessSamples)(
|
|
"ships $title as a unique puzzle",
|
|
(puzzle) => {
|
|
const result = solveExact(puzzle, { maxSolutions: 2 });
|
|
expect(result.count).toBe(1);
|
|
expect(result.truncated).toBe(false);
|
|
},
|
|
);
|
|
|
|
it("solves the generated classic with the supported logical techniques", () => {
|
|
expect(solveLogically(CLASSIC_SAMPLE).status).toBe("solved");
|
|
});
|
|
|
|
it("provides a named example for every advertised generator variant", () => {
|
|
expect(new Set(SAMPLE_CATALOG.map(({ id }) => id)).size).toBe(
|
|
SAMPLE_CATALOG.length,
|
|
);
|
|
for (const { id } of GENERATOR_VARIANTS) {
|
|
expect(SAMPLE_CATALOG.some((entry) => entry.id === id)).toBe(true);
|
|
}
|
|
});
|
|
|
|
it("also demonstrates every supported global chess/adjacency rule", () => {
|
|
const constraintTypes = new Set(
|
|
SAMPLE_PUZZLES.flatMap((puzzle) =>
|
|
(puzzle.constraints ?? []).map(({ type }) => type),
|
|
),
|
|
);
|
|
expect(constraintTypes).toEqual(
|
|
new Set([
|
|
"diagonal",
|
|
"anti-knight",
|
|
"anti-king",
|
|
"non-consecutive",
|
|
"killer-cage",
|
|
"thermo",
|
|
"arrow",
|
|
"kropki",
|
|
"xv",
|
|
"inequality",
|
|
"renban",
|
|
"palindrome",
|
|
"x-sum",
|
|
"skyscraper",
|
|
"quadruple",
|
|
"maximum",
|
|
]),
|
|
);
|
|
});
|
|
});
|