@metamesh/testkit 0.0.0-bootstrap.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +225 -0
  2. package/README.md +112 -5
  3. package/dist/assertions.d.ts +20 -0
  4. package/dist/assertions.d.ts.map +1 -0
  5. package/dist/assertions.js +103 -0
  6. package/dist/assertions.js.map +1 -0
  7. package/dist/docs/guides/package.md +113 -0
  8. package/dist/docs/manifest.json +259 -0
  9. package/dist/docs/reference/font-fixtures/LoadedFontFixtures.md +12 -0
  10. package/dist/docs/reference/font-fixtures/loadFontFixtureServices.md +10 -0
  11. package/dist/docs/reference/font-fixtures/loadFontFixtures.md +10 -0
  12. package/dist/docs/reference/fonts/FontTestFixture.md +17 -0
  13. package/dist/docs/reference/fonts/prepareFontTestServices.md +10 -0
  14. package/dist/docs/reference/index/GeneratorTestExecution.md +18 -0
  15. package/dist/docs/reference/index/GeneratorTestRunner.md +18 -0
  16. package/dist/docs/reference/index/GeneratorTestRunnerOptions.md +14 -0
  17. package/dist/docs/reference/index/MeshMeasurementExpectation.md +19 -0
  18. package/dist/docs/reference/index/MeshMeasurementTolerances.md +17 -0
  19. package/dist/docs/reference/index/createGeneratorTestRunner.md +12 -0
  20. package/dist/docs/reference/index/expectMeshMeasurements.md +14 -0
  21. package/dist/docs/reference/index/expectSerializableDefinition.md +10 -0
  22. package/dist/docs/reference/index/expectValidDefaults.md +10 -0
  23. package/dist/docs/reference/index/expectValidParts.md +19 -0
  24. package/dist/docs/reference/index/expectValidPresets.md +10 -0
  25. package/dist/docs/reference/index/getTestEngine.md +13 -0
  26. package/dist/engine.d.ts +7 -0
  27. package/dist/engine.d.ts.map +1 -0
  28. package/dist/engine.js +11 -0
  29. package/dist/engine.js.map +1 -0
  30. package/dist/font-fixtures.d.ts +10 -0
  31. package/dist/font-fixtures.d.ts.map +1 -0
  32. package/dist/font-fixtures.js +75 -0
  33. package/dist/font-fixtures.js.map +1 -0
  34. package/dist/fonts.d.ts +13 -0
  35. package/dist/fonts.d.ts.map +1 -0
  36. package/dist/fonts.js +34 -0
  37. package/dist/fonts.js.map +1 -0
  38. package/dist/index.d.ts +7 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +5 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/measurements.d.ts +28 -0
  43. package/dist/measurements.d.ts.map +1 -0
  44. package/dist/measurements.js +66 -0
  45. package/dist/measurements.js.map +1 -0
  46. package/dist/runner.d.ts +34 -0
  47. package/dist/runner.d.ts.map +1 -0
  48. package/dist/runner.js +118 -0
  49. package/dist/runner.js.map +1 -0
  50. package/package.json +43 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-fixtures.js","sourceRoot":"","sources":["../src/font-fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type FontSelection, type GeneratorServices } from "@metamesh/generator-sdk";
