ppef 1.0.1 → 1.1.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 (175) hide show
  1. package/bin/ppef.mjs +20 -0
  2. package/dist/__tests__/framework-pipeline.integration.test.js +13 -11
  3. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  4. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  5. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/index-exports.unit.test.js +127 -0
  7. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  8. package/dist/__tests__/registry-executor.integration.test.js +12 -9
  9. package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
  10. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  11. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  12. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  13. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  14. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  15. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  16. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  17. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  18. package/dist/aggregation/aggregators.d.ts +9 -0
  19. package/dist/aggregation/aggregators.d.ts.map +1 -1
  20. package/dist/aggregation/aggregators.js +1 -1
  21. package/dist/aggregation/aggregators.js.map +1 -1
  22. package/dist/aggregation/index.d.ts +1 -1
  23. package/dist/aggregation/index.d.ts.map +1 -1
  24. package/dist/aggregation/index.js +1 -1
  25. package/dist/aggregation/index.js.map +1 -1
  26. package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
  27. package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
  28. package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
  29. package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
  30. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  31. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  32. package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
  33. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  34. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  35. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  36. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  37. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  38. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  39. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  40. package/dist/cli/__tests__/index.unit.test.js +65 -0
  41. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  42. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  43. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  44. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  45. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  46. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  47. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  48. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  49. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  50. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  51. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  52. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  53. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  54. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  55. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  56. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  57. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  58. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  59. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  61. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  62. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  63. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  64. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  65. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  66. package/dist/cli/command-deps.d.ts +125 -0
  67. package/dist/cli/command-deps.d.ts.map +1 -0
  68. package/dist/cli/command-deps.js +7 -0
  69. package/dist/cli/command-deps.js.map +1 -0
  70. package/dist/cli/commands/aggregate.d.ts +35 -0
  71. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  72. package/dist/cli/commands/aggregate.js +121 -0
  73. package/dist/cli/commands/aggregate.js.map +1 -0
  74. package/dist/cli/commands/plan.d.ts +36 -0
  75. package/dist/cli/commands/plan.d.ts.map +1 -0
  76. package/dist/cli/commands/plan.js +109 -0
  77. package/dist/cli/commands/plan.js.map +1 -0
  78. package/dist/cli/commands/run.d.ts +33 -0
  79. package/dist/cli/commands/run.d.ts.map +1 -0
  80. package/dist/cli/commands/run.js +185 -0
  81. package/dist/cli/commands/run.js.map +1 -0
  82. package/dist/cli/commands/validate.d.ts +27 -0
  83. package/dist/cli/commands/validate.d.ts.map +1 -0
  84. package/dist/cli/commands/validate.js +88 -0
  85. package/dist/cli/commands/validate.js.map +1 -0
  86. package/dist/cli/config-loader.d.ts +30 -0
  87. package/dist/cli/config-loader.d.ts.map +1 -0
  88. package/dist/cli/config-loader.js +181 -0
  89. package/dist/cli/config-loader.js.map +1 -0
  90. package/dist/cli/index.d.ts +26 -0
  91. package/dist/cli/index.d.ts.map +1 -0
  92. package/dist/cli/index.js +58 -0
  93. package/dist/cli/index.js.map +1 -0
  94. package/dist/cli/logger.d.ts +75 -0
  95. package/dist/cli/logger.d.ts.map +1 -0
  96. package/dist/cli/logger.js +131 -0
  97. package/dist/cli/logger.js.map +1 -0
  98. package/dist/cli/module-loader.d.ts +46 -0
  99. package/dist/cli/module-loader.d.ts.map +1 -0
  100. package/dist/cli/module-loader.js +116 -0
  101. package/dist/cli/module-loader.js.map +1 -0
  102. package/dist/cli/output-writer.d.ts +51 -0
  103. package/dist/cli/output-writer.d.ts.map +1 -0
  104. package/dist/cli/output-writer.js +65 -0
  105. package/dist/cli/output-writer.js.map +1 -0
  106. package/dist/cli/types.d.ts +174 -0
  107. package/dist/cli/types.d.ts.map +1 -0
  108. package/dist/cli/types.js +7 -0
  109. package/dist/cli/types.js.map +1 -0
  110. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  111. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  112. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  113. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  114. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  115. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  116. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  117. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  118. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
  119. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
  120. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
  121. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
  122. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
  123. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
  124. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +105 -1
  125. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  126. package/dist/executor/__tests__/executor.unit.test.js +69 -1
  127. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  128. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  129. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  130. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  131. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  132. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
  133. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
  134. package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
  135. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
  136. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  137. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  138. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  139. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  140. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  141. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  142. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  143. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  144. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  145. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  146. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  147. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  148. package/dist/executor/parallel-executor.d.ts +186 -0
  149. package/dist/executor/parallel-executor.d.ts.map +1 -1
  150. package/dist/executor/parallel-executor.js +218 -83
  151. package/dist/executor/parallel-executor.js.map +1 -1
  152. package/dist/executor/run-id.d.ts.map +1 -1
  153. package/dist/executor/run-id.js +8 -1
  154. package/dist/executor/run-id.js.map +1 -1
  155. package/dist/executor/worker-entry.d.ts +2 -0
  156. package/dist/executor/worker-entry.d.ts.map +1 -1
  157. package/dist/executor/worker-entry.js +29 -54
  158. package/dist/executor/worker-entry.js.map +1 -1
  159. package/dist/executor/worker-executor.d.ts +156 -0
  160. package/dist/executor/worker-executor.d.ts.map +1 -0
  161. package/dist/executor/worker-executor.js +88 -0
  162. package/dist/executor/worker-executor.js.map +1 -0
  163. package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
  164. package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
  165. package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
  166. package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
  167. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  168. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  169. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  170. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  171. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  172. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  173. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  174. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  175. package/package.json +8 -1
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Unit tests for Aggregation Functions
3
+ *
4
+ * Tests the pure functions for computing aggregated statistics.
5
+ */
6
+ import { describe, it } from "node:test";
7
+ import { strict as assert } from "node:assert";
8
+ import { computeSummaryStats, computeSpeedup, computeMaxSpeedup, computeComparison, computeRankings, getTValue, } from "../aggregators.js";
9
+ import { createMockResult } from "../../__tests__/test-helpers.js";
10
+ describe("computeSummaryStats", () => {
11
+ it("should return NaN values for empty array", () => {
12
+ const result = computeSummaryStats([]);
13
+ assert.strictEqual(result.n, 0);
14
+ assert.ok(Number.isNaN(result.mean));
15
+ assert.ok(Number.isNaN(result.median));
16
+ assert.ok(Number.isNaN(result.min));
17
+ assert.ok(Number.isNaN(result.max));
18
+ });
19
+ it("should compute basic statistics for single value", () => {
20
+ const result = computeSummaryStats([42]);
21
+ assert.strictEqual(result.n, 1);
22
+ assert.strictEqual(result.mean, 42);
23
+ assert.strictEqual(result.median, 42);
24
+ assert.strictEqual(result.min, 42);
25
+ assert.strictEqual(result.max, 42);
26
+ assert.strictEqual(result.std, undefined);
27
+ assert.strictEqual(result.confidence95, undefined);
28
+ });
29
+ it("should compute statistics for multiple values", () => {
30
+ const result = computeSummaryStats([1, 2, 3, 4, 5]);
31
+ assert.strictEqual(result.n, 5);
32
+ assert.strictEqual(result.mean, 3);
33
+ assert.strictEqual(result.median, 3);
34
+ assert.strictEqual(result.min, 1);
35
+ assert.strictEqual(result.max, 5);
36
+ assert.ok(result.std !== undefined);
37
+ assert.ok(result.std > 0);
38
+ });
39
+ it("should compute median for even-length arrays", () => {
40
+ const result = computeSummaryStats([1, 2, 3, 4]);
41
+ assert.strictEqual(result.median, 2.5); // (2 + 3) / 2
42
+ });
43
+ it("should compute 95% confidence interval", () => {
44
+ const result = computeSummaryStats([10, 12, 14, 16, 18]);
45
+ assert.ok(result.confidence95 !== undefined);
46
+ assert.ok(result.confidence95[0] < result.mean);
47
+ assert.ok(result.confidence95[1] > result.mean);
48
+ });
49
+ it("should compute percentiles", () => {
50
+ const result = computeSummaryStats([1, 2, 3, 4, 5, 6, 7, 8]);
51
+ assert.strictEqual(result.p25, 3); // Floor of 8 * 0.25 = 2, sorted[2] = 3
52
+ assert.strictEqual(result.p75, 7); // Floor of 8 * 0.75 = 6, sorted[6] = 7
53
+ });
54
+ });
55
+ describe("computeSpeedup", () => {
56
+ it("should compute speedup ratio", () => {
57
+ const result = computeSpeedup(100, 50);
58
+ assert.strictEqual(result, 2); // 100 / 50 = 2x speedup
59
+ });
60
+ it("should return Infinity for zero treatment time", () => {
61
+ const result = computeSpeedup(100, 0);
62
+ assert.strictEqual(result, Infinity);
63
+ });
64
+ it("should handle slower treatment", () => {
65
+ const result = computeSpeedup(50, 100);
66
+ assert.strictEqual(result, 0.5); // 50 / 100 = 0.5x (slower)
67
+ });
68
+ });
69
+ describe("computeMaxSpeedup", () => {
70
+ it("should return 0 for empty pairs", () => {
71
+ const result = computeMaxSpeedup([]);
72
+ assert.strictEqual(result, 0);
73
+ });
74
+ it("should compute maximum speedup from pairs", () => {
75
+ const pairs = [
76
+ [100, 50], // 2x
77
+ [100, 25], // 4x
78
+ [100, 100], // 1x
79
+ ];
80
+ const result = computeMaxSpeedup(pairs);
81
+ assert.strictEqual(result, 4); // Maximum is 4x
82
+ });
83
+ it("should handle pairs with zero treatment time", () => {
84
+ const pairs = [
85
+ [100, 50],
86
+ [100, 0], // Infinity
87
+ [100, 25],
88
+ ];
89
+ const result = computeMaxSpeedup(pairs);
90
+ assert.strictEqual(result, Infinity);
91
+ });
92
+ it("should handle single pair", () => {
93
+ const pairs = [[100, 25]];
94
+ const result = computeMaxSpeedup(pairs);
95
+ assert.strictEqual(result, 4);
96
+ });
97
+ });
98
+ describe("computeComparison", () => {
99
+ it("should return default values when no common case IDs", () => {
100
+ const primaryResults = [
101
+ createMockResult({
102
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "primary-case-1" },
103
+ }),
104
+ createMockResult({
105
+ run: { runId: "p2", sut: "primary", sutRole: "primary", caseId: "primary-case-2" },
106
+ }),
107
+ ];
108
+ const baselineResults = [
109
+ createMockResult({
110
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "baseline-case-1" },
111
+ }),
112
+ createMockResult({
113
+ run: { runId: "b2", sut: "baseline", sutRole: "baseline", caseId: "baseline-case-2" },
114
+ }),
115
+ ];
116
+ const result = computeComparison(primaryResults, baselineResults, "execution-time");
117
+ assert.deepStrictEqual(result.deltas, { default: 0 });
118
+ assert.deepStrictEqual(result.ratios, { default: 1 });
119
+ });
120
+ it("should compute delta and ratio for matching cases", () => {
121
+ const primaryResults = [
122
+ createMockResult({
123
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
124
+ metrics: { numeric: { "execution-time": 80 } },
125
+ }),
126
+ createMockResult({
127
+ run: { runId: "p2", sut: "primary", sutRole: "primary", caseId: "case-2" },
128
+ metrics: { numeric: { "execution-time": 120 } },
129
+ }),
130
+ ];
131
+ const baselineResults = [
132
+ createMockResult({
133
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
134
+ metrics: { numeric: { "execution-time": 100 } },
135
+ }),
136
+ createMockResult({
137
+ run: { runId: "b2", sut: "baseline", sutRole: "baseline", caseId: "case-2" },
138
+ metrics: { numeric: { "execution-time": 100 } },
139
+ }),
140
+ ];
141
+ const result = computeComparison(primaryResults, baselineResults, "execution-time");
142
+ // Primary mean = 100, baseline mean = 100
143
+ assert.strictEqual(result.deltas.default, 0);
144
+ assert.strictEqual(result.ratios.default, 1);
145
+ });
146
+ it("should compute better rate (wins)", () => {
147
+ const primaryResults = [
148
+ createMockResult({
149
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
150
+ metrics: { numeric: { accuracy: 0.9 } },
151
+ }),
152
+ createMockResult({
153
+ run: { runId: "p2", sut: "primary", sutRole: "primary", caseId: "case-2" },
154
+ metrics: { numeric: { accuracy: 0.7 } },
155
+ }),
156
+ createMockResult({
157
+ run: { runId: "p3", sut: "primary", sutRole: "primary", caseId: "case-3" },
158
+ metrics: { numeric: { accuracy: 0.85 } },
159
+ }),
160
+ ];
161
+ const baselineResults = [
162
+ createMockResult({
163
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
164
+ metrics: { numeric: { accuracy: 0.8 } },
165
+ }),
166
+ createMockResult({
167
+ run: { runId: "b2", sut: "baseline", sutRole: "baseline", caseId: "case-2" },
168
+ metrics: { numeric: { accuracy: 0.8 } },
169
+ }),
170
+ createMockResult({
171
+ run: { runId: "b3", sut: "baseline", sutRole: "baseline", caseId: "case-3" },
172
+ metrics: { numeric: { accuracy: 0.8 } },
173
+ }),
174
+ ];
175
+ const result = computeComparison(primaryResults, baselineResults, "accuracy");
176
+ // Primary wins: case-1 (0.9 > 0.8), loses case-2 (0.7 < 0.8), wins case-3 (0.85 > 0.8)
177
+ // Win rate = 2/3 ≈ 0.667
178
+ assert.ok(result.betterRate > 0.6);
179
+ assert.ok(result.betterRate < 0.7);
180
+ });
181
+ it("should return infinite ratio when baseline mean is zero", () => {
182
+ const primaryResults = [
183
+ createMockResult({
184
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
185
+ metrics: { numeric: { errors: 0 } },
186
+ }),
187
+ ];
188
+ const baselineResults = [
189
+ createMockResult({
190
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
191
+ metrics: { numeric: { errors: 0 } },
192
+ }),
193
+ ];
194
+ const result = computeComparison(primaryResults, baselineResults, "errors");
195
+ // When both means are 0, ratio should be 0/0 which is handled specially
196
+ // Actually looking at the code, if baselineStats.mean === 0, ratio = Infinity
197
+ assert.strictEqual(result.ratios.default, Infinity);
198
+ });
199
+ it("should compute pValue using Mann-Whitney U test", () => {
200
+ const primaryResults = [
201
+ createMockResult({
202
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
203
+ metrics: { numeric: { "execution-time": 100 } },
204
+ }),
205
+ ];
206
+ const baselineResults = [
207
+ createMockResult({
208
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
209
+ metrics: { numeric: { "execution-time": 100 } },
210
+ }),
211
+ ];
212
+ const result = computeComparison(primaryResults, baselineResults, "execution-time");
213
+ assert.ok(typeof result.pValue === "number");
214
+ assert.ok(typeof result.uStatistic === "number");
215
+ });
216
+ it("should compute effect size when both samples have variance", () => {
217
+ const primaryResults = [
218
+ createMockResult({
219
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
220
+ metrics: { numeric: { "execution-time": 80 } },
221
+ }),
222
+ createMockResult({
223
+ run: { runId: "p2", sut: "primary", sutRole: "primary", caseId: "case-2" },
224
+ metrics: { numeric: { "execution-time": 120 } },
225
+ }),
226
+ ];
227
+ const baselineResults = [
228
+ createMockResult({
229
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
230
+ metrics: { numeric: { "execution-time": 95 } },
231
+ }),
232
+ createMockResult({
233
+ run: { runId: "b2", sut: "baseline", sutRole: "baseline", caseId: "case-2" },
234
+ metrics: { numeric: { "execution-time": 105 } },
235
+ }),
236
+ ];
237
+ const result = computeComparison(primaryResults, baselineResults, "execution-time");
238
+ assert.ok(result.effectSize !== undefined);
239
+ assert.ok(result.effectSize >= 0);
240
+ });
241
+ });
242
+ describe("computeRankings", () => {
243
+ it("should rank results by metric in descending order (default)", () => {
244
+ const results = [
245
+ createMockResult({
246
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
247
+ metrics: { numeric: { score: 0.8 } },
248
+ }),
249
+ createMockResult({
250
+ run: { runId: "r2", sut: "sut-2", sutRole: "primary", caseId: "case-1" },
251
+ metrics: { numeric: { score: 0.95 } },
252
+ }),
253
+ createMockResult({
254
+ run: { runId: "r3", sut: "sut-3", sutRole: "primary", caseId: "case-1" },
255
+ metrics: { numeric: { score: 0.7 } },
256
+ }),
257
+ ];
258
+ const rankings = computeRankings(results, "score");
259
+ assert.strictEqual(rankings.length, 3);
260
+ assert.strictEqual(rankings[0].rank, 1);
261
+ assert.strictEqual(rankings[0].result.run.runId, "r2"); // Highest score gets rank 1
262
+ assert.strictEqual(rankings[2].rank, 3);
263
+ assert.strictEqual(rankings[2].result.run.runId, "r3"); // Lowest score gets rank 3
264
+ });
265
+ it("should rank results in ascending order when specified", () => {
266
+ const results = [
267
+ createMockResult({
268
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
269
+ metrics: { numeric: { "execution-time": 100 } },
270
+ }),
271
+ createMockResult({
272
+ run: { runId: "r2", sut: "sut-2", sutRole: "primary", caseId: "case-1" },
273
+ metrics: { numeric: { "execution-time": 50 } },
274
+ }),
275
+ createMockResult({
276
+ run: { runId: "r3", sut: "sut-3", sutRole: "primary", caseId: "case-1" },
277
+ metrics: { numeric: { "execution-time": 75 } },
278
+ }),
279
+ ];
280
+ const rankings = computeRankings(results, "execution-time", true);
281
+ assert.strictEqual(rankings[0].rank, 1);
282
+ assert.strictEqual(rankings[0].result.run.runId, "r2"); // Fastest (lowest time) gets rank 1
283
+ assert.strictEqual(rankings[2].rank, 3);
284
+ assert.strictEqual(rankings[2].result.run.runId, "r1"); // Slowest (highest time) gets rank 3
285
+ });
286
+ it("should filter out results with missing or NaN metric values", () => {
287
+ const results = [
288
+ createMockResult({
289
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
290
+ metrics: { numeric: { score: 0.8 } },
291
+ }),
292
+ createMockResult({
293
+ run: { runId: "r2", sut: "sut-2", sutRole: "primary", caseId: "case-1" },
294
+ metrics: { numeric: {} }, // Missing metric
295
+ }),
296
+ ];
297
+ const rankings = computeRankings(results, "score");
298
+ assert.strictEqual(rankings.length, 1); // Only r1 has the metric
299
+ assert.strictEqual(rankings[0].result.run.runId, "r1");
300
+ });
301
+ it("should return empty array when no results have the metric", () => {
302
+ const results = [
303
+ createMockResult({
304
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
305
+ metrics: { numeric: {} },
306
+ }),
307
+ ];
308
+ const rankings = computeRankings(results, "nonexistent");
309
+ assert.deepStrictEqual(rankings, []);
310
+ });
311
+ it("should handle ties in metric values", () => {
312
+ const results = [
313
+ createMockResult({
314
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
315
+ metrics: { numeric: { score: 0.9 } },
316
+ }),
317
+ createMockResult({
318
+ run: { runId: "r2", sut: "sut-2", sutRole: "primary", caseId: "case-1" },
319
+ metrics: { numeric: { score: 0.9 } },
320
+ }),
321
+ ];
322
+ const rankings = computeRankings(results, "score");
323
+ assert.strictEqual(rankings.length, 2);
324
+ // Both have rank 1 and 2 due to sort stability
325
+ assert.ok(rankings.every((r) => r.value === 0.9));
326
+ });
327
+ });
328
+ describe("getTValue", () => {
329
+ it("should return t-value from lookup table for 95% CI", () => {
330
+ const t10 = getTValue(10, 0.975);
331
+ assert.strictEqual(t10, 2.228);
332
+ const t30 = getTValue(30, 0.975);
333
+ assert.strictEqual(t30, 2.042);
334
+ const t100 = getTValue(100, 0.975);
335
+ assert.strictEqual(t100, 1.984);
336
+ });
337
+ it("should return z-value fallback for non-standard probability", () => {
338
+ const result = getTValue(50, 0.99);
339
+ assert.strictEqual(result, 1.96); // z-value for large samples
340
+ });
341
+ it("should return z-value fallback for 90% CI", () => {
342
+ const result = getTValue(50, 0.95); // 90% two-tailed = 0.95
343
+ assert.strictEqual(result, 1.96);
344
+ });
345
+ it("should return z-value fallback for 99% CI", () => {
346
+ const result = getTValue(50, 0.995); // 99% two-tailed = 0.995
347
+ assert.strictEqual(result, 1.96);
348
+ });
349
+ });
350
+ //# sourceMappingURL=aggregators.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregators.unit.test.js","sourceRoot":"","sources":["../../../src/aggregation/__tests__/aggregators.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for aggregation pipeline
3
+ *
4
+ * Tests aggregateResults and createAggregationOutput functions.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=pipeline.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.unit.test.d.ts","sourceRoot":"","sources":["../../../src/aggregation/__tests__/pipeline.unit.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Unit tests for aggregation pipeline
3
+ *
4
+ * Tests aggregateResults and createAggregationOutput functions.
5
+ */
6
+ import { describe, it } from "node:test";
7
+ import assert from "node:assert/strict";
8
+ import { aggregateResults, createAggregationOutput } from "../pipeline.js";
9
+ import { createMockResults, createMockResultsWithMetrics } from "../../__tests__/test-helpers.js";
10
+ describe("aggregateResults", () => {
11
+ it("should return empty array when no results provided", () => {
12
+ const result = aggregateResults([]);
13
+ assert.deepStrictEqual(result, []);
14
+ });
15
+ it("should aggregate results without comparisons when computeComparisons is false", () => {
16
+ const results = createMockResults(5, "test-sut", "primary");
17
+ const aggregated = aggregateResults(results, { computeComparisons: false });
18
+ // Should have aggregates but no comparisons
19
+ assert.ok(aggregated.length > 0);
20
+ assert.strictEqual(aggregated[0].comparisons, undefined);
21
+ });
22
+ it("should not add comparisons when no baseline SUTs exist", () => {
23
+ const results = createMockResults(5, "primary-sut", "primary");
24
+ const aggregated = aggregateResults(results);
25
+ // Should not have comparisons since no baseline SUTs present
26
+ assert.strictEqual(aggregated[0].comparisons, undefined);
27
+ });
28
+ it("should not add comparisons when no primary SUT can be determined", () => {
29
+ const results = [
30
+ ...createMockResults(3, "baseline-1", "baseline"),
31
+ ...createMockResults(3, "baseline-2", "baseline"),
32
+ ];
33
+ const aggregated = aggregateResults(results);
34
+ // Should not have comparisons since no primary SUT
35
+ for (const agg of aggregated) {
36
+ assert.strictEqual(agg.comparisons, undefined);
37
+ }
38
+ });
39
+ it("should use provided primary SUT from options", () => {
40
+ const results = [
41
+ ...createMockResults(3, "custom-primary", "baseline"),
42
+ ...createMockResults(3, "baseline", "baseline"),
43
+ ];
44
+ const aggregated = aggregateResults(results, { primarySut: "custom-primary" });
45
+ // Should add comparisons using the specified primary
46
+ const primaryAgg = aggregated.find((a) => a.sut === "custom-primary");
47
+ assert.ok(primaryAgg);
48
+ assert.ok(primaryAgg.comparisons);
49
+ });
50
+ it("should use provided baseline SUTs from options", () => {
51
+ const results = [
52
+ ...createMockResults(3, "primary", "primary"),
53
+ ...createMockResults(3, "custom-baseline", "baseline"),
54
+ ];
55
+ const aggregated = aggregateResults(results, { baselineSuts: ["custom-baseline"] });
56
+ // Should add comparisons using the specified baseline
57
+ const primaryAgg = aggregated.find((a) => a.sut === "primary");
58
+ assert.ok(primaryAgg);
59
+ assert.ok(primaryAgg.comparisons);
60
+ assert.ok("custom-baseline" in primaryAgg.comparisons);
61
+ });
62
+ it("should add comparisons when primary and baseline SUTs exist", () => {
63
+ const results = [
64
+ ...createMockResults(3, "primary-sut", "primary"),
65
+ ...createMockResults(3, "baseline-sut", "baseline"),
66
+ ];
67
+ const aggregated = aggregateResults(results);
68
+ // Should have comparisons
69
+ const primaryAgg = aggregated.find((a) => a.sut === "primary-sut");
70
+ assert.ok(primaryAgg);
71
+ assert.ok(primaryAgg.comparisons);
72
+ assert.ok("baseline-sut" in primaryAgg.comparisons);
73
+ });
74
+ it("should compute comparison deltas and ratios", () => {
75
+ const results = [
76
+ ...createMockResultsWithMetrics([100, 110, 90], "primary", "primary"),
77
+ ...createMockResultsWithMetrics([80, 85, 75], "baseline", "baseline"),
78
+ ];
79
+ const aggregated = aggregateResults(results);
80
+ const primaryAgg = aggregated.find((a) => a.sut === "primary");
81
+ assert.ok(primaryAgg);
82
+ assert.ok(primaryAgg.comparisons);
83
+ const comparison = primaryAgg.comparisons.baseline;
84
+ assert.ok(comparison);
85
+ // The metrics key includes the metric name
86
+ assert.ok(Object.keys(comparison.deltas).length > 0);
87
+ assert.ok(Object.keys(comparison.ratios).length > 0);
88
+ });
89
+ });
90
+ describe("createAggregationOutput", () => {
91
+ it("should create output with metadata", () => {
92
+ const aggregates = [
93
+ {
94
+ sut: "test-sut",
95
+ sutRole: "primary",
96
+ group: { runCount: 1, caseCount: 1 },
97
+ correctness: { validRate: 1, producedOutputRate: 1 },
98
+ metrics: {},
99
+ },
100
+ ];
101
+ const results = createMockResults(1, "test-sut");
102
+ const output = createAggregationOutput(aggregates, results);
103
+ assert.strictEqual(output.version, "1.0.0");
104
+ assert.ok(output.timestamp);
105
+ assert.strictEqual(output.aggregates, aggregates);
106
+ assert.ok(output.metadata);
107
+ assert.strictEqual(output.metadata.totalRuns, 1);
108
+ assert.strictEqual(output.metadata.totalCases, 1);
109
+ assert.deepStrictEqual(output.metadata.sutsIncluded, ["test-sut"]);
110
+ });
111
+ it("should extract unique SUTs", () => {
112
+ const aggregates = [
113
+ {
114
+ sut: "sut-1",
115
+ sutRole: "primary",
116
+ group: { runCount: 1, caseCount: 1 },
117
+ correctness: { validRate: 1, producedOutputRate: 1 },
118
+ metrics: {},
119
+ },
120
+ {
121
+ sut: "sut-2",
122
+ sutRole: "baseline",
123
+ group: { runCount: 1, caseCount: 1 },
124
+ correctness: { validRate: 1, producedOutputRate: 1 },
125
+ metrics: {},
126
+ },
127
+ {
128
+ sut: "sut-1",
129
+ sutRole: "primary",
130
+ group: { runCount: 1, caseCount: 1 },
131
+ correctness: { validRate: 1, producedOutputRate: 1 },
132
+ metrics: {},
133
+ },
134
+ ];
135
+ const output = createAggregationOutput(aggregates, []);
136
+ assert.deepStrictEqual(output.metadata?.sutsIncluded, ["sut-1", "sut-2"]);
137
+ });
138
+ it("should extract unique case IDs from results", () => {
139
+ const aggregates = [];
140
+ const results = createMockResults(5, "sut", "primary");
141
+ const output = createAggregationOutput(aggregates, results);
142
+ // createMockResults creates unique case IDs for each result
143
+ const totalCases = output.metadata?.totalCases;
144
+ assert.ok(totalCases !== undefined);
145
+ assert.ok(totalCases > 0);
146
+ });
147
+ it("should include case classes when present", () => {
148
+ const aggregates = [
149
+ {
150
+ sut: "sut-1",
151
+ sutRole: "primary",
152
+ caseClass: "class-a",
153
+ group: { runCount: 1, caseCount: 1 },
154
+ correctness: { validRate: 1, producedOutputRate: 1 },
155
+ metrics: {},
156
+ },
157
+ {
158
+ sut: "sut-1",
159
+ sutRole: "primary",
160
+ caseClass: "class-b",
161
+ group: { runCount: 1, caseCount: 1 },
162
+ correctness: { validRate: 1, producedOutputRate: 1 },
163
+ metrics: {},
164
+ },
165
+ ];
166
+ const output = createAggregationOutput(aggregates, []);
167
+ assert.deepStrictEqual(output.metadata?.caseClassesIncluded, ["class-a", "class-b"]);
168
+ });
169
+ it("should exclude undefined case classes", () => {
170
+ const aggregates = [
171
+ {
172
+ sut: "sut-1",
173
+ sutRole: "primary",
174
+ group: { runCount: 1, caseCount: 1 },
175
+ correctness: { validRate: 1, producedOutputRate: 1 },
176
+ metrics: {},
177
+ },
178
+ {
179
+ sut: "sut-1",
180
+ sutRole: "primary",
181
+ caseClass: "class-b",
182
+ group: { runCount: 1, caseCount: 1 },
183
+ correctness: { validRate: 1, producedOutputRate: 1 },
184
+ metrics: {},
185
+ },
186
+ ];
187
+ const output = createAggregationOutput(aggregates, []);
188
+ assert.deepStrictEqual(output.metadata?.caseClassesIncluded, ["class-b"]);
189
+ });
190
+ it("should set caseClassesIncluded to undefined when none present", () => {
191
+ const aggregates = [
192
+ {
193
+ sut: "sut-1",
194
+ sutRole: "primary",
195
+ group: { runCount: 1, caseCount: 1 },
196
+ correctness: { validRate: 1, producedOutputRate: 1 },
197
+ metrics: {},
198
+ },
199
+ ];
200
+ const output = createAggregationOutput(aggregates, []);
201
+ assert.strictEqual(output.metadata?.caseClassesIncluded, undefined);
202
+ });
203
+ it("should handle empty aggregates and results", () => {
204
+ const output = createAggregationOutput([], []);
205
+ assert.strictEqual(output.version, "1.0.0");
206
+ assert.strictEqual(output.aggregates.length, 0);
207
+ assert.ok(output.metadata);
208
+ assert.strictEqual(output.metadata.totalRuns, 0);
209
+ assert.strictEqual(output.metadata.totalCases, 0);
210
+ assert.deepStrictEqual(output.metadata.sutsIncluded, []);
211
+ });
212
+ });
213
+ //# sourceMappingURL=pipeline.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.unit.test.js","sourceRoot":"","sources":["../../../src/aggregation/__tests__/pipeline.unit.test.ts"],"names":[],"mappings":"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"}
@@ -51,4 +51,13 @@ export declare const computeRankings: (results: EvaluationResult[], metricName:
51
51
  rank: number;
52
52
  value: number;
53
53
  }[];
