@creative-introvert/tons-of-tests 2.0.0 → 3.0.0-rc.0

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 (120) hide show
  1. package/README.md +263 -134
  2. package/dist/cjs/Classify.js +6 -2
  3. package/dist/cjs/Classify.js.map +1 -1
  4. package/dist/cjs/RepositoryError.js +24 -33
  5. package/dist/cjs/RepositoryError.js.map +1 -1
  6. package/dist/cjs/Show.js +18 -0
  7. package/dist/cjs/Show.js.map +1 -1
  8. package/dist/cjs/Test.js +41 -2
  9. package/dist/cjs/Test.js.map +1 -1
  10. package/dist/cjs/Test.repository.js +8 -17
  11. package/dist/cjs/Test.repository.js.map +1 -1
  12. package/dist/cjs/TestRun.js +20 -0
  13. package/dist/cjs/TestRun.js.map +1 -0
  14. package/dist/cjs/TestValueError.js +23 -0
  15. package/dist/cjs/TestValueError.js.map +1 -0
  16. package/dist/cjs/index.js +0 -7
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/internal/Classify.js +1 -9
  19. package/dist/cjs/internal/Classify.js.map +1 -1
  20. package/dist/cjs/internal/Test.js +305 -109
  21. package/dist/cjs/internal/Test.js.map +1 -1
  22. package/dist/cjs/internal/Test.repository.sqlite.js +266 -304
  23. package/dist/cjs/internal/Test.repository.sqlite.js.map +1 -1
  24. package/dist/cjs/internal/Test.serialization.js +128 -0
  25. package/dist/cjs/internal/Test.serialization.js.map +1 -0
  26. package/dist/cjs/internal/common.js.map +1 -1
  27. package/dist/cjs/internal/stats.js +37 -3
  28. package/dist/cjs/internal/stats.js.map +1 -1
  29. package/dist/cjs/internal/summarize.js +155 -36
  30. package/dist/cjs/internal/summarize.js.map +1 -1
  31. package/dist/cjs/internal/test-repository-fixtures.js +31 -0
  32. package/dist/cjs/internal/test-repository-fixtures.js.map +1 -0
  33. package/dist/cjs/internal/test-repository-migrations.js +68 -0
  34. package/dist/cjs/internal/test-repository-migrations.js.map +1 -0
  35. package/dist/cjs/internal/test-result-stats.js +89 -0
  36. package/dist/cjs/internal/test-result-stats.js.map +1 -0
  37. package/dist/dts/Classify.d.ts +4 -1
  38. package/dist/dts/Classify.d.ts.map +1 -1
  39. package/dist/dts/RepositoryError.d.ts +19 -20
  40. package/dist/dts/RepositoryError.d.ts.map +1 -1
  41. package/dist/dts/Show.d.ts +8 -8
  42. package/dist/dts/Show.d.ts.map +1 -1
  43. package/dist/dts/Test.d.ts +155 -11
  44. package/dist/dts/Test.d.ts.map +1 -1
  45. package/dist/dts/Test.repository.d.ts +94 -8
  46. package/dist/dts/Test.repository.d.ts.map +1 -1
  47. package/dist/dts/TestRun.d.ts +18 -0
  48. package/dist/dts/TestRun.d.ts.map +1 -0
  49. package/dist/dts/TestValueError.d.ts +17 -0
  50. package/dist/dts/TestValueError.d.ts.map +1 -0
  51. package/dist/dts/index.d.ts +0 -1
  52. package/dist/dts/index.d.ts.map +1 -1
  53. package/dist/dts/internal/Classify.d.ts +0 -1
  54. package/dist/dts/internal/Classify.d.ts.map +1 -1
  55. package/dist/dts/internal/Test.d.ts +58 -31
  56. package/dist/dts/internal/Test.d.ts.map +1 -1
  57. package/dist/dts/internal/Test.repository.sqlite.d.ts +66 -11
  58. package/dist/dts/internal/Test.repository.sqlite.d.ts.map +1 -1
  59. package/dist/dts/internal/Test.serialization.d.ts +34 -0
  60. package/dist/dts/internal/Test.serialization.d.ts.map +1 -0
  61. package/dist/dts/internal/common.d.ts +1 -1
  62. package/dist/dts/internal/common.d.ts.map +1 -1
  63. package/dist/dts/internal/stats.d.ts +15 -1
  64. package/dist/dts/internal/stats.d.ts.map +1 -1
  65. package/dist/dts/internal/summarize.d.ts +39 -7
  66. package/dist/dts/internal/summarize.d.ts.map +1 -1
  67. package/dist/dts/internal/test-repository-fixtures.d.ts +22 -0
  68. package/dist/dts/internal/test-repository-fixtures.d.ts.map +1 -0
  69. package/dist/dts/internal/test-repository-migrations.d.ts +11 -0
  70. package/dist/dts/internal/test-repository-migrations.d.ts.map +1 -0
  71. package/dist/dts/internal/test-result-stats.d.ts +7 -0
  72. package/dist/dts/internal/test-result-stats.d.ts.map +1 -0
  73. package/dist/esm/Classify.js +5 -1
  74. package/dist/esm/Classify.js.map +1 -1
  75. package/dist/esm/RepositoryError.js +14 -29
  76. package/dist/esm/RepositoryError.js.map +1 -1
  77. package/dist/esm/Show.js +2 -2
  78. package/dist/esm/Show.js.map +1 -1
  79. package/dist/esm/Test.js +38 -1
  80. package/dist/esm/Test.js.map +1 -1
  81. package/dist/esm/Test.repository.js +7 -16
  82. package/dist/esm/Test.repository.js.map +1 -1
  83. package/dist/esm/TestRun.js +13 -0
  84. package/dist/esm/TestRun.js.map +1 -0
  85. package/dist/esm/TestValueError.js +16 -0
  86. package/dist/esm/TestValueError.js.map +1 -0
  87. package/dist/esm/index.js +0 -1
  88. package/dist/esm/index.js.map +1 -1
  89. package/dist/esm/internal/Classify.js +0 -7
  90. package/dist/esm/internal/Classify.js.map +1 -1
  91. package/dist/esm/internal/Test.js +299 -108
  92. package/dist/esm/internal/Test.js.map +1 -1
  93. package/dist/esm/internal/Test.repository.sqlite.js +265 -301
  94. package/dist/esm/internal/Test.repository.sqlite.js.map +1 -1
  95. package/dist/esm/internal/Test.serialization.js +119 -0
  96. package/dist/esm/internal/Test.serialization.js.map +1 -0
  97. package/dist/esm/internal/common.js.map +1 -1
  98. package/dist/esm/internal/stats.js +35 -2
  99. package/dist/esm/internal/stats.js.map +1 -1
  100. package/dist/esm/internal/summarize.js +155 -35
  101. package/dist/esm/internal/summarize.js.map +1 -1
  102. package/dist/esm/internal/test-repository-fixtures.js +25 -0
  103. package/dist/esm/internal/test-repository-fixtures.js.map +1 -0
  104. package/dist/esm/internal/test-repository-migrations.js +62 -0
  105. package/dist/esm/internal/test-repository-migrations.js.map +1 -0
  106. package/dist/esm/internal/test-result-stats.js +83 -0
  107. package/dist/esm/internal/test-result-stats.js.map +1 -0
  108. package/package.json +1 -1
  109. package/dist/cjs/Test.repository.types.js +0 -14
  110. package/dist/cjs/Test.repository.types.js.map +0 -1
  111. package/dist/cjs/internal/lib/Schema.js +0 -14
  112. package/dist/cjs/internal/lib/Schema.js.map +0 -1
  113. package/dist/dts/Test.repository.types.d.ts +0 -56
  114. package/dist/dts/Test.repository.types.d.ts.map +0 -1
  115. package/dist/dts/internal/lib/Schema.d.ts +0 -4
  116. package/dist/dts/internal/lib/Schema.d.ts.map +0 -1
  117. package/dist/esm/Test.repository.types.js +0 -7
  118. package/dist/esm/Test.repository.types.js.map +0 -1
  119. package/dist/esm/internal/lib/Schema.js +0 -7
  120. package/dist/esm/internal/lib/Schema.js.map +0 -1