2
+ /** A checked-in immutable font fixture; no catalog or network is used by the test harness. */
3
+ export interface FontTestFixture {
4
+ /** Font face, weight and SHA-256 revision to resolve from these bytes. */
5
+ readonly selection: FontSelection;
6
+ /** Complete checked-in font file; its digest must match selection.revision. */
7
+ readonly bytes: Uint8Array<ArrayBuffer>;
8
+ /** Weight represented by a static face; omit for variable fonts. */
9
+ readonly staticWeight?: number;
10
+ }
11
+ /** Prepares the same synchronous text service used by Studio, from reproducible fixture bytes. */
12
+ export declare function prepareFontTestServices(fixtures: readonly FontTestFixture[]): Promise<GeneratorServices>;
13
+ //# sourceMappingURL=fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAEvB,MAAM,yBAAyB,CAAC;AAOjC,8FAA8F;AAC9F,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,oEAAoE;IACpE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,kGAAkG;AAClG,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,SAAS,eAAe,EAAE,GACnC,OAAO,CAAC,iBAAiB,CAAC,CAmC5B"}
package/dist/fonts.js ADDED
@@ -0,0 +1,34 @@
1
+ import { isFontSelection, } from "@metamesh/generator-sdk";
2
+ import { prepareVectorFont, } from "@metamesh/modeling/text";
3
+ /** Prepares the same synchronous text service used by Studio, from reproducible fixture bytes. */
4
+ export async function prepareFontTestServices(fixtures) {
5
+ const entries = await Promise.all(fixtures.map(async (fixture) => {
6
+ if (!isFontSelection(fixture.selection))
7
+ throw new TypeError("Invalid fixture font selection.");
8
+ const digest = await crypto.subtle.digest("SHA-256", fixture.bytes);
9
+ const hash = Array.from(new Uint8Array(digest), (value) => value.toString(16).padStart(2, "0")).join("");
10
+ if (hash !== fixture.selection.revision)
11
+ throw new Error("The font fixture does not match its immutable revision.");
12
+ const font = await prepareVectorFont(fixture.bytes, fixture.staticWeight === undefined ? {} : { staticWeight: fixture.staticWeight });
13
+ return { font, selection: fixture.selection };
14
+ }));
15
+ function resolve(options) {
16
+ if (!isFontSelection(options.font))
17
+ throw new Error("Invalid font selection.");
18
+ const entry = entries.find(({ selection }) => selection.revision === options.font.revision &&
19
+ selection.faceId === options.font.faceId &&
20
+ selection.weight === options.font.weight);
21
+ if (!entry)
22
+ throw new Error("This selection has no prepared font fixture.");
23
+ return entry.font;
24
+ }
25
+ return Object.freeze({
26
+ text: Object.freeze({
27
+ layout: (text, options) => resolve(options).layout(text, vectorOptions(options)),
28
+ }),
29
+ });
30
+ }
31
+ function vectorOptions({ font, ...layout }) {
32
+ return { ...layout, fontWeight: font.weight };
33
+ }
34
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,GAIhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,GAGlB,MAAM,yBAAyB,CAAC;AAYjC,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAoC;IAEpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC7B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC;YACrC,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CACxD,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CACpC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,IAAI,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,QAAQ;YACrC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAClC,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CACjF,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;IAChD,CAAC,CAAC,CACH,CAAC;IACF,SAAS,OAAO,CAAC,OAA6B;QAC5C,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CACxB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAChB,SAAS,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ;YAC5C,SAAS,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM;YACxC,SAAS,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,CAC3C,CAAC;QACF,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC5E,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;YAClB,MAAM,EAAE,CAAC,IAAY,EAAE,OAA6B,EAAE,EAAE,CACtD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;SACxD,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,EAAwB;IAC9D,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createGeneratorTestRunner } from "./runner.js";
2
+ export type { GeneratorTestExecution, GeneratorTestRunner, GeneratorTestRunnerOptions, } from "./runner.js";
3
+ export { expectSerializableDefinition, expectValidDefaults, expectValidParts, expectValidPresets, } from "./assertions.js";
4
+ export { getTestEngine } from "./engine.js";
5
+ export { expectMeshMeasurements } from "./measurements.js";
6
+ export type { MeshMeasurementExpectation, MeshMeasurementTolerances } from "./measurements.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EACV,sBAAsB,EACtB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { createGeneratorTestRunner } from "./runner.js";
2
+ export { expectSerializableDefinition, expectValidDefaults, expectValidParts, expectValidPresets, } from "./assertions.js";
3
+ export { getTestEngine } from "./engine.js";
4
+ export { expectMeshMeasurements } from "./measurements.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAMxD,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type Bounds3, type TriangleMesh, type TriangleMeshAnalysis } from "@metamesh/modeling/geometry";
2
+ /** Physical expectations for a closed mesh; omitted facts are not asserted. */
3
+ export interface MeshMeasurementExpectation {
4
+ /** Axis-aligned XYZ bounds in millimetres. */
5
+ readonly bounds?: Bounds3;
6
+ /** Oriented enclosed volume in cubic millimetres; outward winding is positive. */
7
+ readonly signedVolume?: number;
8
+ /** Sum of triangle areas in square millimetres. */
9
+ readonly surfaceArea?: number;
10
+ /** Exact number of components connected by indexed mesh edges. */
11
+ readonly connectedComponentCount?: number;
12
+ }
13
+ /** Absolute nonnegative comparison allowances; each omitted tolerance defaults to zero. */
14
+ export interface MeshMeasurementTolerances {
15
+ /** Allowance for each minimum/maximum XYZ coordinate in millimetres. */
16
+ readonly bounds?: number;
17
+ /** Allowance for signed volume in cubic millimetres. */
18
+ readonly signedVolume?: number;
19
+ /** Allowance for surface area in square millimetres. */
20
+ readonly surfaceArea?: number;
21
+ }
22
+ /**
23
+ * Analyzes current buffers, requires closed oriented edge topology, and checks selected physical
24
+ * facts with explicit absolute tolerances. Returns fresh measurements without initializing an
25
+ * engine. These facts do not prove geometric equivalence or absence of self-intersections.
26
+ */
27
+ export declare function expectMeshMeasurements(mesh: TriangleMesh, expected: MeshMeasurementExpectation, tolerances?: MeshMeasurementTolerances): TriangleMeshAnalysis;
28
+ //# sourceMappingURL=measurements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measurements.d.ts","sourceRoot":"","sources":["../src/measurements.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAC;AAErC,+EAA+E;AAC/E,MAAM,WAAW,0BAA0B;IACzC,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,mDAAmD;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAC3C;AAED,2FAA2F;AAC3F,MAAM,WAAW,yBAAyB;IACxC,wEAAwE;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,wDAAwD;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAaD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,0BAA0B,EACpC,UAAU,GAAE,yBAA8B,GACzC,oBAAoB,CAqDtB"}
@@ -0,0 +1,66 @@
1
+ import { analyzeTriangleMesh, } from "@metamesh/modeling/geometry";
2
+ function finite(value, label) {
3
+ if (!Number.isFinite(value))
4
+ throw new TypeError(`${label} must be finite.`);
5
+ }
6
+ function within(actual, expected, tolerance, label) {
7
+ finite(expected, `Expected ${label}`);
8
+ if (Math.abs(actual - expected) > tolerance) {
9
+ throw new Error(`Mesh ${label}: expected ${expected} ± ${tolerance}, received ${actual}.`);
10
+ }
11
+ }
12
+ /**
13
+ * Analyzes current buffers, requires closed oriented edge topology, and checks selected physical
14
+ * facts with explicit absolute tolerances. Returns fresh measurements without initializing an
15
+ * engine. These facts do not prove geometric equivalence or absence of self-intersections.
16
+ */
17
+ export function expectMeshMeasurements(mesh, expected, tolerances = {}) {
18
+ if (expected.bounds === undefined &&
19
+ expected.signedVolume === undefined &&
20
+ expected.surfaceArea === undefined &&
21
+ expected.connectedComponentCount === undefined) {
22
+ throw new TypeError("Provide at least one mesh measurement expectation.");
23
+ }
24
+ for (const metric of ["bounds", "signedVolume", "surfaceArea"]) {
25
+ const tolerance = tolerances[metric];
26
+ if (tolerance !== undefined) {
27
+ finite(tolerance, `${metric} tolerance`);
28
+ if (tolerance < 0)
29
+ throw new TypeError(`${metric} tolerance must be nonnegative.`);
30
+ }
31
+ }
32
+ const facts = analyzeTriangleMesh(mesh, {
33
+ requireClosed: true,
34
+ includeTopology: expected.connectedComponentCount !== undefined,
35
+ });
36
+ if (expected.bounds !== undefined) {
37
+ for (const end of ["min", "max"]) {
38
+ const point = expected.bounds[end];
39
+ const pointShape = point;
40
+ if (!Array.isArray(pointShape) || pointShape.length !== 3) {
41
+ throw new TypeError(`Expected bounds.${end} must contain three XYZ coordinates.`);
42
+ }
43
+ for (let axis = 0; axis < 3; axis += 1) {
44
+ within(facts.bounds[end][axis], point[axis], tolerances.bounds ?? 0, `bounds.${end}[${axis}]`);
45
+ }
46
+ }
47
+ }
48
+ if (expected.signedVolume !== undefined) {
49
+ within(facts.signedVolume, expected.signedVolume, tolerances.signedVolume ?? 0, "signedVolume");
50
+ }
51
+ if (expected.surfaceArea !== undefined) {
52
+ finite(expected.surfaceArea, "Expected surfaceArea");
53
+ if (expected.surfaceArea < 0)
54
+ throw new TypeError("Expected surfaceArea must be nonnegative.");
55
+ within(facts.surfaceArea, expected.surfaceArea, tolerances.surfaceArea ?? 0, "surfaceArea");
56
+ }
57
+ if (expected.connectedComponentCount !== undefined) {
58
+ const count = expected.connectedComponentCount;
59
+ if (!Number.isSafeInteger(count) || count < 1) {
60
+ throw new TypeError("Expected connectedComponentCount must be a positive safe integer.");
61
+ }
62
+ within(facts.connectedComponentCount, count, 0, "connectedComponentCount");
63
+ }
64
+ return facts;
65
+ }
66
+ //# sourceMappingURL=measurements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measurements.js","sourceRoot":"","sources":["../src/measurements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type GeneratorDefinition, type GeneratorParams, type GeneratorServices, type ParameterValidationResult } from "@metamesh/generator-sdk";
2
+ import type { ModelingLimits, ModelProgram } from "@metamesh/modeling";
3
+ import { type ModelEngine, type ModelSnapshot } from "@metamesh/modeling/engine";
4
+ /** Fixed host resources and optional asynchronous asset preparation. */
5
+ export interface GeneratorTestRunnerOptions<D extends GeneratorDefinition> {
6
+ readonly prepareServices?: (definition: D, parameters: GeneratorParams<D>) => GeneratorServices | Promise<GeneratorServices>;
7
+ readonly engine?: ModelEngine;
8
+ readonly limits?: Partial<ModelingLimits>;
9
+ }
10
+ export type GeneratorTestExecution<D extends GeneratorDefinition> = {
11
+ readonly type: "invalid";
12
+ readonly parameters: GeneratorParams<D>;
13
+ readonly validation: ParameterValidationResult;
14
+ } | {
15
+ readonly type: "generated";
16
+ readonly parameters: GeneratorParams<D>;
17
+ readonly validation: ParameterValidationResult;
18
+ readonly model: ModelSnapshot;
19
+ };
20
+ export interface GeneratorTestRunner<D extends GeneratorDefinition> {
21
+ /** Checks declarations and assertions only. Set `normalize: false` to probe deliberately invalid typed values. */
22
+ readonly validate: (parameters: GeneratorParams<D>, options?: {
23
+ readonly normalize?: boolean;
24
+ }) => Promise<ParameterValidationResult>;
25
+ /** Normalizes once, prepares assets, and executes the same persistent session used by production hosts. */
26
+ readonly execute: (parameters: Readonly<Record<string, unknown>>) => Promise<GeneratorTestExecution<D>>;
27
+ /** Releases runner caches; separately owned snapshots remain valid. */
28
+ readonly dispose: () => void;
29
+ }
30
+ /** Creates a lazy runner for one generation program without loading assets or an engine. */
31
+ export declare function createGeneratorTestRunner<const D extends GeneratorDefinition>(definition: D, runtime: {
32
+ readonly generate: ModelProgram<GeneratorParams<D>, GeneratorServices>;
33
+ }, options?: GeneratorTestRunnerOptions<NoInfer<D>>): GeneratorTestRunner<D>;
34
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC/B,MAAM,yBAAyB,CAAC;AAQjC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAC;AAKnC,wEAAwE;AACxE,MAAM,WAAW,0BAA0B,CAAC,CAAC,SAAS,mBAAmB;IACvE,QAAQ,CAAC,eAAe,CAAC,EAAE,CACzB,UAAU,EAAE,CAAC,EACb,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,KAC3B,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,mBAAmB,IAC5D;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAC;CAChD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;CAC/B,CAAC;AAEN,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,mBAAmB;IAChE,kHAAkH;IAClH,QAAQ,CAAC,QAAQ,EAAE,CACjB,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACvC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACxC,2GAA2G;IAC3G,QAAQ,CAAC,OAAO,EAAE,CAChB,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAC1C,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,CAAC,SAAS,mBAAmB,EAC3E,UAAU,EAAE,CAAC,EACb,OAAO,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAA;CAAE,EACnF,OAAO,GAAE,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAM,GACnD,mBAAmB,CAAC,CAAC,CAAC,CA6HxB"}
package/dist/runner.js ADDED
@@ -0,0 +1,118 @@
1
+ import { UNPREPARED_GENERATOR_SERVICES, } from "@metamesh/generator-sdk";
2
+ import { aggregateParameterIssues, canonicalizeParameters, parseParameterIssues, prepareParameters, } from "@metamesh/generator-sdk/parameters";
3
+ import { generationIssues } from "@metamesh/generator-sdk/runtime";
4
+ import { validateModel, } from "@metamesh/modeling/engine";
5
+ import { isGeometryError } from "@metamesh/modeling/geometry";
6
+ import { getTestEngine } from "./engine.js";
7
+ /** Creates a lazy runner for one generation program without loading assets or an engine. */
8
+ export function createGeneratorTestRunner(definition, runtime, options = {}) {
9
+ let session;
10
+ let assetKey;
11
+ let previous;
12
+ let disposed = false;
13
+ const assertActive = () => {
14
+ if (disposed)
15
+ throw new Error("Generator test runner has been disposed.");
16
+ };
17
+ async function services(parameters) {
18
+ if (options.prepareServices)
19
+ return options.prepareServices(definition, parameters);
20
+ if (definition.parameters.some((parameter) => parameter.type === "font")) {
21
+ throw new Error(`Generator "${definition.id}" declares Font parameters. Pass a prepareServices fixture provider to createGeneratorTestRunner().`);
22
+ }
23
+ return UNPREPARED_GENERATOR_SERVICES;
24
+ }
25
+ async function withSession(parameters, capabilities, execute) {
26
+ assertActive();
27
+ const engine = options.engine ?? (await getTestEngine());
28
+ assertActive();
29
+ const key = JSON.stringify(definition.parameters
30
+ .filter((parameter) => parameter.type === "font")
31
+ .map(({ id }) => parameters[id]));
32
+ if (session === undefined || assetKey !== key) {
33
+ session?.dispose();
34
+ session = undefined;
35
+ session = engine.createSession(runtime.generate, {
36
+ services: capabilities,
37
+ ...(options.limits === undefined ? {} : { limits: options.limits }),
38
+ });
39
+ assetKey = key;
40
+ }
41
+ // Selection and execution stay synchronous: another prepared request may replace this session.
42
+ return execute(session);
43
+ }
44
+ function canonical(parameters) {
45
+ const result = canonicalizeParameters(definition, parameters, previous);
46
+ previous = result;
47
+ return result;
48
+ }
49
+ return Object.freeze({
50
+ async validate(parameters, probe = {}) {
51
+ assertActive();
52
+ const state = probe.normalize === false
53
+ ? { parameters, validation: aggregateParameterIssues() }
54
+ : prepareParameters(definition, parameters);
55
+ if (!state.validation.isValid)
56
+ return state.validation;
57
+ try {
58
+ const params = canonical(state.parameters);
59
+ const capabilities = await services(params);
60
+ assertActive();
61
+ let issues;
62
+ try {
63
+ issues =
64
+ options.engine === undefined
65
+ ? validateModel(runtime.generate, params, {
66
+ services: capabilities,
67
+ ...(options.limits === undefined ? {} : { limits: options.limits }),
68
+ })
69
+ : await withSession(params, capabilities, (active) => active.validate(params));
70
+ }
71
+ catch (error) {
72
+ if (!isGeometryError(error) ||
73
+ error.context?.operation !== "validateModel" ||
74
+ error.context.details?.["requiresKernel"] !== true)
75
+ throw error;
76
+ issues = await withSession(params, capabilities, (active) => active.validate(params));
77
+ }
78
+ return aggregateParameterIssues(state.validation.issues, parseParameterIssues(definition, issues));
79
+ }
80
+ catch (error) {
81
+ const issues = generationIssues(definition, error);
82
+ if (issues === undefined || !issues.some(({ severity }) => severity === "error"))
83
+ throw error;
84
+ return aggregateParameterIssues(state.validation.issues, issues);
85
+ }
86
+ },
87
+ async execute(parameters) {
88
+ assertActive();
89
+ const state = prepareParameters(definition, parameters);
90
+ if (!state.validation.isValid)
91
+ return Object.freeze({ type: "invalid", ...state });
92
+ const params = canonical(state.parameters);
93
+ try {
94
+ const capabilities = await services(params);
95
+ const model = await withSession(params, capabilities, (active) => active.run(params));
96
+ const validation = aggregateParameterIssues(state.validation.issues, parseParameterIssues(definition, model.diagnostics));
97
+ return Object.freeze({ type: "generated", parameters: params, validation, model });
98
+ }
99
+ catch (error) {
100
+ const issues = generationIssues(definition, error);
101
+ if (issues === undefined || !issues.some(({ severity }) => severity === "error"))
102
+ throw error;
103
+ return Object.freeze({
104
+ type: "invalid",
105
+ parameters: params,
106
+ validation: aggregateParameterIssues(state.validation.issues, issues),
107
+ });
108
+ }
109
+ },
110
+ dispose() {
111
+ disposed = true;
112
+ session?.dispose();
113
+ session = undefined;
114
+ previous = undefined;
115
+ },
116
+ });
117
+ }
118
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,21 +1,58 @@
1
1
  {
2
2
  "name": "@metamesh/testkit",
3
- "version": "0.0.0-bootstrap.0",
4
- "description": "Inert name enrollment for the MetaMesh public package set.",
3
+ "version": "0.13.0",
4
+ "description": "Runner-neutral MetaMesh model and Generator testing helpers, assertions, and local font fixtures.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/JasonKoolman/metamesh.git",
9
9
  "directory": "packages/testkit"
10
10
  },
