import test from "node:test"; import assert from "node:assert/strict"; import { configToYaml, normalizeConfig, parseConfigYaml, validateConfig } from "../src/config/yaml.ts"; import { defaultConfig } from "../src/config/schema.ts"; import { PRESETS } from "../src/config/presets.ts"; import { fixture } from "./helpers.ts"; test("presets parse without issues", () => { for (const p of PRESETS) { const { config, issues } = parseConfigYaml(p.yaml); assert.ok(config, p.id); assert.deepEqual(issues, [], `${p.id}: ${JSON.stringify(issues)}`); } }); test("round trip through YAML preserves the configuration", () => { const { config } = parseConfigYaml(PRESETS[2].yaml); const back = parseConfigYaml(configToYaml(config!)); assert.deepEqual(back.config, config); assert.deepEqual(back.issues, []); }); test("Python fixture config normalizes to itself", () => { const { config, issues } = normalizeConfig(fixture.config); assert.deepEqual(issues, []); assert.deepEqual(config, fixture.config); }); test("partial documents take defaults", () => { const { config, issues } = parseConfigYaml("hits:\n - time: 0.1\n exciter: {kind: stick}\nnumerics:\n duration: 0.5\n"); assert.deepEqual(issues, []); assert.equal(config!.numerics.duration, 0.5); assert.equal(config!.material.E, 1.1e11); assert.equal(config!.hits[0].exciter.kind, "stick"); assert.equal(config!.hits[0].time, 0.1); }); test("unknown keys, wrong types and bad values are reported", () => { let r = parseConfigYaml("material:\n youngs: 1\n E: abc\n"); assert.ok(r.issues.some((i) => i.path === "material.youngs" && i.message === "unknown field")); assert.ok(r.issues.some((i) => i.path === "material.E")); r = parseConfigYaml("hits:\n - exciter: {kind: hammer}\n"); assert.ok(r.issues.some((i) => i.path === "hits[0].exciter.kind")); r = parseConfigYaml("bogus: 1\n"); assert.ok(r.issues.some((i) => i.path === "bogus")); r = parseConfigYaml("material: [1, 2\n"); assert.equal(r.config, null); const cfg = defaultConfig(); cfg.hits[0].r = 0.23; assert.ok(validateConfig(cfg).some((i) => i.path === "hits[0].r")); cfg.hits = []; assert.ok(validateConfig(cfg).some((i) => i.path === "hits")); });