ppef 1.0.0 → 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 (336) hide show
  1. package/README.md +172 -0
  2. package/bin/ppef.mjs +20 -0
  3. package/dist/__tests__/framework-pipeline.integration.test.d.ts +7 -0
  4. package/dist/__tests__/framework-pipeline.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/framework-pipeline.integration.test.js +415 -0
  6. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -0
  7. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  8. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/index-exports.unit.test.js +127 -0
  10. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  11. package/dist/__tests__/registry-executor.integration.test.d.ts +5 -0
  12. package/dist/__tests__/registry-executor.integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/registry-executor.integration.test.js +352 -0
  14. package/dist/__tests__/registry-executor.integration.test.js.map +1 -0
  15. package/dist/__tests__/test-helpers.d.ts +94 -0
  16. package/dist/__tests__/test-helpers.d.ts.map +1 -0
  17. package/dist/__tests__/test-helpers.js +271 -0
  18. package/dist/__tests__/test-helpers.js.map +1 -0
  19. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  20. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  21. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  22. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  23. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  24. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  25. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  26. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  27. package/dist/aggregation/aggregators.d.ts +63 -0
  28. package/dist/aggregation/aggregators.d.ts.map +1 -0
  29. package/dist/aggregation/aggregators.js +228 -0
  30. package/dist/aggregation/aggregators.js.map +1 -0
  31. package/dist/aggregation/index.d.ts +8 -0
  32. package/dist/aggregation/index.d.ts.map +1 -0
  33. package/dist/aggregation/index.js +8 -0
  34. package/dist/aggregation/index.js.map +1 -0
  35. package/dist/aggregation/pipeline.d.ts +38 -0
  36. package/dist/aggregation/pipeline.d.ts.map +1 -0
  37. package/dist/aggregation/pipeline.js +198 -0
  38. package/dist/aggregation/pipeline.js.map +1 -0
  39. package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
  40. package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
  41. package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
  42. package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
  43. package/dist/claims/evaluator.d.ts +33 -0
  44. package/dist/claims/evaluator.d.ts.map +1 -0
  45. package/dist/claims/evaluator.js +174 -0
  46. package/dist/claims/evaluator.js.map +1 -0
  47. package/dist/claims/index.d.ts +7 -0
  48. package/dist/claims/index.d.ts.map +1 -0
  49. package/dist/claims/index.js +7 -0
  50. package/dist/claims/index.js.map +1 -0
  51. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  52. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  53. package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
  54. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  55. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  56. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  57. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  58. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  59. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  60. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  61. package/dist/cli/__tests__/index.unit.test.js +65 -0
  62. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  63. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  64. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  65. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  66. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  67. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  68. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  69. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  70. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  71. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  72. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  73. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  74. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  75. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  76. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  77. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  78. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  79. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  80. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  81. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  82. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  83. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  84. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  85. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  86. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  87. package/dist/cli/command-deps.d.ts +125 -0
  88. package/dist/cli/command-deps.d.ts.map +1 -0
  89. package/dist/cli/command-deps.js +7 -0
  90. package/dist/cli/command-deps.js.map +1 -0
  91. package/dist/cli/commands/aggregate.d.ts +35 -0
  92. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  93. package/dist/cli/commands/aggregate.js +121 -0
  94. package/dist/cli/commands/aggregate.js.map +1 -0
  95. package/dist/cli/commands/plan.d.ts +36 -0
  96. package/dist/cli/commands/plan.d.ts.map +1 -0
  97. package/dist/cli/commands/plan.js +109 -0
  98. package/dist/cli/commands/plan.js.map +1 -0
  99. package/dist/cli/commands/run.d.ts +33 -0
  100. package/dist/cli/commands/run.d.ts.map +1 -0
  101. package/dist/cli/commands/run.js +185 -0
  102. package/dist/cli/commands/run.js.map +1 -0
  103. package/dist/cli/commands/validate.d.ts +27 -0
  104. package/dist/cli/commands/validate.d.ts.map +1 -0
  105. package/dist/cli/commands/validate.js +88 -0
  106. package/dist/cli/commands/validate.js.map +1 -0
  107. package/dist/cli/config-loader.d.ts +30 -0
  108. package/dist/cli/config-loader.d.ts.map +1 -0
  109. package/dist/cli/config-loader.js +181 -0
  110. package/dist/cli/config-loader.js.map +1 -0
  111. package/dist/cli/index.d.ts +26 -0
  112. package/dist/cli/index.d.ts.map +1 -0
  113. package/dist/cli/index.js +58 -0
  114. package/dist/cli/index.js.map +1 -0
  115. package/dist/cli/logger.d.ts +75 -0
  116. package/dist/cli/logger.d.ts.map +1 -0
  117. package/dist/cli/logger.js +131 -0
  118. package/dist/cli/logger.js.map +1 -0
  119. package/dist/cli/module-loader.d.ts +46 -0
  120. package/dist/cli/module-loader.d.ts.map +1 -0
  121. package/dist/cli/module-loader.js +116 -0
  122. package/dist/cli/module-loader.js.map +1 -0
  123. package/dist/cli/output-writer.d.ts +51 -0
  124. package/dist/cli/output-writer.d.ts.map +1 -0
  125. package/dist/cli/output-writer.js +65 -0
  126. package/dist/cli/output-writer.js.map +1 -0
  127. package/dist/cli/types.d.ts +174 -0
  128. package/dist/cli/types.d.ts.map +1 -0
  129. package/dist/cli/types.js +7 -0
  130. package/dist/cli/types.js.map +1 -0
  131. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  132. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  133. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  134. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  135. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  136. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  137. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  138. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  139. package/dist/collector/index.d.ts +8 -0
  140. package/dist/collector/index.d.ts.map +1 -0
  141. package/dist/collector/index.js +8 -0
  142. package/dist/collector/index.js.map +1 -0
  143. package/dist/collector/result-collector.d.ts +159 -0
  144. package/dist/collector/result-collector.d.ts.map +1 -0
  145. package/dist/collector/result-collector.js +213 -0
  146. package/dist/collector/result-collector.js.map +1 -0
  147. package/dist/collector/schema.d.ts +34 -0
  148. package/dist/collector/schema.d.ts.map +1 -0
  149. package/dist/collector/schema.js +145 -0
  150. package/dist/collector/schema.js.map +1 -0
  151. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts +10 -0
  152. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts.map +1 -0
  153. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js +122 -0
  154. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js.map +1 -0
  155. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts +7 -0
  156. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts.map +1 -0
  157. package/dist/executor/__tests__/checkpoint-manager.integration.test.js +330 -0
  158. package/dist/executor/__tests__/checkpoint-manager.integration.test.js.map +1 -0
  159. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts +7 -0
  160. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts.map +1 -0
  161. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +531 -0
  162. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -0
  163. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +8 -0
  164. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -0
  165. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +493 -0
  166. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -0
  167. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts +8 -0
  168. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts.map +1 -0
  169. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js +164 -0
  170. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js.map +1 -0
  171. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts +7 -0
  172. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts.map +1 -0
  173. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +490 -0
  174. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -0
  175. package/dist/executor/__tests__/executor.unit.test.d.ts +7 -0
  176. package/dist/executor/__tests__/executor.unit.test.d.ts.map +1 -0
  177. package/dist/executor/__tests__/executor.unit.test.js +202 -0
  178. package/dist/executor/__tests__/executor.unit.test.js.map +1 -0
  179. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  180. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  181. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  182. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  183. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts +12 -0
  184. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts.map +1 -0
  185. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js +196 -0
  186. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js.map +1 -0
  187. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts +7 -0
  188. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts.map +1 -0
  189. package/dist/executor/__tests__/parallel-executor.integration.test.js +249 -0
  190. package/dist/executor/__tests__/parallel-executor.integration.test.js.map +1 -0
  191. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +8 -0
  192. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -0
  193. package/dist/executor/__tests__/parallel-executor.unit.test.js +473 -0
  194. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -0
  195. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  196. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  197. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  198. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  199. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  200. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  201. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  202. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  203. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  204. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  205. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  206. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  207. package/dist/executor/checkpoint-manager.d.ts +231 -0
  208. package/dist/executor/checkpoint-manager.d.ts.map +1 -0
  209. package/dist/executor/checkpoint-manager.js +395 -0
  210. package/dist/executor/checkpoint-manager.js.map +1 -0
  211. package/dist/executor/checkpoint-storage.d.ts +230 -0
  212. package/dist/executor/checkpoint-storage.d.ts.map +1 -0
  213. package/dist/executor/checkpoint-storage.js +370 -0
  214. package/dist/executor/checkpoint-storage.js.map +1 -0
  215. package/dist/executor/checkpoint-types.d.ts +48 -0
  216. package/dist/executor/checkpoint-types.d.ts.map +1 -0
  217. package/dist/executor/checkpoint-types.js +8 -0
  218. package/dist/executor/checkpoint-types.js.map +1 -0
  219. package/dist/executor/executor.d.ts +164 -0
  220. package/dist/executor/executor.d.ts.map +1 -0
  221. package/dist/executor/executor.js +408 -0
  222. package/dist/executor/executor.js.map +1 -0
  223. package/dist/executor/index.d.ts +11 -0
  224. package/dist/executor/index.d.ts.map +1 -0
  225. package/dist/executor/index.js +11 -0
  226. package/dist/executor/index.js.map +1 -0
  227. package/dist/executor/memory-monitor.d.ts +115 -0
  228. package/dist/executor/memory-monitor.d.ts.map +1 -0
  229. package/dist/executor/memory-monitor.js +168 -0
  230. package/dist/executor/memory-monitor.js.map +1 -0
  231. package/dist/executor/parallel-executor.d.ts +239 -0
  232. package/dist/executor/parallel-executor.d.ts.map +1 -0
  233. package/dist/executor/parallel-executor.js +329 -0
  234. package/dist/executor/parallel-executor.js.map +1 -0
  235. package/dist/executor/run-id.d.ts +71 -0
  236. package/dist/executor/run-id.d.ts.map +1 -0
  237. package/dist/executor/run-id.js +74 -0
  238. package/dist/executor/run-id.js.map +1 -0
  239. package/dist/executor/worker-entry.d.ts +10 -0
  240. package/dist/executor/worker-entry.d.ts.map +1 -0
  241. package/dist/executor/worker-entry.js +42 -0
  242. package/dist/executor/worker-entry.js.map +1 -0
  243. package/dist/executor/worker-executor.d.ts +156 -0
  244. package/dist/executor/worker-executor.d.ts.map +1 -0
  245. package/dist/executor/worker-executor.js +88 -0
  246. package/dist/executor/worker-executor.js.map +1 -0
  247. package/dist/index.cjs +11 -0
  248. package/dist/index.d.ts +15 -0
  249. package/dist/index.d.ts.map +1 -0
  250. package/dist/index.js +24 -0
  251. package/dist/index.js.map +1 -0
  252. package/dist/registry/case-registry.d.ts +113 -0
  253. package/dist/registry/case-registry.d.ts.map +1 -0
  254. package/dist/registry/case-registry.js +160 -0
  255. package/dist/registry/case-registry.js.map +1 -0
  256. package/dist/registry/index.d.ts +8 -0
  257. package/dist/registry/index.d.ts.map +1 -0
  258. package/dist/registry/index.js +8 -0
  259. package/dist/registry/index.js.map +1 -0
  260. package/dist/registry/sut-registry.d.ts +96 -0
  261. package/dist/registry/sut-registry.d.ts.map +1 -0
  262. package/dist/registry/sut-registry.js +126 -0
  263. package/dist/registry/sut-registry.js.map +1 -0
  264. package/dist/renderers/index.d.ts +10 -0
  265. package/dist/renderers/index.d.ts.map +1 -0
  266. package/dist/renderers/index.js +9 -0
  267. package/dist/renderers/index.js.map +1 -0
  268. package/dist/renderers/latex-renderer.d.ts +84 -0
  269. package/dist/renderers/latex-renderer.d.ts.map +1 -0
  270. package/dist/renderers/latex-renderer.js +208 -0
  271. package/dist/renderers/latex-renderer.js.map +1 -0
  272. package/dist/renderers/types.d.ts +106 -0
  273. package/dist/renderers/types.d.ts.map +1 -0
  274. package/dist/renderers/types.js +23 -0
  275. package/dist/renderers/types.js.map +1 -0
  276. package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
  277. package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
  278. package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
  279. package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
  280. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  281. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  282. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  283. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  284. package/dist/robustness/analyzer.d.ts +61 -0
  285. package/dist/robustness/analyzer.d.ts.map +1 -0
  286. package/dist/robustness/analyzer.js +191 -0
  287. package/dist/robustness/analyzer.js.map +1 -0
  288. package/dist/robustness/index.d.ts +8 -0
  289. package/dist/robustness/index.d.ts.map +1 -0
  290. package/dist/robustness/index.js +8 -0
  291. package/dist/robustness/index.js.map +1 -0
  292. package/dist/robustness/perturbations.d.ts +46 -0
  293. package/dist/robustness/perturbations.d.ts.map +1 -0
  294. package/dist/robustness/perturbations.js +184 -0
  295. package/dist/robustness/perturbations.js.map +1 -0
  296. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  297. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  298. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  299. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  300. package/dist/statistical/index.d.ts +8 -0
  301. package/dist/statistical/index.d.ts.map +1 -0
  302. package/dist/statistical/index.js +8 -0
  303. package/dist/statistical/index.js.map +1 -0
  304. package/dist/statistical/mann-whitney-u.d.ts +62 -0
  305. package/dist/statistical/mann-whitney-u.d.ts.map +1 -0
  306. package/dist/statistical/mann-whitney-u.js +127 -0
  307. package/dist/statistical/mann-whitney-u.js.map +1 -0
  308. package/dist/types/aggregate.d.ts +124 -0
  309. package/dist/types/aggregate.d.ts.map +1 -0
  310. package/dist/types/aggregate.js +9 -0
  311. package/dist/types/aggregate.js.map +1 -0
  312. package/dist/types/case.d.ts +105 -0
  313. package/dist/types/case.d.ts.map +1 -0
  314. package/dist/types/case.js +10 -0
  315. package/dist/types/case.js.map +1 -0
  316. package/dist/types/claims.d.ts +122 -0
  317. package/dist/types/claims.d.ts.map +1 -0
  318. package/dist/types/claims.js +14 -0
  319. package/dist/types/claims.js.map +1 -0
  320. package/dist/types/index.d.ts +12 -0
  321. package/dist/types/index.d.ts.map +1 -0
  322. package/dist/types/index.js +7 -0
  323. package/dist/types/index.js.map +1 -0
  324. package/dist/types/perturbation.d.ts +105 -0
  325. package/dist/types/perturbation.d.ts.map +1 -0
  326. package/dist/types/perturbation.js +9 -0
  327. package/dist/types/perturbation.js.map +1 -0
  328. package/dist/types/result.d.ts +150 -0
  329. package/dist/types/result.d.ts.map +1 -0
  330. package/dist/types/result.js +12 -0
  331. package/dist/types/result.js.map +1 -0
  332. package/dist/types/sut.d.ts +128 -0
  333. package/dist/types/sut.d.ts.map +1 -0
  334. package/dist/types/sut.js +12 -0
  335. package/dist/types/sut.js.map +1 -0
  336. package/package.json +290 -7
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Test Helpers for Framework Tests
3
+ *
4
+ * Factory functions for creating mock evaluation results, aggregates,
5
+ * and claims for testing the evaluation framework.
6
+ */
7
+ /**
8
+ * Create a mock EvaluationResult with sensible defaults.
9
+ *
10
+ * @param overrides - Partial fields to override defaults
11
+ * @returns A complete EvaluationResult
12
+ */
13
+ export const createMockResult = (overrides) => {
14
+ const defaultRun = {
15
+ runId: "mock-run-001",
16
+ sut: "test-sut-v1.0.0",
17
+ sutRole: "primary",
18
+ caseId: "test-case-001",
19
+ caseClass: "test-class",
20
+ };
21
+ const defaultCorrectness = {
22
+ expectedExists: true,
23
+ producedOutput: true,
24
+ valid: true,
25
+ matchesExpected: true,
26
+ };
27
+ const defaultOutputs = {
28
+ summary: {},
29
+ };
30
+ const defaultMetrics = {
31
+ numeric: {
32
+ "execution-time": 100,
33
+ "nodes-expanded": 50,
34
+ "path-diversity": 0.75,
35
+ },
36
+ };
37
+ const defaultProvenance = {
38
+ runtime: {
39
+ platform: "darwin",
40
+ arch: "arm64",
41
+ nodeVersion: "20.0.0",
42
+ },
43
+ timestamp: new Date().toISOString(),
44
+ };
45
+ return {
46
+ run: { ...defaultRun, ...overrides?.run },
47
+ correctness: { ...defaultCorrectness, ...overrides?.correctness },
48
+ outputs: { ...defaultOutputs, ...overrides?.outputs },
49
+ metrics: { ...defaultMetrics, ...overrides?.metrics },
50
+ provenance: { ...defaultProvenance, ...overrides?.provenance },
51
+ };
52
+ };
53
+ /**
54
+ * Create multiple mock results for a specific SUT.
55
+ *
56
+ * @param count - Number of results to create
57
+ * @param sut - SUT identifier
58
+ * @param role - SUT role (default: "primary")
59
+ * @param caseClass - Optional case class
60
+ * @returns Array of EvaluationResults
61
+ */
62
+ export const createMockResults = (count, sut, role = "primary", caseClass) => Array.from({ length: count }, (_, index) => createMockResult({
63
+ run: {
64
+ runId: `${sut}-run-${index.toString().padStart(3, "0")}`,
65
+ sut,
66
+ sutRole: role,
67
+ caseId: `case-${index.toString().padStart(3, "0")}`,
68
+ caseClass,
69
+ },
70
+ metrics: {
71
+ numeric: {
72
+ "execution-time": 100 + Math.random() * 50,
73
+ "nodes-expanded": 50 + Math.floor(Math.random() * 20),
74
+ "path-diversity": 0.5 + Math.random() * 0.4,
75
+ },
76
+ },
77
+ }));
78
+ /**
79
+ * Create mock SummaryStats.
80
+ *
81
+ * @param values - Array of values to compute stats from
82
+ * @returns SummaryStats
83
+ */
84
+ export const createMockSummaryStats = (values) => {
85
+ if (values.length === 0) {
86
+ return {
87
+ n: 0,
88
+ mean: Number.NaN,
89
+ median: Number.NaN,
90
+ min: Number.NaN,
91
+ max: Number.NaN,
92
+ };
93
+ }
94
+ const sorted = [...values].sort((a, b) => a - b);
95
+ const n = values.length;
96
+ const sum = values.reduce((accumulator, v) => accumulator + v, 0);
97
+ const mean = sum / n;
98
+ const midIndex = Math.floor(n / 2);
99
+ const median = n % 2 === 0 ? (sorted[midIndex - 1] + sorted[midIndex]) / 2 : sorted[midIndex];
100
+ let std;
101
+ if (n > 1) {
102
+ const variance = values.map((v) => (v - mean) ** 2).reduce((accumulator, v) => accumulator + v, 0) / (n - 1);
103
+ std = Math.sqrt(variance);
104
+ }
105
+ return {
106
+ n,
107
+ mean,
108
+ median,
109
+ min: sorted[0],
110
+ max: sorted[n - 1],
111
+ std,
112
+ sum,
113
+ };
114
+ };
115
+ /**
116
+ * Create mock AggregatedResult.
117
+ *
118
+ * @param sut - SUT identifier
119
+ * @param role - SUT role
120
+ * @param caseClass - Optional case class
121
+ * @param metrics - Optional metrics map
122
+ * @returns AggregatedResult
123
+ */
124
+ export const createMockAggregate = (sut, role = "primary", caseClass, metrics) => {
125
+ const defaultMetrics = {
126
+ "execution-time": createMockSummaryStats([100, 110, 105, 115, 120]),
127
+ "nodes-expanded": createMockSummaryStats([50, 55, 52, 58, 60]),
128
+ "path-diversity": createMockSummaryStats([0.7, 0.75, 0.72, 0.78, 0.8]),
129
+ };
130
+ return {
131
+ sut,
132
+ sutRole: role,
133
+ caseClass,
134
+ group: {
135
+ runCount: 5,
136
+ caseCount: 5,
137
+ },
138
+ correctness: {
139
+ validRate: 1,
140
+ producedOutputRate: 1,
141
+ matchesExpectedRate: 1,
142
+ },
143
+ metrics: metrics ?? defaultMetrics,
144
+ };
145
+ };
146
+ /**
147
+ * Create mock aggregates for testing comparisons.
148
+ *
149
+ * @returns Array with primary and baseline aggregates
150
+ */
151
+ export const createMockAggregates = () => [
152
+ createMockAggregate("degree-prioritised-v1.0.0", "primary", "scale-free", {
153
+ "execution-time": createMockSummaryStats([80, 85, 82, 88, 90]),
154
+ "nodes-expanded": createMockSummaryStats([40, 45, 42, 48, 50]),
155
+ }),
156
+ createMockAggregate("standard-bfs-v1.0.0", "baseline", "scale-free", {
157
+ "execution-time": createMockSummaryStats([120, 125, 122, 128, 130]),
158
+ "nodes-expanded": createMockSummaryStats([70, 75, 72, 78, 80]),
159
+ }),
160
+ createMockAggregate("frontier-balanced-v1.0.0", "baseline", "scale-free", {
161
+ "execution-time": createMockSummaryStats([100, 105, 102, 108, 110]),
162
+ "nodes-expanded": createMockSummaryStats([60, 65, 62, 68, 70]),
163
+ }),
164
+ ];
165
+ /**
166
+ * Create a mock EvaluationClaim.
167
+ *
168
+ * @param overrides - Partial fields to override defaults
169
+ * @returns EvaluationClaim
170
+ */
171
+ export const createMockClaim = (overrides) => ({
172
+ claimId: "C001",
173
+ description: "Primary SUT is faster than baseline",
174
+ sut: "degree-prioritised-v1.0.0",
175
+ baseline: "standard-bfs-v1.0.0",
176
+ metric: "execution-time",
177
+ direction: "less",
178
+ scope: "global",
179
+ ...overrides,
180
+ });
181
+ /**
182
+ * Create mock ClaimEvidence.
183
+ *
184
+ * @param overrides - Partial fields to override defaults
185
+ * @returns ClaimEvidence
186
+ */
187
+ export const createMockEvidence = (overrides) => ({
188
+ primaryValue: 85,
189
+ baselineValue: 125,
190
+ delta: -40,
191
+ ratio: 0.68,
192
+ pValue: 0.01,
193
+ effectSize: 1.5,
194
+ n: 10,
195
+ ...overrides,
196
+ });
197
+ /**
198
+ * Create mock ClaimEvaluation.
199
+ *
200
+ * @param status - Claim status
201
+ * @param claim - Optional claim
202
+ * @param evidence - Optional evidence
203
+ * @returns ClaimEvaluation
204
+ */
205
+ export const createMockClaimEvaluation = (status = "satisfied", claim, evidence) => ({
206
+ claim: createMockClaim(claim),
207
+ status,
208
+ evidence: createMockEvidence(evidence),
209
+ });
210
+ /**
211
+ * Create an array of mock results with varying metrics.
212
+ * Useful for testing aggregation and statistics.
213
+ *
214
+ * @param executionTimes - Array of execution times
215
+ * @param sut - SUT identifier
216
+ * @param role - SUT role
217
+ * @returns Array of EvaluationResults
218
+ */
219
+ export const createMockResultsWithMetrics = (executionTimes, sut, role = "primary") => executionTimes.map((time, index) => createMockResult({
220
+ run: {
221
+ runId: `${sut}-run-${index.toString().padStart(3, "0")}`,
222
+ sut,
223
+ sutRole: role,
224
+ caseId: `case-${index.toString().padStart(3, "0")}`,
225
+ },
226
+ metrics: {
227
+ numeric: {
228
+ "execution-time": time,
229
+ },
230
+ },
231
+ }));
232
+ /**
233
+ * Create a minimal valid result for validation tests.
234
+ * Returns the bare minimum fields required by the schema.
235
+ */
236
+ export const createMinimalValidResult = () => ({
237
+ run: {
238
+ runId: "minimal-001",
239
+ sut: "test-sut",
240
+ sutRole: "primary",
241
+ caseId: "test-case",
242
+ },
243
+ correctness: {
244
+ expectedExists: false,
245
+ producedOutput: true,
246
+ valid: true,
247
+ matchesExpected: null,
248
+ },
249
+ outputs: {},
250
+ metrics: {
251
+ numeric: {},
252
+ },
253
+ provenance: {
254
+ runtime: {
255
+ platform: "test",
256
+ arch: "test",
257
+ nodeVersion: "20.0.0",
258
+ },
259
+ },
260
+ });
261
+ /**
262
+ * Create an invalid result missing required fields.
263
+ * Useful for testing validation logic.
264
+ */
265
+ export const createInvalidResult = () => ({
266
+ run: {
267
+ // Missing runId, sut, sutRole, caseId
268
+ },
269
+ // Missing correctness, metrics, provenance
270
+ });
271
+ //# sourceMappingURL=test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/__tests__/test-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for Aggregation Functions
3
+ *
4
+ * Tests the pure functions for computing aggregated statistics.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=aggregators.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregators.unit.test.d.ts","sourceRoot":"","sources":["../../../src/aggregation/__tests__/aggregators.unit.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Unit tests for Aggregation Functions
3
+ *
4
+ * Tests the pure functions for computing aggregated statistics.
5
+ */
6
+ import { describe, it } from "node:test";
7
+ import { strict as assert } from "node:assert";
8
+ import { computeSummaryStats, computeSpeedup, computeMaxSpeedup, computeComparison, computeRankings, getTValue, } from "../aggregators.js";
9
+ import { createMockResult } from "../../__tests__/test-helpers.js";
10
+ describe("computeSummaryStats", () => {
11
+ it("should return NaN values for empty array", () => {
12
+ const result = computeSummaryStats([]);
13
+ assert.strictEqual(result.n, 0);
14
+ assert.ok(Number.isNaN(result.mean));
15
+ assert.ok(Number.isNaN(result.median));
16
+ assert.ok(Number.isNaN(result.min));
17
+ assert.ok(Number.isNaN(result.max));
18
+ });
19
+ it("should compute basic statistics for single value", () => {
20
+ const result = computeSummaryStats([42]);
21
+ assert.strictEqual(result.n, 1);
22
+ assert.strictEqual(result.mean, 42);
23
+ assert.strictEqual(result.median, 42);
24
+ assert.strictEqual(result.min, 42);
25
+ assert.strictEqual(result.max, 42);
26
+ assert.strictEqual(result.std, undefined);
27
+ assert.strictEqual(result.confidence95, undefined);
28
+ });
29
+ it("should compute statistics for multiple values", () => {
30
+ const result = computeSummaryStats([1, 2, 3, 4, 5]);
31
+ assert.strictEqual(result.n, 5);
32
+ assert.strictEqual(result.mean, 3);
33
+ assert.strictEqual(result.median, 3);
34
+ assert.strictEqual(result.min, 1);
35
+ assert.strictEqual(result.max, 5);
36
+ assert.ok(result.std !== undefined);
37
+ assert.ok(result.std > 0);
38
+ });
39
+ it("should compute median for even-length arrays", () => {
40
+ const result = computeSummaryStats([1, 2, 3, 4]);
41
+ assert.strictEqual(result.median, 2.5); // (2 + 3) / 2
42
+ });
43
+ it("should compute 95% confidence interval", () => {
44
+ const result = computeSummaryStats([10, 12, 14, 16, 18]);
45
+ assert.ok(result.confidence95 !== undefined);
46
+ assert.ok(result.confidence95[0] < result.mean);
47
+ assert.ok(result.confidence95[1] > result.mean);
48
+ });
49
+ it("should compute percentiles", () => {
50
+ const result = computeSummaryStats([1, 2, 3, 4, 5, 6, 7, 8]);
51
+ assert.strictEqual(result.p25, 3); // Floor of 8 * 0.25 = 2, sorted[2] = 3
52
+ assert.strictEqual(result.p75, 7); // Floor of 8 * 0.75 = 6, sorted[6] = 7
53
+ });
54
+ });
55
+ describe("computeSpeedup", () => {
56
+ it("should compute speedup ratio", () => {
57
+ const result = computeSpeedup(100, 50);
58
+ assert.strictEqual(result, 2); // 100 / 50 = 2x speedup
59
+ });
60
+ it("should return Infinity for zero treatment time", () => {
61
+ const result = computeSpeedup(100, 0);
62
+ assert.strictEqual(result, Infinity);
63
+ });
64
+ it("should handle slower treatment", () => {
65
+ const result = computeSpeedup(50, 100);
66
+ assert.strictEqual(result, 0.5); // 50 / 100 = 0.5x (slower)
67
+ });
68
+ });
69
+ describe("computeMaxSpeedup", () => {
70
+ it("should return 0 for empty pairs", () => {
71
+ const result = computeMaxSpeedup([]);
72
+ assert.strictEqual(result, 0);
73
+ });
74
+ it("should compute maximum speedup from pairs", () => {
75
+ const pairs = [
76
+ [100, 50], // 2x
77
+ [100, 25], // 4x
78
+ [100, 100], // 1x
79
+ ];
80
+ const result = computeMaxSpeedup(pairs);
81
+ assert.strictEqual(result, 4); // Maximum is 4x
82
+ });
83
+ it("should handle pairs with zero treatment time", () => {
84
+ const pairs = [
85
+ [100, 50],
86
+ [100, 0], // Infinity
87
+ [100, 25],
88
+ ];
89
+ const result = computeMaxSpeedup(pairs);
90
+ assert.strictEqual(result, Infinity);
91
+ });
92
+ it("should handle single pair", () => {
93
+ const pairs = [[100, 25]];
94
+ const result = computeMaxSpeedup(pairs);
95
+ assert.strictEqual(result, 4);
96
+ });
97
+ });
98
+ describe("computeComparison", () => {
99
+ it("should return default values when no common case IDs", () => {
100
+ const primaryResults = [
101
+ createMockResult({
102
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "primary-case-1" },
103
+ }),
104
+ createMockResult({
105
+ run: { runId: "p2", sut: "primary", sutRole: "primary", caseId: "primary-case-2" },
106
+ }),
107
+ ];
108
+ const baselineResults = [
109
+ createMockResult({
110
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "baseline-case-1" },
111
+ }),
112
+ createMockResult({
113
+ run: { runId: "b2", sut: "baseline", sutRole: "baseline", caseId: "baseline-case-2" },
114
+ }),
115
+ ];
116
+ const result = computeComparison(primaryResults, baselineResults, "execution-time");
117
+ assert.deepStrictEqual(result.deltas, { default: 0 });
118
+ assert.deepStrictEqual(result.ratios, { default: 1 });
119
+ });
120
+ it("should compute delta and ratio for matching cases", () => {
121
+ const primaryResults = [
122
+ createMockResult({
123
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
124
+ metrics: { numeric: { "execution-time": 80 } },
125
+ }),
126
+ createMockResult({
127
+ run: { runId: "p2", sut: "primary", sutRole: "primary", caseId: "case-2" },
128
+ metrics: { numeric: { "execution-time": 120 } },
129
+ }),
130
+ ];
131
+ const baselineResults = [
132
+ createMockResult({
133
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
134
+ metrics: { numeric: { "execution-time": 100 } },
135
+ }),
136
+ createMockResult({
137
+ run: { runId: "b2", sut: "baseline", sutRole: "baseline", caseId: "case-2" },
138
+ metrics: { numeric: { "execution-time": 100 } },
139
+ }),
140
+ ];
141
+ const result = computeComparison(primaryResults, baselineResults, "execution-time");
142
+ // Primary mean = 100, baseline mean = 100
143
+ assert.strictEqual(result.deltas.default, 0);
144
+ assert.strictEqual(result.ratios.default, 1);
145
+ });
146
+ it("should compute better rate (wins)", () => {
147
+ const primaryResults = [
148
+ createMockResult({
149
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
150
+ metrics: { numeric: { accuracy: 0.9 } },
151
+ }),
152
+ createMockResult({
153
+ run: { runId: "p2", sut: "primary", sutRole: "primary", caseId: "case-2" },
154
+ metrics: { numeric: { accuracy: 0.7 } },
155
+ }),
156
+ createMockResult({
157
+ run: { runId: "p3", sut: "primary", sutRole: "primary", caseId: "case-3" },
158
+ metrics: { numeric: { accuracy: 0.85 } },
159
+ }),
160
+ ];
161
+ const baselineResults = [
162
+ createMockResult({
163
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
164
+ metrics: { numeric: { accuracy: 0.8 } },
165
+ }),
166
+ createMockResult({
167
+ run: { runId: "b2", sut: "baseline", sutRole: "baseline", caseId: "case-2" },
168
+ metrics: { numeric: { accuracy: 0.8 } },
169
+ }),
170
+ createMockResult({
171
+ run: { runId: "b3", sut: "baseline", sutRole: "baseline", caseId: "case-3" },
172
+ metrics: { numeric: { accuracy: 0.8 } },
173
+ }),
174
+ ];
175
+ const result = computeComparison(primaryResults, baselineResults, "accuracy");
176
+ // Primary wins: case-1 (0.9 > 0.8), loses case-2 (0.7 < 0.8), wins case-3 (0.85 > 0.8)
177
+ // Win rate = 2/3 ≈ 0.667
178
+ assert.ok(result.betterRate > 0.6);
179
+ assert.ok(result.betterRate < 0.7);
180
+ });
181
+ it("should return infinite ratio when baseline mean is zero", () => {
182
+ const primaryResults = [
183
+ createMockResult({
184
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
185
+ metrics: { numeric: { errors: 0 } },
186
+ }),
187
+ ];
188
+ const baselineResults = [
189
+ createMockResult({
190
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
191
+ metrics: { numeric: { errors: 0 } },
192
+ }),
193
+ ];
194
+ const result = computeComparison(primaryResults, baselineResults, "errors");
195
+ // When both means are 0, ratio should be 0/0 which is handled specially
196
+ // Actually looking at the code, if baselineStats.mean === 0, ratio = Infinity
197
+ assert.strictEqual(result.ratios.default, Infinity);
198
+ });
199
+ it("should compute pValue using Mann-Whitney U test", () => {
200
+ const primaryResults = [
201
+ createMockResult({
202
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
203
+ metrics: { numeric: { "execution-time": 100 } },
204
+ }),
205
+ ];
206
+ const baselineResults = [
207
+ createMockResult({
208
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
209
+ metrics: { numeric: { "execution-time": 100 } },
210
+ }),
211
+ ];
212
+ const result = computeComparison(primaryResults, baselineResults, "execution-time");
213
+ assert.ok(typeof result.pValue === "number");
214
+ assert.ok(typeof result.uStatistic === "number");
215
+ });
216
+ it("should compute effect size when both samples have variance", () => {
217
+ const primaryResults = [
218
+ createMockResult({
219
+ run: { runId: "p1", sut: "primary", sutRole: "primary", caseId: "case-1" },
220
+ metrics: { numeric: { "execution-time": 80 } },
221
+ }),
222
+ createMockResult({
223
+ run: { runId: "p2", sut: "primary", sutRole: "primary", caseId: "case-2" },
224
+ metrics: { numeric: { "execution-time": 120 } },
225
+ }),
226
+ ];
227
+ const baselineResults = [
228
+ createMockResult({
229
+ run: { runId: "b1", sut: "baseline", sutRole: "baseline", caseId: "case-1" },
230
+ metrics: { numeric: { "execution-time": 95 } },
231
+ }),
232
+ createMockResult({
233
+ run: { runId: "b2", sut: "baseline", sutRole: "baseline", caseId: "case-2" },
234
+ metrics: { numeric: { "execution-time": 105 } },
235
+ }),
236
+ ];
237
+ const result = computeComparison(primaryResults, baselineResults, "execution-time");
238
+ assert.ok(result.effectSize !== undefined);
239
+ assert.ok(result.effectSize >= 0);
240
+ });
241
+ });
242
+ describe("computeRankings", () => {
243
+ it("should rank results by metric in descending order (default)", () => {
244
+ const results = [
245
+ createMockResult({
246
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
247
+ metrics: { numeric: { score: 0.8 } },
248
+ }),
249
+ createMockResult({
250
+ run: { runId: "r2", sut: "sut-2", sutRole: "primary", caseId: "case-1" },
251
+ metrics: { numeric: { score: 0.95 } },
252
+ }),
253
+ createMockResult({
254
+ run: { runId: "r3", sut: "sut-3", sutRole: "primary", caseId: "case-1" },
255
+ metrics: { numeric: { score: 0.7 } },
256
+ }),
257
+ ];
258
+ const rankings = computeRankings(results, "score");
259
+ assert.strictEqual(rankings.length, 3);
260
+ assert.strictEqual(rankings[0].rank, 1);
261
+ assert.strictEqual(rankings[0].result.run.runId, "r2"); // Highest score gets rank 1
262
+ assert.strictEqual(rankings[2].rank, 3);
263
+ assert.strictEqual(rankings[2].result.run.runId, "r3"); // Lowest score gets rank 3
264
+ });
265
+ it("should rank results in ascending order when specified", () => {
266
+ const results = [
267
+ createMockResult({
268
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
269
+ metrics: { numeric: { "execution-time": 100 } },
270
+ }),
271
+ createMockResult({
272
+ run: { runId: "r2", sut: "sut-2", sutRole: "primary", caseId: "case-1" },
273
+ metrics: { numeric: { "execution-time": 50 } },
274
+ }),
275
+ createMockResult({
276
+ run: { runId: "r3", sut: "sut-3", sutRole: "primary", caseId: "case-1" },
277
+ metrics: { numeric: { "execution-time": 75 } },
278
+ }),
279
+ ];
280
+ const rankings = computeRankings(results, "execution-time", true);
281
+ assert.strictEqual(rankings[0].rank, 1);
282
+ assert.strictEqual(rankings[0].result.run.runId, "r2"); // Fastest (lowest time) gets rank 1
283
+ assert.strictEqual(rankings[2].rank, 3);
284
+ assert.strictEqual(rankings[2].result.run.runId, "r1"); // Slowest (highest time) gets rank 3
285
+ });
286
+ it("should filter out results with missing or NaN metric values", () => {
287
+ const results = [
288
+ createMockResult({
289
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
290
+ metrics: { numeric: { score: 0.8 } },
291
+ }),
292
+ createMockResult({
293
+ run: { runId: "r2", sut: "sut-2", sutRole: "primary", caseId: "case-1" },
294
+ metrics: { numeric: {} }, // Missing metric
295
+ }),
296
+ ];
297
+ const rankings = computeRankings(results, "score");
298
+ assert.strictEqual(rankings.length, 1); // Only r1 has the metric
299
+ assert.strictEqual(rankings[0].result.run.runId, "r1");
300
+ });
301
+ it("should return empty array when no results have the metric", () => {
302
+ const results = [
303
+ createMockResult({
304
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
305
+ metrics: { numeric: {} },
306
+ }),
307
+ ];
308
+ const rankings = computeRankings(results, "nonexistent");
309
+ assert.deepStrictEqual(rankings, []);
310
+ });
311
+ it("should handle ties in metric values", () => {
312
+ const results = [
313
+ createMockResult({
314
+ run: { runId: "r1", sut: "sut-1", sutRole: "primary", caseId: "case-1" },
315
+ metrics: { numeric: { score: 0.9 } },
316
+ }),
317
+ createMockResult({
318
+ run: { runId: "r2", sut: "sut-2", sutRole: "primary", caseId: "case-1" },
319
+ metrics: { numeric: { score: 0.9 } },
320
+ }),
321
+ ];
322
+ const rankings = computeRankings(results, "score");
323
+ assert.strictEqual(rankings.length, 2);
324
+ // Both have rank 1 and 2 due to sort stability
325
+ assert.ok(rankings.every((r) => r.value === 0.9));
326
+ });
327
+ });
328
+ describe("getTValue", () => {
329
+ it("should return t-value from lookup table for 95% CI", () => {
330
+ const t10 = getTValue(10, 0.975);
331
+ assert.strictEqual(t10, 2.228);
332
+ const t30 = getTValue(30, 0.975);
333
+ assert.strictEqual(t30, 2.042);
334
+ const t100 = getTValue(100, 0.975);
335
+ assert.strictEqual(t100, 1.984);
336
+ });
337
+ it("should return z-value fallback for non-standard probability", () => {
338
+ const result = getTValue(50, 0.99);
339
+ assert.strictEqual(result, 1.96); // z-value for large samples
340
+ });
341
+ it("should return z-value fallback for 90% CI", () => {
342
+ const result = getTValue(50, 0.95); // 90% two-tailed = 0.95
343
+ assert.strictEqual(result, 1.96);
344
+ });
345
+ it("should return z-value fallback for 99% CI", () => {
346
+ const result = getTValue(50, 0.995); // 99% two-tailed = 0.995
347
+ assert.strictEqual(result, 1.96);
348
+ });
349
+ });
350
+ //# sourceMappingURL=aggregators.unit.test.js.map