tests/constraints2.test.js
- import { describe, it, expect, vi } from "vitest";
- import { FIXTURES } from "./api.js";
- const { buildChordModel } = FIXTURES;
- describe("modelChords", () => {
-
- it("emits a structurally complete MZN with F4, H20 and cost_matrix; falls back to the graph tonic on opposite-mode tonic input", () => {
- const out = buildChordModel({ bars: 3 });
- expect(out).toContain("int: n_nodes = 8;");
- expect(out).toContain("int: path_length = 3;");
- expect(out).toContain("constraint path[1] = start_node;");
- expect(out).toContain("constraint path[path_length] = end_node;");
- expect(out).toContain("solve minimize total_cost;");
- expect(buildChordModel({ start_chord: "i", end_chord: "i" })).toContain(
- "int: start_node = 1;",
- );
- expect(
- buildChordModel({ mode: "minor", start_chord: "I", end_chord: "I" }),
- ).toContain("int: start_node = 1;");
- expect(buildChordModel({ bars: 2 })).toContain("solve satisfy;");
- });
-
- it("emits cost_matrix when creativity > 0; grows n_nodes when a preset adds chromatic nodes", () => {
- vi.spyOn(Math, "random").mockReturnValue(0.5);
- const noPreset = buildChordModel({ creativity: 0.5 });
- expect(noPreset).toContain("cost_matrix");
- expect(noPreset).toContain("int: n_nodes = 8;");
- const preset = {
- major: { chromatic: ["bII"], edges: { "I->bII": 20 } },
- };
- const withPreset = buildChordModel({ creativity: 0.5, preset });
- expect(withPreset).toContain("int: n_nodes = 9;");
- expect(withPreset).toContain("cost_matrix");
- Math.random.mockRestore();
- });
- });