11
+ "homepage": "https://github.com/JasonKoolman/metamesh#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/JasonKoolman/metamesh/issues"
14
+ },
11
15
  "type": "module",
12
- "exports": {},
16
+ "sideEffects": false,
13
17
  "files": [
14
- "README.md",
15
- "LICENSE"
18
+ "CHANGELOG.md",
19
+ "dist"
16
20
  ],
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ },
26
+ "./fonts": {
27
+ "types": "./dist/fonts.d.ts",
28
+ "import": "./dist/fonts.js"
29
+ },
30
+ "./font-fixtures": {
31
+ "types": "./dist/font-fixtures.d.ts",
32
+ "import": "./dist/font-fixtures.js"
33
+ },
34
+ "./docs/manifest.json": "./dist/docs/manifest.json"
35
+ },
17
36
  "publishConfig": {
18
37
  "access": "public",
19
38
  "registry": "https://registry.npmjs.org/"
39
+ },
40
+ "peerDependencies": {
41
+ "@metamesh/generator-sdk": "0.13.0",
42
+ "@metamesh/modeling": "0.13.0"
43
+ },
44
+ "devDependencies": {
45
+ "@metamesh/config": "0.0.0",
46
+ "@metamesh/generator-sdk": "0.13.0",
47
+ "@metamesh/modeling": "0.13.0",
48
+ "vitest": "^5.0.5",
49
+ "@types/node": "^24.19.2",
50
+ "typescript": "6.0.3"
51
+ },
52
+ "scripts": {
53
+ "build": "node ../../scripts/clean-dist.mjs && tsc -p tsconfig.build.json && node ../../scripts/package-docs/build.mjs testkit",
54
+ "lint": "eslint .",
55
+ "test": "vitest run src",
56
+ "typecheck": "tsc --noEmit --pretty false"
20
57
  }
21
- }
58
+ }