@@ -1,50 +1,17 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { Clock, Effect, Option, pipe, Schema, Sink, Stream } from 'effect';
3
3
  import { Stats } from '../Classify.js';
4
- import { defaultIsEqual, LabelSchema, makeClassify, median, precision, recall } from './Classify.js';
5
- export const makeSha256 = input => {
6
- // This public synchronous helper keeps result IDs stable across releases.
7
- return createHash('sha256').update(JSON.stringify(input)).digest('hex');
8
- };
9
- const TestResult = {
10
- make: args => {
11
- const {
12
- label,
13
- input,
14
- result,
15
- expected
16
- } = args;
17
- // Without `ordering`, in case the user decides to re-order test cases,
18
- // which shouldn't change the identity of the test result.
19
- // Without `tags`, as those are just for filtering.
20
- const id = makeSha256({
21
- label,
22
- input,
23
- result,
24
- expected
25
- });
26
- const hashTestCase = makeSha256({
27
- input,
28
- expected
29
- });
30
- return {
31
- ...args,
32
- id,
33
- hashTestCase
34
- };
35
- }
36
- };
37
- export const TestResultSchema = /*#__PURE__*/Schema.Struct({
38
- id: Schema.String,
39
- hashTestCase: Schema.String,
40
- ordering: Schema.Int,
41
- input: Schema.Unknown,
42
- result: Schema.Unknown,
43
- expected: Schema.Unknown,
44
- label: LabelSchema,
45
- tags: /*#__PURE__*/Schema.Array(Schema.String),
46
- timeMillis: Schema.Finite
47
- });
4
+ import { TestVariantNotFound, TestVariantRequired } from '../Test.js';
5
+ import { TestRepository } from '../Test.repository.js';
6
+ import { TestRunIncomplete, TestRunNotFound } from '../RepositoryError.js';
7
+ import { makeResultCodec, makeValueCodec, stringifyJson } from './Test.serialization.js';
8
+ import { makeClassify, median, precision, recall } from './Classify.js';
9
+ /** Hash already encoded JSON. Object key order does not affect identity. */
10
+ export const makeSha256 = input => createHash('sha256').update(stringifyJson(input)).digest('hex');
11
+ export const resultKey = ({
12
+ hashTestCase,
13
+ key
14
+ }) => JSON.stringify([hashTestCase, key]);
48
15
  export const test = /*#__PURE__*/Effect.fnUntraced(function* ({
49
16
  testCase: {
50
17
  input,
@@ -52,85 +19,231 @@ export const test = /*#__PURE__*/Effect.fnUntraced(function* ({
52
19
  tags,
53
20
  ordering
54
21
  },
22
+ hashTestCase,
55
23
  program,
56
- classify
24
+ evaluate,
25
+ encodeResult
57
26
  }) {
58
27
  const t0 = yield* Clock.currentTimeNanos;
59
28
  const result = yield* program(input);
60
29
  const t1 = yield* Clock.currentTimeNanos;
61
- return TestResult.make({
62
- ordering,
63
- input,
64
- result,
65
- expected,
66
- tags: tags ?? [],
67
- label: classify(result, expected),
68
- timeMillis: Number(t1 - t0) / 1_000_000
69
- });
30
+ const evaluations = evaluate(result, expected);
31
+ if (evaluations.length === 0) {
32
+ return yield* Effect.die(new Error('evaluate must return at least one result'));
33
+ }
34
+ const keys = new Set();
35
+ for (const {
36
+ key
37
+ } of evaluations) {
38
+ if (key.length === 0 || keys.has(key)) {
39
+ return yield* Effect.die(new Error('evaluate must return non-empty keys that are unique within each test case'));
40
+ }
41
+ keys.add(key);
42
+ }
43
+ return yield* Effect.forEach(evaluations, (evaluation, resultOrdering) => Effect.gen(function* () {
44
+ const args = {
45
+ ...evaluation,
46
+ hashTestCase,
47
+ ordering,
48
+ resultOrdering,
49
+ input,
50
+ tags: tags ?? [],
51
+ timeMillis: Number(t1 - t0) / 1_000_000
52
+ };
53
+ const encoded = yield* encodeResult(args);
54
+ // Ordering, tags, and timing do not change result identity.
55
+ return {
56
+ ...args,
57
+ id: makeSha256({
58
+ hashTestCase,
59
+ key: evaluation.key,
60
+ label: evaluation.label,
61
+ input: encoded.input,
62
+ result: encoded.result,
63
+ expected: encoded.expected
64
+ })
65
+ };
66
+ }));
70
67
  });
71
- export const all = ({
72
- testCases,
73
- program,
74
- classify = makeClassify({
75
- isEqual: defaultIsEqual
76
- })
77
- }, {
78
- concurrency
79
- } = {
80
- concurrency: 1
68
+ export function selectVariant(suite, variant) {
69
+ const suiteName = suite.name;
70
+ return Effect.suspend(() => {
71
+ if (Object.hasOwn(suite, 'program') === Object.hasOwn(suite, 'variants')) {
72
+ return Effect.die(new Error(`${suite.name}: define exactly one of program and variants`));
73
+ }
74
+ if (suite.program !== undefined) {
75
+ if (typeof suite.program !== 'function') {
76
+ return Effect.die(new Error(`${suiteName}: program must be a function`));
77
+ }
78
+ return variant === undefined || variant === 'default' ? Effect.succeed({
79
+ name: 'default',
80
+ program: suite.program
81
+ }) : Effect.fail(new TestVariantNotFound({
82
+ testSuiteName: suite.name,
83
+ variant
84
+ }));
85
+ }
86
+ if (suite.variants === undefined || suite.variants === null || typeof suite.variants !== 'object' || Array.isArray(suite.variants)) {
87
+ return Effect.die(new Error(`${suite.name}: variants must be a map of programs`));
88
+ }
89
+ for (const [name, definition] of Object.entries(suite.variants)) {
90
+ if (name.length === 0 || name.includes(',') || name.startsWith('run:')) {
91
+ return Effect.die(new Error(`${suite.name}: invalid variant ID ${JSON.stringify(name)}`));
92
+ }
93
+ if (definition === null || typeof definition !== 'object' || typeof definition.program !== 'function') {
94
+ return Effect.die(new Error(`${suite.name}: variant ${JSON.stringify(name)} must define a program`));
95
+ }
96
+ }
97
+ if (variant === undefined) {
98
+ return Effect.fail(new TestVariantRequired({
99
+ testSuiteName: suite.name
100
+ }));
101
+ }
102
+ return Object.hasOwn(suite.variants, variant) ? Effect.succeed({
103
+ name: variant,
104
+ program: suite.variants[variant].program
105
+ }) : Effect.fail(new TestVariantNotFound({
106
+ testSuiteName: suite.name,
107
+ variant
108
+ }));
109
+ });
110
+ }
111
+ export function all(suite, options = {}) {
112
+ return executeAll(suite, options);
113
+ }
114
+ const executeAll = (suite, {
115
+ variant,
116
+ concurrency = 1
81
117
  }) => {
118
+ if (suite.evaluate === undefined) {
119
+ if (!Object.is(suite.schemas.evaluation.result, suite.schemas.evaluation.expected)) {
120
+ return Stream.die(new Error(`${suite.name}: without evaluate, evaluation.result and evaluation.expected must reuse the same schema`));
121
+ }
122
+ const classify = makeClassify({
123
+ isEqual: Schema.toEquivalence(Schema.Union([suite.schemas.evaluation.result, suite.schemas.evaluation.expected]))
124
+ });
125
+ return executeAll({
126
+ ...suite,
127
+ evaluate: (result, expected) => [{
128
+ key: 'result',
129
+ result,
130
+ expected,
131
+ label: classify(result, expected)
132
+ }]
133
+ }, {
134
+ variant,
135
+ concurrency
136
+ });
137
+ }
138
+ const {
139
+ testCases,
140
+ evaluate,
141
+ schemas
142
+ } = suite;
143
+ const inputCodec = makeValueCodec(schemas.testCase.input);
144
+ const expectedCodec = makeValueCodec(schemas.testCase.expected);
145
+ const {
146
+ encode: encodeResult
147
+ } = makeResultCodec(schemas, suite.name);
82
148
  const total = Stream.isStream(testCases) ? undefined : testCases.length;
83
149
  const testCases$ = Stream.isStream(testCases) ? testCases : Stream.fromIterable(testCases);
84
- return pipe(testCases$, Stream.zipWithIndex, Stream.map(([testCase, ordering]) => ({
85
- ...testCase,
86
- ordering
87
- })), Stream.mapEffect(testCase => test({
88
- testCase,
89
- program,
90
- classify
91
- }), {
92
- concurrency,
93
- unordered: false
94
- }), Stream.tap(testResult => {
95
- const i = testResult.ordering + 1;
96
- const stride = total === undefined ? 10 : Math.max(Math.floor(total * 0.05), 10);
97
- const isMilestone = i === 1 || i % stride === 0 || total !== undefined && i === total;
98
- if (!isMilestone) return Effect.void;
99
- return Effect.logDebug(total === undefined ? `progress ${i}` : `progress ${i}/${total}`);
150
+ return Stream.unwrap(Effect.map(selectVariant(suite, variant), ({
151
+ program
152
+ }) => {
153
+ const seen = new Set();
154
+ return pipe(testCases$, Stream.zipWithIndex, Stream.mapEffect(Effect.fnUntraced(function* ([testCase, ordering]) {
155
+ const context = {
156
+ suite: suite.name,
157
+ caseNumber: ordering + 1
158
+ };
159
+ const input = yield* inputCodec.encode(testCase.input, {
160
+ ...context,
161
+ field: 'testCase.input'
162
+ });
163
+ const expected = yield* expectedCodec.encode(testCase.expected, {
164
+ ...context,
165
+ field: 'testCase.expected'
166
+ });
167
+ return {
168
+ testCase: {
169
+ ...testCase,
170
+ ordering
171
+ },
172
+ hashTestCase: makeSha256({
173
+ input,
174
+ expected
175
+ })
176
+ };
177
+ })), Stream.filterEffect(({
178
+ testCase,
179
+ hashTestCase
180
+ }) => {
181
+ if (seen.has(hashTestCase)) {
182
+ return Effect.logWarning('Skipping duplicate test case.', {
183
+ suite: suite.name,
184
+ hashTestCase,
185
+ caseNumber: testCase.ordering + 1
186
+ }).pipe(Effect.as(false));
187
+ }
188
+ seen.add(hashTestCase);
189
+ return Effect.succeed(true);
190
+ }), Stream.mapEffect(({
191
+ testCase,
192
+ hashTestCase
193
+ }) => test({
194
+ testCase,
195
+ hashTestCase,
196
+ program,
197
+ evaluate,
198
+ encodeResult
199
+ }), {
200
+ concurrency,
201
+ unordered: false
202
+ }), Stream.tap(testResults => {
203
+ const i = testResults[0].ordering + 1;
204
+ const stride = total === undefined ? 10 : Math.max(Math.floor(total * 0.05), 10);
205
+ const isMilestone = i === 1 || i % stride === 0 || total !== undefined && i === total;
206
+ if (!isMilestone) return Effect.void;
207
+ return Effect.logDebug(total === undefined ? `progress ${i}` : `progress ${i}/${total}`);
208
+ }), Stream.flattenIterable);
100
209
  }));
101
210
  };
102
211
  const emptyAcc = () => ({
103
- testResultsByTestCaseHash: {},
104
- testCaseHashes: [],
105
- times: [],
212
+ testResultsByKey: {},
213
+ testResultKeys: [],
214
+ timesByTestCaseHash: new Map(),
106
215
  TP: 0,
107
216
  TN: 0,
108
217
  FP: 0,
109
- FN: 0,
110
- timeSum: 0,
111
- timeMin: Number.POSITIVE_INFINITY,
112
- timeMax: Number.NEGATIVE_INFINITY
218
+ FN: 0
113
219
  });
114
- export const runCollectRecord = testRun => testResults$ => testResults$.pipe(Stream.run(
115
- // Each run owns its accumulator, so updates can happen in place.
116
- Sink.reduce(emptyAcc, (acc, r) => {
117
- acc.testResultsByTestCaseHash[r.hashTestCase] = r;
118
- acc.testCaseHashes.push(r.hashTestCase);
119
- acc.times.push(r.timeMillis);
120
- acc.timeSum += r.timeMillis;
121
- if (r.timeMillis < acc.timeMin) acc.timeMin = r.timeMillis;
122
- if (r.timeMillis > acc.timeMax) acc.timeMax = r.timeMillis;
220
+ const appendResult = (acc, r) => {
221
+ const key = resultKey(r);
222
+ acc.testResultsByKey[key] = r;
223
+ acc.testResultKeys.push(key);
224
+ if (!acc.timesByTestCaseHash.has(r.hashTestCase)) {
225
+ acc.timesByTestCaseHash.set(r.hashTestCase, r.timeMillis);
226
+ }
123
227
  if (r.label === 'TP') acc.TP++;else if (r.label === 'TN') acc.TN++;else if (r.label === 'FP') acc.FP++;else acc.FN++;
124
228
  return acc;
125
- })), Effect.map(acc => {
126
- const total = acc.testCaseHashes.length;
127
- const hasTimes = acc.times.length > 0;
229
+ };
230
+ const finish = (testRun, acc) => {
231
+ const times = [...acc.timesByTestCaseHash.values()];
232
+ let timeSum = 0;
233
+ let timeMin = Number.POSITIVE_INFINITY;
234
+ let timeMax = Number.NEGATIVE_INFINITY;
235
+ for (const time of times) {
236
+ timeSum += time;
237
+ if (time < timeMin) timeMin = time;
238
+ if (time > timeMax) timeMax = time;
239
+ }
128
240
  const stats = new Stats({
129
241
  TP: acc.TP,
130
242
  TN: acc.TN,
131
243
  FP: acc.FP,
132
244
  FN: acc.FN,
133
- total,
245
+ total: acc.testResultKeys.length,
246
+ testCases: acc.timesByTestCaseHash.size,
134
247
  precision: precision({
135
248
  TP: acc.TP,
136
249
  FP: acc.FP
@@ -139,20 +252,31 @@ Sink.reduce(emptyAcc, (acc, r) => {
139
252
  TP: acc.TP,
140
253
  FN: acc.FN
141
254
  }),
142
- timeMean: hasTimes ? Option.some(acc.timeSum / acc.times.length) : Option.none(),
143
- timeMin: hasTimes ? Option.some(acc.timeMin) : Option.none(),
144
- timeMax: hasTimes ? Option.some(acc.timeMax) : Option.none(),
145
- timeMedian: median(acc.times)
255
+ timeMean: times.length > 0 ? Option.some(timeSum / times.length) : Option.none(),
256
+ timeMin: times.length > 0 ? Option.some(timeMin) : Option.none(),
257
+ timeMax: times.length > 0 ? Option.some(timeMax) : Option.none(),
258
+ timeMedian: median(times)
146
259
  });
147
260
  return {
148
261
  id: testRun.id,
149
262
  name: testRun.name,
150
- hash: testRun.hash,
151
- testResultsByTestCaseHash: acc.testResultsByTestCaseHash,
152
- testCaseHashes: acc.testCaseHashes,
263
+ variant: testRun.variant,
264
+ state: testRun.state,
265
+ testResultsByKey: acc.testResultsByKey,
266
+ testResultKeys: acc.testResultKeys,
267
+ testCaseHashes: [...acc.timesByTestCaseHash.keys()],
153
268
  stats
154
269
  };
155
- }));
270
+ };
271
+ export const runCollectRecord = testRun => testResults$ => testResults$.pipe(Stream.run(Sink.reduce(emptyAcc, appendResult)), Effect.map(acc => finish(testRun, acc)));
272
+ export const filterResults = (testRun, predicate) => {
273
+ const acc = emptyAcc();
274
+ for (const key of testRun.testResultKeys) {
275
+ const result = testRun.testResultsByKey[key];
276
+ if (predicate(result)) appendResult(acc, result);
277
+ }
278
+ return finish(testRun, acc);
279
+ };
156
280
  export const diff = ({
157
281
  testRun: {
158
282
  stats
@@ -171,4 +295,71 @@ export const diff = ({
171
295
  recall: stats.recall - previousStats.recall
172
296
  })
173
297
  }));
298
+ const requireComplete = /*#__PURE__*/Effect.fnUntraced(function* (repository, run) {
299
+ const saved = yield* repository.getTestRun(run.id);
300
+ if (Option.isNone(saved)) {
301
+ return yield* new TestRunNotFound({
302
+ testRunId: run.id
303
+ });
304
+ }
305
+ if (saved.value.state !== 'Complete') {
306
+ return yield* new TestRunIncomplete({
307
+ testSuiteName: saved.value.name,
308
+ testRunId: saved.value.id,
309
+ variant: saved.value.variant
310
+ });
311
+ }
312
+ return saved.value;
313
+ });
314
+ export const compareRuns = ({
315
+ from,
316
+ to,
317
+ schemas
318
+ }) => Stream.unwrap(Effect.gen(function* () {
319
+ const repository = yield* TestRepository;
320
+ const savedFrom = yield* requireComplete(repository, from);
321
+ const savedTo = yield* requireComplete(repository, to);
322
+ const resultEquals = Schema.toEquivalence(schemas.evaluation.result);
323
+ const expectedEquals = Schema.toEquivalence(schemas.evaluation.expected);
324
+ const matchingTo = repository.getTestResultsStream(savedTo, schemas).pipe(Stream.grouped(50), Stream.mapEffect(Effect.fnUntraced(function* (batch) {
325
+ const matches = yield* repository.getTestResultsStream(savedFrom, schemas, batch).pipe(Stream.runCollect);
326
+ const byKey = new Map(matches.map(result => [resultKey(result), result]));
327
+ return batch.map(to => {
328
+ const from = byKey.get(resultKey(to));
329
+ return from === undefined ? {
330
+ _tag: 'OnlyTo',
331
+ to
332
+ } : {
333
+ _tag: 'Matched',
334
+ from,
335
+ to,
336
+ changed: from.label !== to.label || !resultEquals(from.result, to.result) || !expectedEquals(from.expected, to.expected)
337
+ };
338
+ });
339
+ })), Stream.flattenIterable);
340
+ const onlyFrom = repository.getTestResultsStream(savedFrom, schemas).pipe(Stream.grouped(50), Stream.mapEffect(Effect.fnUntraced(function* (batch) {
341
+ const matches = yield* repository.getTestResultsStream(savedTo, schemas, batch).pipe(Stream.runCollect);
342
+ const keys = new Set(matches.map(resultKey));
343
+ return batch.filter(from => !keys.has(resultKey(from))).map(from => ({
344
+ _tag: 'OnlyFrom',
345
+ from
346
+ }));
347
+ })), Stream.flattenIterable);
348
+ return matchingTo.pipe(Stream.concat(onlyFrom));
349
+ }));
350
+ export const summarizeRun = /*#__PURE__*/Effect.fnUntraced(function* ({
351
+ run,
352
+ schemas,
353
+ predicate
354
+ }) {
355
+ const repository = yield* TestRepository;
356
+ const saved = yield* requireComplete(repository, run);
357
+ return yield* repository.withStats(collector => Effect.gen(function* () {
358
+ yield* repository.getTestResultsStream(saved, schemas).pipe(Stream.filter(predicate ?? (() => true)), Stream.grouped(50), Stream.runForEach(collector.add));
359
+ return {
360
+ run: saved,
361
+ stats: yield* collector.stats
362
+ };
363
+ }));
364
+ });
174
365
  //# sourceMappingURL=Test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Test.js","names":["createHash","Clock","Effect","Option","pipe","Schema","Sink","Stream","Stats","defaultIsEqual","LabelSchema","makeClassify","median","precision","recall","makeSha256","input","update","JSON","stringify","digest","TestResult","make","args","label","result","expected","id","hashTestCase","TestResultSchema","Struct","String","ordering","Int","Unknown","tags","Array","timeMillis","Finite","test","fnUntraced","testCase","program","classify","t0","currentTimeNanos","t1","Number","all","testCases","isEqual","concurrency","total","isStream","undefined","length","testCases$","fromIterable","zipWithIndex","map","mapEffect","unordered","tap","testResult","i","stride","Math","max","floor","isMilestone","void","logDebug","emptyAcc","testResultsByTestCaseHash","testCaseHashes","times","TP","TN","FP","FN","timeSum","timeMin","POSITIVE_INFINITY","timeMax","NEGATIVE_INFINITY","runCollectRecord","testRun","testResults$","run","reduce","acc","r","push","hasTimes","stats","timeMean","some","none","timeMedian","name","hash","diff","previousTestRun","match","onNone","onSome","previousStats"],"sources":["../../../src/internal/Test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Test.js","names":["createHash","Clock","Effect","Option","pipe","Schema","Sink","Stream","Stats","TestVariantNotFound","TestVariantRequired","TestRepository","TestRunIncomplete","TestRunNotFound","makeResultCodec","makeValueCodec","stringifyJson","makeClassify","median","precision","recall","makeSha256","input","update","digest","resultKey","hashTestCase","key","JSON","stringify","test","fnUntraced","testCase","expected","tags","ordering","program","evaluate","encodeResult","t0","currentTimeNanos","result","t1","evaluations","length","die","Error","keys","Set","has","add","forEach","evaluation","resultOrdering","gen","args","timeMillis","Number","encoded","id","label","selectVariant","suite","variant","suiteName","name","suspend","Object","hasOwn","undefined","succeed","fail","testSuiteName","variants","Array","isArray","definition","entries","includes","startsWith","all","options","executeAll","concurrency","is","schemas","classify","isEqual","toEquivalence","Union","testCases","inputCodec","expectedCodec","encode","total","isStream","testCases$","fromIterable","unwrap","map","seen","zipWithIndex","mapEffect","context","caseNumber","field","filterEffect","logWarning","as","unordered","tap","testResults","i","stride","Math","max","floor","isMilestone","void","logDebug","flattenIterable","emptyAcc","testResultsByKey","testResultKeys","timesByTestCaseHash","Map","TP","TN","FP","FN","appendResult","acc","r","push","set","finish","testRun","times","values","timeSum","timeMin","POSITIVE_INFINITY","timeMax","NEGATIVE_INFINITY","time","stats","size","timeMean","some","none","timeMedian","state","testCaseHashes","runCollectRecord","testResults$","run","reduce","filterResults","predicate","diff","previousTestRun","match","onNone","onSome","previousStats","requireComplete","repository","saved","getTestRun","isNone","testRunId","value","compareRuns","from","to","savedFrom","savedTo","resultEquals","expectedEquals","matchingTo","getTestResultsStream","grouped","batch","matches","runCollect","byKey","get","_tag","changed","onlyFrom","filter","concat","summarizeRun","withStats","collector","runForEach"],"sources":["../../../src/internal/Test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}