@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.
- package/LICENSE +21 -0
- package/assert/assertion-extension.d.ts +65 -0
- package/assert/assertion-extension.d.ts.map +1 -0
- package/assert/assertion-extension.js +250 -0
- package/assert/assertion-extension.js.map +1 -0
- package/doubles/disposal-symbol.js +10 -0
- package/doubles/disposal-symbol.js.map +1 -0
- package/doubles/double-behavior.d.ts +106 -0
- package/doubles/double-behavior.d.ts.map +1 -0
- package/doubles/double-behavior.js +257 -0
- package/doubles/double-behavior.js.map +1 -0
- package/doubles/double-chronology.js +78 -0
- package/doubles/double-chronology.js.map +1 -0
- package/doubles/double-history-api.js +125 -0
- package/doubles/double-history-api.js.map +1 -0
- package/doubles/double-history-record.d.ts +82 -0
- package/doubles/double-history-record.d.ts.map +1 -0
- package/doubles/double-history-record.js +65 -0
- package/doubles/double-history-record.js.map +1 -0
- package/doubles/double-history-store.d.ts +21 -0
- package/doubles/double-history-store.d.ts.map +1 -0
- package/doubles/double-history-store.js +118 -0
- package/doubles/double-history-store.js.map +1 -0
- package/doubles/double-history.d.ts +141 -0
- package/doubles/double-history.d.ts.map +1 -0
- package/doubles/double-history.js +32 -0
- package/doubles/double-history.js.map +1 -0
- package/doubles/double-iterator-event-types.d.ts +25 -0
- package/doubles/double-iterator-event-types.d.ts.map +1 -0
- package/doubles/double-iterator-tracking.d.ts +12 -0
- package/doubles/double-iterator-tracking.d.ts.map +1 -0
- package/doubles/double-iterator-tracking.js +161 -0
- package/doubles/double-iterator-tracking.js.map +1 -0
- package/doubles/double-rule-arguments.d.ts +18 -0
- package/doubles/double-rule-arguments.d.ts.map +1 -0
- package/doubles/double-rule-callback.d.ts +40 -0
- package/doubles/double-rule-callback.d.ts.map +1 -0
- package/doubles/double-rule-callback.js +84 -0
- package/doubles/double-rule-callback.js.map +1 -0
- package/doubles/double-rule-generator.d.ts +108 -0
- package/doubles/double-rule-generator.d.ts.map +1 -0
- package/doubles/double-rule-generator.js +37 -0
- package/doubles/double-rule-generator.js.map +1 -0
- package/doubles/double-rule-types.d.ts +162 -0
- package/doubles/double-rule-types.d.ts.map +1 -0
- package/doubles/double-rule.d.ts +3 -0
- package/doubles/double-rule.d.ts.map +1 -0
- package/doubles/double-rule.js +113 -0
- package/doubles/double-rule.js.map +1 -0
- package/doubles/double-runtime.js +173 -0
- package/doubles/double-runtime.js.map +1 -0
- package/doubles/double-signature.d.ts +5 -0
- package/doubles/double-signature.d.ts.map +1 -0
- package/doubles/double-usage-argument-assertion.js +202 -0
- package/doubles/double-usage-argument-assertion.js.map +1 -0
- package/doubles/double-usage-contract.d.ts +29 -0
- package/doubles/double-usage-contract.d.ts.map +1 -0
- package/doubles/double-usage-contract.js +11 -0
- package/doubles/double-usage-contract.js.map +1 -0
- package/doubles/double-usage-count-assertion.js +73 -0
- package/doubles/double-usage-count-assertion.js.map +1 -0
- package/doubles/double-usage-disposal-assertion.js +175 -0
- package/doubles/double-usage-disposal-assertion.js.map +1 -0
- package/doubles/double-usage-inspection.js +59 -0
- package/doubles/double-usage-inspection.js.map +1 -0
- package/doubles/double-usage-iterator-assertion.js +124 -0
- package/doubles/double-usage-iterator-assertion.js.map +1 -0
- package/doubles/double-usage-order-assertion.js +91 -0
- package/doubles/double-usage-order-assertion.js.map +1 -0
- package/doubles/double-usage.d.ts +81 -0
- package/doubles/double-usage.d.ts.map +1 -0
- package/doubles/double-usage.js +228 -0
- package/doubles/double-usage.js.map +1 -0
- package/doubles/protocol-disposable-double.d.ts +16 -0
- package/doubles/protocol-disposable-double.d.ts.map +1 -0
- package/doubles/protocol-disposable-double.js +37 -0
- package/doubles/protocol-disposable-double.js.map +1 -0
- package/doubles/protocol-double-metadata.js +30 -0
- package/doubles/protocol-double-metadata.js.map +1 -0
- package/doubles/protocol-double.d.ts +50 -0
- package/doubles/protocol-double.d.ts.map +1 -0
- package/doubles/protocol-double.js +76 -0
- package/doubles/protocol-double.js.map +1 -0
- package/doubles/protocol-iterator-double.d.ts +93 -0
- package/doubles/protocol-iterator-double.d.ts.map +1 -0
- package/doubles/protocol-iterator-double.js +512 -0
- package/doubles/protocol-iterator-double.js.map +1 -0
- package/doubles/test-double.d.ts +62 -0
- package/doubles/test-double.d.ts.map +1 -0
- package/doubles/test-double.js +192 -0
- package/doubles/test-double.js.map +1 -0
- package/package.json +38 -6
- package/packages/doubles/doubles.entry-point.d.ts +13 -0
- package/packages/doubles/doubles.entry-point.d.ts.map +1 -0
- package/packages/doubles/doubles.entry-point.js +5 -0
- package/packages/doubles/doubles.entry-point.js.map +1 -0
- package/readme.md +423 -5
- package/sbom.cdx.json +50 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { defineCompositeAssertion } from "../assert/assertion-extension.js";
|
|
2
|
+
import { modeNoun } from "./double-usage-contract.js";
|
|
3
|
+
import { countFor, inspectedDouble, validNonNegativeInteger } from "./double-usage-inspection.js";
|
|
4
|
+
function countAssertion(input) {
|
|
5
|
+
const inspected = inspectedDouble(input.check, input.subject);
|
|
6
|
+
if (!inspected.valid) {
|
|
7
|
+
return inspected.failure;
|
|
8
|
+
}
|
|
9
|
+
return input.check.group([
|
|
10
|
+
input.check.annotated('expected count').true(validNonNegativeInteger(input.expectedCount)),
|
|
11
|
+
input.check.annotated(`${modeNoun(input.mode)} count`).equal(countFor(inspected.history, input.mode), input.expectedCount)
|
|
12
|
+
]);
|
|
13
|
+
}
|
|
14
|
+
function atLeastOneAssertion(check, subject, mode) {
|
|
15
|
+
const inspected = inspectedDouble(check, subject);
|
|
16
|
+
return inspected.valid
|
|
17
|
+
? check.annotated(`${modeNoun(mode)} count`).greaterThan(countFor(inspected.history, mode), 0)
|
|
18
|
+
: inspected.failure;
|
|
19
|
+
}
|
|
20
|
+
function noEventsAssertion(check, subject, mode) {
|
|
21
|
+
const inspected = inspectedDouble(check, subject);
|
|
22
|
+
return inspected.valid
|
|
23
|
+
? check.annotated(`${modeNoun(mode)} count`).equal(countFor(inspected.history, mode), 0)
|
|
24
|
+
: inspected.failure;
|
|
25
|
+
}
|
|
26
|
+
function onceAssertion(check, subject, mode) {
|
|
27
|
+
return countAssertion({ check, expectedCount: 1, mode, subject });
|
|
28
|
+
}
|
|
29
|
+
export function countReference(name, mode) {
|
|
30
|
+
return defineCompositeAssertion({
|
|
31
|
+
assert(check, subject, expectedCount) {
|
|
32
|
+
return countAssertion({ check, expectedCount, mode, subject });
|
|
33
|
+
},
|
|
34
|
+
formatSummary() {
|
|
35
|
+
return `Expected double ${modeNoun(mode)} count to match.`;
|
|
36
|
+
},
|
|
37
|
+
name
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export function atLeastOneReference(name, mode) {
|
|
41
|
+
return defineCompositeAssertion({
|
|
42
|
+
assert(check, subject) {
|
|
43
|
+
return atLeastOneAssertion(check, subject, mode);
|
|
44
|
+
},
|
|
45
|
+
formatSummary() {
|
|
46
|
+
return `Expected double to have at least one ${modeNoun(mode)}.`;
|
|
47
|
+
},
|
|
48
|
+
name
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export function noEventsReference(name, mode) {
|
|
52
|
+
return defineCompositeAssertion({
|
|
53
|
+
assert(check, subject) {
|
|
54
|
+
return noEventsAssertion(check, subject, mode);
|
|
55
|
+
},
|
|
56
|
+
formatSummary() {
|
|
57
|
+
return `Expected double not to have ${modeNoun(mode)}s.`;
|
|
58
|
+
},
|
|
59
|
+
name
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export function onceReference(name, mode) {
|
|
63
|
+
return defineCompositeAssertion({
|
|
64
|
+
assert(check, subject) {
|
|
65
|
+
return onceAssertion(check, subject, mode);
|
|
66
|
+
},
|
|
67
|
+
formatSummary() {
|
|
68
|
+
return `Expected double to have exactly one ${modeNoun(mode)}.`;
|
|
69
|
+
},
|
|
70
|
+
name
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=double-usage-count-assertion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-count-assertion.js","sourceRoot":"","sources":["../../../../source/doubles/double-usage-count-assertion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { defineCompositeAssertion } from "../assert/assertion-extension.js";
|
|
2
|
+
import { groupChildren } from "./double-usage-contract.js";
|
|
3
|
+
import { chronologyFor, inspectedDouble, validNonNegativeInteger } from "./double-usage-inspection.js";
|
|
4
|
+
import { protocolDisposeMethod } from "./protocol-double-metadata.js";
|
|
5
|
+
const minimumOrderedDisposables = 2;
|
|
6
|
+
function invalidDisposableFailure(check) {
|
|
7
|
+
return check.fromThrowable('test disposable', function expectedTestDisposable() {
|
|
8
|
+
throw new TypeError('Expected an Overkill test disposable.');
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function inspectedDisposal(check, subject) {
|
|
12
|
+
const disposeMethod = protocolDisposeMethod(subject);
|
|
13
|
+
if (disposeMethod === null) {
|
|
14
|
+
return {
|
|
15
|
+
failure: invalidDisposableFailure(check),
|
|
16
|
+
valid: false
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const inspection = inspectedDouble(check, disposeMethod);
|
|
20
|
+
return inspection.valid
|
|
21
|
+
? {
|
|
22
|
+
inspection,
|
|
23
|
+
valid: true
|
|
24
|
+
}
|
|
25
|
+
: {
|
|
26
|
+
failure: inspection.failure,
|
|
27
|
+
valid: false
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function disposalCount(check, subject) {
|
|
31
|
+
const inspected = inspectedDisposal(check, subject);
|
|
32
|
+
return inspected.valid
|
|
33
|
+
? check.annotated('dispose count').greaterThan(inspected.inspection.history.callCount, 0)
|
|
34
|
+
: inspected.failure;
|
|
35
|
+
}
|
|
36
|
+
function noDisposal(check, subject) {
|
|
37
|
+
const inspected = inspectedDisposal(check, subject);
|
|
38
|
+
return inspected.valid
|
|
39
|
+
? check.annotated('dispose count').equal(inspected.inspection.history.callCount, 0)
|
|
40
|
+
: inspected.failure;
|
|
41
|
+
}
|
|
42
|
+
function disposalOnce(check, subject) {
|
|
43
|
+
const inspected = inspectedDisposal(check, subject);
|
|
44
|
+
return inspected.valid
|
|
45
|
+
? check.annotated('dispose count').equal(inspected.inspection.history.callCount, 1)
|
|
46
|
+
: inspected.failure;
|
|
47
|
+
}
|
|
48
|
+
function expectedDisposalCount(check, subject, expectedCount) {
|
|
49
|
+
const inspected = inspectedDisposal(check, subject);
|
|
50
|
+
if (!inspected.valid) {
|
|
51
|
+
return inspected.failure;
|
|
52
|
+
}
|
|
53
|
+
return check.group([
|
|
54
|
+
check.annotated('expected count').true(validNonNegativeInteger(expectedCount)),
|
|
55
|
+
check.annotated('dispose count').equal(inspected.inspection.history.callCount, expectedCount)
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
function inspectDisposables(check, disposables) {
|
|
59
|
+
const inspections = [];
|
|
60
|
+
const failures = [];
|
|
61
|
+
for (const disposable of disposables) {
|
|
62
|
+
const inspected = inspectedDisposal(check, disposable);
|
|
63
|
+
if (inspected.valid) {
|
|
64
|
+
inspections.push(inspected.inspection);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
failures.push(inspected.failure);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return failures.length === 0
|
|
71
|
+
? {
|
|
72
|
+
inspections,
|
|
73
|
+
valid: true
|
|
74
|
+
}
|
|
75
|
+
: {
|
|
76
|
+
result: groupChildren(check, failures, 'disposal'),
|
|
77
|
+
valid: false
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function hasMixedScope(inspections) {
|
|
81
|
+
const firstScope = inspections[0]?.chronology.scope;
|
|
82
|
+
return inspections.some(function hasDifferentScope(inspection) {
|
|
83
|
+
return inspection.chronology.scope !== firstScope;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function sharedScopeFailure(check) {
|
|
87
|
+
return check.fromThrowable('dispose order', function expectedSharedScope() {
|
|
88
|
+
throw new TypeError('Expected ordered disposables to belong to the same double scope.');
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function disposalEventGroups(inspections) {
|
|
92
|
+
return inspections.map(function eventsFor(inspection) {
|
|
93
|
+
return chronologyFor(inspection.chronology, 'call');
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function missingDisposalChecks(check, eventGroups) {
|
|
97
|
+
return eventGroups.flatMap(function missingEvents(events, index) {
|
|
98
|
+
return events.length === 0 ? [check.annotated(`dispose ${index}`).notEmpty(events)] : [];
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function disposalOrderChecks(check, eventGroups) {
|
|
102
|
+
return eventGroups.slice(0, -1).flatMap(function pairOrder(previousEvents, index) {
|
|
103
|
+
const nextEvents = eventGroups[index + 1] ?? [];
|
|
104
|
+
const previousLast = previousEvents.at(-1);
|
|
105
|
+
const nextFirst = nextEvents[0];
|
|
106
|
+
return previousLast === undefined || nextFirst === undefined ? [] : [
|
|
107
|
+
check.annotated(`dispose order ${index} before ${index + 1}`).lessThan(previousLast.order, nextFirst.order)
|
|
108
|
+
];
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function disposalOrder(check, disposables) {
|
|
112
|
+
if (disposables.length < minimumOrderedDisposables) {
|
|
113
|
+
return check.fromThrowable('dispose order', function expectedDisposalOrder() {
|
|
114
|
+
throw new TypeError('Expected at least two disposables.');
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const inspected = inspectDisposables(check, disposables);
|
|
118
|
+
if (!inspected.valid) {
|
|
119
|
+
return inspected.result;
|
|
120
|
+
}
|
|
121
|
+
if (hasMixedScope(inspected.inspections)) {
|
|
122
|
+
return sharedScopeFailure(check);
|
|
123
|
+
}
|
|
124
|
+
const eventGroups = disposalEventGroups(inspected.inspections);
|
|
125
|
+
return groupChildren(check, [
|
|
126
|
+
...missingDisposalChecks(check, eventGroups),
|
|
127
|
+
...disposalOrderChecks(check, eventGroups)
|
|
128
|
+
], 'dispose order');
|
|
129
|
+
}
|
|
130
|
+
export function disposedReference(name) {
|
|
131
|
+
return defineCompositeAssertion({
|
|
132
|
+
assert: disposalCount,
|
|
133
|
+
formatSummary() {
|
|
134
|
+
return 'Expected disposable to have been disposed.';
|
|
135
|
+
},
|
|
136
|
+
name
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
export function notDisposedReference(name) {
|
|
140
|
+
return defineCompositeAssertion({
|
|
141
|
+
assert: noDisposal,
|
|
142
|
+
formatSummary() {
|
|
143
|
+
return 'Expected disposable not to have been disposed.';
|
|
144
|
+
},
|
|
145
|
+
name
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
export function disposedOnceReference(name) {
|
|
149
|
+
return defineCompositeAssertion({
|
|
150
|
+
assert: disposalOnce,
|
|
151
|
+
formatSummary() {
|
|
152
|
+
return 'Expected disposable to have been disposed once.';
|
|
153
|
+
},
|
|
154
|
+
name
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
export function disposeCountReference(name) {
|
|
158
|
+
return defineCompositeAssertion({
|
|
159
|
+
assert: expectedDisposalCount,
|
|
160
|
+
formatSummary() {
|
|
161
|
+
return 'Expected dispose count to match.';
|
|
162
|
+
},
|
|
163
|
+
name
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
export function disposeOrderReference(name) {
|
|
167
|
+
return defineCompositeAssertion({
|
|
168
|
+
assert: disposalOrder,
|
|
169
|
+
formatSummary() {
|
|
170
|
+
return 'Expected dispose order to match.';
|
|
171
|
+
},
|
|
172
|
+
name
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=double-usage-disposal-assertion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-disposal-assertion.js","sourceRoot":"","sources":["../../../../source/doubles/double-usage-disposal-assertion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { doubleChronology } from "./double-chronology.js";
|
|
2
|
+
export function recordsFor(history, mode) {
|
|
3
|
+
if (mode === 'call') {
|
|
4
|
+
return history.calls;
|
|
5
|
+
}
|
|
6
|
+
return mode === 'construction' ? history.constructions : history.interactions;
|
|
7
|
+
}
|
|
8
|
+
export function chronologyFor(chronology, mode) {
|
|
9
|
+
if (mode === 'call') {
|
|
10
|
+
return chronology.calls;
|
|
11
|
+
}
|
|
12
|
+
return mode === 'construction' ? chronology.constructions : chronology.interactions;
|
|
13
|
+
}
|
|
14
|
+
export function countFor(history, mode) {
|
|
15
|
+
if (mode === 'call') {
|
|
16
|
+
return history.callCount;
|
|
17
|
+
}
|
|
18
|
+
return mode === 'construction' ? history.constructionCount : history.interactionCount;
|
|
19
|
+
}
|
|
20
|
+
function hasNumberHistoryProperties(value) {
|
|
21
|
+
return typeof value === 'function' &&
|
|
22
|
+
typeof Reflect.get(value, 'callCount') === 'number' &&
|
|
23
|
+
typeof Reflect.get(value, 'constructionCount') === 'number' &&
|
|
24
|
+
typeof Reflect.get(value, 'interactionCount') === 'number' &&
|
|
25
|
+
typeof Reflect.get(value, 'iteratorEventCount') === 'number';
|
|
26
|
+
}
|
|
27
|
+
function hasArrayHistoryProperties(value) {
|
|
28
|
+
return typeof value === 'function' &&
|
|
29
|
+
Array.isArray(Reflect.get(value, 'calls')) &&
|
|
30
|
+
Array.isArray(Reflect.get(value, 'constructions')) &&
|
|
31
|
+
Array.isArray(Reflect.get(value, 'interactions')) &&
|
|
32
|
+
Array.isArray(Reflect.get(value, 'iteratorEvents'));
|
|
33
|
+
}
|
|
34
|
+
function isHistoryShape(value) {
|
|
35
|
+
return hasNumberHistoryProperties(value) &&
|
|
36
|
+
hasArrayHistoryProperties(value);
|
|
37
|
+
}
|
|
38
|
+
function invalidDoubleFailure(check) {
|
|
39
|
+
return check.fromThrowable('test double', function expectedTestDouble() {
|
|
40
|
+
throw new TypeError('Expected an Overkill test double.');
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export function inspectedDouble(check, subject) {
|
|
44
|
+
const chronology = doubleChronology(subject);
|
|
45
|
+
return chronology === null || !isHistoryShape(subject)
|
|
46
|
+
? {
|
|
47
|
+
failure: invalidDoubleFailure(check),
|
|
48
|
+
valid: false
|
|
49
|
+
}
|
|
50
|
+
: {
|
|
51
|
+
chronology,
|
|
52
|
+
history: subject,
|
|
53
|
+
valid: true
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function validNonNegativeInteger(value) {
|
|
57
|
+
return Number.isSafeInteger(value) && value >= 0;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=double-usage-inspection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-inspection.js","sourceRoot":"","sources":["../../../../source/doubles/double-usage-inspection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { defineCompositeAssertion } from "../assert/assertion-extension.js";
|
|
2
|
+
import { groupChildren } from "./double-usage-contract.js";
|
|
3
|
+
import { inspectedDouble, validNonNegativeInteger } from "./double-usage-inspection.js";
|
|
4
|
+
import { protocolIteratorEvents } from "./protocol-double-metadata.js";
|
|
5
|
+
function inspectedIteratorEvents(check, subject) {
|
|
6
|
+
const protocolEvents = protocolIteratorEvents(subject);
|
|
7
|
+
if (protocolEvents !== null) {
|
|
8
|
+
return {
|
|
9
|
+
events: protocolEvents,
|
|
10
|
+
valid: true
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const inspected = inspectedDouble(check, subject);
|
|
14
|
+
return inspected.valid
|
|
15
|
+
? {
|
|
16
|
+
events: inspected.history.iteratorEvents,
|
|
17
|
+
valid: true
|
|
18
|
+
}
|
|
19
|
+
: {
|
|
20
|
+
result: inspected.failure,
|
|
21
|
+
valid: false
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function iteratorEventCount(check, subject) {
|
|
25
|
+
const inspected = inspectedIteratorEvents(check, subject);
|
|
26
|
+
return inspected.valid
|
|
27
|
+
? check.annotated('iterator event count').greaterThan(inspected.events.length, 0)
|
|
28
|
+
: inspected.result;
|
|
29
|
+
}
|
|
30
|
+
function noIteratorEvents(check, subject) {
|
|
31
|
+
const inspected = inspectedIteratorEvents(check, subject);
|
|
32
|
+
return inspected.valid
|
|
33
|
+
? check.annotated('iterator event count').equal(inspected.events.length, 0)
|
|
34
|
+
: inspected.result;
|
|
35
|
+
}
|
|
36
|
+
function yieldedValues(history) {
|
|
37
|
+
return history
|
|
38
|
+
.iteratorEvents
|
|
39
|
+
.filter(function yieldedEvent(event) {
|
|
40
|
+
return event.kind === 'yield';
|
|
41
|
+
})
|
|
42
|
+
.map(function yieldedValue(event) {
|
|
43
|
+
return event.value;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function iteratorCountAssertion(input) {
|
|
47
|
+
const inspected = inspectedIteratorEvents(input.check, input.subject);
|
|
48
|
+
if (!inspected.valid) {
|
|
49
|
+
return inspected.result;
|
|
50
|
+
}
|
|
51
|
+
const actualCounts = {
|
|
52
|
+
event: inspected.events.length,
|
|
53
|
+
yield: yieldedValues({ iteratorEvents: inspected.events }).length
|
|
54
|
+
};
|
|
55
|
+
return input.check.group([
|
|
56
|
+
input.check.annotated('expected count').true(validNonNegativeInteger(input.expectedCount)),
|
|
57
|
+
input.check.annotated(input.value === 'event' ? 'iterator event count' : 'yield count').equal(actualCounts[input.value], input.expectedCount)
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
function yieldedExactlyAssertion(check, subject, expectedValues) {
|
|
61
|
+
const inspected = inspectedDouble(check, subject);
|
|
62
|
+
const protocolEvents = protocolIteratorEvents(subject);
|
|
63
|
+
if (protocolEvents !== null) {
|
|
64
|
+
return groupChildren(check, [
|
|
65
|
+
check.annotated('yielded values').deepEqual(yieldedValues({ iteratorEvents: protocolEvents }), expectedValues)
|
|
66
|
+
], 'yielded values');
|
|
67
|
+
}
|
|
68
|
+
if (!inspected.valid) {
|
|
69
|
+
return inspected.failure;
|
|
70
|
+
}
|
|
71
|
+
return groupChildren(check, [
|
|
72
|
+
check.annotated('yielded values').deepEqual(yieldedValues(inspected.history), expectedValues)
|
|
73
|
+
], 'yielded values');
|
|
74
|
+
}
|
|
75
|
+
export function iteratedReference(name) {
|
|
76
|
+
return defineCompositeAssertion({
|
|
77
|
+
assert: iteratorEventCount,
|
|
78
|
+
formatSummary() {
|
|
79
|
+
return 'Expected double iterator to have been consumed.';
|
|
80
|
+
},
|
|
81
|
+
name
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
export function notIteratedReference(name) {
|
|
85
|
+
return defineCompositeAssertion({
|
|
86
|
+
assert: noIteratorEvents,
|
|
87
|
+
formatSummary() {
|
|
88
|
+
return 'Expected double iterator not to have been consumed.';
|
|
89
|
+
},
|
|
90
|
+
name
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export function iteratorEventCountReference(name) {
|
|
94
|
+
return defineCompositeAssertion({
|
|
95
|
+
assert(check, subject, expectedCount) {
|
|
96
|
+
return iteratorCountAssertion({ check, expectedCount, subject, value: 'event' });
|
|
97
|
+
},
|
|
98
|
+
formatSummary() {
|
|
99
|
+
return 'Expected double iterator event count to match.';
|
|
100
|
+
},
|
|
101
|
+
name
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export function yieldCountReference(name) {
|
|
105
|
+
return defineCompositeAssertion({
|
|
106
|
+
assert(check, subject, expectedCount) {
|
|
107
|
+
return iteratorCountAssertion({ check, expectedCount, subject, value: 'yield' });
|
|
108
|
+
},
|
|
109
|
+
formatSummary() {
|
|
110
|
+
return 'Expected double yield count to match.';
|
|
111
|
+
},
|
|
112
|
+
name
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
export function yieldedExactlyReference(name) {
|
|
116
|
+
return defineCompositeAssertion({
|
|
117
|
+
assert: yieldedExactlyAssertion,
|
|
118
|
+
formatSummary() {
|
|
119
|
+
return 'Expected double yielded values to match exactly.';
|
|
120
|
+
},
|
|
121
|
+
name
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=double-usage-iterator-assertion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-iterator-assertion.js","sourceRoot":"","sources":["../../../../source/doubles/double-usage-iterator-assertion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { defineCompositeAssertion } from "../assert/assertion-extension.js";
|
|
2
|
+
import { groupChildren, modeNoun } from "./double-usage-contract.js";
|
|
3
|
+
import { chronologyFor, inspectedDouble } from "./double-usage-inspection.js";
|
|
4
|
+
const minimumOrderedDoubles = 2;
|
|
5
|
+
function inspectDoubles(check, doubles) {
|
|
6
|
+
const inspections = [];
|
|
7
|
+
const failures = [];
|
|
8
|
+
for (const double of doubles) {
|
|
9
|
+
const inspection = inspectedDouble(check, double);
|
|
10
|
+
if (inspection.valid) {
|
|
11
|
+
inspections.push(inspection);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
failures.push(inspection.failure);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return failures.length === 0
|
|
18
|
+
? {
|
|
19
|
+
inspections,
|
|
20
|
+
valid: true
|
|
21
|
+
}
|
|
22
|
+
: {
|
|
23
|
+
result: groupChildren(check, failures, 'double usage'),
|
|
24
|
+
valid: false
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function hasMixedScope(inspections) {
|
|
28
|
+
const firstScope = inspections[0]?.chronology.scope;
|
|
29
|
+
return inspections.some(function hasDifferentScope(inspection) {
|
|
30
|
+
return inspection.chronology.scope !== firstScope;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function sharedScopeFailure(check) {
|
|
34
|
+
return check.fromThrowable('double usage scope', function expectedSharedScope() {
|
|
35
|
+
throw new TypeError('Expected ordered doubles to belong to the same double scope.');
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function eventGroupsFor(inspections, mode) {
|
|
39
|
+
return inspections.map(function eventsFor(inspection) {
|
|
40
|
+
return chronologyFor(inspection.chronology, mode);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function missingEventChecks(check, eventGroups, mode) {
|
|
44
|
+
return eventGroups.flatMap(function missingEvents(events, index) {
|
|
45
|
+
return events.length === 0 ? [check.annotated(`${modeNoun(mode)} ${index}`).notEmpty(events)] : [];
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function orderChecks(check, eventGroups, mode) {
|
|
49
|
+
return eventGroups.slice(0, -1).flatMap(function pairOrder(previousEvents, index) {
|
|
50
|
+
const nextEvents = eventGroups[index + 1] ?? [];
|
|
51
|
+
const previousLast = previousEvents.at(-1);
|
|
52
|
+
const nextFirst = nextEvents[0];
|
|
53
|
+
return previousLast === undefined || nextFirst === undefined ? [] : [
|
|
54
|
+
check
|
|
55
|
+
.annotated(`${modeNoun(mode)} order ${index} before ${index + 1}`)
|
|
56
|
+
.lessThan(previousLast.order, nextFirst.order)
|
|
57
|
+
];
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function orderAssertion(input) {
|
|
61
|
+
if (input.doubles.length < minimumOrderedDoubles) {
|
|
62
|
+
return input.check.fromThrowable('double usage order', function expectedDoubleOrder() {
|
|
63
|
+
throw new TypeError('Expected at least two doubles.');
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const inspected = inspectDoubles(input.check, input.doubles);
|
|
67
|
+
if (!inspected.valid) {
|
|
68
|
+
return inspected.result;
|
|
69
|
+
}
|
|
70
|
+
if (hasMixedScope(inspected.inspections)) {
|
|
71
|
+
return sharedScopeFailure(input.check);
|
|
72
|
+
}
|
|
73
|
+
const eventGroups = eventGroupsFor(inspected.inspections, input.mode);
|
|
74
|
+
const children = [
|
|
75
|
+
...missingEventChecks(input.check, eventGroups, input.mode),
|
|
76
|
+
...orderChecks(input.check, eventGroups, input.mode)
|
|
77
|
+
];
|
|
78
|
+
return groupChildren(input.check, children, `${modeNoun(input.mode)} order`);
|
|
79
|
+
}
|
|
80
|
+
export function orderReference(name, mode) {
|
|
81
|
+
return defineCompositeAssertion({
|
|
82
|
+
assert(check, doubles) {
|
|
83
|
+
return orderAssertion({ check, doubles, mode });
|
|
84
|
+
},
|
|
85
|
+
formatSummary() {
|
|
86
|
+
return `Expected double ${modeNoun(mode)} order to match.`;
|
|
87
|
+
},
|
|
88
|
+
name
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=double-usage-order-assertion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-order-assertion.js","sourceRoot":"","sources":["../../../../source/doubles/double-usage-order-assertion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { AggregateArguments, AggregateIndexedArguments, AggregateIndexedPrefixArguments, AggregatePrefixArguments, CountArguments, IteratorValuesArguments, OrderArguments, UsageAssertionReference, ValueArguments } from './double-usage-contract.ts';
|
|
2
|
+
type CountReference = UsageAssertionReference<CountArguments>;
|
|
3
|
+
type IteratorValuesReference = UsageAssertionReference<IteratorValuesArguments>;
|
|
4
|
+
type ValueReference = UsageAssertionReference<ValueArguments>;
|
|
5
|
+
type OrderReference = UsageAssertionReference<OrderArguments>;
|
|
6
|
+
type ArgumentReference = UsageAssertionReference<AggregateArguments>;
|
|
7
|
+
type PrefixReference = UsageAssertionReference<AggregatePrefixArguments>;
|
|
8
|
+
type IndexedArgumentReference = UsageAssertionReference<AggregateIndexedArguments>;
|
|
9
|
+
type IndexedPrefixReference = UsageAssertionReference<AggregateIndexedPrefixArguments>;
|
|
10
|
+
export type DoubleUsageAssertions = {
|
|
11
|
+
readonly callCount: CountReference;
|
|
12
|
+
readonly callOrder: OrderReference;
|
|
13
|
+
readonly called: ValueReference;
|
|
14
|
+
readonly calledOnce: ValueReference;
|
|
15
|
+
readonly calledOnceWith: ArgumentReference;
|
|
16
|
+
readonly calledOnceWithExactly: ArgumentReference;
|
|
17
|
+
readonly calledOnceWithPrefix: PrefixReference;
|
|
18
|
+
readonly calledWith: ArgumentReference;
|
|
19
|
+
readonly calledWithExactly: ArgumentReference;
|
|
20
|
+
readonly calledWithPrefix: PrefixReference;
|
|
21
|
+
readonly constructed: ValueReference;
|
|
22
|
+
readonly constructedOnce: ValueReference;
|
|
23
|
+
readonly constructedOnceWith: ArgumentReference;
|
|
24
|
+
readonly constructedOnceWithExactly: ArgumentReference;
|
|
25
|
+
readonly constructedOnceWithPrefix: PrefixReference;
|
|
26
|
+
readonly constructedWith: ArgumentReference;
|
|
27
|
+
readonly constructedWithExactly: ArgumentReference;
|
|
28
|
+
readonly constructedWithPrefix: PrefixReference;
|
|
29
|
+
readonly constructionCount: CountReference;
|
|
30
|
+
readonly constructionOrder: OrderReference;
|
|
31
|
+
readonly disposeCount: CountReference;
|
|
32
|
+
readonly disposeOrder: OrderReference;
|
|
33
|
+
readonly disposed: ValueReference;
|
|
34
|
+
readonly disposedOnce: ValueReference;
|
|
35
|
+
readonly interacted: ValueReference;
|
|
36
|
+
readonly interactedOnce: ValueReference;
|
|
37
|
+
readonly interactedOnceWith: ArgumentReference;
|
|
38
|
+
readonly interactedOnceWithExactly: ArgumentReference;
|
|
39
|
+
readonly interactedOnceWithPrefix: PrefixReference;
|
|
40
|
+
readonly interactedWith: ArgumentReference;
|
|
41
|
+
readonly interactedWithExactly: ArgumentReference;
|
|
42
|
+
readonly interactedWithPrefix: PrefixReference;
|
|
43
|
+
readonly iterated: ValueReference;
|
|
44
|
+
readonly iteratorEventCount: CountReference;
|
|
45
|
+
readonly interactionCount: CountReference;
|
|
46
|
+
readonly interactionOrder: OrderReference;
|
|
47
|
+
readonly lastCalledWith: ArgumentReference;
|
|
48
|
+
readonly lastCalledWithExactly: ArgumentReference;
|
|
49
|
+
readonly lastCalledWithPrefix: PrefixReference;
|
|
50
|
+
readonly lastConstructedWith: ArgumentReference;
|
|
51
|
+
readonly lastConstructedWithExactly: ArgumentReference;
|
|
52
|
+
readonly lastConstructedWithPrefix: PrefixReference;
|
|
53
|
+
readonly lastInteractedWith: ArgumentReference;
|
|
54
|
+
readonly lastInteractedWithExactly: ArgumentReference;
|
|
55
|
+
readonly lastInteractedWithPrefix: PrefixReference;
|
|
56
|
+
readonly notCalled: ValueReference;
|
|
57
|
+
readonly notCalledWith: ArgumentReference;
|
|
58
|
+
readonly notCalledWithPrefix: PrefixReference;
|
|
59
|
+
readonly notConstructed: ValueReference;
|
|
60
|
+
readonly notConstructedWith: ArgumentReference;
|
|
61
|
+
readonly notConstructedWithPrefix: PrefixReference;
|
|
62
|
+
readonly notDisposed: ValueReference;
|
|
63
|
+
readonly notInteracted: ValueReference;
|
|
64
|
+
readonly notInteractedWith: ArgumentReference;
|
|
65
|
+
readonly notInteractedWithPrefix: PrefixReference;
|
|
66
|
+
readonly notIterated: ValueReference;
|
|
67
|
+
readonly nthCallWith: IndexedArgumentReference;
|
|
68
|
+
readonly nthCallWithExactly: IndexedArgumentReference;
|
|
69
|
+
readonly nthCallWithPrefix: IndexedPrefixReference;
|
|
70
|
+
readonly nthConstructionWith: IndexedArgumentReference;
|
|
71
|
+
readonly nthConstructionWithExactly: IndexedArgumentReference;
|
|
72
|
+
readonly nthConstructionWithPrefix: IndexedPrefixReference;
|
|
73
|
+
readonly nthInteractionWith: IndexedArgumentReference;
|
|
74
|
+
readonly nthInteractionWithExactly: IndexedArgumentReference;
|
|
75
|
+
readonly nthInteractionWithPrefix: IndexedPrefixReference;
|
|
76
|
+
readonly yieldCount: CountReference;
|
|
77
|
+
readonly yieldedExactly: IteratorValuesReference;
|
|
78
|
+
};
|
|
79
|
+
export declare const doubleUsage: DoubleUsageAssertions;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=double-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage.d.ts","sourceRoot":"","sources":["../../../../source/doubles/double-usage.ts"],"names":[],"mappings":"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"}
|