@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,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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"}