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,422 @@
1
+ /**
2
+ * Unit tests for run command
3
+ *
4
+ * Tests run command functionality with injected dependencies.
5
+ */
6
+ import { beforeEach, describe, it, mock } from "node:test";
7
+ import { strict as assert } from "node:assert";
8
+ import { executeRun } from "../commands/run.js";
9
+ describe("run command", () => {
10
+ let mockLogger;
11
+ let mockConfigLoader;
12
+ let mockModuleLoader;
13
+ let mockExecutor;
14
+ let mockAggregator;
15
+ let mockOutputWriter;
16
+ let mockProcessExit;
17
+ let exitCode;
18
+ const loggedMessages = [];
19
+ const mockSutFactory = {
20
+ id: "test-sut",
21
+ config: {},
22
+ run: async (input) => ({ result: "ok" }),
23
+ };
24
+ const mockCaseDefinition = {
25
+ case: {
26
+ caseId: "test-case",
27
+ name: "Test Case",
28
+ inputs: {},
29
+ },
30
+ getInput: async () => ({}),
31
+ getInputs: () => [],
32
+ };
33
+ const mockResults = [
34
+ {
35
+ run: {
36
+ runId: "test-1",
37
+ sut: "sut-1",
38
+ sutRole: "primary",
39
+ caseId: "case-1",
40
+ seed: 42,
41
+ repetition: 0,
42
+ },
43
+ correctness: {
44
+ expectedExists: false,
45
+ producedOutput: true,
46
+ valid: true,
47
+ matchesExpected: null,
48
+ },
49
+ outputs: {
50
+ summary: { status: "success" },
51
+ },
52
+ metrics: {
53
+ numeric: { durationMs: 100, memoryBytes: 1024 },
54
+ },
55
+ provenance: {
56
+ runtime: {
57
+ platform: "linux",
58
+ arch: "x64",
59
+ nodeVersion: "20.0.0",
60
+ },
61
+ timestamp: "2024-01-01T00:00:00Z",
62
+ },
63
+ },
64
+ ];
65
+ const mockAggregationOutput = {
66
+ version: "1.0.0",
67
+ timestamp: "2024-01-01T00:00:00Z",
68
+ aggregates: [],
69
+ metadata: { totalRuns: 1, totalCases: 1, sutsIncluded: ["sut-1"] },
70
+ };
71
+ const mockPlannedRuns = [{ sutId: "test-sut", caseId: "test-case", repetition: 0, seed: 42 }];
72
+ beforeEach(() => {
73
+ loggedMessages.length = 0;
74
+ exitCode = null;
75
+ // Mock logger
76
+ mockLogger = {
77
+ header: mock.fn((msg) => {
78
+ loggedMessages.push(`[header] ${msg}`);
79
+ }),
80
+ subheader: mock.fn((msg) => {
81
+ loggedMessages.push(`[subheader] ${msg}`);
82
+ }),
83
+ info: mock.fn((msg) => {
84
+ loggedMessages.push(`[info] ${msg}`);
85
+ }),
86
+ debug: mock.fn((msg) => {
87
+ loggedMessages.push(`[debug] ${msg}`);
88
+ }),
89
+ error: mock.fn((msg) => {
90
+ loggedMessages.push(`[error] ${msg}`);
91
+ }),
92
+ warn: mock.fn((msg) => {
93
+ loggedMessages.push(`[warn] ${msg}`);
94
+ }),
95
+ setProgress: mock.fn(() => {
96
+ // Do nothing
97
+ }),
98
+ };
99
+ // Mock process exit
100
+ mockProcessExit = mock.fn((code) => {
101
+ exitCode = code;
102
+ throw new Error(`process.exit(${code})`);
103
+ });
104
+ // Mock config loader
105
+ mockConfigLoader = {
106
+ loadAndValidateConfig: async () => {
107
+ return {
108
+ config: {
109
+ experiment: {
110
+ name: "Test Experiment",
111
+ description: "Test Description",
112
+ version: "1.0.0",
113
+ },
114
+ suts: [
115
+ {
116
+ id: "test-sut",
117
+ module: "./test.js",
118
+ exportName: "createSUT",
119
+ registration: {
120
+ name: "Test SUT",
121
+ version: "1.0.0",
122
+ role: "primary",
123
+ tags: [],
124
+ },
125
+ },
126
+ ],
127
+ cases: [
128
+ {
129
+ id: "test-case",
130
+ module: "./case.js",
131
+ exportName: "createCase",
132
+ },
133
+ ],
134
+ metricsExtractor: {
135
+ module: "./metrics.js",
136
+ exportName: "extractMetrics",
137
+ },
138
+ executor: {
139
+ repetitions: 10,
140
+ seedBase: 42,
141
+ },
142
+ output: {
143
+ path: "./results",
144
+ format: "json-pretty",
145
+ aggregate: true,
146
+ },
147
+ },
148
+ baseDir: "/test/base",
149
+ configPath: "/test/config.json",
150
+ };
151
+ },
152
+ };
153
+ // Mock module loader
154
+ mockModuleLoader = {
155
+ loadSutFactory: async () => mockSutFactory,
156
+ loadCaseDefinition: async () => mockCaseDefinition,
157
+ loadMetricsExtractor: async () => ({
158
+ extract: (result, input) => ({ accuracy: 0.9 }),
159
+ }),
160
+ };
161
+ // Mock executor
162
+ mockExecutor = {
163
+ plan: mock.fn(() => mockPlannedRuns),
164
+ execute: mock.fn(async () => ({
165
+ results: mockResults,
166
+ errors: [],
167
+ totalRuns: 1,
168
+ successfulRuns: 1,
169
+ failedRuns: 0,
170
+ elapsedMs: 100,
171
+ })),
172
+ };
173
+ // Mock aggregator
174
+ mockAggregator = {
175
+ aggregateResults: mock.fn(() => []),
176
+ createAggregationOutput: mock.fn(() => mockAggregationOutput),
177
+ };
178
+ // Mock output writer
179
+ mockOutputWriter = {
180
+ generateOutputFilename: mock.fn((name, type) => {
181
+ return `experiment-${type}.json`;
182
+ }),
183
+ writeResults: mock.fn(async () => {
184
+ // Do nothing
185
+ }),
186
+ writeAggregates: mock.fn(async () => {
187
+ // Do nothing
188
+ }),
189
+ };
190
+ });
191
+ describe("executeRun", () => {
192
+ const defaultOptions = {
193
+ output: undefined,
194
+ format: "json-pretty",
195
+ noAggregate: false,
196
+ jobs: undefined,
197
+ verbose: false,
198
+ quiet: false,
199
+ dryRun: false,
200
+ };
201
+ it("should log execution header", async () => {
202
+ await executeRun("/test/config.json", defaultOptions, {
203
+ logger: mockLogger,
204
+ configLoader: mockConfigLoader,
205
+ moduleLoader: mockModuleLoader,
206
+ createExecutor: () => mockExecutor,
207
+ aggregator: mockAggregator,
208
+ outputWriter: mockOutputWriter,
209
+ processExit: mockProcessExit,
210
+ });
211
+ assert.ok(loggedMessages.includes("[header] Experiment: Execution"));
212
+ });
213
+ it("should log dry run header when dryRun is true", async () => {
214
+ await executeRun("/test/config.json", { ...defaultOptions, dryRun: true }, {
215
+ logger: mockLogger,
216
+ configLoader: mockConfigLoader,
217
+ moduleLoader: mockModuleLoader,
218
+ createExecutor: () => mockExecutor,
219
+ aggregator: mockAggregator,
220
+ outputWriter: mockOutputWriter,
221
+ processExit: mockProcessExit,
222
+ });
223
+ assert.ok(loggedMessages.includes("[header] Experiment: Dry Run"));
224
+ });
225
+ it("should load and log SUTs", async () => {
226
+ await executeRun("/test/config.json", defaultOptions, {
227
+ logger: mockLogger,
228
+ configLoader: mockConfigLoader,
229
+ moduleLoader: mockModuleLoader,
230
+ createExecutor: () => mockExecutor,
231
+ aggregator: mockAggregator,
232
+ outputWriter: mockOutputWriter,
233
+ processExit: mockProcessExit,
234
+ });
235
+ assert.ok(loggedMessages.includes("[subheader] Loading SUTs..."));
236
+ assert.ok(loggedMessages.some((msg) => msg.includes("Loaded 1 SUTs")));
237
+ });
238
+ it("should load and log cases", async () => {
239
+ await executeRun("/test/config.json", defaultOptions, {
240
+ logger: mockLogger,
241
+ configLoader: mockConfigLoader,
242
+ moduleLoader: mockModuleLoader,
243
+ createExecutor: () => mockExecutor,
244
+ aggregator: mockAggregator,
245
+ outputWriter: mockOutputWriter,
246
+ processExit: mockProcessExit,
247
+ });
248
+ assert.ok(loggedMessages.includes("[subheader] Loading cases..."));
249
+ assert.ok(loggedMessages.some((msg) => msg.includes("Loaded 1 cases")));
250
+ });
251
+ it("should call executor plan", async () => {
252
+ const planMock = mock.fn(() => mockPlannedRuns);
253
+ mockExecutor.plan = planMock;
254
+ await executeRun("/test/config.json", defaultOptions, {
255
+ logger: mockLogger,
256
+ configLoader: mockConfigLoader,
257
+ moduleLoader: mockModuleLoader,
258
+ createExecutor: () => mockExecutor,
259
+ aggregator: mockAggregator,
260
+ outputWriter: mockOutputWriter,
261
+ processExit: mockProcessExit,
262
+ });
263
+ assert.strictEqual(planMock.mock.calls.length, 1);
264
+ });
265
+ it("should handle dry run mode", async () => {
266
+ const executeMock = mock.fn(async () => ({
267
+ results: mockResults,
268
+ errors: [],
269
+ totalRuns: 1,
270
+ successfulRuns: 1,
271
+ failedRuns: 0,
272
+ elapsedMs: 100,
273
+ }));
274
+ mockExecutor.execute = executeMock;
275
+ await executeRun("/test/config.json", { ...defaultOptions, dryRun: true }, {
276
+ logger: mockLogger,
277
+ configLoader: mockConfigLoader,
278
+ moduleLoader: mockModuleLoader,
279
+ createExecutor: () => mockExecutor,
280
+ aggregator: mockAggregator,
281
+ outputWriter: mockOutputWriter,
282
+ processExit: mockProcessExit,
283
+ });
284
+ assert.ok(loggedMessages.includes("[subheader] Dry run - not executing"));
285
+ assert.strictEqual(executeMock.mock.calls.length, 0);
286
+ });
287
+ it("should log SUTs and cases in dry run", async () => {
288
+ await executeRun("/test/config.json", { ...defaultOptions, dryRun: true }, {
289
+ logger: mockLogger,
290
+ configLoader: mockConfigLoader,
291
+ moduleLoader: mockModuleLoader,
292
+ createExecutor: () => mockExecutor,
293
+ aggregator: mockAggregator,
294
+ outputWriter: mockOutputWriter,
295
+ processExit: mockProcessExit,
296
+ });
297
+ assert.ok(loggedMessages.some((msg) => msg.includes("SUTs: test-sut")));
298
+ assert.ok(loggedMessages.some((msg) => msg.includes("Cases: test-case")));
299
+ assert.ok(loggedMessages.some((msg) => msg.includes("Total runs: 1")));
300
+ });
301
+ it("should execute experiments in normal mode", async () => {
302
+ const executeMock = mock.fn(async () => ({
303
+ results: mockResults,
304
+ errors: [],
305
+ totalRuns: 1,
306
+ successfulRuns: 1,
307
+ failedRuns: 0,
308
+ elapsedMs: 100,
309
+ }));
310
+ mockExecutor.execute = executeMock;
311
+ await executeRun("/test/config.json", defaultOptions, {
312
+ logger: mockLogger,
313
+ configLoader: mockConfigLoader,
314
+ moduleLoader: mockModuleLoader,
315
+ createExecutor: () => mockExecutor,
316
+ aggregator: mockAggregator,
317
+ outputWriter: mockOutputWriter,
318
+ processExit: mockProcessExit,
319
+ });
320
+ assert.strictEqual(executeMock.mock.calls.length, 1);
321
+ });
322
+ it("should log execution summary", async () => {
323
+ await executeRun("/test/config.json", defaultOptions, {
324
+ logger: mockLogger,
325
+ configLoader: mockConfigLoader,
326
+ moduleLoader: mockModuleLoader,
327
+ createExecutor: () => mockExecutor,
328
+ aggregator: mockAggregator,
329
+ outputWriter: mockOutputWriter,
330
+ processExit: mockProcessExit,
331
+ });
332
+ assert.ok(loggedMessages.includes("[subheader] Execution Summary"));
333
+ assert.ok(loggedMessages.some((msg) => msg.includes("Total runs: 1")));
334
+ assert.ok(loggedMessages.some((msg) => msg.includes("Successful: 1")));
335
+ assert.ok(loggedMessages.some((msg) => msg.includes("Failed: 0")));
336
+ });
337
+ it("should write results", async () => {
338
+ const writeResultsMock = mock.fn(async () => {
339
+ // Do nothing
340
+ });
341
+ mockOutputWriter.writeResults = writeResultsMock;
342
+ await executeRun("/test/config.json", defaultOptions, {
343
+ logger: mockLogger,
344
+ configLoader: mockConfigLoader,
345
+ moduleLoader: mockModuleLoader,
346
+ createExecutor: () => mockExecutor,
347
+ aggregator: mockAggregator,
348
+ outputWriter: mockOutputWriter,
349
+ processExit: mockProcessExit,
350
+ });
351
+ assert.strictEqual(writeResultsMock.mock.calls.length, 1);
352
+ });
353
+ it("should aggregate when requested and results exist", async () => {
354
+ const aggregateResultsMock = mock.fn(() => []);
355
+ const writeAggregatesMock = mock.fn(async () => {
356
+ // Do nothing
357
+ });
358
+ mockAggregator.aggregateResults = aggregateResultsMock;
359
+ mockOutputWriter.writeAggregates = writeAggregatesMock;
360
+ await executeRun("/test/config.json", defaultOptions, {
361
+ logger: mockLogger,
362
+ configLoader: mockConfigLoader,
363
+ moduleLoader: mockModuleLoader,
364
+ createExecutor: () => mockExecutor,
365
+ aggregator: mockAggregator,
366
+ outputWriter: mockOutputWriter,
367
+ processExit: mockProcessExit,
368
+ });
369
+ assert.strictEqual(aggregateResultsMock.mock.calls.length, 1);
370
+ assert.strictEqual(writeAggregatesMock.mock.calls.length, 1);
371
+ });
372
+ it("should skip aggregation when noAggregate is true", async () => {
373
+ const aggregateResultsMock = mock.fn(() => []);
374
+ mockAggregator.aggregateResults = aggregateResultsMock;
375
+ await executeRun("/test/config.json", { ...defaultOptions, noAggregate: true }, {
376
+ logger: mockLogger,
377
+ configLoader: mockConfigLoader,
378
+ moduleLoader: mockModuleLoader,
379
+ createExecutor: () => mockExecutor,
380
+ aggregator: mockAggregator,
381
+ outputWriter: mockOutputWriter,
382
+ processExit: mockProcessExit,
383
+ });
384
+ assert.strictEqual(aggregateResultsMock.mock.calls.length, 0);
385
+ });
386
+ it("should call process.exit on error", async () => {
387
+ mockConfigLoader.loadAndValidateConfig = async () => {
388
+ throw new Error("Config error");
389
+ };
390
+ try {
391
+ await executeRun("/test/config.json", defaultOptions, {
392
+ logger: mockLogger,
393
+ configLoader: mockConfigLoader,
394
+ moduleLoader: mockModuleLoader,
395
+ createExecutor: () => mockExecutor,
396
+ aggregator: mockAggregator,
397
+ outputWriter: mockOutputWriter,
398
+ processExit: mockProcessExit,
399
+ });
400
+ }
401
+ catch {
402
+ // Expected to throw
403
+ }
404
+ assert.ok(loggedMessages.some((msg) => msg.includes("[error] Config error")));
405
+ assert.strictEqual(exitCode, 1);
406
+ });
407
+ it("should log success message", async () => {
408
+ await executeRun("/test/config.json", defaultOptions, {
409
+ logger: mockLogger,
410
+ configLoader: mockConfigLoader,
411
+ moduleLoader: mockModuleLoader,
412
+ createExecutor: () => mockExecutor,
413
+ aggregator: mockAggregator,
414
+ outputWriter: mockOutputWriter,
415
+ processExit: mockProcessExit,
416
+ });
417
+ assert.ok(loggedMessages.some((msg) => msg.includes("Experiment completed successfully!")));
418
+ assert.strictEqual(exitCode, null);
419
+ });
420
+ });
421
+ });
422
+ //# sourceMappingURL=run.command.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.command.unit.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/run.command.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for validate command
3
+ *
4
+ * Tests validate command functionality with injected dependencies.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=validate.command.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.command.unit.test.d.ts","sourceRoot":"","sources":["../../../src/cli/__tests__/validate.command.unit.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}