@playfast/reform-proof 1.4.0 → 1.4.1
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/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +10 -12
- package/dist/engine.js.map +1 -1
- package/dist/engineCoverage.d.ts +11 -0
- package/dist/engineCoverage.d.ts.map +1 -0
- package/dist/engineCoverage.js +48 -0
- package/dist/engineCoverage.js.map +1 -0
- package/dist/engineMounted.d.ts.map +1 -1
- package/dist/engineMounted.js +7 -2
- package/dist/engineMounted.js.map +1 -1
- package/dist/engineSink.d.ts +13 -1
- package/dist/engineSink.d.ts.map +1 -1
- package/dist/engineSink.js +21 -2
- package/dist/engineSink.js.map +1 -1
- package/dist/engineTreeFacade.d.ts.map +1 -1
- package/dist/engineTreeFacade.js +18 -3
- package/dist/engineTreeFacade.js.map +1 -1
- package/dist/engineTreeTypes.d.ts +3 -1
- package/dist/engineTreeTypes.d.ts.map +1 -1
- package/dist/engineTreeTypes.js.map +1 -1
- package/package.json +1 -1
- package/src/coverage-host.test.ts +183 -0
- package/src/engine.ts +10 -21
- package/src/engineCoverage.ts +86 -0
- package/src/engineMounted.ts +7 -2
- package/src/engineSink.ts +56 -2
- package/src/engineTreeFacade.ts +18 -3
- package/src/engineTreeTypes.ts +3 -0
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAA8B,MAAM,QAAQ,CAAA;AAuBlE,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,SAAS,CAAA;AAErD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,YAAY,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACtF,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AA8I1D,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAgBtF,CAAA;AAEH,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,KAAG,OAAO,CAAC,WAAW,CACjB,CAAA;AA8D9C,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAgBpF,CAAA;AAEH,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,KAAG,OAAO,CAAC,WAAW,CACjB,CAAA"}
|
package/dist/engine.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Cause, Effect, Option, Record as Rec, Ref } from 'effect';
|
|
2
2
|
import { yieldWrapGet } from 'effect/Utils';
|
|
3
3
|
import { makeAppRuntime, sceneInstrumentation, } from '@playfast/reform';
|
|
4
4
|
import {} from '@playfast/reform/internal';
|
|
5
5
|
import { invalidCompositionProps, makeSink, messageOf, } from './engineSink.js';
|
|
6
6
|
import { childComposition, readRuntimeSlotChild, slotsOf } from './engineTree.js';
|
|
7
|
+
import { coverageFailure, missingCoverage } from './engineCoverage.js';
|
|
7
8
|
import { makeRuntimeTreeFacade } from './engineTreeFacade.js';
|
|
8
9
|
export { makeSink } from './engineSink.js';
|
|
9
10
|
export { proofLayer } from './engineTree.js';
|
|
@@ -18,14 +19,6 @@ const withProofRuntimeTree = (scene, sink, dispatched, use) => Effect.acquireUse
|
|
|
18
19
|
yield* Effect.sync(() => runtime.boot());
|
|
19
20
|
return makeRuntimeTreeFacade(runtime, scene.composition, rootProps, sink, dispatched);
|
|
20
21
|
}), (tree) => use(runtime, tree), (tree) => Effect.sync(tree.dispose)), (runtime) => Effect.sync(runtime.dispose));
|
|
21
|
-
const missingCoverage = (proof, dispatched) => Option.match(proof.requirement.manifest.events, {
|
|
22
|
-
onNone: () => [],
|
|
23
|
-
onSome: (declared) => {
|
|
24
|
-
const owner = compositionIdentity(proof.requirement.manifest.composition);
|
|
25
|
-
const covered = new Set(Arr.filterMap(Arr.fromIterable(dispatched), (action) => Object.is(action.identity, owner) ? Option.some(action.event) : Option.none()));
|
|
26
|
-
return declared.map(String).filter((event) => !covered.has(event));
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
22
|
const compositionIdentity = (composition) => composition.capture((exact) => exact.identity);
|
|
30
23
|
const verifyProofPlacement = (proof, scene, runtime) => {
|
|
31
24
|
const expected = proof.requirement.manifest.composition;
|
|
@@ -65,10 +58,15 @@ const executeProofWithSink = Effect.fn('executeProofWithSink')(function* (proof,
|
|
|
65
58
|
yield* verifyProofPlacement(proof, scene, runtime);
|
|
66
59
|
yield* tree.settle;
|
|
67
60
|
yield* runGenerator(proof.body(tree.facade), undefined, tree.settle);
|
|
68
|
-
const
|
|
69
|
-
|
|
61
|
+
const coverage = {
|
|
62
|
+
requirement: proof.requirement,
|
|
63
|
+
host: compositionIdentity(scene.composition),
|
|
64
|
+
dispatched,
|
|
65
|
+
publications: tree.publications,
|
|
66
|
+
};
|
|
67
|
+
const missing = missingCoverage(coverage);
|
|
70
68
|
return missing.length > 0
|
|
71
|
-
? { requirement: statement, ok: false, error:
|
|
69
|
+
? { requirement: statement, ok: false, error: coverageFailure(coverage, missing) }
|
|
72
70
|
: { requirement: statement, ok: true, error: undefined };
|
|
73
71
|
})).pipe(Effect.catchAllCause((cause) => Effect.succeed({
|
|
74
72
|
requirement: statement,
|
package/dist/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type DispatchedAction, type EventPublications } from './engineSink.js';
|
|
2
|
+
import type { Proof } from './index.js';
|
|
3
|
+
export interface Coverage {
|
|
4
|
+
readonly requirement: Proof['requirement'];
|
|
5
|
+
readonly host: symbol;
|
|
6
|
+
readonly dispatched: Set<DispatchedAction>;
|
|
7
|
+
readonly publications: EventPublications;
|
|
8
|
+
}
|
|
9
|
+
export declare const missingCoverage: (coverage: Coverage) => ReadonlyArray<string>;
|
|
10
|
+
export declare const coverageFailure: (coverage: Coverage, missing: ReadonlyArray<string>) => string;
|
|
11
|
+
//# sourceMappingURL=engineCoverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engineCoverage.d.ts","sourceRoot":"","sources":["../src/engineCoverage.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACnG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;IAG1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC1C,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAA;CACzC;AAiCD,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,KAAG,aAAa,CAAC,MAAM,CAUrE,CAAA;AA2BJ,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,EAAE,SAAS,aAAa,CAAC,MAAM,CAAC,KAAG,MAIpF,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Array as Arr, Option } from 'effect';
|
|
2
|
+
import { compositionIdentityOf } from './engineSink.js';
|
|
3
|
+
const samePublication = (published, declared) => Option.getOrElse(Option.zipWith(published, declared, (raised, owned) => raised === owned), () => false);
|
|
4
|
+
// A declared event is answered by a dispatch on the requirement's own composition — or
|
|
5
|
+
// by the composition that renders it raising the very same domain Event. The second
|
|
6
|
+
// case is the test-only parent that exists to feed a slot the props it needs and
|
|
7
|
+
// re-exposes its action: that dispatch reaches the child's reducer, so withholding
|
|
8
|
+
// coverage reports "never dispatched" about an event whose effects the proof body
|
|
9
|
+
// asserts two lines later. A composition that merely spells an action the same way
|
|
10
|
+
// publishes a different Event and stays uncovered, which is the collision the identity
|
|
11
|
+
// check exists for — as does a sibling raising the event without owning the action.
|
|
12
|
+
const answeredBy = ({ coverage, owner, event }) => (action) => Object.is(action.identity, owner)
|
|
13
|
+
? action.event === event
|
|
14
|
+
: Object.is(action.identity, coverage.host) &&
|
|
15
|
+
samePublication(action.published, coverage.publications.publishedBy(owner, event));
|
|
16
|
+
export const missingCoverage = (coverage) => Option.match(coverage.requirement.manifest.events, {
|
|
17
|
+
onNone: () => [],
|
|
18
|
+
onSome: (declared) => {
|
|
19
|
+
const owner = compositionIdentityOf(coverage.requirement.manifest.composition);
|
|
20
|
+
const raised = Arr.fromIterable(coverage.dispatched);
|
|
21
|
+
return declared
|
|
22
|
+
.map(String)
|
|
23
|
+
.filter((event) => !raised.some(answeredBy({ coverage, owner, event })));
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
const publicationSuffix = (published) => Option.match(published, {
|
|
27
|
+
onNone: () => '',
|
|
28
|
+
onSome: (tag) => ` (publishes ${tag})`,
|
|
29
|
+
});
|
|
30
|
+
// "never dispatched" is the wrong story when the event was dispatched on a composition
|
|
31
|
+
// the requirement does not own, so name that composition and what each side publishes.
|
|
32
|
+
const uncoveredDetail = ({ coverage, owner, event }) => {
|
|
33
|
+
const ownerName = coverage.requirement.manifest.composition.manifest.name;
|
|
34
|
+
const elsewhere = Arr.dedupe(Arr.filterMap(Arr.fromIterable(coverage.dispatched), (action) => action.event === event && !Object.is(action.identity, owner)
|
|
35
|
+
? Option.some(`${action.composition}${publicationSuffix(action.published)}`)
|
|
36
|
+
: Option.none()));
|
|
37
|
+
const owned = publicationSuffix(coverage.publications.publishedBy(owner, event));
|
|
38
|
+
return Arr.match(elsewhere, {
|
|
39
|
+
onEmpty: () => event,
|
|
40
|
+
onNonEmpty: (raisers) => `${event} — dispatched on ${Arr.join(raisers, ', ')}, not on ${ownerName}${owned}`,
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
export const coverageFailure = (coverage, missing) => {
|
|
44
|
+
const owner = compositionIdentityOf(coverage.requirement.manifest.composition);
|
|
45
|
+
const detail = missing.map((event) => uncoveredDetail({ coverage, owner, event }));
|
|
46
|
+
return `requirement declares events never dispatched: ${Arr.join(detail, '; ')}`;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=engineCoverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engineCoverage.js","sourceRoot":"","sources":["../src/engineCoverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineMounted.d.ts","sourceRoot":"","sources":["../src/engineMounted.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,EAAE,cAAc,EAAqB,MAAM,QAAQ,CAAA;AAE/F,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,aAAa,EAElB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAuB,WAAW,
|
|
1
|
+
{"version":3,"file":"engineMounted.d.ts","sourceRoot":"","sources":["../src/engineMounted.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,EAAE,cAAc,EAAqB,MAAM,QAAQ,CAAA;AAE/F,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,aAAa,EAElB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAuB,WAAW,EAAmB,MAAM,2BAA2B,CAAA;AAC7F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAGL,KAAK,gBAAgB,EAGrB,KAAK,aAAa,EAKlB,KAAK,sBAAsB,EAE3B,KAAK,IAAI,EAEV,MAAM,cAAc,CAAA;AAYrB,wBAAgB,UAAU,CACxB,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EACR,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,OAAO,EAAE,cAAc,CAAC,cAAc,CAAC,QAAQ,GAAG,WAAW,EAAE,KAAK,CAAC,EACrE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EACpD,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,GAAG,CAAC,gBAAgB,CAAC,GAChC;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CACnD,CASA;AAgLD,eAAO,MAAM,eAAe,GAC1B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EACR,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,SAAS,cAAc,CAAC,cAAc,CAAC,QAAQ,GAAG,WAAW,EAAE,KAAK,CAAC,EACrE,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EACpD,MAAM,IAAI,EACV,YAAY,GAAG,CAAC,gBAAgB,CAAC,KAChC;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAGnD,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,QAAQ,EACR,cAAc,SAAS,OAAO,CAAC,QAAQ,CAAC,EACxC,CAAC,EACD,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,SAAS,aAAa,CAAC,QAAQ,CAAC,EAChC,MAAM,sBAAsB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAClE,MAAM,IAAI,EACV,YAAY,GAAG,CAAC,gBAAgB,CAAC,KAChC;IACD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CACiB,CAAA"}
|
package/dist/engineMounted.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Array as Arr, Effect, ManagedRuntime, Option, TestClock } from 'effect';
|
|
2
2
|
import { NoTestClock, UnknownAction, UnknownSlot } from './errors.js';
|
|
3
3
|
import {} from '@playfast/reform';
|
|
4
|
-
import { CaptureSink } from '@playfast/reform/internal';
|
|
4
|
+
import { CaptureSink, triggerEventTag } from '@playfast/reform/internal';
|
|
5
5
|
import { compositionIdentityOf, directSettle, expectMatchingProps, keyed, uiNameOf, } from './engineSink.js';
|
|
6
6
|
import { makeCaptureLookup, nodeCaptureFor, renderRuntimeFromContext, rootRef, slotCapturesFor, slotsOf, } from './engineTree.js';
|
|
7
7
|
import { collectRuntimeBindings, renderTreeRuntime, settleTreeRuntime } from './engineRender.js';
|
|
@@ -37,7 +37,12 @@ function makeMountedFacade(runtime, root, sink, dispatched, settleBoundary) {
|
|
|
37
37
|
props: propsFor(ref),
|
|
38
38
|
expectProps: (partial) => propsFor(ref).pipe(Effect.flatMap((props) => expectMatchingProps({ actual: props, expected: partial }))),
|
|
39
39
|
actions: keyed((event) => (payload) => rerender.pipe(Effect.flatMap(() => triggerOf(ref, event)), Effect.flatMap((trigger) => Effect.sync(() => {
|
|
40
|
-
dispatched.add({
|
|
40
|
+
dispatched.add({
|
|
41
|
+
identity: compositionIdentityOf(comp),
|
|
42
|
+
composition: uiNameOf(comp),
|
|
43
|
+
event,
|
|
44
|
+
published: triggerEventTag(trigger),
|
|
45
|
+
});
|
|
41
46
|
trigger(payload);
|
|
42
47
|
})), Effect.flatMap(() => settle), Effect.flatMap(() => propsFor(ref)))),
|
|
43
48
|
slots: keyed((slotName) => slotFacade(ref, comp, slotName)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineMounted.js","sourceRoot":"","sources":["../src/engineMounted.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,GAAG,EAAiB,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC/F,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAMN,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAuB,WAAW,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"engineMounted.js","sourceRoot":"","sources":["../src/engineMounted.ts"],"names":[],"mappings":"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"}
|
package/dist/engineSink.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Context, type Duration, Effect } from 'effect';
|
|
1
|
+
import { type Context, type Duration, Effect, Option } from 'effect';
|
|
2
2
|
import { type CompositionClass, type CompositionService, type RuntimeHandle, type Structure, type Trigger, type UiContract } from '@playfast/reform';
|
|
3
3
|
import { type AnyComposition, type CapturedRender, type CaptureSinkApi, type Instrumentation } from '@playfast/reform/internal';
|
|
4
4
|
import type { Facade, SlotFacade, SlotFacadesOf } from './facade.js';
|
|
@@ -46,8 +46,20 @@ export declare const keyed: <V>(get: (key: string) => V) => Record<string, V>;
|
|
|
46
46
|
export declare const messageOf: (error: unknown) => string;
|
|
47
47
|
export interface DispatchedAction {
|
|
48
48
|
readonly identity: symbol;
|
|
49
|
+
readonly composition: string;
|
|
49
50
|
readonly event: string;
|
|
51
|
+
readonly published: Option.Option<string>;
|
|
50
52
|
}
|
|
53
|
+
export interface EventPublications {
|
|
54
|
+
readonly observe: (root: TreeNodeShape) => void;
|
|
55
|
+
readonly publishedBy: (identity: symbol, action: string) => Option.Option<string>;
|
|
56
|
+
}
|
|
57
|
+
export interface TreeNodeShape {
|
|
58
|
+
readonly comp: AnyComposition;
|
|
59
|
+
readonly events: Record<string, Trigger<unknown>>;
|
|
60
|
+
readonly slots: Readonly<Record<string, ReadonlyArray<TreeNodeShape>>>;
|
|
61
|
+
}
|
|
62
|
+
export declare const makeEventPublications: () => EventPublications;
|
|
51
63
|
export declare const compositionIdentityOf: (composition: AnyComposition) => symbol;
|
|
52
64
|
export declare const uiNameOf: (comp: AnyComposition) => string;
|
|
53
65
|
export declare const eventsOf: (structure: Structure<UiContract>) => Record<string, Trigger<unknown>>;
|
package/dist/engineSink.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineSink.d.ts","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"engineSink.d.ts","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"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"}
|
package/dist/engineSink.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Clock, Effect, MutableRef, Option } from 'effect';
|
|
1
|
+
import { Clock, Effect, MutableRef, Option, Record as Rec, } from 'effect';
|
|
2
2
|
import { AssertionFailed } from './errors.js';
|
|
3
3
|
import { Composition, isStructure, } from '@playfast/reform';
|
|
4
|
-
import { noopInstrumentation, } from '@playfast/reform/internal';
|
|
4
|
+
import { noopInstrumentation, triggerEventTag, } from '@playfast/reform/internal';
|
|
5
5
|
import { matchProps } from './assert.js';
|
|
6
6
|
export const directSettle = (settlement) => settlement;
|
|
7
7
|
// Cooperative yields flush synchronous fibers; the real-time sleep prevents a
|
|
@@ -22,6 +22,25 @@ export const keyed = (get) => {
|
|
|
22
22
|
return new Proxy(target, { get: (_target, key) => get(String(key)) });
|
|
23
23
|
};
|
|
24
24
|
export const messageOf = (error) => error instanceof Error ? error.message : String(error);
|
|
25
|
+
export const makeEventPublications = () => {
|
|
26
|
+
const byComposition = new Map();
|
|
27
|
+
const record = (node) => {
|
|
28
|
+
const identity = compositionIdentityOf(node.comp);
|
|
29
|
+
const actions = byComposition.get(identity) ?? new Map();
|
|
30
|
+
Rec.toEntries(node.events).forEach(([action, trigger]) => Option.match(triggerEventTag(trigger), {
|
|
31
|
+
onNone: () => { },
|
|
32
|
+
onSome: (tag) => {
|
|
33
|
+
actions.set(action, tag);
|
|
34
|
+
},
|
|
35
|
+
}));
|
|
36
|
+
byComposition.set(identity, actions);
|
|
37
|
+
Rec.toEntries(node.slots).forEach(([_name, children]) => children.forEach(record));
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
observe: record,
|
|
41
|
+
publishedBy: (identity, action) => Option.fromNullable(byComposition.get(identity)).pipe(Option.flatMap((actions) => Option.fromNullable(actions.get(action)))),
|
|
42
|
+
};
|
|
43
|
+
};
|
|
25
44
|
export const compositionIdentityOf = (composition) => composition.capture((exact) => exact.identity);
|
|
26
45
|
export const uiNameOf = (comp) => comp.manifest.ui.manifest.name;
|
|
27
46
|
// UiContract erases event values to never, so this boundary needs no assertion.
|
package/dist/engineSink.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineSink.js","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"engineSink.js","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineTreeFacade.d.ts","sourceRoot":"","sources":["../src/engineTreeFacade.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEtE,OAAO,EAEL,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"engineTreeFacade.d.ts","sourceRoot":"","sources":["../src/engineTreeFacade.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEtE,OAAO,EAEL,KAAK,gBAAgB,EAMrB,KAAK,sBAAsB,EAC3B,KAAK,IAAI,EAEV,MAAM,cAAc,CAAA;AAErB,OAAO,KAAK,EAAE,iBAAiB,EAAsC,MAAM,mBAAmB,CAAA;AAE9F,wBAAgB,qBAAqB,CACnC,QAAQ,EACR,cAAc,SAAS,OAAO,CAAC,QAAQ,CAAC,EACxC,CAAC,EACD,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,EAChC,IAAI,EAAE,sBAAsB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAClE,SAAS,EAAE,CAAC,EACZ,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,GAAG,CAAC,gBAAgB,CAAC,GAChC,iBAAiB,CAAC,CAAC,CAAC,CAAA"}
|
package/dist/engineTreeFacade.js
CHANGED
|
@@ -2,11 +2,20 @@ import { Array as Arr, Effect, MutableRef, Option, TestClock } from 'effect';
|
|
|
2
2
|
import { AssertionFailed, NoTestClock, UnknownAction, UnknownSlot } from './errors.js';
|
|
3
3
|
import { matchProps } from './assert.js';
|
|
4
4
|
import {} from '@playfast/reform';
|
|
5
|
-
import {
|
|
5
|
+
import { triggerEventTag } from '@playfast/reform/internal';
|
|
6
|
+
import { compositionIdentityOf, keyed, makeEventPublications, uiNameOf, } from './engineSink.js';
|
|
6
7
|
import { makeTreeDriver } from './engineTreeDriver.js';
|
|
7
8
|
export function makeRuntimeTreeFacade(runtime, root, rootProps, sink, dispatched) {
|
|
8
9
|
const driver = makeTreeDriver(runtime, root, rootProps, sink);
|
|
9
|
-
const
|
|
10
|
+
const publications = makeEventPublications();
|
|
11
|
+
// Every resolver bottoms out here, so reading the tree is also when the ledger of
|
|
12
|
+
// "what does each composition publish under this action name" is refreshed. Coverage
|
|
13
|
+
// needs that for compositions the proof body never addressed directly.
|
|
14
|
+
const currentRoot = () => {
|
|
15
|
+
const node = driver.render().root;
|
|
16
|
+
publications.observe(node);
|
|
17
|
+
return node;
|
|
18
|
+
};
|
|
10
19
|
// The nested-Feature twin of the mounted facade's `advance`: same virtual clock
|
|
11
20
|
// off the same runtime, settled through this driver instead.
|
|
12
21
|
const advance = (duration) => Option.match(runtime.readOption(TestClock.TestClock), {
|
|
@@ -38,7 +47,12 @@ export function makeRuntimeTreeFacade(runtime, root, rootProps, sink, dispatched
|
|
|
38
47
|
rendered: 1,
|
|
39
48
|
}).message);
|
|
40
49
|
}
|
|
41
|
-
dispatched.add({
|
|
50
|
+
dispatched.add({
|
|
51
|
+
identity: compositionIdentityOf(node.comp),
|
|
52
|
+
composition: uiNameOf(node.comp),
|
|
53
|
+
event,
|
|
54
|
+
published: triggerEventTag(trigger),
|
|
55
|
+
});
|
|
42
56
|
trigger(payload);
|
|
43
57
|
yield* driver.settle;
|
|
44
58
|
// A self-removing action leaves nothing to re-read; report what the
|
|
@@ -118,6 +132,7 @@ export function makeRuntimeTreeFacade(runtime, root, rootProps, sink, dispatched
|
|
|
118
132
|
return {
|
|
119
133
|
facade: nodeFacade(currentRoot, () => Option.some(currentRoot())),
|
|
120
134
|
settle: driver.settle,
|
|
135
|
+
publications,
|
|
121
136
|
dispose: driver.dispose,
|
|
122
137
|
};
|
|
123
138
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineTreeFacade.js","sourceRoot":"","sources":["../src/engineTreeFacade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,GAAG,EAAiB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC3F,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAuC,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"engineTreeFacade.js","sourceRoot":"","sources":["../src/engineTreeFacade.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Effect, type Option } from 'effect';
|
|
2
2
|
import type { FeatureLoadFailed, SlotFill, Trigger, UiContract } from '@playfast/reform';
|
|
3
3
|
import type { AnyComposition, AnyFeatureBinding } from '@playfast/reform/internal';
|
|
4
|
-
import { type HostRuntime, type MountedFacade, type MountedFacadeHandleErasure } from './engineSink.js';
|
|
4
|
+
import { type EventPublications, type HostRuntime, type MountedFacade, type MountedFacadeHandleErasure } from './engineSink.js';
|
|
5
5
|
export type FeatureMountState = {
|
|
6
6
|
readonly _tag: 'Loading';
|
|
7
7
|
} | {
|
|
@@ -37,9 +37,11 @@ export interface TreeRenderState {
|
|
|
37
37
|
export interface RuntimeTreeFacade<C extends UiContract> {
|
|
38
38
|
readonly facade: MountedFacade<C>;
|
|
39
39
|
readonly settle: Effect.Effect<void, never, never>;
|
|
40
|
+
readonly publications: EventPublications;
|
|
40
41
|
dispose(): void;
|
|
41
42
|
}
|
|
42
43
|
export interface RuntimeTreeFacadeErasure extends MountedFacadeHandleErasure {
|
|
44
|
+
readonly publications: EventPublications;
|
|
43
45
|
dispose(): void;
|
|
44
46
|
}
|
|
45
47
|
export interface TreeDriver {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineTreeTypes.d.ts","sourceRoot":"","sources":["../src/engineTreeTypes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engineTreeTypes.d.ts","sourceRoot":"","sources":["../src/engineTreeTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineTreeTypes.js","sourceRoot":"","sources":["../src/engineTreeTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAe,MAAM,IAAI,GAAG,EAAE,MAAM,QAAQ,CAAA;AAGvE,OAAO,
|
|
1
|
+
{"version":3,"file":"engineTreeTypes.js","sourceRoot":"","sources":["../src/engineTreeTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAe,MAAM,IAAI,GAAG,EAAE,MAAM,QAAQ,CAAA;AAGvE,OAAO,EAKL,QAAQ,GACT,MAAM,cAAc,CAAA;AA8ErB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAA;AAEpF,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,QAAgB,EAChB,IAAuB,EAC2C,EAAE,CACpE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CACpB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAClD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,QAAQ,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAC1F,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EACxC,KAAK,CAAC,UAAU,CACjB,CAAA;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAc,EAAW,EAAE,CAAC;IAC1D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IACnB,IAAI,CAAC,GAAG;IACR,IAAI,CAAC,KAAK;IACV,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;CACjE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@playfast/reform-proof",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Headless testing toolkit for reform — drive a scene's compositions and assert on the props they compute, with no DOM, timers, or text matching.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"effect",
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { Layer, Schema as S } from 'effect'
|
|
2
|
+
import {
|
|
3
|
+
Composition,
|
|
4
|
+
Engine,
|
|
5
|
+
Event,
|
|
6
|
+
mount,
|
|
7
|
+
one,
|
|
8
|
+
provide,
|
|
9
|
+
Reducer,
|
|
10
|
+
scene,
|
|
11
|
+
slot,
|
|
12
|
+
State,
|
|
13
|
+
StateGroup,
|
|
14
|
+
type Trigger,
|
|
15
|
+
Ui,
|
|
16
|
+
ui,
|
|
17
|
+
} from '@playfast/reform'
|
|
18
|
+
import { describe, expect, test } from 'vitest'
|
|
19
|
+
import { Product, Proof, ProductRequirement, expect as proofExpect } from './index'
|
|
20
|
+
|
|
21
|
+
// The dialog's own event, and one only the host raises.
|
|
22
|
+
class Confirmed extends Event.make('CovConfirmed', S.Struct({})) {}
|
|
23
|
+
class HostConfirmed extends Event.make('CovHostConfirmed', S.Struct({})) {}
|
|
24
|
+
|
|
25
|
+
class CountState extends State.make('covCount', S.Number) {}
|
|
26
|
+
class CountStates extends StateGroup.make(CountState) {}
|
|
27
|
+
class CountReducer extends Reducer.make('CovReducer', {
|
|
28
|
+
states: [CountState],
|
|
29
|
+
events: [Confirmed],
|
|
30
|
+
}) {}
|
|
31
|
+
const CountReducerLive = Reducer.live(CountReducer, (count) => count + 1)
|
|
32
|
+
|
|
33
|
+
class DialogUi extends ui('CovDialog')<{
|
|
34
|
+
props: { count: number }
|
|
35
|
+
events: { confirm: Trigger<Record<string, never>> }
|
|
36
|
+
}>() {}
|
|
37
|
+
class Dialog extends Composition.make('CovDialog', {
|
|
38
|
+
title: 'CovDialog',
|
|
39
|
+
states: [CountStates],
|
|
40
|
+
events: [Confirmed],
|
|
41
|
+
ui: DialogUi,
|
|
42
|
+
})<Dialog>() {}
|
|
43
|
+
const DialogLive = Composition.live(Dialog, function* () {
|
|
44
|
+
const count = yield* StateGroup.select(CountStates, 'covCount')
|
|
45
|
+
const confirm = yield* Event.trigger(Confirmed)
|
|
46
|
+
return mount({ props: { count }, slots: {}, events: { confirm } })
|
|
47
|
+
})
|
|
48
|
+
class DialogSlot extends slot('CovDialogSlot')<DialogSlot, typeof Dialog>() {}
|
|
49
|
+
|
|
50
|
+
// A sibling that raises the dialog's event without being the dialog.
|
|
51
|
+
class EchoUi extends ui('CovEcho')<{
|
|
52
|
+
props: { count: number }
|
|
53
|
+
events: { confirm: Trigger<Record<string, never>> }
|
|
54
|
+
}>() {}
|
|
55
|
+
class Echo extends Composition.make('CovEcho', {
|
|
56
|
+
title: 'CovEcho',
|
|
57
|
+
states: [CountStates],
|
|
58
|
+
events: [Confirmed],
|
|
59
|
+
ui: EchoUi,
|
|
60
|
+
})<Echo>() {}
|
|
61
|
+
const EchoLive = Composition.live(Echo, function* () {
|
|
62
|
+
const count = yield* StateGroup.select(CountStates, 'covCount')
|
|
63
|
+
const confirm = yield* Event.trigger(Confirmed)
|
|
64
|
+
return mount({ props: { count }, slots: {}, events: { confirm } })
|
|
65
|
+
})
|
|
66
|
+
class EchoSlot extends slot('CovEchoSlot')<EchoSlot, typeof Echo>() {}
|
|
67
|
+
|
|
68
|
+
// The test-only parent: it renders the dialog and re-exposes its event as
|
|
69
|
+
// `passthrough`, while its own `confirm` is a different event that happens to
|
|
70
|
+
// spell the dialog's action name.
|
|
71
|
+
class HostUi extends ui('CovHost')<{
|
|
72
|
+
props: { count: number }
|
|
73
|
+
events: {
|
|
74
|
+
confirm: Trigger<Record<string, never>>
|
|
75
|
+
passthrough: Trigger<Record<string, never>>
|
|
76
|
+
}
|
|
77
|
+
slots: { Dialog: DialogSlot; Echo: EchoSlot }
|
|
78
|
+
}>() {}
|
|
79
|
+
class Host extends Composition.make('CovHost', {
|
|
80
|
+
title: 'CovHost',
|
|
81
|
+
states: [CountStates],
|
|
82
|
+
events: [Confirmed, HostConfirmed],
|
|
83
|
+
slots: { Dialog: DialogSlot, Echo: EchoSlot },
|
|
84
|
+
ui: HostUi,
|
|
85
|
+
})<Host>() {}
|
|
86
|
+
const HostLive = Composition.live(Host, function* () {
|
|
87
|
+
const count = yield* StateGroup.select(CountStates, 'covCount')
|
|
88
|
+
const confirm = yield* Event.trigger(HostConfirmed)
|
|
89
|
+
const passthrough = yield* Event.trigger(Confirmed)
|
|
90
|
+
return mount({
|
|
91
|
+
props: { count },
|
|
92
|
+
slots: { Dialog: one({}), Echo: one({}) },
|
|
93
|
+
events: { confirm, passthrough },
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
const presentations = Layer.mergeAll(
|
|
98
|
+
provide(
|
|
99
|
+
HostUi,
|
|
100
|
+
Ui.make(HostUi, () => null),
|
|
101
|
+
),
|
|
102
|
+
provide(
|
|
103
|
+
DialogUi,
|
|
104
|
+
Ui.make(DialogUi, () => null),
|
|
105
|
+
),
|
|
106
|
+
provide(
|
|
107
|
+
EchoUi,
|
|
108
|
+
Ui.make(EchoUi, () => null),
|
|
109
|
+
),
|
|
110
|
+
)
|
|
111
|
+
const Views = Layer.mergeAll(
|
|
112
|
+
HostLive,
|
|
113
|
+
DialogLive,
|
|
114
|
+
EchoLive,
|
|
115
|
+
provide(DialogSlot, Dialog),
|
|
116
|
+
provide(EchoSlot, Echo),
|
|
117
|
+
).pipe(Layer.provideMerge(presentations))
|
|
118
|
+
const Logic = CountReducerLive.pipe(
|
|
119
|
+
Layer.provideMerge(Layer.mergeAll(Engine, StateGroup.live(CountStates, { covCount: 0 }))),
|
|
120
|
+
)
|
|
121
|
+
const HostScene = scene(Host, { provide: [Views.pipe(Layer.provideMerge(Logic))] })
|
|
122
|
+
|
|
123
|
+
class ConfirmsDialog extends ProductRequirement.make(Dialog, 'confirms the dialog', {
|
|
124
|
+
events: ['confirm'],
|
|
125
|
+
}) {}
|
|
126
|
+
class DialogProduct extends Product.make(Dialog, { requirements: [ConfirmsDialog] }) {}
|
|
127
|
+
|
|
128
|
+
const run = (proof: Proof) => Proof.run(Proof.suite(DialogProduct, { proofs: [proof] }))
|
|
129
|
+
|
|
130
|
+
describe('event coverage across a test-only host (issue #26)', () => {
|
|
131
|
+
test('the composition raising the requirement’s own event covers it', async () => {
|
|
132
|
+
const viaSlot = Proof.implementVia(ConfirmsDialog, HostScene, function* (app) {
|
|
133
|
+
const dialog = yield* app.slots.Dialog.first
|
|
134
|
+
const after = yield* dialog.actions.confirm({})
|
|
135
|
+
yield* proofExpect(after.count).toBe(1)
|
|
136
|
+
})
|
|
137
|
+
const result = await run(viaSlot)
|
|
138
|
+
expect(result.results[0]?.error).toBeUndefined()
|
|
139
|
+
expect(result.ok).toBe(true)
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
test('a host that re-raises the requirement’s event covers it too', async () => {
|
|
143
|
+
const viaHost = Proof.implementVia(ConfirmsDialog, HostScene, function* (app) {
|
|
144
|
+
const after = yield* app.actions.passthrough({})
|
|
145
|
+
yield* proofExpect(after.count).toBe(1)
|
|
146
|
+
})
|
|
147
|
+
const result = await run(viaHost)
|
|
148
|
+
expect(result.results[0]?.error).toBeUndefined()
|
|
149
|
+
expect(result.ok).toBe(true)
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
test('a host action that only spells the name the same does not cover it', async () => {
|
|
153
|
+
const sameName = Proof.implementVia(ConfirmsDialog, HostScene, function* (app) {
|
|
154
|
+
const after = yield* app.actions.confirm({})
|
|
155
|
+
yield* proofExpect(after.count).toBe(0)
|
|
156
|
+
})
|
|
157
|
+
const result = await run(sameName)
|
|
158
|
+
expect(result.ok).toBe(false)
|
|
159
|
+
expect(result.results[0]?.error).toContain('never dispatched')
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
test('a sibling raising the same event does not cover it', async () => {
|
|
163
|
+
const sibling = Proof.implementVia(ConfirmsDialog, HostScene, function* (app) {
|
|
164
|
+
const echo = yield* app.slots.Echo.first
|
|
165
|
+
const after = yield* echo.actions.confirm({})
|
|
166
|
+
yield* proofExpect(after.count).toBe(1)
|
|
167
|
+
})
|
|
168
|
+
const result = await run(sibling)
|
|
169
|
+
expect(result.ok).toBe(false)
|
|
170
|
+
expect(result.results[0]?.error).toContain('never dispatched')
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
test('the failure names where the event was dispatched instead', async () => {
|
|
174
|
+
const sameName = Proof.implementVia(ConfirmsDialog, HostScene, function* (app) {
|
|
175
|
+
yield* app.actions.confirm({})
|
|
176
|
+
})
|
|
177
|
+
const result = await run(sameName)
|
|
178
|
+
expect(result.results[0]?.error).toContain('dispatched on CovHost')
|
|
179
|
+
expect(result.results[0]?.error).toContain('CovHostConfirmed')
|
|
180
|
+
expect(result.results[0]?.error).toContain('not on CovDialog')
|
|
181
|
+
expect(result.results[0]?.error).toContain('CovConfirmed')
|
|
182
|
+
})
|
|
183
|
+
})
|
package/src/engine.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Cause, Effect, Option, Record as Rec, Ref } from 'effect'
|
|
2
2
|
import { yieldWrapGet } from 'effect/Utils'
|
|
3
3
|
import {
|
|
4
4
|
type CapturedScene,
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
type Sink,
|
|
19
19
|
} from './engineSink'
|
|
20
20
|
import { childComposition, readRuntimeSlotChild, slotsOf } from './engineTree'
|
|
21
|
+
import { type Coverage, coverageFailure, missingCoverage } from './engineCoverage'
|
|
21
22
|
import type { RuntimeTreeFacade } from './engineTreeTypes'
|
|
22
23
|
import { makeRuntimeTreeFacade } from './engineTreeFacade'
|
|
23
24
|
import type { ProofCase, ProofResult } from './proofCase'
|
|
@@ -78,23 +79,6 @@ const withProofRuntimeTree = <
|
|
|
78
79
|
(runtime) => Effect.sync(runtime.dispose),
|
|
79
80
|
)
|
|
80
81
|
|
|
81
|
-
const missingCoverage = (
|
|
82
|
-
proof: Pick<Proof, 'requirement'>,
|
|
83
|
-
dispatched: Set<DispatchedAction>,
|
|
84
|
-
): ReadonlyArray<string> =>
|
|
85
|
-
Option.match(proof.requirement.manifest.events, {
|
|
86
|
-
onNone: () => [],
|
|
87
|
-
onSome: (declared) => {
|
|
88
|
-
const owner = compositionIdentity(proof.requirement.manifest.composition)
|
|
89
|
-
const covered = new Set(
|
|
90
|
-
Arr.filterMap(Arr.fromIterable(dispatched), (action) =>
|
|
91
|
-
Object.is(action.identity, owner) ? Option.some(action.event) : Option.none(),
|
|
92
|
-
),
|
|
93
|
-
)
|
|
94
|
-
return declared.map(String).filter((event) => !covered.has(event))
|
|
95
|
-
},
|
|
96
|
-
})
|
|
97
|
-
|
|
98
82
|
interface ProofPlacement {
|
|
99
83
|
readonly requirement: Proof['requirement']
|
|
100
84
|
readonly placement: 'Root' | 'Slot'
|
|
@@ -169,10 +153,15 @@ const executeProofWithSink = Effect.fn('executeProofWithSink')(function* <
|
|
|
169
153
|
yield* verifyProofPlacement(proof, scene, runtime)
|
|
170
154
|
yield* tree.settle
|
|
171
155
|
yield* runGenerator(proof.body(tree.facade), undefined, tree.settle)
|
|
172
|
-
const
|
|
173
|
-
|
|
156
|
+
const coverage: Coverage = {
|
|
157
|
+
requirement: proof.requirement,
|
|
158
|
+
host: compositionIdentity(scene.composition),
|
|
159
|
+
dispatched,
|
|
160
|
+
publications: tree.publications,
|
|
161
|
+
}
|
|
162
|
+
const missing = missingCoverage(coverage)
|
|
174
163
|
return missing.length > 0
|
|
175
|
-
? { requirement: statement, ok: false, error:
|
|
164
|
+
? { requirement: statement, ok: false, error: coverageFailure(coverage, missing) }
|
|
176
165
|
: { requirement: statement, ok: true, error: undefined }
|
|
177
166
|
}),
|
|
178
167
|
).pipe(
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Array as Arr, Option } from 'effect'
|
|
2
|
+
import { compositionIdentityOf, type DispatchedAction, type EventPublications } from './engineSink'
|
|
3
|
+
import type { Proof } from './index'
|
|
4
|
+
|
|
5
|
+
export interface Coverage {
|
|
6
|
+
readonly requirement: Proof['requirement']
|
|
7
|
+
// The scene root — the composition that renders the requirement's own, and the only
|
|
8
|
+
// one whose dispatch can stand in for it.
|
|
9
|
+
readonly host: symbol
|
|
10
|
+
readonly dispatched: Set<DispatchedAction>
|
|
11
|
+
readonly publications: EventPublications
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface DeclaredEvent {
|
|
15
|
+
readonly coverage: Coverage
|
|
16
|
+
readonly owner: symbol
|
|
17
|
+
readonly event: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const samePublication = (
|
|
21
|
+
published: Option.Option<string>,
|
|
22
|
+
declared: Option.Option<string>,
|
|
23
|
+
): boolean =>
|
|
24
|
+
Option.getOrElse(
|
|
25
|
+
Option.zipWith(published, declared, (raised, owned) => raised === owned),
|
|
26
|
+
() => false,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
// A declared event is answered by a dispatch on the requirement's own composition — or
|
|
30
|
+
// by the composition that renders it raising the very same domain Event. The second
|
|
31
|
+
// case is the test-only parent that exists to feed a slot the props it needs and
|
|
32
|
+
// re-exposes its action: that dispatch reaches the child's reducer, so withholding
|
|
33
|
+
// coverage reports "never dispatched" about an event whose effects the proof body
|
|
34
|
+
// asserts two lines later. A composition that merely spells an action the same way
|
|
35
|
+
// publishes a different Event and stays uncovered, which is the collision the identity
|
|
36
|
+
// check exists for — as does a sibling raising the event without owning the action.
|
|
37
|
+
const answeredBy =
|
|
38
|
+
({ coverage, owner, event }: DeclaredEvent) =>
|
|
39
|
+
(action: DispatchedAction): boolean =>
|
|
40
|
+
Object.is(action.identity, owner)
|
|
41
|
+
? action.event === event
|
|
42
|
+
: Object.is(action.identity, coverage.host) &&
|
|
43
|
+
samePublication(action.published, coverage.publications.publishedBy(owner, event))
|
|
44
|
+
|
|
45
|
+
export const missingCoverage = (coverage: Coverage): ReadonlyArray<string> =>
|
|
46
|
+
Option.match(coverage.requirement.manifest.events, {
|
|
47
|
+
onNone: () => [],
|
|
48
|
+
onSome: (declared) => {
|
|
49
|
+
const owner = compositionIdentityOf(coverage.requirement.manifest.composition)
|
|
50
|
+
const raised = Arr.fromIterable(coverage.dispatched)
|
|
51
|
+
return declared
|
|
52
|
+
.map(String)
|
|
53
|
+
.filter((event) => !raised.some(answeredBy({ coverage, owner, event })))
|
|
54
|
+
},
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const publicationSuffix = (published: Option.Option<string>): string =>
|
|
58
|
+
Option.match(published, {
|
|
59
|
+
onNone: () => '',
|
|
60
|
+
onSome: (tag) => ` (publishes ${tag})`,
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
// "never dispatched" is the wrong story when the event was dispatched on a composition
|
|
64
|
+
// the requirement does not own, so name that composition and what each side publishes.
|
|
65
|
+
const uncoveredDetail = ({ coverage, owner, event }: DeclaredEvent): string => {
|
|
66
|
+
const ownerName = coverage.requirement.manifest.composition.manifest.name
|
|
67
|
+
const elsewhere = Arr.dedupe(
|
|
68
|
+
Arr.filterMap(Arr.fromIterable(coverage.dispatched), (action) =>
|
|
69
|
+
action.event === event && !Object.is(action.identity, owner)
|
|
70
|
+
? Option.some(`${action.composition}${publicationSuffix(action.published)}`)
|
|
71
|
+
: Option.none(),
|
|
72
|
+
),
|
|
73
|
+
)
|
|
74
|
+
const owned = publicationSuffix(coverage.publications.publishedBy(owner, event))
|
|
75
|
+
return Arr.match(elsewhere, {
|
|
76
|
+
onEmpty: () => event,
|
|
77
|
+
onNonEmpty: (raisers) =>
|
|
78
|
+
`${event} — dispatched on ${Arr.join(raisers, ', ')}, not on ${ownerName}${owned}`,
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export const coverageFailure = (coverage: Coverage, missing: ReadonlyArray<string>): string => {
|
|
83
|
+
const owner = compositionIdentityOf(coverage.requirement.manifest.composition)
|
|
84
|
+
const detail = missing.map((event) => uncoveredDetail({ coverage, owner, event }))
|
|
85
|
+
return `requirement declares events never dispatched: ${Arr.join(detail, '; ')}`
|
|
86
|
+
}
|
package/src/engineMounted.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
type Trigger,
|
|
8
8
|
type UiContract,
|
|
9
9
|
} from '@playfast/reform'
|
|
10
|
-
import { type AnyComposition, CaptureSink } from '@playfast/reform/internal'
|
|
10
|
+
import { type AnyComposition, CaptureSink, triggerEventTag } from '@playfast/reform/internal'
|
|
11
11
|
import type { Facade } from './facade'
|
|
12
12
|
import {
|
|
13
13
|
compositionIdentityOf,
|
|
@@ -144,7 +144,12 @@ function makeMountedFacade(
|
|
|
144
144
|
Effect.flatMap(() => triggerOf(ref, event)),
|
|
145
145
|
Effect.flatMap((trigger) =>
|
|
146
146
|
Effect.sync(() => {
|
|
147
|
-
dispatched.add({
|
|
147
|
+
dispatched.add({
|
|
148
|
+
identity: compositionIdentityOf(comp),
|
|
149
|
+
composition: uiNameOf(comp),
|
|
150
|
+
event,
|
|
151
|
+
published: triggerEventTag(trigger),
|
|
152
|
+
})
|
|
148
153
|
trigger(payload)
|
|
149
154
|
}),
|
|
150
155
|
),
|
package/src/engineSink.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
Clock,
|
|
3
|
+
type Context,
|
|
4
|
+
type Duration,
|
|
5
|
+
Effect,
|
|
6
|
+
MutableRef,
|
|
7
|
+
Option,
|
|
8
|
+
Record as Rec,
|
|
9
|
+
} from 'effect'
|
|
2
10
|
import { AssertionFailed } from './errors'
|
|
3
11
|
import {
|
|
4
12
|
Composition,
|
|
@@ -16,6 +24,7 @@ import {
|
|
|
16
24
|
type CaptureSinkApi,
|
|
17
25
|
type Instrumentation,
|
|
18
26
|
noopInstrumentation,
|
|
27
|
+
triggerEventTag,
|
|
19
28
|
} from '@playfast/reform/internal'
|
|
20
29
|
import { matchProps } from './assert'
|
|
21
30
|
import type { Facade, SlotFacade, SlotFacadesOf } from './facade'
|
|
@@ -106,10 +115,55 @@ export const messageOf = (error: unknown): string =>
|
|
|
106
115
|
// An action credited to the composition that actually raised it. A bare event name
|
|
107
116
|
// is not enough: two contracts in one tree can expose the same action name, and a
|
|
108
117
|
// requirement's coverage must be answered by *its* composition's action, not by a
|
|
109
|
-
// child that happens to spell its own action the same way.
|
|
118
|
+
// child that happens to spell its own action the same way. `published` is the domain
|
|
119
|
+
// Event the trigger reached — None for a trigger built outside `Event.trigger` — which
|
|
120
|
+
// is what tells a harness parent re-exposing the child's own action apart from an
|
|
121
|
+
// unrelated composition that merely spells one the same.
|
|
110
122
|
export interface DispatchedAction {
|
|
111
123
|
readonly identity: symbol
|
|
124
|
+
readonly composition: string
|
|
112
125
|
readonly event: string
|
|
126
|
+
readonly published: Option.Option<string>
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// What each composition in the tree publishes under a given action name, so coverage
|
|
130
|
+
// can ask that question of a composition the proof body never addressed directly.
|
|
131
|
+
export interface EventPublications {
|
|
132
|
+
readonly observe: (root: TreeNodeShape) => void
|
|
133
|
+
readonly publishedBy: (identity: symbol, action: string) => Option.Option<string>
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// The slice of a rendered node the publication ledger reads. Declared here rather than
|
|
137
|
+
// imported from the tree types to keep engineSink free of that cycle.
|
|
138
|
+
export interface TreeNodeShape {
|
|
139
|
+
readonly comp: AnyComposition
|
|
140
|
+
readonly events: Record<string, Trigger<unknown>>
|
|
141
|
+
readonly slots: Readonly<Record<string, ReadonlyArray<TreeNodeShape>>>
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export const makeEventPublications = (): EventPublications => {
|
|
145
|
+
const byComposition = new Map<symbol, Map<string, string>>()
|
|
146
|
+
const record = (node: TreeNodeShape): void => {
|
|
147
|
+
const identity = compositionIdentityOf(node.comp)
|
|
148
|
+
const actions = byComposition.get(identity) ?? new Map<string, string>()
|
|
149
|
+
Rec.toEntries(node.events).forEach(([action, trigger]) =>
|
|
150
|
+
Option.match(triggerEventTag(trigger), {
|
|
151
|
+
onNone: () => {},
|
|
152
|
+
onSome: (tag) => {
|
|
153
|
+
actions.set(action, tag)
|
|
154
|
+
},
|
|
155
|
+
}),
|
|
156
|
+
)
|
|
157
|
+
byComposition.set(identity, actions)
|
|
158
|
+
Rec.toEntries(node.slots).forEach(([_name, children]) => children.forEach(record))
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
observe: record,
|
|
162
|
+
publishedBy: (identity, action) =>
|
|
163
|
+
Option.fromNullable(byComposition.get(identity)).pipe(
|
|
164
|
+
Option.flatMap((actions) => Option.fromNullable(actions.get(action))),
|
|
165
|
+
),
|
|
166
|
+
}
|
|
113
167
|
}
|
|
114
168
|
|
|
115
169
|
export const compositionIdentityOf = (composition: AnyComposition): symbol =>
|
package/src/engineTreeFacade.ts
CHANGED
|
@@ -2,12 +2,13 @@ import { Array as Arr, type Duration, Effect, MutableRef, Option, TestClock } fr
|
|
|
2
2
|
import { AssertionFailed, NoTestClock, UnknownAction, UnknownSlot } from './errors'
|
|
3
3
|
import { matchProps } from './assert'
|
|
4
4
|
import { type RuntimeHandle, type UiContract } from '@playfast/reform'
|
|
5
|
-
import type
|
|
5
|
+
import { type AnyComposition, triggerEventTag } from '@playfast/reform/internal'
|
|
6
6
|
import {
|
|
7
7
|
compositionIdentityOf,
|
|
8
8
|
type DispatchedAction,
|
|
9
9
|
type HostRuntime,
|
|
10
10
|
keyed,
|
|
11
|
+
makeEventPublications,
|
|
11
12
|
type MountedFacadeErasure,
|
|
12
13
|
type MountedSlotFacadeErasure,
|
|
13
14
|
type RuntimeRootComposition,
|
|
@@ -40,7 +41,15 @@ export function makeRuntimeTreeFacade(
|
|
|
40
41
|
dispatched: Set<DispatchedAction>,
|
|
41
42
|
): RuntimeTreeFacadeErasure {
|
|
42
43
|
const driver = makeTreeDriver(runtime, root, rootProps, sink)
|
|
43
|
-
const
|
|
44
|
+
const publications = makeEventPublications()
|
|
45
|
+
// Every resolver bottoms out here, so reading the tree is also when the ledger of
|
|
46
|
+
// "what does each composition publish under this action name" is refreshed. Coverage
|
|
47
|
+
// needs that for compositions the proof body never addressed directly.
|
|
48
|
+
const currentRoot = (): TreeNode => {
|
|
49
|
+
const node = driver.render().root
|
|
50
|
+
publications.observe(node)
|
|
51
|
+
return node
|
|
52
|
+
}
|
|
44
53
|
|
|
45
54
|
// The nested-Feature twin of the mounted facade's `advance`: same virtual clock
|
|
46
55
|
// off the same runtime, settled through this driver instead.
|
|
@@ -85,7 +94,12 @@ export function makeRuntimeTreeFacade(
|
|
|
85
94
|
}).message,
|
|
86
95
|
)
|
|
87
96
|
}
|
|
88
|
-
dispatched.add({
|
|
97
|
+
dispatched.add({
|
|
98
|
+
identity: compositionIdentityOf(node.comp),
|
|
99
|
+
composition: uiNameOf(node.comp),
|
|
100
|
+
event,
|
|
101
|
+
published: triggerEventTag(trigger),
|
|
102
|
+
})
|
|
89
103
|
trigger(payload)
|
|
90
104
|
yield* driver.settle
|
|
91
105
|
// A self-removing action leaves nothing to re-read; report what the
|
|
@@ -213,6 +227,7 @@ export function makeRuntimeTreeFacade(
|
|
|
213
227
|
return {
|
|
214
228
|
facade: nodeFacade(currentRoot, () => Option.some(currentRoot())),
|
|
215
229
|
settle: driver.settle,
|
|
230
|
+
publications,
|
|
216
231
|
dispose: driver.dispose,
|
|
217
232
|
}
|
|
218
233
|
}
|
package/src/engineTreeTypes.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { type Effect, Match, type Option, Record as Rec } from 'effect'
|
|
|
2
2
|
import type { FeatureLoadFailed, SlotFill, Trigger, UiContract } from '@playfast/reform'
|
|
3
3
|
import type { AnyComposition, AnyFeatureBinding } from '@playfast/reform/internal'
|
|
4
4
|
import {
|
|
5
|
+
type EventPublications,
|
|
5
6
|
type HostRuntime,
|
|
6
7
|
type MountedFacade,
|
|
7
8
|
type MountedFacadeHandleErasure,
|
|
@@ -42,10 +43,12 @@ export interface TreeRenderState {
|
|
|
42
43
|
export interface RuntimeTreeFacade<C extends UiContract> {
|
|
43
44
|
readonly facade: MountedFacade<C>
|
|
44
45
|
readonly settle: Effect.Effect<void, never, never>
|
|
46
|
+
readonly publications: EventPublications
|
|
45
47
|
dispose(): void
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
export interface RuntimeTreeFacadeErasure extends MountedFacadeHandleErasure {
|
|
51
|
+
readonly publications: EventPublications
|
|
49
52
|
dispose(): void
|
|
50
53
|
}
|
|
51
54
|
|