@metamesh/testkit 0.16.0 → 0.18.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 (77) hide show
  1. package/CHANGELOG.md +191 -0
  2. package/README.md +122 -88
  3. package/dist/assertions.d.ts +8 -15
  4. package/dist/assertions.d.ts.map +1 -1
  5. package/dist/assertions.js +24 -70
  6. package/dist/assertions.js.map +1 -1
  7. package/dist/content-assertions.d.ts +28 -0
  8. package/dist/content-assertions.d.ts.map +1 -0
  9. package/dist/content-assertions.js +75 -0
  10. package/dist/content-assertions.js.map +1 -0
  11. package/dist/content-matchers.d.ts +12 -0
  12. package/dist/content-matchers.d.ts.map +1 -0
  13. package/dist/content-matchers.js +22 -0
  14. package/dist/content-matchers.js.map +1 -0
  15. package/dist/docs/guides/package.md +122 -88
  16. package/dist/docs/manifest.json +175 -35
  17. package/dist/docs/reference/font-fixtures/LoadedFontFixtures.md +1 -1
  18. package/dist/docs/reference/font-fixtures/loadFontFixtureServices.md +1 -1
  19. package/dist/docs/reference/font-fixtures/loadFontFixtures.md +1 -1
  20. package/dist/docs/reference/fonts/FontTestFixture.md +1 -1
  21. package/dist/docs/reference/fonts/prepareFontTestServices.md +1 -1
  22. package/dist/docs/reference/index/BufferContent.md +13 -0
  23. package/dist/docs/reference/index/ContentMismatchError.md +12 -0
  24. package/dist/docs/reference/index/GeneratorModelTestInput.md +13 -0
  25. package/dist/docs/reference/index/GeneratorModelTestOptions.md +10 -0
  26. package/dist/docs/reference/index/GeneratorTestResult.md +18 -0
  27. package/dist/docs/reference/index/GeneratorTestRunner.md +9 -9
  28. package/dist/docs/reference/index/GeneratorTestRunnerOptions.md +2 -3
  29. package/dist/docs/reference/index/MeshContent.md +13 -0
  30. package/dist/docs/reference/index/MeshMeasurementExpectation.md +3 -3
  31. package/dist/docs/reference/index/MeshMeasurementTolerances.md +1 -1
  32. package/dist/docs/reference/index/RunModelOptions.md +13 -0
  33. package/dist/docs/reference/index/assertEqualBuffer.md +15 -0
  34. package/dist/docs/reference/index/assertEqualMesh.md +14 -0
  35. package/dist/docs/reference/index/{expectMeshMeasurements.md → assertMeshMeasurements.md} +3 -3
  36. package/dist/docs/reference/index/{expectValidDefaults.md → assertValidDefaults.md} +3 -3
  37. package/dist/docs/reference/index/assertValidDefinition.md +10 -0
  38. package/dist/docs/reference/index/assertValidParts.md +12 -0
  39. package/dist/docs/reference/index/{expectValidPresets.md → assertValidPresets.md} +3 -3
  40. package/dist/docs/reference/index/contentMatchers.md +12 -0
  41. package/dist/docs/reference/index/createGeneratorTestRunner.md +2 -4
  42. package/dist/docs/reference/index/getTestEngine.md +1 -1
  43. package/dist/docs/reference/index/runModel.md +13 -0
  44. package/dist/generator-execution.d.ts +6 -0
  45. package/dist/generator-execution.d.ts.map +1 -0
  46. package/dist/generator-execution.js +20 -0
  47. package/dist/generator-execution.js.map +1 -0
  48. package/dist/generator-test-runner.d.ts +32 -0
  49. package/dist/generator-test-runner.d.ts.map +1 -0
  50. package/dist/generator-test-runner.js +109 -0
  51. package/dist/generator-test-runner.js.map +1 -0
  52. package/dist/index.d.ts +10 -5
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +7 -4
  55. package/dist/index.js.map +1 -1
  56. package/dist/measurements.d.ts +4 -4
  57. package/dist/measurements.d.ts.map +1 -1
  58. package/dist/measurements.js +10 -9
  59. package/dist/measurements.js.map +1 -1
  60. package/dist/run-model.d.ts +21 -0
  61. package/dist/run-model.d.ts.map +1 -0
  62. package/dist/run-model.js +39 -0
  63. package/dist/run-model.js.map +1 -0
  64. package/dist/{engine.d.ts → test-engine.d.ts} +1 -1
  65. package/dist/test-engine.d.ts.map +1 -0
  66. package/dist/{engine.js → test-engine.js} +1 -1
  67. package/dist/test-engine.js.map +1 -0
  68. package/package.json +8 -5
  69. package/dist/docs/reference/index/GeneratorTestExecution.md +0 -19
  70. package/dist/docs/reference/index/expectSerializableDefinition.md +0 -10
  71. package/dist/docs/reference/index/expectValidParts.md +0 -19
  72. package/dist/engine.d.ts.map +0 -1
  73. package/dist/engine.js.map +0 -1
  74. package/dist/runner.d.ts +0 -36
  75. package/dist/runner.d.ts.map +0 -1
  76. package/dist/runner.js +0 -121
  77. package/dist/runner.js.map +0 -1
