@overkill-dev/doubles 0.0.1 → 0.0.3

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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/assert/assertion-extension.d.ts +65 -0
  3. package/assert/assertion-extension.d.ts.map +1 -0
  4. package/assert/assertion-extension.js +250 -0
  5. package/assert/assertion-extension.js.map +1 -0
  6. package/doubles/disposal-symbol.js +10 -0
  7. package/doubles/disposal-symbol.js.map +1 -0
  8. package/doubles/double-behavior.d.ts +106 -0
  9. package/doubles/double-behavior.d.ts.map +1 -0
  10. package/doubles/double-behavior.js +257 -0
  11. package/doubles/double-behavior.js.map +1 -0
  12. package/doubles/double-chronology.js +78 -0
  13. package/doubles/double-chronology.js.map +1 -0
  14. package/doubles/double-history-api.js +125 -0
  15. package/doubles/double-history-api.js.map +1 -0
  16. package/doubles/double-history-record.d.ts +82 -0
  17. package/doubles/double-history-record.d.ts.map +1 -0
  18. package/doubles/double-history-record.js +65 -0
  19. package/doubles/double-history-record.js.map +1 -0
  20. package/doubles/double-history-store.d.ts +21 -0
  21. package/doubles/double-history-store.d.ts.map +1 -0
  22. package/doubles/double-history-store.js +118 -0
  23. package/doubles/double-history-store.js.map +1 -0
  24. package/doubles/double-history.d.ts +141 -0
  25. package/doubles/double-history.d.ts.map +1 -0
  26. package/doubles/double-history.js +32 -0
  27. package/doubles/double-history.js.map +1 -0
  28. package/doubles/double-iterator-event-types.d.ts +25 -0
  29. package/doubles/double-iterator-event-types.d.ts.map +1 -0
  30. package/doubles/double-iterator-tracking.d.ts +12 -0
  31. package/doubles/double-iterator-tracking.d.ts.map +1 -0
  32. package/doubles/double-iterator-tracking.js +161 -0
  33. package/doubles/double-iterator-tracking.js.map +1 -0
  34. package/doubles/double-rule-arguments.d.ts +18 -0
  35. package/doubles/double-rule-arguments.d.ts.map +1 -0
  36. package/doubles/double-rule-callback.d.ts +40 -0
  37. package/doubles/double-rule-callback.d.ts.map +1 -0
  38. package/doubles/double-rule-callback.js +84 -0
  39. package/doubles/double-rule-callback.js.map +1 -0
  40. package/doubles/double-rule-generator.d.ts +108 -0
  41. package/doubles/double-rule-generator.d.ts.map +1 -0
  42. package/doubles/double-rule-generator.js +37 -0
  43. package/doubles/double-rule-generator.js.map +1 -0
  44. package/doubles/double-rule-types.d.ts +162 -0
  45. package/doubles/double-rule-types.d.ts.map +1 -0
  46. package/doubles/double-rule.d.ts +3 -0
  47. package/doubles/double-rule.d.ts.map +1 -0
  48. package/doubles/double-rule.js +113 -0
  49. package/doubles/double-rule.js.map +1 -0
  50. package/doubles/double-runtime.js +173 -0
  51. package/doubles/double-runtime.js.map +1 -0
  52. package/doubles/double-signature.d.ts +5 -0
  53. package/doubles/double-signature.d.ts.map +1 -0
  54. package/doubles/double-usage-argument-assertion.js +202 -0
  55. package/doubles/double-usage-argument-assertion.js.map +1 -0
  56. package/doubles/double-usage-contract.d.ts +29 -0
  57. package/doubles/double-usage-contract.d.ts.map +1 -0
  58. package/doubles/double-usage-contract.js +11 -0
  59. package/doubles/double-usage-contract.js.map +1 -0
  60. package/doubles/double-usage-count-assertion.js +73 -0
  61. package/doubles/double-usage-count-assertion.js.map +1 -0
  62. package/doubles/double-usage-disposal-assertion.js +175 -0
  63. package/doubles/double-usage-disposal-assertion.js.map +1 -0
  64. package/doubles/double-usage-inspection.js +59 -0
  65. package/doubles/double-usage-inspection.js.map +1 -0
  66. package/doubles/double-usage-iterator-assertion.js +124 -0
  67. package/doubles/double-usage-iterator-assertion.js.map +1 -0
  68. package/doubles/double-usage-order-assertion.js +91 -0
  69. package/doubles/double-usage-order-assertion.js.map +1 -0
  70. package/doubles/double-usage.d.ts +81 -0
  71. package/doubles/double-usage.d.ts.map +1 -0
  72. package/doubles/double-usage.js +228 -0
  73. package/doubles/double-usage.js.map +1 -0
  74. package/doubles/protocol-disposable-double.d.ts +16 -0
  75. package/doubles/protocol-disposable-double.d.ts.map +1 -0
  76. package/doubles/protocol-disposable-double.js +37 -0
  77. package/doubles/protocol-disposable-double.js.map +1 -0
  78. package/doubles/protocol-double-metadata.js +30 -0
  79. package/doubles/protocol-double-metadata.js.map +1 -0
  80. package/doubles/protocol-double.d.ts +50 -0
  81. package/doubles/protocol-double.d.ts.map +1 -0
  82. package/doubles/protocol-double.js +76 -0
  83. package/doubles/protocol-double.js.map +1 -0
  84. package/doubles/protocol-iterator-double.d.ts +93 -0
  85. package/doubles/protocol-iterator-double.d.ts.map +1 -0
  86. package/doubles/protocol-iterator-double.js +512 -0
  87. package/doubles/protocol-iterator-double.js.map +1 -0
  88. package/doubles/test-double.d.ts +62 -0
  89. package/doubles/test-double.d.ts.map +1 -0
  90. package/doubles/test-double.js +192 -0
  91. package/doubles/test-double.js.map +1 -0
  92. package/package.json +38 -6
  93. package/packages/doubles/doubles.entry-point.d.ts +13 -0
  94. package/packages/doubles/doubles.entry-point.d.ts.map +1 -0
  95. package/packages/doubles/doubles.entry-point.js +5 -0
  96. package/packages/doubles/doubles.entry-point.js.map +1 -0
  97. package/readme.md +423 -5
  98. package/sbom.cdx.json +50 -0
