ppef 1.0.1 → 1.2.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 (295) hide show
  1. package/README.md +76 -125
  2. package/bin/ppef.mjs +20 -0
  3. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts +8 -0
  4. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/cli/evaluate-command.integration.test.js +308 -0
  6. package/dist/__tests__/cli/evaluate-command.integration.test.js.map +1 -0
  7. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts +8 -0
  8. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js +405 -0
  10. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js.map +1 -0
  11. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts +8 -0
  12. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts.map +1 -0
  13. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js +424 -0
  14. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js.map +1 -0
  15. package/dist/__tests__/evaluators/registry.unit.test.d.ts +7 -0
  16. package/dist/__tests__/evaluators/registry.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/evaluators/registry.unit.test.js +173 -0
  18. package/dist/__tests__/evaluators/registry.unit.test.js.map +1 -0
  19. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts +8 -0
  20. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts.map +1 -0
  21. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js +260 -0
  22. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js.map +1 -0
  23. package/dist/__tests__/framework-pipeline.integration.test.js +49 -20
  24. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  25. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  26. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/index-exports.unit.test.js +124 -0
  28. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  29. package/dist/__tests__/registry-executor.integration.test.js +12 -9
  30. package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
  31. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  32. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  33. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  34. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  35. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  36. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  37. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  38. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  39. package/dist/aggregation/aggregators.d.ts +9 -0
  40. package/dist/aggregation/aggregators.d.ts.map +1 -1
  41. package/dist/aggregation/aggregators.js +1 -1
  42. package/dist/aggregation/aggregators.js.map +1 -1
  43. package/dist/aggregation/index.d.ts +1 -1
  44. package/dist/aggregation/index.d.ts.map +1 -1
  45. package/dist/aggregation/index.js +1 -1
  46. package/dist/aggregation/index.js.map +1 -1
  47. package/dist/aggregation/pipeline.d.ts.map +1 -1
  48. package/dist/aggregation/pipeline.js +40 -3
  49. package/dist/aggregation/pipeline.js.map +1 -1
  50. package/dist/claims/index.d.ts +6 -3
  51. package/dist/claims/index.d.ts.map +1 -1
  52. package/dist/claims/index.js +6 -3
  53. package/dist/claims/index.js.map +1 -1
  54. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  55. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  56. package/dist/cli/__tests__/aggregate.command.unit.test.js +399 -0
  57. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  58. package/dist/cli/__tests__/binary-sut.integration.test.d.ts +8 -0
  59. package/dist/cli/__tests__/binary-sut.integration.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/binary-sut.integration.test.js +165 -0
  61. package/dist/cli/__tests__/binary-sut.integration.test.js.map +1 -0
  62. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  63. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  64. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  65. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  66. package/dist/cli/__tests__/config-loader.unit.test.d.ts +7 -0
  67. package/dist/cli/__tests__/config-loader.unit.test.d.ts.map +1 -0
  68. package/dist/cli/__tests__/config-loader.unit.test.js +611 -0
  69. package/dist/cli/__tests__/config-loader.unit.test.js.map +1 -0
  70. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  71. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  72. package/dist/cli/__tests__/index.unit.test.js +65 -0
  73. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  74. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  75. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  76. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  77. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  78. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  79. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  80. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  81. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  82. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  83. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  84. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  85. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  86. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  87. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  88. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  89. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  90. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  91. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  92. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  93. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  94. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  95. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  96. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  97. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  98. package/dist/cli/command-deps.d.ts +137 -0
  99. package/dist/cli/command-deps.d.ts.map +1 -0
  100. package/dist/cli/command-deps.js +7 -0
  101. package/dist/cli/command-deps.js.map +1 -0
  102. package/dist/cli/commands/aggregate.d.ts +35 -0
  103. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  104. package/dist/cli/commands/aggregate.js +124 -0
  105. package/dist/cli/commands/aggregate.js.map +1 -0
  106. package/dist/cli/commands/evaluate.d.ts +41 -0
  107. package/dist/cli/commands/evaluate.d.ts.map +1 -0
  108. package/dist/cli/commands/evaluate.js +287 -0
  109. package/dist/cli/commands/evaluate.js.map +1 -0
  110. package/dist/cli/commands/plan.d.ts +36 -0
  111. package/dist/cli/commands/plan.d.ts.map +1 -0
  112. package/dist/cli/commands/plan.js +109 -0
  113. package/dist/cli/commands/plan.js.map +1 -0
  114. package/dist/cli/commands/run.d.ts +33 -0
  115. package/dist/cli/commands/run.d.ts.map +1 -0
  116. package/dist/cli/commands/run.js +277 -0
  117. package/dist/cli/commands/run.js.map +1 -0
  118. package/dist/cli/commands/validate.d.ts +27 -0
  119. package/dist/cli/commands/validate.d.ts.map +1 -0
  120. package/dist/cli/commands/validate.js +88 -0
  121. package/dist/cli/commands/validate.js.map +1 -0
  122. package/dist/cli/config-loader.d.ts +30 -0
  123. package/dist/cli/config-loader.d.ts.map +1 -0
  124. package/dist/cli/config-loader.js +181 -0
  125. package/dist/cli/config-loader.js.map +1 -0
  126. package/dist/cli/index.d.ts +27 -0
  127. package/dist/cli/index.d.ts.map +1 -0
  128. package/dist/cli/index.js +60 -0
  129. package/dist/cli/index.js.map +1 -0
  130. package/dist/cli/logger.d.ts +75 -0
  131. package/dist/cli/logger.d.ts.map +1 -0
  132. package/dist/cli/logger.js +131 -0
  133. package/dist/cli/logger.js.map +1 -0
  134. package/dist/cli/module-loader.d.ts +68 -0
  135. package/dist/cli/module-loader.d.ts.map +1 -0
  136. package/dist/cli/module-loader.js +134 -0
  137. package/dist/cli/module-loader.js.map +1 -0
  138. package/dist/cli/output-writer.d.ts +51 -0
  139. package/dist/cli/output-writer.d.ts.map +1 -0
  140. package/dist/cli/output-writer.js +65 -0
  141. package/dist/cli/output-writer.js.map +1 -0
  142. package/dist/cli/types.d.ts +193 -0
  143. package/dist/cli/types.d.ts.map +1 -0
  144. package/dist/cli/types.js +7 -0
  145. package/dist/cli/types.js.map +1 -0
  146. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  147. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  148. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  149. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  150. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  151. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  152. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  153. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  154. package/dist/evaluators/claims-evaluator.d.ts +87 -0
  155. package/dist/evaluators/claims-evaluator.d.ts.map +1 -0
  156. package/dist/evaluators/claims-evaluator.js +289 -0
  157. package/dist/evaluators/claims-evaluator.js.map +1 -0
  158. package/dist/evaluators/exploratory-evaluator.d.ts +136 -0
  159. package/dist/evaluators/exploratory-evaluator.d.ts.map +1 -0
  160. package/dist/evaluators/exploratory-evaluator.js +545 -0
  161. package/dist/evaluators/exploratory-evaluator.js.map +1 -0
  162. package/dist/evaluators/index.d.ts +13 -0
  163. package/dist/evaluators/index.d.ts.map +1 -0
  164. package/dist/evaluators/index.js +14 -0
  165. package/dist/evaluators/index.js.map +1 -0
  166. package/dist/evaluators/metrics-evaluator.d.ts +114 -0
  167. package/dist/evaluators/metrics-evaluator.d.ts.map +1 -0
  168. package/dist/evaluators/metrics-evaluator.js +433 -0
  169. package/dist/evaluators/metrics-evaluator.js.map +1 -0
  170. package/dist/evaluators/registry.d.ts +106 -0
  171. package/dist/evaluators/registry.d.ts.map +1 -0
  172. package/dist/evaluators/registry.js +148 -0
  173. package/dist/evaluators/registry.js.map +1 -0
  174. package/dist/evaluators/robustness-evaluator.d.ts +57 -0
  175. package/dist/evaluators/robustness-evaluator.d.ts.map +1 -0
  176. package/dist/evaluators/robustness-evaluator.js +186 -0
  177. package/dist/evaluators/robustness-evaluator.js.map +1 -0
  178. package/dist/executor/__tests__/binary-sut.unit.test.d.ts +8 -0
  179. package/dist/executor/__tests__/binary-sut.unit.test.d.ts.map +1 -0
  180. package/dist/executor/__tests__/binary-sut.unit.test.js +313 -0
  181. package/dist/executor/__tests__/binary-sut.unit.test.js.map +1 -0
  182. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
  183. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
  184. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
  185. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
  186. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
  187. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
  188. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +148 -1
  189. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  190. package/dist/executor/__tests__/executor.unit.test.js +123 -8
  191. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  192. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  193. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  194. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  195. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  196. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
  197. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
  198. package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
  199. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
  200. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts +10 -0
  201. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts.map +1 -0
  202. package/dist/executor/__tests__/resource-calculator.unit.test.js +104 -0
  203. package/dist/executor/__tests__/resource-calculator.unit.test.js.map +1 -0
  204. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  205. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  206. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  207. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  208. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  209. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  210. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  211. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  212. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  213. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  214. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  215. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  216. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts +8 -0
  217. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts.map +1 -0
  218. package/dist/executor/__tests__/worker-threads-executor.unit.test.js +276 -0
  219. package/dist/executor/__tests__/worker-threads-executor.unit.test.js.map +1 -0
  220. package/dist/executor/binary-sut.d.ts +105 -0
  221. package/dist/executor/binary-sut.d.ts.map +1 -0
  222. package/dist/executor/binary-sut.js +174 -0
  223. package/dist/executor/binary-sut.js.map +1 -0
  224. package/dist/executor/checkpoint-storage.d.ts.map +1 -1
  225. package/dist/executor/checkpoint-storage.js +6 -4
  226. package/dist/executor/checkpoint-storage.js.map +1 -1
  227. package/dist/executor/executor.d.ts +28 -0
  228. package/dist/executor/executor.d.ts.map +1 -1
  229. package/dist/executor/executor.js +85 -24
  230. package/dist/executor/executor.js.map +1 -1
  231. package/dist/executor/index.d.ts +4 -0
  232. package/dist/executor/index.d.ts.map +1 -1
  233. package/dist/executor/index.js +4 -0
  234. package/dist/executor/index.js.map +1 -1
  235. package/dist/executor/parallel-executor.d.ts +186 -0
  236. package/dist/executor/parallel-executor.d.ts.map +1 -1
  237. package/dist/executor/parallel-executor.js +218 -83
  238. package/dist/executor/parallel-executor.js.map +1 -1
  239. package/dist/executor/resource-calculator.d.ts +49 -0
  240. package/dist/executor/resource-calculator.d.ts.map +1 -0
  241. package/dist/executor/resource-calculator.js +129 -0
  242. package/dist/executor/resource-calculator.js.map +1 -0
  243. package/dist/executor/run-id.d.ts.map +1 -1
  244. package/dist/executor/run-id.js +8 -1
  245. package/dist/executor/run-id.js.map +1 -1
  246. package/dist/executor/worker-entry.d.ts +2 -0
  247. package/dist/executor/worker-entry.d.ts.map +1 -1
  248. package/dist/executor/worker-entry.js +46 -55
  249. package/dist/executor/worker-entry.js.map +1 -1
  250. package/dist/executor/worker-executor.d.ts +257 -0
  251. package/dist/executor/worker-executor.d.ts.map +1 -0
  252. package/dist/executor/worker-executor.js +308 -0
  253. package/dist/executor/worker-executor.js.map +1 -0
  254. package/dist/executor/worker-threads-executor.d.ts +245 -0
  255. package/dist/executor/worker-threads-executor.d.ts.map +1 -0
  256. package/dist/executor/worker-threads-executor.js +332 -0
  257. package/dist/executor/worker-threads-executor.js.map +1 -0
  258. package/dist/index.d.ts +1 -0
  259. package/dist/index.d.ts.map +1 -1
  260. package/dist/index.js +4 -2
  261. package/dist/index.js.map +1 -1
  262. package/dist/renderers/latex-renderer.d.ts +60 -0
  263. package/dist/renderers/latex-renderer.d.ts.map +1 -1
  264. package/dist/renderers/latex-renderer.js +299 -0
  265. package/dist/renderers/latex-renderer.js.map +1 -1
  266. package/dist/renderers/types.d.ts +9 -0
  267. package/dist/renderers/types.d.ts.map +1 -1
  268. package/dist/renderers/types.js.map +1 -1
  269. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  270. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  271. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  272. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  273. package/dist/robustness/index.d.ts +5 -2
  274. package/dist/robustness/index.d.ts.map +1 -1
  275. package/dist/robustness/index.js +4 -2
  276. package/dist/robustness/index.js.map +1 -1
  277. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  278. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  279. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  280. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  281. package/dist/types/evaluator.d.ts +449 -0
  282. package/dist/types/evaluator.d.ts.map +1 -0
  283. package/dist/types/evaluator.js +9 -0
  284. package/dist/types/evaluator.js.map +1 -0
  285. package/dist/types/result.d.ts +2 -0
  286. package/dist/types/result.d.ts.map +1 -1
  287. package/package.json +8 -1
  288. package/dist/claims/evaluator.d.ts +0 -33
  289. package/dist/claims/evaluator.d.ts.map +0 -1
  290. package/dist/claims/evaluator.js +0 -174
  291. package/dist/claims/evaluator.js.map +0 -1
  292. package/dist/robustness/analyzer.d.ts +0 -61
  293. package/dist/robustness/analyzer.d.ts.map +0 -1
  294. package/dist/robustness/analyzer.js +0 -191
  295. package/dist/robustness/analyzer.js.map +0 -1
