tscircuit/ti

ti tscircuit library

Version
1.0.198
License
unset
Stars
0

system-block-ui/src/rendering/local-ti-package-files.test.ts

import { describe, expect, test } from "bun:test";
import { evaluateGeneratedTsx } from "./evaluate-schematic";
import { createLocalTiPackageEvaluationFsMap } from "./local-ti-package-files";

const fixtureSources = {
  "../../../lib/subcircuits/FixtureBlock.circuit.tsx": `
import "tscircuit"
import { FixtureChip } from "../chips/FixtureChip.circuit.tsx"

export const FixtureBlock = (props: Record<string, unknown>) => (
  <subcircuit routingDisabled {...props}>
    <FixtureChip name="U1" />
  </subcircuit>
)
`,
  "../../../lib/chips/FixtureChip.circuit.tsx": `
import "tscircuit"

export const FixtureChip = (props: Record<string, unknown>) => (
  <chip
    manufacturerPartNumber="FIXTURE"
    pinLabels={{ pin1: "INPUT", pin2: "GND" }}
    {...props}
  />
)
`,
  "../../../lib/chips/UnusedChip.circuit.tsx": `
export const UnusedChip = () => null
`,
};

const fixtureDefinition = {
  componentName: "FixtureBlock",
  sourcePath: "lib/subcircuits/FixtureBlock.circuit.tsx",
};

describe("local TI package evaluation files", () => {
  test("includes selected subcircuits and their dependency closure", () => {
    const fsMap = createLocalTiPackageEvaluationFsMap(
      [fixtureDefinition],
      fixtureSources,
    );

    expect(fsMap["node_modules/@tsci/tscircuit.ti/index.ts"]).toContain(
      'export { FixtureBlock } from "./lib/subcircuits/FixtureBlock.circuit.tsx"',
    );
    expect(
      fsMap[
        "node_modules/@tsci/tscircuit.ti/lib/subcircuits/FixtureBlock.circuit.tsx"
      ],
    ).toContain("FixtureChip");
    expect(
      fsMap[
        "node_modules/@tsci/tscircuit.ti/lib/chips/FixtureChip.circuit.tsx"
      ],
    ).toContain('manufacturerPartNumber="FIXTURE"');
    expect(
      fsMap["node_modules/@tsci/tscircuit.ti/lib/chips/UnusedChip.circuit.tsx"],
    ).toBeUndefined();
  });

  test("evaluates a package export which is not published", async () => {
    const fsMap = createLocalTiPackageEvaluationFsMap(
      [fixtureDefinition],
      fixtureSources,
    );
    const evaluated = await evaluateGeneratedTsx(
      `
import { FixtureBlock } from "@tsci/tscircuit.ti"
import "tscircuit"

export default () => (
  <board routingDisabled>
    <schematicsheet name="fixture" displayName="Fixture" sheetIndex={0} />
    <FixtureBlock name="fixture" schSheetName="fixture" />
  </board>
)
`,
      {
        fsMap,
        mainComponentPath: "fixture-entrypoint.tsx",
        timeoutMs: 15_000,
      },
    );

    expect(evaluated.sheets.map(({ name }) => name)).toEqual(["fixture"]);
    expect(
      evaluated.circuitJson.some(
        (element) =>
          element.type === "source_component" && element.name === "U1",
      ),
    ).toBe(true);
    expect(
      evaluated.circuitJson.some((element) => element.type === "pcb_component"),
    ).toBe(true);
    expect(
      evaluated.circuitJson.some(
        (element) => element.type === "pcb_missing_footprint_error",
      ),
    ).toBe(true);
  });

  test("fails clearly when a selected local source is unavailable", () => {
    expect(() =>
      createLocalTiPackageEvaluationFsMap(
        [
          {
            componentName: "MissingBlock",
            sourcePath: "lib/subcircuits/MissingBlock.circuit.tsx",
          },
        ],
        fixtureSources,
      ),
    ).toThrow(
      "Local TI source is unavailable: lib/subcircuits/MissingBlock.circuit.tsx",
    );
  });
});