@overkill-dev/doubles 0.0.1 → 0.0.2
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/assertion-protocol/assertion-evaluation.d.ts +13 -0
- package/assertion-protocol/assertion-evaluation.d.ts.map +1 -0
- package/assertion-protocol/assertion-node-shape.d.ts +71 -0
- package/assertion-protocol/assertion-node-shape.d.ts.map +1 -0
- package/assertion-protocol/assertion-node.d.ts +97 -0
- package/assertion-protocol/assertion-node.d.ts.map +1 -0
- package/assertion-protocol/assertion-reference.d.ts +73 -0
- package/assertion-protocol/assertion-reference.d.ts.map +1 -0
- package/assertion-protocol/assertion-reference.js +49 -0
- package/assertion-protocol/assertion-reference.js.map +1 -0
- package/assertion-protocol/assertions/boolean.d.ts +11 -0
- package/assertion-protocol/assertions/boolean.d.ts.map +1 -0
- package/assertion-protocol/assertions/collection.d.ts +22 -0
- package/assertion-protocol/assertions/collection.d.ts.map +1 -0
- package/assertion-protocol/assertions/equality.d.ts +17 -0
- package/assertion-protocol/assertions/equality.d.ts.map +1 -0
- package/assertion-protocol/assertions/fail.d.ts +13 -0
- package/assertion-protocol/assertions/fail.d.ts.map +1 -0
- package/assertion-protocol/assertions/numeric.d.ts +29 -0
- package/assertion-protocol/assertions/numeric.d.ts.map +1 -0
- package/assertion-protocol/assertions/partial.d.ts +14 -0
- package/assertion-protocol/assertions/partial.d.ts.map +1 -0
- package/assertion-protocol/assertions/presence.d.ts +17 -0
- package/assertion-protocol/assertions/presence.d.ts.map +1 -0
- package/assertion-protocol/assertions/string.d.ts +28 -0
- package/assertion-protocol/assertions/string.d.ts.map +1 -0
- package/assertion-protocol/assertions/type-shape.d.ts +42 -0
- package/assertion-protocol/assertions/type-shape.d.ts.map +1 -0
- package/assertion-protocol/thrown-error-record.d.ts +8 -0
- package/assertion-protocol/thrown-error-record.d.ts.map +1 -0
- package/assertion-protocol/thrown-error-record.js +17 -0
- package/assertion-protocol/thrown-error-record.js.map +1 -0
- package/assertion-protocol/thrown-matcher.d.ts +51 -0
- package/assertion-protocol/thrown-matcher.d.ts.map +1 -0
- package/assertion-protocol/thrown-matcher.js +186 -0
- package/assertion-protocol/thrown-matcher.js.map +1 -0
- package/compare/comparison-result.d.ts +25 -0
- package/compare/comparison-result.d.ts.map +1 -0
- package/compare/comparison-state.d.ts +7 -0
- package/compare/comparison-state.d.ts.map +1 -0
- package/compare/comparison-state.js +20 -0
- package/compare/comparison-state.js.map +1 -0
- package/compare/comparison.d.ts +12 -0
- package/compare/comparison.d.ts.map +1 -0
- package/compare/raw-comparison.d.ts +24 -0
- package/compare/raw-comparison.d.ts.map +1 -0
- package/compare/raw-comparison.js +285 -0
- package/compare/raw-comparison.js.map +1 -0
- package/compare/serialized-value-shape.d.ts +143 -0
- package/compare/serialized-value-shape.d.ts.map +1 -0
- package/compare/serialized-value.d.ts +11 -0
- package/compare/serialized-value.d.ts.map +1 -0
- package/compare/value-classification.d.ts +26 -0
- package/compare/value-classification.d.ts.map +1 -0
- package/compare/value-classification.js +110 -0
- package/compare/value-classification.js.map +1 -0
- package/diff/diff-shape.d.ts +117 -0
- package/diff/diff-shape.d.ts.map +1 -0
- package/doubles/disposal-symbol.d.ts +3 -0
- package/doubles/disposal-symbol.d.ts.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.d.ts +21 -0
- package/doubles/double-chronology.d.ts.map +1 -0
- package/doubles/double-chronology.js +78 -0
- package/doubles/double-chronology.js.map +1 -0
- package/doubles/double-history-api.d.ts +33 -0
- package/doubles/double-history-api.d.ts.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.d.ts +9 -0
- package/doubles/double-runtime.d.ts.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.d.ts +27 -0
- package/doubles/double-usage-argument-assertion.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.d.ts +6 -0
- package/doubles/double-usage-count-assertion.d.ts.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.d.ts +7 -0
- package/doubles/double-usage-disposal-assertion.d.ts.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.d.ts +22 -0
- package/doubles/double-usage-inspection.d.ts.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.d.ts +7 -0
- package/doubles/double-usage-iterator-assertion.d.ts.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.d.ts +3 -0
- package/doubles/double-usage-order-assertion.d.ts.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.d.ts +15 -0
- package/doubles/protocol-double-metadata.d.ts.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 +36 -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 +30 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-count-assertion.d.ts","sourceRoot":"","sources":["../../../../source/doubles/double-usage-count-assertion.ts"],"names":[],"mappings":"AACA,OAAO,EAGH,KAAK,cAAc,EAEnB,KAAK,uBAAuB,EAC5B,KAAK,SAAS,EACd,KAAK,cAAc,EACtB,MAAM,4BAA4B,CAAC;AAkDpC,wBAAgB,cAAc,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,GAChB,uBAAuB,CAAC,cAAc,CAAC,CAUzC;AAED,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,GAChB,uBAAuB,CAAC,cAAc,CAAC,CAUzC;AAED,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,GAChB,uBAAuB,CAAC,cAAc,CAAC,CAUzC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAUpG"}
|
|
@@ -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,7 @@
|
|
|
1
|
+
import { type CountArguments, type OrderArguments, type UsageAssertionReference, type ValueArguments } from './double-usage-contract.ts';
|
|
2
|
+
export declare function disposedReference(name: string): UsageAssertionReference<ValueArguments>;
|
|
3
|
+
export declare function notDisposedReference(name: string): UsageAssertionReference<ValueArguments>;
|
|
4
|
+
export declare function disposedOnceReference(name: string): UsageAssertionReference<ValueArguments>;
|
|
5
|
+
export declare function disposeCountReference(name: string): UsageAssertionReference<CountArguments>;
|
|
6
|
+
export declare function disposeOrderReference(name: string): UsageAssertionReference<OrderArguments>;
|
|
7
|
+
//# sourceMappingURL=double-usage-disposal-assertion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-disposal-assertion.d.ts","sourceRoot":"","sources":["../../../../source/doubles/double-usage-disposal-assertion.ts"],"names":[],"mappings":"AAEA,OAAO,EAKH,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACtB,MAAM,4BAA4B,CAAC;AAyLpC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAQvF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAQ1F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAQ3F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAQ3F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAQ3F"}
|
|
@@ -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,22 @@
|
|
|
1
|
+
import { type ChronologyOrder, type DoubleChronology } from './double-chronology.ts';
|
|
2
|
+
import type { DoubleCall, DoubleConstruction, DoubleInteraction } from './double-history-record.ts';
|
|
3
|
+
import type { AssertionCheck, AssertionChild, UsageMode } from './double-usage-contract.ts';
|
|
4
|
+
import type { DoubleHistory } from './test-double.ts';
|
|
5
|
+
export type EventRecord = DoubleCall | DoubleConstruction | DoubleInteraction;
|
|
6
|
+
type HistoryShape = DoubleHistory<unknown>;
|
|
7
|
+
export type ValidDoubleInspection = {
|
|
8
|
+
readonly chronology: DoubleChronology;
|
|
9
|
+
readonly history: HistoryShape;
|
|
10
|
+
readonly valid: true;
|
|
11
|
+
};
|
|
12
|
+
export type DoubleInspection = ValidDoubleInspection | {
|
|
13
|
+
readonly failure: AssertionChild;
|
|
14
|
+
readonly valid: false;
|
|
15
|
+
};
|
|
16
|
+
export declare function recordsFor(history: HistoryShape, mode: UsageMode): readonly EventRecord[];
|
|
17
|
+
export declare function chronologyFor(chronology: DoubleChronology, mode: UsageMode): readonly ChronologyOrder[];
|
|
18
|
+
export declare function countFor(history: HistoryShape, mode: UsageMode): number;
|
|
19
|
+
export declare function inspectedDouble(check: AssertionCheck, subject: unknown): DoubleInspection;
|
|
20
|
+
export declare function validNonNegativeInteger(value: number): boolean;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=double-usage-inspection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-inspection.d.ts","sourceRoot":"","sources":["../../../../source/doubles/double-usage-inspection.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACR,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACR,cAAc,EACd,cAAc,EACd,SAAS,EACZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAC9E,KAAK,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;AAE3C,MAAM,MAAM,qBAAqB,GAAG;IAChC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,qBAAqB,GAAG;IACnD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACzB,CAAC;AAEF,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,WAAW,EAAE,CAMzF;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,eAAe,EAAE,CAMvG;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAMvE;AA6BD,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAazF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D"}
|
|
@@ -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,7 @@
|
|
|
1
|
+
import { type CountArguments, type IteratorValuesArguments, type UsageAssertionReference, type ValueArguments } from './double-usage-contract.ts';
|
|
2
|
+
export declare function iteratedReference(name: string): UsageAssertionReference<ValueArguments>;
|
|
3
|
+
export declare function notIteratedReference(name: string): UsageAssertionReference<ValueArguments>;
|
|
4
|
+
export declare function iteratorEventCountReference(name: string): UsageAssertionReference<CountArguments>;
|
|
5
|
+
export declare function yieldCountReference(name: string): UsageAssertionReference<CountArguments>;
|
|
6
|
+
export declare function yieldedExactlyReference(name: string): UsageAssertionReference<IteratorValuesArguments>;
|
|
7
|
+
//# sourceMappingURL=double-usage-iterator-assertion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-iterator-assertion.d.ts","sourceRoot":"","sources":["../../../../source/doubles/double-usage-iterator-assertion.ts"],"names":[],"mappings":"AAEA,OAAO,EAGH,KAAK,cAAc,EAEnB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACtB,MAAM,4BAA4B,CAAC;AA2HpC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAQvF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAQ1F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAUjG;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAUzF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAAC,uBAAuB,CAAC,CAQtG"}
|
|
@@ -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":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAIH,aAAa,EAIhB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,eAAe,EACf,uBAAuB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAqBvE,SAAS,uBAAuB,CAAC,KAAqB,EAAE,OAAgB;IACpE,MAAM,cAAc,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEvD,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO;YACH,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,IAAI;SACd,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAElD,OAAO,SAAS,CAAC,KAAK;QAClB,CAAC,CAAC;YACE,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,cAAc;YACxC,KAAK,EAAE,IAAI;SACd;QACD,CAAC,CAAC;YACE,MAAM,EAAE,SAAS,CAAC,OAAO;YACzB,KAAK,EAAE,KAAK;SACf,CAAC;AACV,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAqB,EAAE,OAAgB;IAC/D,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE1D,OAAO,SAAS,CAAC,KAAK;QAClB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAqB,EAAE,OAAgB;IAC7D,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE1D,OAAO,SAAS,CAAC,KAAK;QAClB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,SAAS,aAAa,CAAC,OAA6B;IAChD,OAAO,OAAO;SACT,cAAc;SACd,MAAM,CAAC,SAAS,YAAY,CAAC,KAAK;QAC/B,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;IAClC,CAAC,CAAC;SACD,GAAG,CAAC,SAAS,YAAY,CAAC,KAAK;QAC5B,OAAO,KAAK,CAAC,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;AACX,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA8B;IAC1D,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAEtE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,MAAM,YAAY,GAAG;QACjB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;QAC9B,KAAK,EAAE,aAAa,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM;KACpE,CAAC;IAEF,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1F,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,KAAK,CACzF,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EACzB,KAAK,CAAC,aAAa,CACtB;KACJ,CAAC,CAAC;AACP,CAAC;AAED,SAAS,uBAAuB,CAC5B,KAAqB,EACrB,OAAgB,EAChB,cAAkC;IAElC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEvD,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,aAAa,CAAC,KAAK,EAAE;YACxB,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,CACvC,aAAa,CAAC,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,EACjD,cAAc,CACjB;SACJ,EAAE,gBAAgB,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,OAAO,aAAa,CAAC,KAAK,EAAE;QACxB,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;KAChG,EAAE,gBAAgB,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,OAAO,wBAAwB,CAAkC;QAC7D,MAAM,EAAE,kBAAkB;QAC1B,aAAa;YACT,OAAO,iDAAiD,CAAC;QAC7D,CAAC;QACD,IAAI;KACP,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC7C,OAAO,wBAAwB,CAAkC;QAC7D,MAAM,EAAE,gBAAgB;QACxB,aAAa;YACT,OAAO,qDAAqD,CAAC;QACjE,CAAC;QACD,IAAI;KACP,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACpD,OAAO,wBAAwB,CAAkC;QAC7D,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,aAAqB;YACjD,OAAO,sBAAsB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,aAAa;YACT,OAAO,gDAAgD,CAAC;QAC5D,CAAC;QACD,IAAI;KACP,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC5C,OAAO,wBAAwB,CAAkC;QAC7D,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,aAAqB;YACjD,OAAO,sBAAsB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,aAAa;YACT,OAAO,uCAAuC,CAAC;QACnD,CAAC;QACD,IAAI;KACP,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAChD,OAAO,wBAAwB,CAA2C;QACtE,MAAM,EAAE,uBAAuB;QAC/B,aAAa;YACT,OAAO,kDAAkD,CAAC;QAC9D,CAAC;QACD,IAAI;KACP,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type OrderArguments, type UsageAssertionReference, type UsageMode } from './double-usage-contract.ts';
|
|
2
|
+
export declare function orderReference(name: string, mode: UsageMode): UsageAssertionReference<OrderArguments>;
|
|
3
|
+
//# sourceMappingURL=double-usage-order-assertion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double-usage-order-assertion.d.ts","sourceRoot":"","sources":["../../../../source/doubles/double-usage-order-assertion.ts"],"names":[],"mappings":"AAEA,OAAO,EAMH,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,SAAS,EACjB,MAAM,4BAA4B,CAAC;AA6HpC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAUrG"}
|
|
@@ -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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"}
|