@@ -0,0 +1,611 @@
1
+ /**
2
+ * Unit tests for Config Loader
3
+ *
4
+ * Tests configuration loading, validation, and error handling.
5
+ */
6
+ import { describe, it, before, after } from "node:test";
7
+ import { strict as assert } from "node:assert";
8
+ import { mkdir, rm, writeFile } from "node:fs/promises";
9
+ import { join } from "node:path";
10
+ import { tmpdir } from "node:os";
11
+ import { loadConfig, validateConfig, loadAndValidateConfig } from "../config-loader.js";
12
+ describe("config-loader", () => {
13
+ let tempDir;
14
+ // Setup before all tests
15
+ before(async () => {
16
+ const dir = join(tmpdir(), `config-loader-test-${Date.now()}`);
17
+ await mkdir(dir, { recursive: true });
18
+ tempDir = dir;
19
+ });
20
+ // Cleanup after all tests
21
+ after(async () => {
22
+ if (tempDir) {
23
+ try {
24
+ await rm(tempDir, { recursive: true, force: true });
25
+ }
26
+ catch {
27
+ // Ignore
28
+ }
29
+ }
30
+ });
31
+ async function createConfigFile(config, filename = "config.json") {
32
+ const filePath = join(tempDir, filename);
33
+ await writeFile(filePath, JSON.stringify(config, null, 2));
34
+ return filePath;
35
+ }
36
+ describe("loadConfig", () => {
37
+ it("should load and parse a valid config file", async () => {
38
+ const config = {
39
+ experiment: { name: "Test Experiment" },
40
+ executor: { repetitions: 1 },
41
+ suts: [
42
+ {
43
+ id: "sut1",
44
+ module: "./sut.js",
45
+ exportName: "createSut",
46
+ registration: { name: "SUT 1", version: "1.0.0", role: "primary", tags: [] },
47
+ },
48
+ ],
49
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
50
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
51
+ output: {},
52
+ };
53
+ const configPath = await createConfigFile(config);
54
+ const loaded = await loadConfig(configPath);
55
+ assert.strictEqual(loaded.config.experiment.name, "Test Experiment");
56
+ assert.ok(loaded.baseDir);
57
+ assert.ok(loaded.configPath.endsWith("config.json"));
58
+ });
59
+ it("should resolve relative paths to absolute", async () => {
60
+ const config = {
61
+ experiment: { name: "Test" },
62
+ executor: { repetitions: 1 },
63
+ suts: [
64
+ {
65
+ id: "sut1",
66
+ module: "./sut.js",
67
+ exportName: "createSut",
68
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
69
+ },
70
+ ],
71
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
72
+ metricsExtractor: { module: "./metrics.js", exportName: "extract" },
73
+ output: {},
74
+ };
75
+ const configPath = await createConfigFile(config);
76
+ const loaded = await loadConfig(configPath);
77
+ assert.ok(loaded.configPath.startsWith("/"));
78
+ });
79
+ it("should throw on invalid JSON", async () => {
80
+ const filePath = join(tempDir, "invalid.json");
81
+ await writeFile(filePath, "{ invalid json }");
82
+ await assert.rejects(() => loadConfig(filePath));
83
+ });
84
+ it("should throw on missing file", async () => {
85
+ await assert.rejects(() => loadConfig(join(tempDir, "missing.json")));
86
+ });
87
+ });
88
+ describe("validateConfig", () => {
89
+ it("should pass validation for a complete valid config", () => {
90
+ const config = {
91
+ experiment: { name: "Test" },
92
+ executor: { repetitions: 1 },
93
+ suts: [
94
+ {
95
+ id: "sut1",
96
+ module: "./sut.js",
97
+ exportName: "createSut",
98
+ registration: { name: "SUT 1", version: "1.0.0", role: "primary", tags: [] },
99
+ },
100
+ ],
101
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
102
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
103
+ output: {},
104
+ };
105
+ const result = validateConfig(config);
106
+ assert.strictEqual(result.valid, true);
107
+ assert.strictEqual(result.errors.length, 0);
108
+ });
109
+ it("should error when experiment.name is missing", () => {
110
+ const config = {
111
+ experiment: {},
112
+ executor: { repetitions: 1 },
113
+ suts: [],
114
+ cases: [],
115
+ metricsExtractor: { module: "./m.js", exportName: "e" },
116
+ };
117
+ const result = validateConfig(config);
118
+ assert.strictEqual(result.valid, false);
119
+ assert.ok(result.errors.some((e) => e.includes("experiment.name is required")));
120
+ });
121
+ it("should error when executor is missing", () => {
122
+ const config = {
123
+ experiment: { name: "Test" },
124
+ suts: [],
125
+ cases: [],
126
+ metricsExtractor: { module: "./m.js", exportName: "e" },
127
+ };
128
+ const result = validateConfig(config);
129
+ assert.strictEqual(result.valid, false);
130
+ assert.ok(result.errors.some((e) => e.includes("executor configuration is required")));
131
+ });
132
+ it("should validate executor.repetitions is at least 1", () => {
133
+ const config = {
134
+ experiment: { name: "Test" },
135
+ executor: { repetitions: 0 },
136
+ suts: [
137
+ {
138
+ id: "sut1",
139
+ module: "./sut.js",
140
+ exportName: "createSut",
141
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
142
+ },
143
+ ],
144
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
145
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
146
+ output: {},
147
+ };
148
+ const result = validateConfig(config);
149
+ assert.strictEqual(result.valid, false);
150
+ assert.ok(result.errors.some((e) => e.includes("repetitions must be at least 1")));
151
+ });
152
+ it("should validate executor.seedBase is non-negative", () => {
153
+ const config = {
154
+ experiment: { name: "Test" },
155
+ executor: { seedBase: -1 },
156
+ suts: [
157
+ {
158
+ id: "sut1",
159
+ module: "./sut.js",
160
+ exportName: "createSut",
161
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
162
+ },
163
+ ],
164
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
165
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
166
+ output: {},
167
+ };
168
+ const result = validateConfig(config);
169
+ assert.strictEqual(result.valid, false);
170
+ assert.ok(result.errors.some((e) => e.includes("seedBase must be non-negative")));
171
+ });
172
+ it("should validate executor.timeoutMs is non-negative", () => {
173
+ const config = {
174
+ experiment: { name: "Test" },
175
+ executor: { timeoutMs: -1 },
176
+ suts: [
177
+ {
178
+ id: "sut1",
179
+ module: "./sut.js",
180
+ exportName: "createSut",
181
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
182
+ },
183
+ ],
184
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
185
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
186
+ output: {},
187
+ };
188
+ const result = validateConfig(config);
189
+ assert.strictEqual(result.valid, false);
190
+ assert.ok(result.errors.some((e) => e.includes("timeoutMs must be non-negative")));
191
+ });
192
+ it("should validate executor.concurrency is at least 1", () => {
193
+ const config = {
194
+ experiment: { name: "Test" },
195
+ executor: { concurrency: 0 },
196
+ suts: [
197
+ {
198
+ id: "sut1",
199
+ module: "./sut.js",
200
+ exportName: "createSut",
201
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
202
+ },
203
+ ],
204
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
205
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
206
+ output: {},
207
+ };
208
+ const result = validateConfig(config);
209
+ assert.strictEqual(result.valid, false);
210
+ assert.ok(result.errors.some((e) => e.includes("concurrency must be at least 1")));
211
+ });
212
+ it("should warn when no SUTs are configured", () => {
213
+ const config = {
214
+ experiment: { name: "Test" },
215
+ executor: { repetitions: 1 },
216
+ suts: [],
217
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
218
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
219
+ output: {},
220
+ };
221
+ const result = validateConfig(config);
222
+ assert.ok(result.warnings.some((w) => w.includes("No SUTs configured")));
223
+ });
224
+ it("should error when SUT is missing required fields", () => {
225
+ const config = {
226
+ experiment: { name: "Test" },
227
+ executor: { repetitions: 1 },
228
+ suts: [
229
+ {
230
+ id: "sut1",
231
+ module: "",
232
+ exportName: "",
233
+ registration: { name: "", version: "", role: "primary", tags: [] },
234
+ },
235
+ ],
236
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
237
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
238
+ output: {},
239
+ };
240
+ const result = validateConfig(config);
241
+ assert.ok(result.errors.some((e) => e.includes("suts[0].module is required")));
242
+ assert.ok(result.errors.some((e) => e.includes("suts[0].exportName is required")));
243
+ });
244
+ it("should error when SUT registration.name is missing", () => {
245
+ const config = {
246
+ experiment: { name: "Test" },
247
+ executor: { repetitions: 1 },
248
+ suts: [
249
+ {
250
+ id: "sut1",
251
+ module: "./sut.js",
252
+ exportName: "createSut",
253
+ registration: { name: "", version: "1.0.0", role: "primary", tags: [] },
254
+ },
255
+ ],
256
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
257
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
258
+ output: {},
259
+ };
260
+ const result = validateConfig(config);
261
+ assert.ok(result.errors.some((e) => e.includes("suts[0].registration.name is required")));
262
+ });
263
+ it("should error when SUT registration.version is missing", () => {
264
+ const config = {
265
+ experiment: { name: "Test" },
266
+ executor: { repetitions: 1 },
267
+ suts: [
268
+ {
269
+ id: "sut1",
270
+ module: "./sut.js",
271
+ exportName: "createSut",
272
+ registration: { name: "SUT 1", version: "", role: "primary", tags: [] },
273
+ },
274
+ ],
275
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
276
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
277
+ output: {},
278
+ };
279
+ const result = validateConfig(config);
280
+ assert.ok(result.errors.some((e) => e.includes("suts[0].registration.version is required")));
281
+ });
282
+ it("should error when SUT registration.role is missing", () => {
283
+ const config = {
284
+ experiment: { name: "Test" },
285
+ executor: { repetitions: 1 },
286
+ suts: [
287
+ {
288
+ id: "sut1",
289
+ module: "./sut.js",
290
+ exportName: "createSut",
291
+ registration: {
292
+ name: "SUT 1",
293
+ version: "1.0.0",
294
+ role: undefined,
295
+ tags: [],
296
+ },
297
+ },
298
+ ],
299
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
300
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
301
+ output: {},
302
+ };
303
+ const result = validateConfig(config);
304
+ assert.ok(result.errors.some((e) => e.includes("suts[0].registration.role is required")));
305
+ });
306
+ it("should error when SUT registration.role is invalid", () => {
307
+ const config = {
308
+ experiment: { name: "Test" },
309
+ executor: { repetitions: 1 },
310
+ suts: [
311
+ {
312
+ id: "sut1",
313
+ module: "./sut.js",
314
+ exportName: "createSut",
315
+ registration: {
316
+ name: "SUT 1",
317
+ version: "1.0.0",
318
+ role: "invalid",
319
+ tags: [],
320
+ },
321
+ },
322
+ ],
323
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
324
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
325
+ output: {},
326
+ };
327
+ const result = validateConfig(config);
328
+ assert.ok(result.errors.some((e) => e.includes("suts[0].registration.role must be one of")));
329
+ });
330
+ it("should accept valid SUT roles", () => {
331
+ for (const role of ["primary", "baseline", "oracle"]) {
332
+ const config = {
333
+ experiment: { name: "Test" },
334
+ executor: { repetitions: 1 },
335
+ suts: [
336
+ {
337
+ id: "sut1",
338
+ module: "./sut.js",
339
+ exportName: "createSut",
340
+ registration: { name: "SUT 1", version: "1.0.0", role, tags: [] },
341
+ },
342
+ ],
343
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
344
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
345
+ output: {},
346
+ };
347
+ const result = validateConfig(config);
348
+ assert.ok(!result.errors.some((e) => e.includes("role must be one of")), `Role ${role} should be valid`);
349
+ }
350
+ });
351
+ it("should detect duplicate SUT IDs", () => {
352
+ const config = {
353
+ experiment: { name: "Test" },
354
+ executor: { repetitions: 1 },
355
+ suts: [
356
+ {
357
+ id: "duplicate",
358
+ module: "./sut1.js",
359
+ exportName: "createSut1",
360
+ registration: { name: "SUT 1", version: "1.0.0", role: "primary", tags: [] },
361
+ },
362
+ {
363
+ id: "duplicate",
364
+ module: "./sut2.js",
365
+ exportName: "createSut2",
366
+ registration: {
367
+ name: "SUT 2",
368
+ version: "1.0.0",
369
+ role: "baseline",
370
+ tags: [],
371
+ },
372
+ },
373
+ ],
374
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
375
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
376
+ output: {},
377
+ };
378
+ const result = validateConfig(config);
379
+ assert.ok(result.errors.some((e) => e.includes("Duplicate SUT ID: duplicate")));
380
+ });
381
+ it("should warn when no cases are configured", () => {
382
+ const config = {
383
+ experiment: { name: "Test" },
384
+ executor: { repetitions: 1 },
385
+ suts: [
386
+ {
387
+ id: "sut1",
388
+ module: "./sut.js",
389
+ exportName: "createSut",
390
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
391
+ },
392
+ ],
393
+ cases: [],
394
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
395
+ output: {},
396
+ };
397
+ const result = validateConfig(config);
398
+ assert.ok(result.warnings.some((w) => w.includes("No cases configured")));
399
+ });
400
+ it("should error when case is missing required fields", () => {
401
+ const config = {
402
+ experiment: { name: "Test" },
403
+ executor: { repetitions: 1 },
404
+ suts: [
405
+ {
406
+ id: "sut1",
407
+ module: "./sut.js",
408
+ exportName: "createSut",
409
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
410
+ },
411
+ ],
412
+ cases: [{ id: "case1", module: "", exportName: "" }],
413
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
414
+ output: {},
415
+ };
416
+ const result = validateConfig(config);
417
+ assert.ok(result.errors.some((e) => e.includes("cases[0].module is required")));
418
+ assert.ok(result.errors.some((e) => e.includes("cases[0].exportName is required")));
419
+ });
420
+ it("should detect duplicate case IDs", () => {
421
+ const config = {
422
+ experiment: { name: "Test" },
423
+ executor: { repetitions: 1 },
424
+ suts: [
425
+ {
426
+ id: "sut1",
427
+ module: "./sut.js",
428
+ exportName: "createSut",
429
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
430
+ },
431
+ ],
432
+ cases: [
433
+ { id: "duplicate", module: "./case1.js", exportName: "createCase1" },
434
+ { id: "duplicate", module: "./case2.js", exportName: "createCase2" },
435
+ ],
436
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
437
+ output: {},
438
+ };
439
+ const result = validateConfig(config);
440
+ assert.ok(result.errors.some((e) => e.includes("Duplicate case ID: duplicate")));
441
+ });
442
+ it("should error when metricsExtractor is missing", () => {
443
+ const config = {
444
+ experiment: { name: "Test" },
445
+ executor: { repetitions: 1 },
446
+ suts: [
447
+ {
448
+ id: "sut1",
449
+ module: "./sut.js",
450
+ exportName: "createSut",
451
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
452
+ },
453
+ ],
454
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
455
+ metricsExtractor: undefined,
456
+ output: {},
457
+ };
458
+ const result = validateConfig(config);
459
+ assert.ok(result.errors.some((e) => e.includes("metricsExtractor configuration is required")));
460
+ });
461
+ it("should error when metricsExtractor.module is missing", () => {
462
+ const config = {
463
+ experiment: { name: "Test" },
464
+ executor: { repetitions: 1 },
465
+ suts: [
466
+ {
467
+ id: "sut1",
468
+ module: "./sut.js",
469
+ exportName: "createSut",
470
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
471
+ },
472
+ ],
473
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
474
+ metricsExtractor: { module: "", exportName: "extractMetrics" },
475
+ output: {},
476
+ };
477
+ const result = validateConfig(config);
478
+ assert.ok(result.errors.some((e) => e.includes("metricsExtractor.module is required")));
479
+ });
480
+ it("should error when metricsExtractor.exportName is missing", () => {
481
+ const config = {
482
+ experiment: { name: "Test" },
483
+ executor: { repetitions: 1 },
484
+ suts: [
485
+ {
486
+ id: "sut1",
487
+ module: "./sut.js",
488
+ exportName: "createSut",
489
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
490
+ },
491
+ ],
492
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
493
+ metricsExtractor: { module: "./metrics.js", exportName: "" },
494
+ output: {},
495
+ };
496
+ const result = validateConfig(config);
497
+ assert.ok(result.errors.some((e) => e.includes("metricsExtractor.exportName is required")));
498
+ });
499
+ it("should warn when output configuration is missing", () => {
500
+ const config = {
501
+ experiment: { name: "Test" },
502
+ executor: { repetitions: 1 },
503
+ suts: [
504
+ {
505
+ id: "sut1",
506
+ module: "./sut.js",
507
+ exportName: "createSut",
508
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
509
+ },
510
+ ],
511
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
512
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
513
+ output: undefined,
514
+ };
515
+ const result = validateConfig(config);
516
+ assert.ok(result.warnings.some((w) => w.includes("No output configuration specified")));
517
+ });
518
+ it("should error when output.format is invalid", () => {
519
+ const config = {
520
+ experiment: { name: "Test" },
521
+ executor: { repetitions: 1 },
522
+ suts: [
523
+ {
524
+ id: "sut1",
525
+ module: "./sut.js",
526
+ exportName: "createSut",
527
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
528
+ },
529
+ ],
530
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
531
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
532
+ output: { format: "invalid" },
533
+ };
534
+ const result = validateConfig(config);
535
+ assert.ok(result.errors.some((e) => e.includes("output.format must be one of")));
536
+ });
537
+ it("should accept valid output formats", () => {
538
+ for (const format of ["json", "json-pretty"]) {
539
+ const config = {
540
+ experiment: { name: "Test" },
541
+ executor: { repetitions: 1 },
542
+ suts: [
543
+ {
544
+ id: "sut1",
545
+ module: "./sut.js",
546
+ exportName: "createSut",
547
+ registration: { name: "SUT", version: "1.0.0", role: "primary", tags: [] },
548
+ },
549
+ ],
550
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
551
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
552
+ output: { format },
553
+ };
554
+ const result = validateConfig(config);
555
+ assert.ok(!result.errors.some((e) => e.includes("output.format must be one of")), `Format ${format} should be valid`);
556
+ }
557
+ });
558
+ });
559
+ describe("loadAndValidateConfig", () => {
560
+ it("should load and validate a valid config", async () => {
561
+ const config = {
562
+ experiment: { name: "Test Experiment" },
563
+ executor: { repetitions: 1 },
564
+ suts: [
565
+ {
566
+ id: "sut1",
567
+ module: "./sut.js",
568
+ exportName: "createSut",
569
+ registration: { name: "SUT 1", version: "1.0.0", role: "primary", tags: [] },
570
+ },
571
+ ],
572
+ cases: [{ id: "case1", module: "./case.js", exportName: "createCase" }],
573
+ metricsExtractor: { module: "./metrics.js", exportName: "extractMetrics" },
574
+ output: {},
575
+ };
576
+ const configPath = await createConfigFile(config);
577
+ const loaded = await loadAndValidateConfig(configPath);
578
+ assert.strictEqual(loaded.config.experiment.name, "Test Experiment");
579
+ });
580
+ it("should throw when validation fails", async () => {
581
+ const config = {
582
+ experiment: {},
583
+ executor: { repetitions: 1 },
584
+ suts: [],
585
+ cases: [],
586
+ metricsExtractor: { module: "./m.js", exportName: "e" },
587
+ };
588
+ const configPath = await createConfigFile(config);
589
+ await assert.rejects(() => loadAndValidateConfig(configPath), /Configuration validation failed/);
590
+ });
591
+ it("should throw with detailed error messages", async () => {
592
+ const config = {
593
+ experiment: {},
594
+ executor: { repetitions: 1 },
595
+ suts: [],
596
+ cases: [],
597
+ metricsExtractor: { module: "./m.js", exportName: "e" },
598
+ };
599
+ const configPath = await createConfigFile(config);
600
+ try {
601
+ await loadAndValidateConfig(configPath);
602
+ assert.fail("Should have thrown");
603
+ }
604
+ catch (error) {
605
+ assert.ok(error instanceof Error);
606
+ assert.ok(error.message.includes("experiment.name is required"));
607
+ }
608
+ });
609
+ });
610
+ });
611
+ //# sourceMappingURL=config-loader.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.unit.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/config-loader.unit.test.ts"],"names":[],"mappings":"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"}