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,424 @@
1
+ /**
2
+ * Unit tests for Metrics Evaluator
3
+ *
4
+ * Tests the metrics evaluator functionality including threshold,
5
+ * baseline, and target-range criteria.
6
+ */
7
+ import { describe, it } from "node:test";
8
+ import { strict as assert } from "node:assert";
9
+ import { MetricsEvaluator } from "../../evaluators/metrics-evaluator.js";
10
+ import { createMockAggregate, createMockSummaryStats } from "../test-helpers.js";
11
+ /**
12
+ * Test helpers
13
+ */
14
+ function createTestCriterion(overrides) {
15
+ return {
16
+ criterionId: "C001",
17
+ description: "Test criterion",
18
+ type: "threshold",
19
+ metric: "accuracy",
20
+ sut: "primary-sut",
21
+ threshold: { operator: "gte", value: 0.8 },
22
+ ...overrides,
23
+ };
24
+ }
25
+ function createTestContext(aggregates) {
26
+ return {
27
+ aggregates,
28
+ metadata: { source: "test" },
29
+ };
30
+ }
31
+ describe("MetricsEvaluator", () => {
32
+ describe("validateConfig", () => {
33
+ const evaluator = new MetricsEvaluator();
34
+ it("should validate empty criteria array with warning", () => {
35
+ const config = { criteria: [] };
36
+ const result = evaluator.validateConfig(config);
37
+ assert.equal(result.valid, true);
38
+ assert.ok(result.warnings?.some((w) => w.includes("No criteria")));
39
+ });
40
+ it("should invalidate when criteria is not an array", () => {
41
+ const config = { criteria: "not-an-array" };
42
+ const result = evaluator.validateConfig(config);
43
+ assert.equal(result.valid, false);
44
+ assert.ok(result.errors?.includes("criteria must be an array"));
45
+ });
46
+ it("should invalidate when criteria is missing", () => {
47
+ const config = {};
48
+ const result = evaluator.validateConfig(config);
49
+ assert.equal(result.valid, false);
50
+ assert.ok(result.errors?.includes("criteria must be an array"));
51
+ });
52
+ it("should validate threshold criterion", () => {
53
+ const config = {
54
+ criteria: [
55
+ createTestCriterion({
56
+ type: "threshold",
57
+ threshold: { operator: "gt", value: 100 },
58
+ }),
59
+ ],
60
+ };
61
+ const result = evaluator.validateConfig(config);
62
+ assert.equal(result.valid, true);
63
+ });
64
+ it("should validate baseline criterion", () => {
65
+ const config = {
66
+ criteria: [
67
+ createTestCriterion({
68
+ type: "baseline",
69
+ baseline: { sut: "baseline-sut", operator: "gt" },
70
+ }),
71
+ ],
72
+ };
73
+ const result = evaluator.validateConfig(config);
74
+ assert.equal(result.valid, true);
75
+ });
76
+ it("should validate target-range criterion", () => {
77
+ const config = {
78
+ criteria: [
79
+ createTestCriterion({
80
+ type: "target-range",
81
+ targetRange: { min: 50, max: 100 },
82
+ }),
83
+ ],
84
+ };
85
+ const result = evaluator.validateConfig(config);
86
+ assert.equal(result.valid, true);
87
+ });
88
+ it("should invalidate threshold criterion with missing threshold", () => {
89
+ const criterion = createTestCriterion({ type: "threshold" });
90
+ delete criterion.threshold;
91
+ const config = { criteria: [criterion] };
92
+ const result = evaluator.validateConfig(config);
93
+ assert.equal(result.valid, false);
94
+ });
95
+ it("should invalidate baseline criterion with missing baseline", () => {
96
+ const criterion = createTestCriterion({ type: "baseline" });
97
+ delete criterion.baseline;
98
+ const config = { criteria: [criterion] };
99
+ const result = evaluator.validateConfig(config);
100
+ assert.equal(result.valid, false);
101
+ });
102
+ it("should invalidate target-range criterion with missing targetRange", () => {
103
+ const criterion = createTestCriterion({ type: "target-range" });
104
+ delete criterion.targetRange;
105
+ const config = { criteria: [criterion] };
106
+ const result = evaluator.validateConfig(config);
107
+ assert.equal(result.valid, false);
108
+ });
109
+ it("should invalidate criterion with missing required fields", () => {
110
+ const config = {
111
+ criteria: [
112
+ {
113
+ criterionId: "",
114
+ description: "",
115
+ type: "threshold",
116
+ metric: "",
117
+ sut: "",
118
+ threshold: { operator: "gt", value: 0 },
119
+ },
120
+ ],
121
+ };
122
+ const result = evaluator.validateConfig(config);
123
+ assert.equal(result.valid, false);
124
+ assert.ok(result.errors !== undefined && result.errors.length > 0);
125
+ });
126
+ });
127
+ describe("evaluate - threshold criteria", () => {
128
+ const evaluator = new MetricsEvaluator();
129
+ it("should pass gt threshold when value exceeds threshold", () => {
130
+ const config = {
131
+ criteria: [
132
+ createTestCriterion({
133
+ type: "threshold",
134
+ metric: "accuracy",
135
+ threshold: { operator: "gt", value: 0.8 },
136
+ }),
137
+ ],
138
+ };
139
+ const aggregates = [
140
+ createMockAggregate("primary-sut", "primary", undefined, {
141
+ accuracy: createMockSummaryStats([0.85]),
142
+ }),
143
+ ];
144
+ const context = createTestContext(aggregates);
145
+ const result = evaluator.evaluate(config, context);
146
+ assert.equal(result.type, "metrics");
147
+ assert.equal(result.data.summary.total, 1);
148
+ assert.equal(result.data.summary.passed, 1);
149
+ assert.equal(result.data.summary.failed, 0);
150
+ });
151
+ it("should fail gte threshold when value equals threshold", () => {
152
+ const config = {
153
+ criteria: [
154
+ createTestCriterion({
155
+ type: "threshold",
156
+ metric: "accuracy",
157
+ threshold: { operator: "gt", value: 0.8 },
158
+ }),
159
+ ],
160
+ };
161
+ const aggregates = [
162
+ createMockAggregate("primary-sut", "primary", undefined, {
163
+ accuracy: createMockSummaryStats([0.8]),
164
+ }),
165
+ ];
166
+ const context = createTestContext(aggregates);
167
+ const result = evaluator.evaluate(config, context);
168
+ assert.equal(result.data.summary.failed, 1);
169
+ assert.equal(result.data.summary.passed, 0);
170
+ });
171
+ it("should pass gte threshold when value equals threshold", () => {
172
+ const config = {
173
+ criteria: [
174
+ createTestCriterion({
175
+ type: "threshold",
176
+ metric: "accuracy",
177
+ threshold: { operator: "gte", value: 0.8 },
178
+ }),
179
+ ],
180
+ };
181
+ const aggregates = [
182
+ createMockAggregate("primary-sut", "primary", undefined, {
183
+ accuracy: createMockSummaryStats([0.8]),
184
+ }),
185
+ ];
186
+ const context = createTestContext(aggregates);
187
+ const result = evaluator.evaluate(config, context);
188
+ assert.equal(result.data.summary.passed, 1);
189
+ });
190
+ it("should be inconclusive when metric not found", () => {
191
+ const config = {
192
+ criteria: [
193
+ createTestCriterion({
194
+ type: "threshold",
195
+ metric: "missing-metric",
196
+ threshold: { operator: "gt", value: 0.8 },
197
+ }),
198
+ ],
199
+ };
200
+ const aggregates = [
201
+ createMockAggregate("primary-sut", "primary", undefined, {
202
+ accuracy: createMockSummaryStats([0.85]),
203
+ }),
204
+ ];
205
+ const context = createTestContext(aggregates);
206
+ const result = evaluator.evaluate(config, context);
207
+ assert.equal(result.data.summary.inconclusive, 1);
208
+ });
209
+ it("should handle multiple SUTs with wildcard", () => {
210
+ const config = {
211
+ criteria: [
212
+ createTestCriterion({
213
+ criterionId: "C001",
214
+ sut: "*",
215
+ type: "threshold",
216
+ metric: "accuracy",
217
+ threshold: { operator: "gte", value: 0.8 },
218
+ }),
219
+ ],
220
+ };
221
+ const aggregates = [
222
+ createMockAggregate("sut-1", "primary", undefined, {
223
+ accuracy: createMockSummaryStats([0.85]),
224
+ }),
225
+ createMockAggregate("sut-2", "primary", undefined, {
226
+ accuracy: createMockSummaryStats([0.75]),
227
+ }),
228
+ ];
229
+ const context = createTestContext(aggregates);
230
+ const result = evaluator.evaluate(config, context);
231
+ assert.equal(result.data.summary.total, 1); // 1 criterion
232
+ assert.equal(result.data.summary.failed, 1); // sut-2 fails
233
+ });
234
+ });
235
+ describe("evaluate - baseline criteria", () => {
236
+ const evaluator = new MetricsEvaluator();
237
+ it("should pass baseline comparison", () => {
238
+ const config = {
239
+ criteria: [
240
+ createTestCriterion({
241
+ type: "baseline",
242
+ baseline: { sut: "baseline-sut", operator: "gt" },
243
+ }),
244
+ ],
245
+ };
246
+ const aggregates = [
247
+ createMockAggregate("primary-sut", "primary", undefined, {
248
+ accuracy: createMockSummaryStats([0.85]),
249
+ }),
250
+ createMockAggregate("baseline-sut", "baseline", undefined, {
251
+ accuracy: createMockSummaryStats([0.75]),
252
+ }),
253
+ ];
254
+ const context = createTestContext(aggregates);
255
+ const result = evaluator.evaluate(config, context);
256
+ assert.equal(result.data.summary.passed, 1);
257
+ });
258
+ it("should fail when below baseline", () => {
259
+ const config = {
260
+ criteria: [
261
+ createTestCriterion({
262
+ type: "baseline",
263
+ baseline: { sut: "baseline-sut", operator: "gt" },
264
+ }),
265
+ ],
266
+ };
267
+ const aggregates = [
268
+ createMockAggregate("primary-sut", "primary", undefined, {
269
+ accuracy: createMockSummaryStats([0.7]),
270
+ }),
271
+ createMockAggregate("baseline-sut", "baseline", undefined, {
272
+ accuracy: createMockSummaryStats([0.8]),
273
+ }),
274
+ ];
275
+ const context = createTestContext(aggregates);
276
+ const result = evaluator.evaluate(config, context);
277
+ assert.equal(result.data.summary.failed, 1);
278
+ });
279
+ it("should be inconclusive when baseline SUT not found", () => {
280
+ const config = {
281
+ criteria: [
282
+ createTestCriterion({
283
+ type: "baseline",
284
+ baseline: { sut: "missing-baseline", operator: "gt" },
285
+ }),
286
+ ],
287
+ };
288
+ const aggregates = [
289
+ createMockAggregate("primary-sut", "primary", undefined, {
290
+ accuracy: createMockSummaryStats([0.85]),
291
+ }),
292
+ ];
293
+ const context = createTestContext(aggregates);
294
+ const result = evaluator.evaluate(config, context);
295
+ assert.equal(result.data.summary.inconclusive, 1);
296
+ });
297
+ });
298
+ describe("evaluate - target-range criteria", () => {
299
+ const evaluator = new MetricsEvaluator();
300
+ it("should pass when value in range", () => {
301
+ const config = {
302
+ criteria: [
303
+ createTestCriterion({
304
+ type: "target-range",
305
+ targetRange: { min: 50, max: 100 },
306
+ }),
307
+ ],
308
+ };
309
+ const aggregates = [
310
+ createMockAggregate("primary-sut", "primary", undefined, {
311
+ accuracy: createMockSummaryStats([75]),
312
+ }),
313
+ ];
314
+ const context = createTestContext(aggregates);
315
+ const result = evaluator.evaluate(config, context);
316
+ assert.equal(result.data.summary.passed, 1);
317
+ });
318
+ it("should fail when value below min", () => {
319
+ const config = {
320
+ criteria: [
321
+ createTestCriterion({
322
+ type: "target-range",
323
+ targetRange: { min: 50, max: 100 },
324
+ }),
325
+ ],
326
+ };
327
+ const aggregates = [
328
+ createMockAggregate("primary-sut", "primary", undefined, {
329
+ accuracy: createMockSummaryStats([40]),
330
+ }),
331
+ ];
332
+ const context = createTestContext(aggregates);
333
+ const result = evaluator.evaluate(config, context);
334
+ assert.equal(result.data.summary.failed, 1);
335
+ });
336
+ it("should fail when value above max", () => {
337
+ const config = {
338
+ criteria: [
339
+ createTestCriterion({
340
+ type: "target-range",
341
+ targetRange: { min: 50, max: 100 },
342
+ }),
343
+ ],
344
+ };
345
+ const aggregates = [
346
+ createMockAggregate("primary-sut", "primary", undefined, {
347
+ accuracy: createMockSummaryStats([120]),
348
+ }),
349
+ ];
350
+ const context = createTestContext(aggregates);
351
+ const result = evaluator.evaluate(config, context);
352
+ assert.equal(result.data.summary.failed, 1);
353
+ });
354
+ it("should handle open-ended range (max only)", () => {
355
+ const config = {
356
+ criteria: [
357
+ createTestCriterion({
358
+ type: "target-range",
359
+ targetRange: { max: 100 },
360
+ }),
361
+ ],
362
+ };
363
+ const aggregates = [
364
+ createMockAggregate("primary-sut", "primary", undefined, {
365
+ accuracy: createMockSummaryStats([50]),
366
+ }),
367
+ ];
368
+ const context = createTestContext(aggregates);
369
+ const result = evaluator.evaluate(config, context);
370
+ assert.equal(result.data.summary.passed, 1);
371
+ });
372
+ });
373
+ describe("evaluate - scope constraints", () => {
374
+ const evaluator = new MetricsEvaluator();
375
+ it("should filter by caseClass", () => {
376
+ const config = {
377
+ criteria: [
378
+ createTestCriterion({
379
+ type: "threshold",
380
+ scopeConstraints: { caseClass: "scale-free" },
381
+ }),
382
+ ],
383
+ };
384
+ const aggregates = [
385
+ createMockAggregate("primary-sut", "primary", "scale-free", {
386
+ accuracy: createMockSummaryStats([0.85]),
387
+ }),
388
+ createMockAggregate("primary-sut", "primary", "small-world", {
389
+ accuracy: createMockSummaryStats([0.65]),
390
+ }),
391
+ ];
392
+ const context = createTestContext(aggregates);
393
+ const result = evaluator.evaluate(config, context);
394
+ // Should only evaluate scale-free aggregate
395
+ assert.equal(result.data.results[0].observed[0].value, 0.85);
396
+ });
397
+ });
398
+ describe("summarize", () => {
399
+ const evaluator = new MetricsEvaluator();
400
+ it("should create summary from output", () => {
401
+ const config = {
402
+ criteria: [
403
+ createTestCriterion({
404
+ type: "threshold",
405
+ threshold: { operator: "gte", value: 0.8 },
406
+ }),
407
+ ],
408
+ };
409
+ const aggregates = [
410
+ createMockAggregate("primary-sut", "primary", undefined, {
411
+ accuracy: createMockSummaryStats([0.85]),
412
+ }),
413
+ ];
414
+ const context = createTestContext(aggregates);
415
+ const output = evaluator.evaluate(config, context);
416
+ const summary = evaluator.summarize(output);
417
+ assert.equal(summary.total, 1);
418
+ assert.equal(summary.passed, 1);
419
+ assert.equal(summary.failed, 0);
420
+ assert.equal(summary.passRate, 1);
421
+ });
422
+ });
423
+ });
424
+ //# sourceMappingURL=metrics-evaluator.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-evaluator.unit.test.js","sourceRoot":"","sources":["../../../src/__tests__/evaluators/metrics-evaluator.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for Evaluator Registry
3
+ *
4
+ * Tests the registry functionality including getAs() type-safe retrieval.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=registry.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.unit.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/evaluators/registry.unit.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Unit tests for Evaluator Registry
3
+ *
4
+ * Tests the registry functionality including getAs() type-safe retrieval.
5
+ */
6
+ import { describe, it, afterEach } from "node:test";
7
+ import { strict as assert } from "node:assert";
8
+ import { EvaluatorRegistry, registerBuiltInEvaluators } from "../../evaluators/registry.js";
9
+ /**
10
+ * Mock evaluator implementing IEvaluator for testing.
11
+ * Uses parameterless constructor for getAs() compatibility.
12
+ */
13
+ class MockCustomEvaluator {
14
+ type = "custom";
15
+ validateConfig(_config) {
16
+ return { valid: true };
17
+ }
18
+ evaluate(_config, _input) {
19
+ return {
20
+ type: this.type,
21
+ version: "1.0.0",
22
+ timestamp: new Date().toISOString(),
23
+ data: { mock: true },
24
+ };
25
+ }
26
+ summarize(_output) {
27
+ return { total: 1 };
28
+ }
29
+ }
30
+ describe("EvaluatorRegistry", () => {
31
+ afterEach(() => {
32
+ EvaluatorRegistry.clear();
33
+ registerBuiltInEvaluators();
34
+ });
35
+ describe("register", () => {
36
+ it("should register an evaluator", () => {
37
+ const evaluator = new MockCustomEvaluator();
38
+ EvaluatorRegistry.register(evaluator);
39
+ assert.ok(EvaluatorRegistry.has("custom"));
40
+ });
41
+ it("should replace existing evaluator when registering same type", () => {
42
+ const evaluator1 = new MockCustomEvaluator();
43
+ const evaluator2 = new MockCustomEvaluator();
44
+ EvaluatorRegistry.register(evaluator1);
45
+ EvaluatorRegistry.register(evaluator2);
46
+ const retrieved = EvaluatorRegistry.get("custom");
47
+ assert.equal(retrieved, evaluator2);
48
+ });
49
+ });
50
+ describe("get", () => {
51
+ it("should return registered evaluator", () => {
52
+ const evaluator = new MockCustomEvaluator();
53
+ EvaluatorRegistry.register(evaluator);
54
+ const retrieved = EvaluatorRegistry.get("custom");
55
+ assert.equal(retrieved, evaluator);
56
+ });
57
+ it("should return undefined for unknown type", () => {
58
+ const retrieved = EvaluatorRegistry.get("claims"); // Use valid type
59
+ assert.ok(retrieved !== undefined); // Built-in evaluators exist
60
+ });
61
+ });
62
+ describe("getAs", () => {
63
+ it("should return evaluator when instanceof matches", () => {
64
+ const evaluator = new MockCustomEvaluator();
65
+ EvaluatorRegistry.register(evaluator);
66
+ const retrieved = EvaluatorRegistry.getAs("custom", MockCustomEvaluator);
67
+ assert.equal(retrieved, evaluator);
68
+ });
69
+ it("should return undefined when instanceof does not match", () => {
70
+ class OtherMockEvaluator {
71
+ type = "metrics"; // Use valid type
72
+ validateConfig() {
73
+ return { valid: true };
74
+ }
75
+ evaluate() {
76
+ return {
77
+ type: "metrics",
78
+ version: "1.0.0",
79
+ timestamp: new Date().toISOString(),
80
+ data: {},
81
+ };
82
+ }
83
+ summarize() {
84
+ return { total: 0 };
85
+ }
86
+ }
87
+ const other = new OtherMockEvaluator();
88
+ EvaluatorRegistry.register(other);
89
+ const retrieved = EvaluatorRegistry.getAs("metrics", MockCustomEvaluator);
90
+ assert.equal(retrieved, undefined);
91
+ });
92
+ it("should return undefined for unknown type", () => {
93
+ const retrieved = EvaluatorRegistry.getAs("claims", MockCustomEvaluator);
94
+ assert.equal(retrieved, undefined);
95
+ });
96
+ });
97
+ describe("getOrThrow", () => {
98
+ it("should return evaluator when found", () => {
99
+ const evaluator = new MockCustomEvaluator();
100
+ EvaluatorRegistry.register(evaluator);
101
+ const retrieved = EvaluatorRegistry.getOrThrow("custom", MockCustomEvaluator);
102
+ assert.equal(retrieved, evaluator);
103
+ });
104
+ it("should throw when evaluator not found", () => {
105
+ assert.throws(() => EvaluatorRegistry.getOrThrow("claims", MockCustomEvaluator), {
106
+ message: "Evaluator not found for type: claims",
107
+ });
108
+ });
109
+ });
110
+ describe("types", () => {
111
+ it("should return all registered evaluator types", () => {
112
+ EvaluatorRegistry.register(new MockCustomEvaluator());
113
+ const types = EvaluatorRegistry.types();
114
+ assert.ok(types.includes("custom"));
115
+ });
116
+ it("should return empty array when no evaluators registered", () => {
117
+ EvaluatorRegistry.clear();
118
+ const types = EvaluatorRegistry.types();
119
+ assert.equal(types.length, 0);
120
+ });
121
+ });
122
+ describe("has", () => {
123
+ it("should return true for registered type", () => {
124
+ EvaluatorRegistry.register(new MockCustomEvaluator());
125
+ assert.ok(EvaluatorRegistry.has("custom"));
126
+ });
127
+ it("should return false for unknown type", () => {
128
+ // "custom" won't be registered after clear in afterEach
129
+ assert.ok(!EvaluatorRegistry.has("custom"));
130
+ });
131
+ });
132
+ describe("unregister", () => {
133
+ it("should remove registered evaluator", () => {
134
+ const evaluator = new MockCustomEvaluator();
135
+ EvaluatorRegistry.register(evaluator);
136
+ assert.ok(EvaluatorRegistry.has("custom"));
137
+ const result = EvaluatorRegistry.unregister("custom");
138
+ assert.ok(result);
139
+ assert.ok(!EvaluatorRegistry.has("custom"));
140
+ });
141
+ it("should return false when evaluator not found", () => {
142
+ const result = EvaluatorRegistry.unregister("unknown-type");
143
+ assert.strictEqual(result, false);
144
+ });
145
+ });
146
+ describe("clear", () => {
147
+ it("should remove all evaluators", () => {
148
+ EvaluatorRegistry.register(new MockCustomEvaluator());
149
+ EvaluatorRegistry.clear();
150
+ assert.equal(EvaluatorRegistry.size, 0);
151
+ assert.ok(!EvaluatorRegistry.has("custom"));
152
+ });
153
+ });
154
+ describe("size", () => {
155
+ it("should return count of registered evaluators", () => {
156
+ const initialSize = EvaluatorRegistry.size;
157
+ EvaluatorRegistry.register(new MockCustomEvaluator());
158
+ assert.equal(EvaluatorRegistry.size, initialSize + 1);
159
+ });
160
+ });
161
+ describe("built-in evaluators", () => {
162
+ it("should have claims evaluator registered", () => {
163
+ assert.ok(EvaluatorRegistry.has("claims"));
164
+ });
165
+ it("should have robustness evaluator registered", () => {
166
+ assert.ok(EvaluatorRegistry.has("robustness"));
167
+ });
168
+ it("should have metrics evaluator registered", () => {
169
+ assert.ok(EvaluatorRegistry.has("metrics"));
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=registry.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.unit.test.js","sourceRoot":"","sources":["../../../src/__tests__/evaluators/registry.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Unit tests for Robustness Evaluator
3
+ *
4
+ * Tests the robustness evaluator functionality including variance analysis
5
+ * under perturbations.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=robustness-evaluator.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robustness-evaluator.unit.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/evaluators/robustness-evaluator.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}