@@ -0,0 +1,113 @@
1
+ import { callsBehavior, constructsBehavior, rejectsBehavior, resolvesBehavior, returnsBehavior, sequenceBehavior, throwsBehavior } from "./double-behavior.js";
2
+ import { callsCallbackAsyncBehavior, callsCallbackBehavior, createAsyncCallbackRuleTerminator, createCallbackRuleTerminator } from "./double-rule-callback.js";
3
+ import { createAsyncYieldingBehavior, createAsyncYieldingFromBehavior, createAsyncYieldingFromRuleTerminator, createAsyncYieldingRuleTerminator, createYieldingBehavior, createYieldingFromBehavior, createYieldingFromRuleTerminator, createYieldingRuleTerminator } from "./double-rule-generator.js";
4
+ function callRule(criterion, behavior) {
5
+ return { behavior, criterion };
6
+ }
7
+ function constructionRule(criterion, behavior) {
8
+ return { behavior, criterion };
9
+ }
10
+ function createCallRuleStarter(criterion) {
11
+ return {
12
+ calls(answer) {
13
+ return callRule(criterion, callsBehavior(answer));
14
+ },
15
+ callsCallback: createCallbackRuleTerminator(criterion),
16
+ callsCallbackAsync: createAsyncCallbackRuleTerminator(criterion),
17
+ rejects(reason) {
18
+ return callRule(criterion, rejectsBehavior(reason));
19
+ },
20
+ resolves(value) {
21
+ return callRule(criterion, resolvesBehavior(value));
22
+ },
23
+ returns(...value) {
24
+ return callRule(criterion, returnsBehavior(value[0]));
25
+ },
26
+ sequence(entries) {
27
+ const behavior = sequenceBehavior(entries);
28
+ return callRule(criterion, behavior);
29
+ },
30
+ throws(thrown) {
31
+ return callRule(criterion, throwsBehavior(thrown));
32
+ },
33
+ yields: createYieldingRuleTerminator(criterion),
34
+ yieldsAsync: createAsyncYieldingRuleTerminator(criterion),
35
+ yieldsAsyncFrom: createAsyncYieldingFromRuleTerminator(criterion),
36
+ yieldsFrom: createYieldingFromRuleTerminator(criterion)
37
+ };
38
+ }
39
+ function createConstructionRuleStarter(criterion) {
40
+ return {
41
+ calls(answer) {
42
+ return constructionRule(criterion, callsBehavior(answer));
43
+ },
44
+ constructs(instance) {
45
+ const behavior = constructsBehavior(instance);
46
+ return constructionRule(criterion, behavior);
47
+ },
48
+ sequence(entries) {
49
+ const behavior = sequenceBehavior(entries);
50
+ return constructionRule(criterion, behavior);
51
+ },
52
+ throws(thrown) {
53
+ return constructionRule(criterion, throwsBehavior(thrown));
54
+ }
55
+ };
56
+ }
57
+ function createCallArgumentRuleStarter(...expectedArguments) {
58
+ return createCallRuleStarter({
59
+ expectedArguments,
60
+ invocationKind: 'call',
61
+ kind: 'arguments'
62
+ });
63
+ }
64
+ function createConstructionArgumentRuleStarter(...expectedArguments) {
65
+ return createConstructionRuleStarter({
66
+ expectedArguments,
67
+ invocationKind: 'construction',
68
+ kind: 'arguments'
69
+ });
70
+ }
71
+ function validRuleIndex(index) {
72
+ if (!Number.isSafeInteger(index) || index < 0) {
73
+ throw new TypeError('ordered double rules require a non-negative integer index.');
74
+ }
75
+ return index;
76
+ }
77
+ function createCallIndexRuleStarter(index) {
78
+ return createCallRuleStarter({
79
+ index: validRuleIndex(index),
80
+ invocationKind: 'call',
81
+ kind: 'index'
82
+ });
83
+ }
84
+ function createConstructionIndexRuleStarter(index) {
85
+ return createConstructionRuleStarter({
86
+ index: validRuleIndex(index),
87
+ invocationKind: 'construction',
88
+ kind: 'index'
89
+ });
90
+ }
91
+ function createReturningBehavior(...value) {
92
+ return returnsBehavior(value[0]);
93
+ }
94
+ export const rule = {
95
+ calls: callsBehavior,
96
+ callsCallback: callsCallbackBehavior,
97
+ callsCallbackAsync: callsCallbackAsyncBehavior,
98
+ constructs: constructsBehavior,
99
+ onCall: createCallIndexRuleStarter,
100
+ onConstruction: createConstructionIndexRuleStarter,
101
+ rejects: rejectsBehavior,
102
+ resolves: resolvesBehavior,
103
+ returns: createReturningBehavior,
104
+ sequence: sequenceBehavior,
105
+ throws: throwsBehavior,
106
+ yields: createYieldingBehavior,
107
+ yieldsAsync: createAsyncYieldingBehavior,
108
+ yieldsAsyncFrom: createAsyncYieldingFromBehavior,
109
+ yieldsFrom: createYieldingFromBehavior,
110
+ when: createCallArgumentRuleStarter,
111
+ whenConstructedWith: createConstructionArgumentRuleStarter
112
+ };
113
+ //# sourceMappingURL=double-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"double-rule.js","sourceRoot":"","sources":["../../../../source/doubles/double-rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ import { answerFromBehavior, fallbackForInvocation, isConstructorInstance, isUnknownFunction, ruleMatches } from "./double-behavior.js";
2
+ import { createDoubleHistory } from "./double-history.js";
3
+ import { installDoubleChronology } from "./double-chronology.js";
4
+ import { createReturnedResult, createThrownResult } from "./double-history-record.js";
5
+ export function modeSet(...modes) {
6
+ return new Set(modes);
7
+ }
8
+ function assertTestDouble(value) {
9
+ if (!isUnknownFunction(value)) {
10
+ throw new TypeError('Expected double factory to create a function.');
11
+ }
12
+ }
13
+ function createSequenceRuntimeState() {
14
+ const sequenceIndexes = new Map();
15
+ return {
16
+ nextSequenceEntry(behavior) {
17
+ const index = sequenceIndexes.get(behavior) ?? 0;
18
+ const entry = behavior.behaviorKind === 'sequence' ? behavior.entries[index] : undefined;
19
+ if (entry !== undefined) {
20
+ sequenceIndexes.set(behavior, index + 1);
21
+ }
22
+ return entry;
23
+ },
24
+ reset() {
25
+ sequenceIndexes.clear();
26
+ }
27
+ };
28
+ }
29
+ function answerFromMatchingRules(rules, invocation, runtime) {
30
+ for (const configuredRule of rules) {
31
+ const answer = ruleMatches(configuredRule, invocation)
32
+ ? answerFromBehavior(configuredRule.behavior, invocation, runtime)
33
+ : { answered: false };
34
+ if (answer.answered) {
35
+ return answer;
36
+ }
37
+ }
38
+ return { answered: false };
39
+ }
40
+ function answerFromFallback(fallback, invocation, runtime) {
41
+ if (fallback === null) {
42
+ return { answered: false };
43
+ }
44
+ const fallbackBehavior = fallbackForInvocation(fallback, invocation);
45
+ return fallbackBehavior === null
46
+ ? { answered: false }
47
+ : answerFromBehavior(fallbackBehavior, invocation, runtime);
48
+ }
49
+ function answerFromRules(configuration, invocation, runtime) {
50
+ const ruleAnswer = answerFromMatchingRules(configuration.rules, invocation, runtime);
51
+ if (ruleAnswer.answered) {
52
+ return ruleAnswer;
53
+ }
54
+ const fallbackAnswer = answerFromFallback(configuration.fallback, invocation, runtime);
55
+ if (fallbackAnswer.answered || configuration.answer === null) {
56
+ return fallbackAnswer;
57
+ }
58
+ return {
59
+ answered: true,
60
+ value: configuration.answer(invocation)
61
+ };
62
+ }
63
+ function behaviorInvocationFrom(invocation) {
64
+ return {
65
+ arguments: invocation.arguments,
66
+ index: invocation.index,
67
+ kind: invocation.kind
68
+ };
69
+ }
70
+ function answerForInvocation(context, invocation, missingBehaviorMessage) {
71
+ const answer = answerFromRules(context.configuration, behaviorInvocationFrom(invocation), context.runtime);
72
+ if (!answer.answered) {
73
+ throw new TypeError(missingBehaviorMessage);
74
+ }
75
+ return answer.value;
76
+ }
77
+ function createCallInvocation(chronologyScope, history, argumentList) {
78
+ return {
79
+ arguments: Array.from(argumentList),
80
+ chronologyOrder: chronologyScope.nextOrder(),
81
+ index: history.callIndex(),
82
+ kind: 'call',
83
+ order: history.interactionOrder()
84
+ };
85
+ }
86
+ function createConstructionInvocation(chronologyScope, history, argumentList) {
87
+ return {
88
+ arguments: Array.from(argumentList),
89
+ chronologyOrder: chronologyScope.nextOrder(),
90
+ index: history.constructionIndex(),
91
+ kind: 'construction',
92
+ order: history.interactionOrder()
93
+ };
94
+ }
95
+ function unsupportedCall(context, invocation, thisValue) {
96
+ const error = new TypeError('Class constructor TestDouble cannot be invoked without new.');
97
+ context.history.recordCallResult(invocation, thisValue, createThrownResult(invocation, error));
98
+ context.chronology.record({ kind: invocation.kind, order: invocation.chronologyOrder });
99
+ throw error;
100
+ }
101
+ function unsupportedConstruction(context, invocation) {
102
+ const error = new TypeError('test double is not a constructor.');
103
+ context.history.recordConstructionResult(invocation, null, createThrownResult(invocation, error));
104
+ context.chronology.record({ kind: invocation.kind, order: invocation.chronologyOrder });
105
+ throw error;
106
+ }
107
+ function answerCall(context, invocation, thisValue) {
108
+ try {
109
+ const answer = answerForInvocation(context, invocation, 'test double has no configured behavior for this call.');
110
+ context.history.recordCallResult(invocation, thisValue, createReturnedResult(invocation, answer));
111
+ context.chronology.record({ kind: invocation.kind, order: invocation.chronologyOrder });
112
+ return answer;
113
+ }
114
+ catch (error) {
115
+ context.history.recordCallResult(invocation, thisValue, createThrownResult(invocation, error));
116
+ context.chronology.record({ kind: invocation.kind, order: invocation.chronologyOrder });
117
+ throw error;
118
+ }
119
+ }
120
+ function answerConstruction(context, invocation) {
121
+ const answer = answerForInvocation(context, invocation, 'test double has no configured behavior for this construction.');
122
+ if (!isConstructorInstance(answer)) {
123
+ throw new TypeError('test double constructor behavior must return an object instance.');
124
+ }
125
+ return answer;
126
+ }
127
+ function constructDouble(context, invocation) {
128
+ try {
129
+ const answer = answerConstruction(context, invocation);
130
+ context.history.recordConstructionResult(invocation, answer, createReturnedResult(invocation, answer));
131
+ context.chronology.record({ kind: invocation.kind, order: invocation.chronologyOrder });
132
+ return answer;
133
+ }
134
+ catch (error) {
135
+ context.history.recordConstructionResult(invocation, null, createThrownResult(invocation, error));
136
+ context.chronology.record({ kind: invocation.kind, order: invocation.chronologyOrder });
137
+ throw error;
138
+ }
139
+ }
140
+ function createDoubleTarget() {
141
+ return function TestDouble() {
142
+ throw new TypeError('test double target should not be reached.');
143
+ };
144
+ }
145
+ export function createDouble(configuration, chronologyScope, supportedModes) {
146
+ const sequenceRuntime = createSequenceRuntimeState();
147
+ const target = createDoubleTarget();
148
+ const chronology = installDoubleChronology(target, chronologyScope);
149
+ const history = createDoubleHistory(function resetDouble() {
150
+ chronology.reset();
151
+ sequenceRuntime.reset();
152
+ });
153
+ const runtime = {
154
+ nextSequenceEntry: sequenceRuntime.nextSequenceEntry,
155
+ trackAsyncIterator: history.trackAsyncIterator,
156
+ trackSyncIterator: history.trackSyncIterator
157
+ };
158
+ const context = { chronology, configuration, history, runtime, supportedModes };
159
+ history.install(target);
160
+ const candidate = new Proxy(target, {
161
+ apply(_target, thisArgument, argumentList) {
162
+ const invocation = createCallInvocation(chronologyScope, history, argumentList);
163
+ return supportedModes.has('call') ? answerCall(context, invocation, thisArgument) : unsupportedCall(context, invocation, thisArgument);
164
+ },
165
+ construct(_target, argumentList) {
166
+ const invocation = createConstructionInvocation(chronologyScope, history, argumentList);
167
+ return supportedModes.has('construction') ? constructDouble(context, invocation) : unsupportedConstruction(context, invocation);
168
+ }
169
+ });
170
+ assertTestDouble(candidate);
171
+ return candidate;
172
+ }
173
+ //# sourceMappingURL=double-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"double-runtime.js","sourceRoot":"","sources":["../../../../source/doubles/double-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type CallArguments<Signature> = Signature extends (...arguments_: infer Arguments) => unknown ? Arguments : never;
2
+ export type ConstructionArguments<Signature> = Signature extends new (...arguments_: infer Arguments) => unknown ? Arguments : never;
3
+ export type CallReturn<Signature> = Signature extends (...arguments_: readonly never[]) => infer ReturnValue ? ReturnValue : never;
4
+ export type ConstructionInstance<Signature> = Signature extends new (...arguments_: readonly never[]) => infer Instance ? Instance : never;
5
+ //# sourceMappingURL=double-signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"double-signature.d.ts","sourceRoot":"","sources":["../../../../source/doubles/double-signature.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,CAAC,SAAS,IAAI,SAAS,SAAS,CAAC,GAAG,UAAU,EAAE,MAAM,SAAS,KAAK,OAAO,GAAG,SAAS,GAC1G,KAAK,CAAC;AAEZ,MAAM,MAAM,qBAAqB,CAAC,SAAS,IAAI,SAAS,SAAS,KAAK,GAAG,UAAU,EAAE,MAAM,SAAS,KAAK,OAAO,GAC1G,SAAS,GACT,KAAK,CAAC;AAEZ,MAAM,MAAM,UAAU,CAAC,SAAS,IAAI,SAAS,SAAS,CAAC,GAAG,UAAU,EAAE,SAAS,KAAK,EAAE,KAAK,MAAM,WAAW,GACtG,WAAW,GACX,KAAK,CAAC;AAEZ,MAAM,MAAM,oBAAoB,CAAC,SAAS,IAAI,SAAS,SAAS,KAC5D,GAAG,UAAU,EAAE,SAAS,KAAK,EAAE,KAC9B,MAAM,QAAQ,GAAG,QAAQ,GACxB,KAAK,CAAC"}
@@ -0,0 +1,202 @@
1
+ import { defineCompositeAssertion } from "../assert/assertion-extension.js";
2
+ import { compareExactly, comparePartially } from "@overkill-dev/engine/compare/raw-comparison.js";
3
+ import { groupChildren, modeNoun } from "./double-usage-contract.js";
4
+ import { inspectedDouble, recordsFor, validNonNegativeInteger } from "./double-usage-inspection.js";
5
+ function partialArgumentsMatch(actual, expected) {
6
+ return actual.length === expected.length &&
7
+ expected.every(function argumentMatches(expectedArgument, index) {
8
+ return comparePartially(actual[index], expectedArgument);
9
+ });
10
+ }
11
+ function prefixArgumentsMatch(actual, expected) {
12
+ return actual.length >= expected.length &&
13
+ expected.every(function argumentMatches(expectedArgument, index) {
14
+ return comparePartially(actual[index], expectedArgument);
15
+ });
16
+ }
17
+ function argumentsMatch(actual, expected, match) {
18
+ if (match === 'exact') {
19
+ return compareExactly(actual, expected);
20
+ }
21
+ return match === 'prefix'
22
+ ? prefixArgumentsMatch(actual, expected)
23
+ : partialArgumentsMatch(actual, expected);
24
+ }
25
+ function matchingRecords(records, expectedArguments, match) {
26
+ return records.filter(function recordMatches(record) {
27
+ return argumentsMatch(record.arguments, expectedArguments, match);
28
+ });
29
+ }
30
+ function sameArityArguments(records, expectedArguments) {
31
+ return records
32
+ .map(function recordArguments(record) {
33
+ return record.arguments;
34
+ })
35
+ .filter(function sameLength(actualArguments) {
36
+ return actualArguments.length === expectedArguments.length;
37
+ });
38
+ }
39
+ function positiveArgumentFailure(input) {
40
+ if (input.match === 'prefix') {
41
+ return input.check.annotated(input.label).arrayContainsPartial(input.records.map(function recordArguments(record) {
42
+ return record.arguments;
43
+ }), input.expectedArguments);
44
+ }
45
+ if (input.match === 'partial') {
46
+ return input.check.annotated(input.label).membersPartialDeepEqual(sameArityArguments(input.records, input.expectedArguments), [input.expectedArguments]);
47
+ }
48
+ const firstSameArity = sameArityArguments(input.records, input.expectedArguments)[0];
49
+ return firstSameArity === undefined
50
+ ? input.check.annotated(`${input.label} arity`).true(false)
51
+ : input.check.annotated(input.label).deepEqual(firstSameArity, input.expectedArguments);
52
+ }
53
+ function specificArgumentCheck(input) {
54
+ if (input.record === null) {
55
+ return input.check.annotated(input.label).notNull(input.record);
56
+ }
57
+ if (input.match === 'exact') {
58
+ return input.check.annotated(input.label).deepEqual(input.record.arguments, input.expectedArguments);
59
+ }
60
+ return input.match === 'prefix'
61
+ ? input.check.annotated(input.label).partialDeepEqual(input.record.arguments, input.expectedArguments)
62
+ : input.check.group([
63
+ input.check.annotated(`${input.label} count`).length(input.record.arguments, input.expectedArguments.length),
64
+ input.check.annotated(input.label).partialDeepEqual(input.record.arguments, input.expectedArguments)
65
+ ]);
66
+ }
67
+ function emptyPrefixFailure(check, match, args) {
68
+ return match === 'prefix' && args.length === 0
69
+ ? check.fromThrowable('expected argument prefix', function expectedArgumentPrefix() {
70
+ throw new TypeError('Expected argument prefix to contain at least one item.');
71
+ })
72
+ : null;
73
+ }
74
+ function anyArgumentAssertion(input, records) {
75
+ const label = `${modeNoun(input.mode)} arguments`;
76
+ const matched = matchingRecords(records, input.args, input.match).length > 0;
77
+ if (input.negative) {
78
+ return input.check.annotated(label).false(matched);
79
+ }
80
+ return matched
81
+ ? input.check.annotated(label).true(true)
82
+ : positiveArgumentFailure({
83
+ check: input.check,
84
+ expectedArguments: input.args,
85
+ label,
86
+ match: input.match,
87
+ records
88
+ });
89
+ }
90
+ function onceArgumentAssertion(input, records) {
91
+ const label = `${modeNoun(input.mode)} arguments`;
92
+ const children = [
93
+ input.check.annotated(`${modeNoun(input.mode)} count`).equal(records.length, 1),
94
+ ...records[0] === undefined ? [] : [
95
+ specificArgumentCheck({
96
+ check: input.check,
97
+ expectedArguments: input.args,
98
+ label,
99
+ match: input.match,
100
+ record: records[0]
101
+ })
102
+ ]
103
+ ];
104
+ return groupChildren(input.check, children, label);
105
+ }
106
+ function lastArgumentAssertion(input, records) {
107
+ return specificArgumentCheck({
108
+ check: input.check,
109
+ expectedArguments: input.args,
110
+ label: `${modeNoun(input.mode)} arguments`,
111
+ match: input.match,
112
+ record: records.at(-1) ?? null
113
+ });
114
+ }
115
+ function unexpectedIndexedPosition(input) {
116
+ return input.check.fromThrowable('indexed double usage assertion', function unexpectedIndexedAssertion() {
117
+ throw new TypeError('Indexed assertions require an index argument.');
118
+ });
119
+ }
120
+ function positionedArgumentAssertion(input, records) {
121
+ if (input.position === 'any') {
122
+ return anyArgumentAssertion(input, records);
123
+ }
124
+ if (input.position === 'last') {
125
+ return lastArgumentAssertion(input, records);
126
+ }
127
+ return input.position === 'once'
128
+ ? onceArgumentAssertion(input, records)
129
+ : unexpectedIndexedPosition(input);
130
+ }
131
+ function argumentAssertion(input) {
132
+ const inspected = inspectedDouble(input.check, input.subject);
133
+ const prefixFailure = emptyPrefixFailure(input.check, input.match, input.args);
134
+ if (!inspected.valid) {
135
+ return inspected.failure;
136
+ }
137
+ return prefixFailure ?? positionedArgumentAssertion(input, recordsFor(inspected.history, input.mode));
138
+ }
139
+ function indexedArgumentAssertion(input) {
140
+ const inspected = inspectedDouble(input.check, input.subject);
141
+ const prefixFailure = emptyPrefixFailure(input.check, input.match, input.args);
142
+ if (!inspected.valid) {
143
+ return inspected.failure;
144
+ }
145
+ if (!validNonNegativeInteger(input.index)) {
146
+ return input.check.fromThrowable('expected usage index', function expectedUsageIndex() {
147
+ throw new TypeError('Expected usage index to be a non-negative integer.');
148
+ });
149
+ }
150
+ return prefixFailure ?? specificArgumentCheck({
151
+ check: input.check,
152
+ expectedArguments: input.args,
153
+ label: `${modeNoun(input.mode)} arguments`,
154
+ match: input.match,
155
+ record: recordsFor(inspected.history, input.mode)[input.index] ?? null
156
+ });
157
+ }
158
+ export function argumentReference(name, configuration) {
159
+ return defineCompositeAssertion({
160
+ assert(check, subject, args) {
161
+ return argumentAssertion({ args, check, ...configuration, subject });
162
+ },
163
+ formatSummary() {
164
+ return `Expected double ${modeNoun(configuration.mode)} arguments to match.`;
165
+ },
166
+ name
167
+ });
168
+ }
169
+ export function argumentPrefixReference(name, configuration) {
170
+ return defineCompositeAssertion({
171
+ assert(check, subject, args) {
172
+ return argumentAssertion({ args, check, match: 'prefix', ...configuration, subject });
173
+ },
174
+ formatSummary() {
175
+ return `Expected double ${modeNoun(configuration.mode)} arguments to match.`;
176
+ },
177
+ name
178
+ });
179
+ }
180
+ export function indexedArgumentReference(name, mode, match) {
181
+ return defineCompositeAssertion({
182
+ assert(check, subject, index, args) {
183
+ return indexedArgumentAssertion({ args, check, index, match, mode, subject });
184
+ },
185
+ formatSummary() {
186
+ return `Expected indexed double ${modeNoun(mode)} arguments to match.`;
187
+ },
188
+ name
189
+ });
190
+ }
191
+ export function indexedArgumentPrefixReference(name, mode) {
192
+ return defineCompositeAssertion({
193
+ assert(check, subject, index, args) {
194
+ return indexedArgumentAssertion({ args, check, index, match: 'prefix', mode, subject });
195
+ },
196
+ formatSummary() {
197
+ return `Expected indexed double ${modeNoun(mode)} arguments to match.`;
198
+ },
199
+ name
200
+ });
201
+ }
202
+ //# sourceMappingURL=double-usage-argument-assertion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"double-usage-argument-assertion.js","sourceRoot":"","sources":["../../../../source/doubles/double-usage-argument-assertion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { CompositeCheckBuilder } from '../assert/assertion-extension.ts';
2
+ import type { CompositeAssertionReference, CompositeAssertionReturn } from '@overkill-dev/engine/packages/engine/assertion-protocol.entry-point.js';
3
+ import type { CompositeAssertionChildNode } from '@overkill-dev/engine/assertion-protocol/assertion-node.js';
4
+ export type UsageMode = 'call' | 'construction' | 'interaction';
5
+ export type ArgumentMatch = 'exact' | 'partial' | 'prefix';
6
+ export type AssertionCheck = CompositeCheckBuilder<'assert'>;
7
+ export type AssertionChild = CompositeAssertionChildNode<'assert'>;
8
+ export type AssertionGroupItem = Parameters<AssertionCheck['group']>[0][number];
9
+ export type AssertionResult = CompositeAssertionReturn<'assert'>;
10
+ export type UsageAssertionReference<Arguments extends readonly unknown[]> = CompositeAssertionReference<Arguments, AssertionResult>;
11
+ type DoubleList = readonly [unknown, unknown, ...unknown[]];
12
+ type AnyArguments = readonly unknown[];
13
+ type NonEmptyAnyArguments = readonly [unknown, ...unknown[]];
14
+ export type CountArguments = readonly [double: unknown, expectedCount: number];
15
+ export type IteratorValuesArguments = readonly [double: unknown, values: readonly unknown[]];
16
+ export type ValueArguments = readonly [double: unknown];
17
+ export type OrderArguments = readonly [doubles: DoubleList];
18
+ export type AggregateArguments = readonly [double: unknown, args: AnyArguments];
19
+ export type AggregatePrefixArguments = readonly [double: unknown, args: NonEmptyAnyArguments];
20
+ export type AggregateIndexedArguments = readonly [double: unknown, index: number, args: AnyArguments];
21
+ export type AggregateIndexedPrefixArguments = readonly [
22
+ double: unknown,
23
+ index: number,
24
+ args: NonEmptyAnyArguments
25
+ ];
26
+ export declare function modeNoun(mode: UsageMode): string;
27
+ export declare function groupChildren(check: AssertionCheck, children: readonly AssertionGroupItem[], passingLabel: string): AssertionResult;
28
+ export {};
29
+ //# sourceMappingURL=double-usage-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"double-usage-contract.d.ts","sourceRoot":"","sources":["../../../../source/doubles/double-usage-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,qBAAqB,EACxB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EACR,2BAA2B,EAC3B,wBAAwB,EAC3B,MAAM,8CAA8C,CAAC;AACtD,OAAO,KAAK,EACR,2BAA2B,EAC9B,MAAM,yCAAyC,CAAC;AAEjD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,cAAc,GAAG,aAAa,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AAC7D,MAAM,MAAM,cAAc,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;AACnE,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAChF,MAAM,MAAM,eAAe,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AACjE,MAAM,MAAM,uBAAuB,CAAC,SAAS,SAAS,SAAS,OAAO,EAAE,IAAI,2BAA2B,CACnG,SAAS,EACT,eAAe,CAClB,CAAC;AAEF,KAAK,UAAU,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAC5D,KAAK,YAAY,GAAG,SAAS,OAAO,EAAE,CAAC;AACvC,KAAK,oBAAoB,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAC/E,MAAM,MAAM,uBAAuB,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC;AAC7F,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AAChF,MAAM,MAAM,wBAAwB,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;AAC9F,MAAM,MAAM,yBAAyB,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AACtG,MAAM,MAAM,+BAA+B,GAAG,SAAS;IACnD,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,oBAAoB;CAC7B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAMhD;AAED,wBAAgB,aAAa,CACzB,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,SAAS,kBAAkB,EAAE,EACvC,YAAY,EAAE,MAAM,GACrB,eAAe,CAIjB"}
@@ -0,0 +1,11 @@
1
+ export function modeNoun(mode) {
2
+ if (mode === 'call') {
3
+ return 'call';
4
+ }
5
+ return mode === 'construction' ? 'construction' : 'interaction';
6
+ }
7
+ export function groupChildren(check, children, passingLabel) {
8
+ const [first, ...rest] = children;
9
+ return first === undefined ? check.annotated(passingLabel).true(true) : check.group([first, ...rest]);
10
+ }
11
+ //# sourceMappingURL=double-usage-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"double-usage-contract.js","sourceRoot":"","sources":["../../../../source/doubles/double-usage-contract.ts"],"names":[],"mappings":"AAuCA,MAAM,UAAU,QAAQ,CAAC,IAAe;IACpC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,aAAa,CACzB,KAAqB,EACrB,QAAuC,EACvC,YAAoB;IAEpB,MAAM,CAAE,KAAK,EAAE,GAAG,IAAI,CAAE,GAAG,QAAQ,CAAC;IAEpC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAE,KAAK,EAAE,GAAG,IAAI,CAAE,CAAC,CAAC;AAC5G,CAAC"}