syntaxai/tdd.md · main · src / c14_sama_profile.test.ts

c14_sama_profile.test.ts 252 lines · 7030 bytes raw
import { describe, test, expect } from "bun:test";
import { parseProfileToml } from "./c14_sama_profile.ts";

describe("c14_sama_profile — parseProfileToml", () => {
  test("parses the minimum required top-level keys", () => {
    const p = parseProfileToml(`
sama_version = "2.0"
profile = "tdd-md"

[layers.0]
prefixes = ["c31_"]

[layers.1]
prefixes = ["c32_"]

[layers.2]
prefixes = ["c13_"]

[layers.3]
prefixes = ["c11_"]
`);
    expect(p.samaVersion).toBe("2.0");
    expect(p.profile).toBe("tdd-md");
  });

  test("a flat-prefix layer maps to a single synthetic sublayer named 'default'", () => {
    const p = parseProfileToml(`
sama_version = "2.0"
profile = "x"

[layers.0]
prefixes = ["c31_"]

[layers.1]
prefixes = []

[layers.2]
prefixes = []

[layers.3]
prefixes = []
`);
    expect(p.layers[0].sublayers).toHaveLength(1);
    expect(p.layers[0].sublayers[0]).toEqual({ name: "default", prefix: "c31_", index: 0 });
  });

  test("a subdivided layer carries sublayer index = position in the array", () => {
    const p = parseProfileToml(`
sama_version = "2.0"
profile = "x"

[layers.0]
prefixes = []

[layers.1]
sublayers = [
  { name = "logic",  prefix = "c32_" },
  { name = "render", prefix = "c51_" },
]

[layers.2]
prefixes = []

[layers.3]
prefixes = []
`);
    expect(p.layers[1].sublayers).toHaveLength(2);
    expect(p.layers[1].sublayers[0]).toEqual({ name: "logic",  prefix: "c32_", index: 0 });
    expect(p.layers[1].sublayers[1]).toEqual({ name: "render", prefix: "c51_", index: 1 });
  });

  test("comments are stripped", () => {
    const p = parseProfileToml(`
# leading comment
sama_version = "2.0"  # trailing comment
profile = "x"

[layers.0]
prefixes = ["c31_"] # another

[layers.1]
prefixes = []

[layers.2]
prefixes = []

[layers.3]
prefixes = []
`);
    expect(p.samaVersion).toBe("2.0");
    expect(p.layers[0].sublayers[0]!.prefix).toBe("c31_");
  });

  test("missing top-level keys throws a clear error", () => {
    expect(() => parseProfileToml(`profile = "x"\n[layers.0]\n[layers.1]\n[layers.2]\n[layers.3]\n`))
      .toThrow(/sama_version/);
    expect(() => parseProfileToml(`sama_version = "2.0"\n[layers.0]\n[layers.1]\n[layers.2]\n[layers.3]\n`))
      .toThrow(/profile/);
  });

  test("missing a required layer section throws a clear error", () => {
    expect(() => parseProfileToml(`
sama_version = "2.0"
profile = "x"

[layers.0]
prefixes = []

[layers.1]
prefixes = []

[layers.2]
prefixes = []
`)).toThrow(/layers\.3/);
  });

  describe("v2.1 dialect flags (§6.1–6.3)", () => {
    const minimalProfile = (extra: string = ""): string => `
sama_version = "2.1"
profile = "x"
${extra}

[layers.0]
prefixes = ["a_"]

[layers.1]
prefixes = ["b_"]

[layers.2]
prefixes = ["c_"]

[layers.3]
prefixes = ["d_"]
`;

    test("absent dialect flags → ProfileSpec leaves them undefined (≡ v2.0 defaults)", () => {
      const p = parseProfileToml(minimalProfile());
      expect(p.layout).toBeUndefined();
      expect(p.tests).toBeUndefined();
      expect(p.atomicExemption).toBeUndefined();
    });

    test("layout = \"prefix\" parses to ProfileSpec.layout = \"prefix\"", () => {
      const p = parseProfileToml(minimalProfile(`layout = "prefix"`));
      expect(p.layout).toBe("prefix");
    });

    test("layout = \"directory\" parses to ProfileSpec.layout = \"directory\"", () => {
      const p = parseProfileToml(minimalProfile(`layout = "directory"`));
      expect(p.layout).toBe("directory");
    });

    test("layout with an unknown value throws a clear error referencing §6 and the allowed set", () => {
      expect(() => parseProfileToml(minimalProfile(`layout = "nonsense"`))).toThrow(
        /layout.*nonsense.*prefix.*directory.*§6/s,
      );
    });

    test("tests = \"sibling\" parses to ProfileSpec.tests = \"sibling\"", () => {
      const p = parseProfileToml(minimalProfile(`tests = "sibling"`));
      expect(p.tests).toBe("sibling");
    });

    test("tests = \"inline\" parses to ProfileSpec.tests = \"inline\"", () => {
      const p = parseProfileToml(minimalProfile(`tests = "inline"`));
      expect(p.tests).toBe("inline");
    });

    test("tests with an unknown value throws a clear error", () => {
      expect(() => parseProfileToml(minimalProfile(`tests = "elsewhere"`))).toThrow(
        /tests.*elsewhere.*sibling.*inline/s,
      );
    });

    test("atomic_exemption = \"none\" parses to ProfileSpec.atomicExemption = \"none\"", () => {
      const p = parseProfileToml(minimalProfile(`atomic_exemption = "none"`));
      expect(p.atomicExemption).toBe("none");
    });

    test("atomic_exemption = \"declarative\" parses to ProfileSpec.atomicExemption = \"declarative\"", () => {
      const p = parseProfileToml(minimalProfile(`atomic_exemption = "declarative"`));
      expect(p.atomicExemption).toBe("declarative");
    });

    test("atomic_exemption with an unknown value throws a clear error", () => {
      expect(() => parseProfileToml(minimalProfile(`atomic_exemption = "behavioural"`))).toThrow(
        /atomic_exemption.*behavioural.*none.*declarative/s,
      );
    });

    test("all three dialect flags can co-occur (the ripgrep rebuild profile shape)", () => {
      const p = parseProfileToml(minimalProfile(`
layout = "directory"
tests = "inline"
atomic_exemption = "declarative"
`));
      expect(p.layout).toBe("directory");
      expect(p.tests).toBe("inline");
      expect(p.atomicExemption).toBe("declarative");
    });

    test("dialect flags do not interfere with layer parsing", () => {
      const p = parseProfileToml(minimalProfile(`
layout = "directory"
tests = "inline"
atomic_exemption = "declarative"
`));
      expect(p.layers[0].sublayers.map((s) => s.prefix)).toEqual(["a_"]);
      expect(p.layers[1].sublayers.map((s) => s.prefix)).toEqual(["b_"]);
      expect(p.layers[2].sublayers.map((s) => s.prefix)).toEqual(["c_"]);
      expect(p.layers[3].sublayers.map((s) => s.prefix)).toEqual(["d_"]);
    });
  });

  test("parses the actual repo profile file", () => {
    // Inline copy of the real-repo profile to keep this test
    // hermetic — no filesystem read. If sama.profile.toml's shape
    // ever drifts, this test pins what the parser supports.
    const real = `
sama_version = "2.0"
profile = "tdd-md"

[layers.0]
prefixes = ["c31_"]

[layers.1]
sublayers = [
  { name = "logic",  prefix = "c32_" },
  { name = "render", prefix = "c51_" },
]

[layers.2]
sublayers = [
  { name = "data", prefix = "c13_" },
  { name = "io",   prefix = "c14_" },
]

[layers.3]
sublayers = [
  { name = "handlers", prefix = "c21_" },
  { name = "server",   prefix = "c11_" },
]
`;
    const p = parseProfileToml(real);
    expect(p.profile).toBe("tdd-md");
    expect(p.layers[0].sublayers.map((s) => s.prefix)).toEqual(["c31_"]);
    expect(p.layers[1].sublayers.map((s) => s.name)).toEqual(["logic", "render"]);
    expect(p.layers[2].sublayers.map((s) => s.name)).toEqual(["data", "io"]);
    expect(p.layers[3].sublayers.map((s) => s.name)).toEqual(["handlers", "server"]);
  });
});