54
+ /**
55
+ * Get t-value for confidence interval calculation.
56
+ * This is a simplified lookup table for common degrees of freedom.
57
+ *
58
+ * @param df - Degrees of freedom
59
+ * @param probability - Probability (e.g., 0.975 for 95% two-tailed)
60
+ * @returns t-value
61
+ */
62
+ export declare const getTValue: (df: number, probability: number) => number;
54
63
  //# sourceMappingURL=aggregators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"aggregators.d.ts","sourceRoot":"","sources":["../../src/aggregation/aggregators.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,KAAG,YAuDtD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,cAAc,MAAM,EAAE,eAAe,MAAM,KAAG,MAG5E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAG,MAG7D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAC7B,gBAAgB,gBAAgB,EAAE,EAClC,iBAAiB,gBAAgB,EAAE,EACnC,YAAY,MAAM,KAChB,iBA+EF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC3B,SAAS,gBAAgB,EAAE,EAC3B,YAAY,MAAM,EAClB,mBAAiB,KACf;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAgB3D,CAAC"}
1
+ {"version":3,"file":"aggregators.d.ts","sourceRoot":"","sources":["../../src/aggregation/aggregators.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,KAAG,YAuDtD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,cAAc,MAAM,EAAE,eAAe,MAAM,KAAG,MAG5E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAG,MAG7D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAC7B,gBAAgB,gBAAgB,EAAE,EAClC,iBAAiB,gBAAgB,EAAE,EACnC,YAAY,MAAM,KAChB,iBA+EF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC3B,SAAS,gBAAgB,EAAE,EAC3B,YAAY,MAAM,EAClB,mBAAiB,KACf;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAgB3D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,EAAE,aAAa,MAAM,KAAG,MAsC3D,CAAC"}
@@ -189,7 +189,7 @@ export const computeRankings = (results, metricName, ascending = false) => {
189
189
  * @param probability - Probability (e.g., 0.975 for 95% two-tailed)
190
190
  * @returns t-value
191
191
  */
192
- const getTValue = (df, probability) => {
192
+ export const getTValue = (df, probability) => {
193
193
  // Simplified t-table for 95% CI (probability = 0.975)
194
194
  if (probability !== 0.975) {
195
195
  return 1.96; // Fall back to z-value for large samples