@adobe/data-testing 0.10.21 → 0.10.22
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.
- package/README.md +42 -25
- package/dist/conformance/adapt-spec.d.ts +1 -6
- package/dist/conformance/adapt-spec.js +2 -0
- package/dist/conformance/adapt-spec.js.map +1 -1
- package/dist/conformance/build-double.js +22 -18
- package/dist/conformance/build-double.js.map +1 -1
- package/dist/conformance/build-double.test.d.ts +1 -0
- package/dist/conformance/build-double.test.js +30 -0
- package/dist/conformance/build-double.test.js.map +1 -0
- package/dist/conformance/check-feature.d.ts +5 -0
- package/dist/conformance/check-feature.js +50 -0
- package/dist/conformance/check-feature.js.map +1 -0
- package/dist/conformance/check-spec.d.ts +4 -0
- package/dist/conformance/check-spec.js +20 -0
- package/dist/conformance/check-spec.js.map +1 -0
- package/dist/conformance/feature-types.d.ts +2 -2
- package/dist/conformance/implementation.d.ts +41 -0
- package/dist/conformance/implementation.js +11 -0
- package/dist/conformance/implementation.js.map +1 -0
- package/dist/conformance/manifest.type-test.d.ts +122 -0
- package/dist/conformance/manifest.type-test.js +96 -0
- package/dist/conformance/manifest.type-test.js.map +1 -0
- package/dist/conformance/public.d.ts +7 -1
- package/dist/conformance/public.js +8 -3
- package/dist/conformance/public.js.map +1 -1
- package/dist/conformance/run-actions.d.ts +1 -0
- package/dist/conformance/run-actions.js +1 -1
- package/dist/conformance/run-actions.js.map +1 -1
- package/dist/conformance/run-feature.d.ts +1 -1
- package/dist/conformance/run-feature.js +26 -15
- package/dist/conformance/run-feature.js.map +1 -1
- package/dist/conformance/run-spec.d.ts +2 -2
- package/dist/conformance/run-spec.js +5 -9
- package/dist/conformance/run-spec.js.map +1 -1
- package/dist/conformance/run-systems.d.ts +33 -0
- package/dist/conformance/run-systems.js +126 -0
- package/dist/conformance/run-systems.js.map +1 -0
- package/dist/conformance/spec.d.ts +22 -0
- package/dist/conformance/spec.js +9 -0
- package/dist/conformance/spec.js.map +1 -0
- package/dist/conformance/state-matches.d.ts +14 -0
- package/dist/conformance/state-matches.js +3 -0
- package/dist/conformance/state-matches.js.map +1 -0
- package/dist/conformance/systems-types.d.ts +41 -0
- package/dist/conformance/systems-types.js +2 -0
- package/dist/conformance/systems-types.js.map +1 -0
- package/dist/conformance/systems.test.d.ts +1 -0
- package/dist/conformance/systems.test.js +125 -0
- package/dist/conformance/systems.test.js.map +1 -0
- package/dist/conformance/systems.type-test.d.ts +30 -0
- package/dist/conformance/systems.type-test.js +33 -0
- package/dist/conformance/systems.type-test.js.map +1 -0
- package/dist/conformance/with-no-op.d.ts +5 -0
- package/dist/conformance/with-no-op.js +14 -0
- package/dist/conformance/with-no-op.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
// A real-time feature's systems conform one by one and as a frame. `integrate` is
|
|
3
|
+
// scheduled after `accelerate`, and the frame case only holds in that order, so it
|
|
4
|
+
// proves the order comes from `schedule`, not from the spec. `drift` reads a service,
|
|
5
|
+
// so its frame case also proves each run gets fresh recording doubles. `physics`
|
|
6
|
+
// stands in for a system the spec can't model (e.g. wasm) and `seed` is init-only;
|
|
7
|
+
// both are declared unmodelled and skipped. Every system guards on `frozen`, which
|
|
8
|
+
// the `noOp` case checks against each of them.
|
|
9
|
+
import { Database } from "@adobe/data/ecs";
|
|
10
|
+
import { spec } from "./spec.js";
|
|
11
|
+
import { implementation } from "./implementation.js";
|
|
12
|
+
import { checkSpec } from "./check-spec.js";
|
|
13
|
+
import { checkFeature } from "./check-feature.js";
|
|
14
|
+
const accelerate = (state, { dt }) => ({
|
|
15
|
+
velocity: state.frozen ? state.velocity : state.velocity + dt,
|
|
16
|
+
});
|
|
17
|
+
const integrate = (state, { dt }) => ({
|
|
18
|
+
position: state.frozen ? state.position : state.position + state.velocity * dt,
|
|
19
|
+
});
|
|
20
|
+
const drift = (state, { rng }) => ({
|
|
21
|
+
offset: state.frozen ? state.offset : state.offset + rng.next(),
|
|
22
|
+
});
|
|
23
|
+
const systems = { accelerate, integrate, drift };
|
|
24
|
+
const plugin = Database.Plugin.create({
|
|
25
|
+
services: { rng: () => ({ serviceName: "rng", next: () => 0 }) },
|
|
26
|
+
resources: {
|
|
27
|
+
frozen: { default: false },
|
|
28
|
+
position: { default: 0 },
|
|
29
|
+
velocity: { default: 0 },
|
|
30
|
+
offset: { default: 0 },
|
|
31
|
+
jitter: { default: 0 },
|
|
32
|
+
frameDelta: { default: 0 },
|
|
33
|
+
},
|
|
34
|
+
systems: {
|
|
35
|
+
integrate: {
|
|
36
|
+
schedule: { after: ["accelerate"] },
|
|
37
|
+
create: (db) => () => {
|
|
38
|
+
const r = db.store.resources;
|
|
39
|
+
if (!r.frozen)
|
|
40
|
+
r.position += r.velocity * r.frameDelta;
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
accelerate: {
|
|
44
|
+
create: (db) => () => {
|
|
45
|
+
const r = db.store.resources;
|
|
46
|
+
if (!r.frozen)
|
|
47
|
+
r.velocity += r.frameDelta;
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
drift: {
|
|
51
|
+
create: (db) => () => {
|
|
52
|
+
const r = db.store.resources;
|
|
53
|
+
if (!r.frozen)
|
|
54
|
+
r.offset += db.services.rng.next();
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
physics: {
|
|
58
|
+
create: (db) => () => {
|
|
59
|
+
db.store.resources.jitter += 1;
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
seed: {
|
|
63
|
+
create: (db) => {
|
|
64
|
+
db.store.resources.jitter = 0;
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const accelerateCases = {
|
|
70
|
+
cases: [{ name: "adds dt to velocity", before: { velocity: 1 }, args: { dt: 2 }, after: { velocity: 3 } }],
|
|
71
|
+
};
|
|
72
|
+
const integrateCases = {
|
|
73
|
+
cases: [{ name: "moves by velocity × dt", before: { position: 1, velocity: 2 }, args: { dt: 3 }, after: { position: 7 } }],
|
|
74
|
+
};
|
|
75
|
+
const driftCases = {
|
|
76
|
+
cases: [{ name: "adds the next random offset", before: { offset: 1 }, responses: { rng: { next: [4] } }, after: { offset: 5 } }],
|
|
77
|
+
};
|
|
78
|
+
const motion = spec({
|
|
79
|
+
state: { create: () => ({ frozen: false, position: 0, velocity: 0, offset: 0 }) },
|
|
80
|
+
fns: {},
|
|
81
|
+
cases: {},
|
|
82
|
+
services: { rng: () => ({ serviceName: "rng", next: () => 0 }) },
|
|
83
|
+
systems: {
|
|
84
|
+
fns: systems,
|
|
85
|
+
cases: { accelerate: accelerateCases, integrate: integrateCases, drift: driftCases },
|
|
86
|
+
noOp: [{ name: "frozen", before: { frozen: true, position: 1, velocity: 2, offset: 3 }, args: { dt: 5 } }],
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
// Whole frames: accelerate first gives velocity 3, then position 0 + 3 × 2 = 6 (the
|
|
90
|
+
// other order gives 2).
|
|
91
|
+
const frame = {
|
|
92
|
+
cases: [
|
|
93
|
+
{
|
|
94
|
+
name: "accelerates, then integrates",
|
|
95
|
+
before: { velocity: 1 },
|
|
96
|
+
args: { dt: 2 },
|
|
97
|
+
responses: { rng: { next: [5] } },
|
|
98
|
+
after: { velocity: 3, position: 6, offset: 5 },
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
checkSpec(motion);
|
|
103
|
+
checkFeature(implementation(motion, {
|
|
104
|
+
plugin,
|
|
105
|
+
projection: {
|
|
106
|
+
fromState: (store, state) => {
|
|
107
|
+
store.resources.frozen = state.frozen;
|
|
108
|
+
store.resources.position = state.position;
|
|
109
|
+
store.resources.velocity = state.velocity;
|
|
110
|
+
store.resources.offset = state.offset;
|
|
111
|
+
},
|
|
112
|
+
toState: (store) => ({
|
|
113
|
+
frozen: store.resources.frozen,
|
|
114
|
+
position: store.resources.position,
|
|
115
|
+
velocity: store.resources.velocity,
|
|
116
|
+
offset: store.resources.offset,
|
|
117
|
+
}),
|
|
118
|
+
},
|
|
119
|
+
frame: {
|
|
120
|
+
args: { dt: (db, dt) => { db.store.resources.frameDelta = dt; } },
|
|
121
|
+
unmodelled: { physics: "stands in for a wasm system", seed: "init-only" },
|
|
122
|
+
cases: frame,
|
|
123
|
+
},
|
|
124
|
+
}));
|
|
125
|
+
//# sourceMappingURL=systems.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systems.test.js","sourceRoot":"","sources":["../../src/conformance/systems.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Database } from "@adobe/data/ecs";
|
|
2
|
+
type State = {
|
|
3
|
+
readonly velocity: number;
|
|
4
|
+
};
|
|
5
|
+
declare const plugin: {
|
|
6
|
+
readonly components: {};
|
|
7
|
+
readonly resources: {
|
|
8
|
+
readonly velocity: {
|
|
9
|
+
readonly default: number;
|
|
10
|
+
};
|
|
11
|
+
readonly frameDelta: {
|
|
12
|
+
readonly default: number;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
readonly archetypes: {};
|
|
16
|
+
readonly transactions: {};
|
|
17
|
+
readonly systems: import("@adobe/data/ecs").SystemDeclarations<"accelerate" | "physics">;
|
|
18
|
+
readonly actions: {};
|
|
19
|
+
readonly services: {};
|
|
20
|
+
readonly computed: {};
|
|
21
|
+
readonly indexes: {};
|
|
22
|
+
};
|
|
23
|
+
type Store = Database.Plugin.ToStore<typeof plugin>;
|
|
24
|
+
export declare const ok: import("./implementation.js").Implementation<State, {}, Store>;
|
|
25
|
+
export declare const missing: import("./implementation.js").Implementation<State, {}, Store>;
|
|
26
|
+
export declare const unknown: import("./implementation.js").Implementation<State, {}, Store>;
|
|
27
|
+
export declare const both: import("./implementation.js").Implementation<State, {}, Store>;
|
|
28
|
+
export declare const noWriter: import("./implementation.js").Implementation<State, {}, Store>;
|
|
29
|
+
export declare const noFrame: import("./implementation.js").Implementation<State, {}, Store>;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
// Compile-time guards of the systems manifest: every ECS system is modelled xor
|
|
3
|
+
// unmodelled, and every frame data arg has a writer.
|
|
4
|
+
import { Database } from "@adobe/data/ecs";
|
|
5
|
+
import { spec } from "./spec.js";
|
|
6
|
+
import { implementation } from "./implementation.js";
|
|
7
|
+
const accelerate = (state, { dt }) => ({ velocity: state.velocity + dt });
|
|
8
|
+
const plugin = Database.Plugin.create({
|
|
9
|
+
resources: { velocity: { default: 0 }, frameDelta: { default: 0 } },
|
|
10
|
+
systems: {
|
|
11
|
+
accelerate: { create: (db) => () => { db.store.resources.velocity += db.store.resources.frameDelta; } },
|
|
12
|
+
physics: { create: () => () => { } },
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
const projection = {
|
|
16
|
+
fromState: (store, state) => { store.resources.velocity = state.velocity; },
|
|
17
|
+
toState: (store) => ({ velocity: store.resources.velocity }),
|
|
18
|
+
};
|
|
19
|
+
const motion = spec({ state: { create: () => ({ velocity: 0 }) }, fns: {}, cases: {}, systems: { fns: { accelerate }, cases: { accelerate: accelerateCases } } });
|
|
20
|
+
const dt = (db, value) => { db.store.resources.frameDelta = value; };
|
|
21
|
+
// POSITIVE — `accelerate` modelled, `physics` unmodelled, `dt` written.
|
|
22
|
+
export const ok = implementation(motion, { plugin, projection, frame: { args: { dt }, unmodelled: { physics: "wasm" } } });
|
|
23
|
+
// @ts-expect-error — `physics` is neither modelled nor declared unmodelled
|
|
24
|
+
export const missing = implementation(motion, { plugin, projection, frame: { args: { dt } } });
|
|
25
|
+
// @ts-expect-error — `gravity` is not a system of this plugin
|
|
26
|
+
export const unknown = implementation(motion, { plugin, projection, frame: { args: { dt }, unmodelled: { physics: "wasm", gravity: "x" } } });
|
|
27
|
+
// @ts-expect-error — `accelerate` is modelled, so it can't also be unmodelled
|
|
28
|
+
export const both = implementation(motion, { plugin, projection, frame: { args: { dt }, unmodelled: { physics: "wasm", accelerate: "x" } } });
|
|
29
|
+
// @ts-expect-error — the frame arg `dt` has no writer
|
|
30
|
+
export const noWriter = implementation(motion, { plugin, projection, frame: { args: {}, unmodelled: { physics: "wasm" } } });
|
|
31
|
+
// @ts-expect-error — a spec with systems requires `frame`
|
|
32
|
+
export const noFrame = implementation(motion, { plugin, projection });
|
|
33
|
+
//# sourceMappingURL=systems.type-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systems.type-test.js","sourceRoot":"","sources":["../../src/conformance/systems.type-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
// Append each no-op state to every system's cases as an ordinary case expecting no
|
|
3
|
+
// change, so both runners check it without a separate path.
|
|
4
|
+
export const withNoOp = (cases, noOp) => {
|
|
5
|
+
if (noOp === undefined || noOp.length === 0)
|
|
6
|
+
return cases;
|
|
7
|
+
// Runtime invariant: a systems manifest's `cases` holds one case module per system.
|
|
8
|
+
const modules = cases;
|
|
9
|
+
return Object.fromEntries(Object.entries(modules).map(([name, module]) => [
|
|
10
|
+
name,
|
|
11
|
+
{ ...module, cases: [...module.cases, ...noOp.map((c) => ({ ...c, name: `${c.name} (no-op)`, after: {} }))] },
|
|
12
|
+
]));
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=with-no-op.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-no-op.js","sourceRoot":"","sources":["../../src/conformance/with-no-op.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAIvD,mFAAmF;AACnF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,KAAa,EACb,IAAwG,EAChG,EAAE;IACV,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,oFAAoF;IACpF,MAAM,OAAO,GAAG,KAAyC,CAAC;IAC1D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;QAC9C,IAAI;QACJ,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;KAC9G,CAAC,CACH,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * as Match from "./match/public.js";
|
|
2
2
|
export * as Conformance from "./conformance/public.js";
|
|
3
|
-
export type { SpecCase, SpecCases, SpecDerivationCase, SpecDerivations, Responses, CaseModule,
|
|
3
|
+
export type { SpecCase, SpecCases, SpecDerivationCase, SpecDerivations, Responses, CaseModule, Spec, Implementation, StateMatches, FrameCases, SystemCases, Effects, ServiceCall, } from "./conformance/public.js";
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
2
|
// Shared test-only utilities for the spec↔ecs conformance pattern. Two namespaces:
|
|
3
3
|
// Match — tolerant, matcher-aware value comparison (framework-agnostic).
|
|
4
|
-
// Conformance — the manifest API (`
|
|
4
|
+
// Conformance — the manifest API (`spec` / `implementation` / `checkSpec` / `checkFeature`), the case
|
|
5
5
|
// types, and the lower-level runner escape hatch.
|
|
6
|
-
// Import only from a feature's test tier (its
|
|
6
|
+
// Import only from a feature's test tier (its `spec/` folder, `ecs/conformance/`, and
|
|
7
7
|
// `*.test.ts`), which the package's project-reference wall keeps out of the runtime build.
|
|
8
8
|
export * as Match from "./match/public.js";
|
|
9
9
|
export * as Conformance from "./conformance/public.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,mFAAmF;AACnF,iFAAiF;AACjF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,mFAAmF;AACnF,iFAAiF;AACjF,wGAAwG;AACxG,kEAAkE;AAClE,sFAAsF;AACtF,2FAA2F;AAC3F,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adobe/data-testing",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.22",
|
|
4
4
|
"description": "Conformance-testing utilities (Match + Conformance runners) for @adobe/data ECS features",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"LICENSE"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@adobe/data": "0.10.
|
|
18
|
+
"@adobe/data": "0.10.22"
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
21
|
"vitest": "^1.6.0"
|