package/dist/runner.d.ts DELETED
@@ -1,36 +0,0 @@
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
- /** Parameter or assertion failure, or a generated snapshot owned separately from its runner. */
11
- export type GeneratorTestExecution<D extends GeneratorDefinition> = {
12
- readonly type: "invalid";
13
- readonly parameters: GeneratorParams<D>;
14
- readonly validation: ParameterValidationResult;
15
- } | {
16
- readonly type: "generated";
17
- readonly parameters: GeneratorParams<D>;
18
- readonly validation: ParameterValidationResult;
19
- readonly model: ModelSnapshot;
20
- };
21
- /** A lazy reusable Generator test session; dispose the runner and every returned snapshot separately. */
22
- export interface GeneratorTestRunner<D extends GeneratorDefinition> {
23
- /** Checks declarations and assertions only. Set `normalize: false` to probe deliberately invalid typed values. */
24
- readonly validate: (parameters: GeneratorParams<D>, options?: {
25
- readonly normalize?: boolean;
26
- }) => Promise<ParameterValidationResult>;
27
- /** Normalizes once, prepares assets, and executes the same persistent session used by production hosts. */
28
- readonly execute: (parameters: Readonly<Record<string, unknown>>) => Promise<GeneratorTestExecution<D>>;
29
- /** Releases runner caches; separately owned snapshots remain valid. */
30
- readonly dispose: () => void;
31
- }
32
- /** Creates a lazy runner for one generation program without loading assets or an engine. */
33
- export declare function createGeneratorTestRunner<const D extends GeneratorDefinition>(definition: D, runtime: {
34
- readonly generate: ModelProgram<GeneratorParams<D>, GeneratorServices>;
35
- }, options?: GeneratorTestRunnerOptions<NoInfer<D>>): GeneratorTestRunner<D>;
36
- //# sourceMappingURL=runner.d.ts.map
@@ -1 +0,0 @@
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,gGAAgG;AAChG,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,yGAAyG;AACzG,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,CAgIxB"}
package/dist/runner.js DELETED
@@ -1,121 +0,0 @@
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 sessionServices;
11
- let assetKey;
12
- let previous;
13
- let disposed = false;
14
- const assertActive = () => {
15
- if (disposed)
16
- throw new Error("Generator test runner has been disposed.");
17
- };
18
- async function services(parameters) {
19
- if (options.prepareServices)
20
- return options.prepareServices(definition, parameters);
21
- if (definition.parameters.some((parameter) => parameter.type === "font")) {
22
- throw new Error(`Generator "${definition.id}" declares Font parameters. Pass a prepareServices fixture provider to createGeneratorTestRunner().`);
23
- }
24
- return UNPREPARED_GENERATOR_SERVICES;
25
- }
26
- async function withSession(parameters, capabilities, execute) {
27
- assertActive();
28
- const engine = options.engine ?? (await getTestEngine());
29
- assertActive();
30
- const key = JSON.stringify(definition.parameters
31
- .filter((parameter) => parameter.type === "font")
32
- .map(({ id }) => parameters[id]));
33
- if (session === undefined || assetKey !== key || sessionServices !== capabilities) {
34
- session?.dispose();
35
- session = undefined;
36
- session = engine.createSession(runtime.generate, {
37
- services: capabilities,
38
- ...(options.limits === undefined ? {} : { limits: options.limits }),
39
- });
40
- assetKey = key;
41
- sessionServices = capabilities;
42
- }
43
- // Selection and execution stay synchronous: another prepared request may replace this session.
44
- return execute(session);
45
- }
46
- function canonical(parameters) {
47
- const result = canonicalizeParameters(definition, parameters, previous);
48
- previous = result;
49
- return result;
50
- }
51
- return Object.freeze({
52
- async validate(parameters, probe = {}) {
53
- assertActive();
54
- const state = probe.normalize === false
55
- ? { parameters, validation: aggregateParameterIssues() }
56
- : prepareParameters(definition, parameters);
57
- if (!state.validation.isValid)
58
- return state.validation;
59
- try {
60
- const params = canonical(state.parameters);
61
- const capabilities = await services(params);
62
- assertActive();
63
- let issues;
64
- try {
65
- issues =
66
- options.engine === undefined
67
- ? validateModel(runtime.generate, params, {
68
- services: capabilities,
69
- ...(options.limits === undefined ? {} : { limits: options.limits }),
70
- })
71
- : await withSession(params, capabilities, (active) => active.validate(params));
72
- }
73
- catch (error) {
74
- if (!isGeometryError(error) ||
75
- error.context?.operation !== "validateModel" ||
76
- error.context.details?.["requiresKernel"] !== true)
77
- throw error;
78
- issues = await withSession(params, capabilities, (active) => active.validate(params));
79
- }
80
- return aggregateParameterIssues(state.validation.issues, parseParameterIssues(definition, issues));
81
- }
82
- catch (error) {
83
- const issues = generationIssues(definition, error);
84
- if (issues === undefined || !issues.some(({ severity }) => severity === "error"))
85
- throw error;
86
- return aggregateParameterIssues(state.validation.issues, issues);
87
- }
88
- },
89
- async execute(parameters) {
90
- assertActive();
91
- const state = prepareParameters(definition, parameters);
92
- if (!state.validation.isValid)
93
- return Object.freeze({ type: "invalid", ...state });
94
- const params = canonical(state.parameters);
95
- try {
96
- const capabilities = await services(params);
97
- const model = await withSession(params, capabilities, (active) => active.run(params));
98
- const validation = aggregateParameterIssues(state.validation.issues, parseParameterIssues(definition, model.diagnostics));
99
- return Object.freeze({ type: "generated", parameters: params, validation, model });
100
- }
101
- catch (error) {
102
- const issues = generationIssues(definition, error);
103
- if (issues === undefined || !issues.some(({ severity }) => severity === "error"))
104
- throw error;
105
- return Object.freeze({
106
- type: "invalid",
107
- parameters: params,
108
- validation: aggregateParameterIssues(state.validation.issues, issues),
109
- });
110
- }
111
- },
112
- dispose() {
113
- disposed = true;
114
- session?.dispose();
115
- session = undefined;
116
- sessionServices = undefined;
117
- previous = undefined;
118
- },
119
- });
120
- }
121
- //# sourceMappingURL=runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}