ppef 1.2.0 → 1.3.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.
- package/README.md +270 -6
- package/dist/__tests__/cli/evaluate-command.integration.test.js +60 -0
- package/dist/__tests__/cli/evaluate-command.integration.test.js.map +1 -1
- package/dist/__tests__/examples.integration.test.d.ts +8 -0
- package/dist/__tests__/examples.integration.test.d.ts.map +1 -0
- package/dist/__tests__/examples.integration.test.js +236 -0
- package/dist/__tests__/examples.integration.test.js.map +1 -0
- package/dist/cli/__tests__/commands.unit.test.js +12 -5
- package/dist/cli/__tests__/commands.unit.test.js.map +1 -1
- package/dist/cli/__tests__/config-loader.unit.test.js +30 -25
- package/dist/cli/__tests__/config-loader.unit.test.js.map +1 -1
- package/dist/cli/__tests__/evaluator-schemas.unit.test.d.ts +9 -0
- package/dist/cli/__tests__/evaluator-schemas.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/evaluator-schemas.unit.test.js +334 -0
- package/dist/cli/__tests__/evaluator-schemas.unit.test.js.map +1 -0
- package/dist/cli/commands/aggregate.d.ts.map +1 -1
- package/dist/cli/commands/aggregate.js +20 -12
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/evaluate.d.ts.map +1 -1
- package/dist/cli/commands/evaluate.js +130 -24
- package/dist/cli/commands/evaluate.js.map +1 -1
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +40 -6
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +71 -12
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +55 -0
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/config-loader.d.ts +6 -3
- package/dist/cli/config-loader.d.ts.map +1 -1
- package/dist/cli/config-loader.js +31 -106
- package/dist/cli/config-loader.js.map +1 -1
- package/dist/cli/evaluator-schemas.d.ts +395 -0
- package/dist/cli/evaluator-schemas.d.ts.map +1 -0
- package/dist/cli/evaluator-schemas.js +285 -0
- package/dist/cli/evaluator-schemas.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +11 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/module-loader.d.ts.map +1 -1
- package/dist/cli/module-loader.js +38 -20
- package/dist/cli/module-loader.js.map +1 -1
- package/dist/cli/type-utils.d.ts +31 -0
- package/dist/cli/type-utils.d.ts.map +1 -0
- package/dist/cli/type-utils.js +38 -0
- package/dist/cli/type-utils.js.map +1 -0
- package/dist/cli/types.d.ts +284 -94
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js +177 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/collector/schema.js.map +1 -1
- package/dist/evaluators/claims-evaluator.d.ts.map +1 -1
- package/dist/evaluators/claims-evaluator.js +1 -1
- package/dist/evaluators/claims-evaluator.js.map +1 -1
- package/dist/evaluators/exploratory-evaluator.js.map +1 -1
- package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -1
- package/dist/executor/__tests__/worker-entry.integration.test.js +19 -4
- package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -1
- package/dist/executor/binary-sut.d.ts.map +1 -1
- package/dist/executor/binary-sut.js +2 -1
- package/dist/executor/binary-sut.js.map +1 -1
- package/dist/executor/checkpoint-storage.d.ts.map +1 -1
- package/dist/executor/checkpoint-storage.js +13 -4
- package/dist/executor/checkpoint-storage.js.map +1 -1
- package/dist/executor/executor.d.ts +22 -0
- package/dist/executor/executor.d.ts.map +1 -1
- package/dist/executor/executor.js +133 -6
- package/dist/executor/executor.js.map +1 -1
- package/dist/executor/parallel-executor.d.ts.map +1 -1
- package/dist/executor/parallel-executor.js +9 -2
- package/dist/executor/parallel-executor.js.map +1 -1
- package/dist/executor/worker-entry.js +3 -1
- package/dist/executor/worker-entry.js.map +1 -1
- package/dist/executor/worker-executor.d.ts +9 -0
- package/dist/executor/worker-executor.d.ts.map +1 -1
- package/dist/executor/worker-executor.js +88 -9
- package/dist/executor/worker-executor.js.map +1 -1
- package/dist/executor/worker-threads-executor.d.ts.map +1 -1
- package/dist/executor/worker-threads-executor.js +52 -18
- package/dist/executor/worker-threads-executor.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/renderers/latex-renderer.d.ts.map +1 -1
- package/dist/renderers/latex-renderer.js +20 -12
- package/dist/renderers/latex-renderer.js.map +1 -1
- package/dist/schemas/__tests__/json-schema-validator.unit.test.d.ts +8 -0
- package/dist/schemas/__tests__/json-schema-validator.unit.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/json-schema-validator.unit.test.js +170 -0
- package/dist/schemas/__tests__/json-schema-validator.unit.test.js.map +1 -0
- package/dist/schemas/index.d.ts +7 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/json-schema-validator.d.ts +59 -0
- package/dist/schemas/json-schema-validator.d.ts.map +1 -0
- package/dist/schemas/json-schema-validator.js +67 -0
- package/dist/schemas/json-schema-validator.js.map +1 -0
- package/dist/types/case.d.ts +4 -0
- package/dist/types/case.d.ts.map +1 -1
- package/dist/types/result.d.ts +2 -0
- package/dist/types/result.d.ts.map +1 -1
- package/dist/types/sut.d.ts +4 -0
- package/dist/types/sut.d.ts.map +1 -1
- package/package.json +16 -6
- package/ppef.schema.json +1178 -0
package/README.md
CHANGED
|
@@ -45,11 +45,275 @@ npx tsx --test src/path/to/file.test.ts
|
|
|
45
45
|
|
|
46
46
|
CLI (after build):
|
|
47
47
|
```bash
|
|
48
|
-
ppef
|
|
49
|
-
ppef
|
|
50
|
-
ppef
|
|
51
|
-
ppef
|
|
52
|
-
ppef
|
|
48
|
+
ppef experiment.json # Run experiment (default command)
|
|
49
|
+
ppef run config.json # Explicit run command
|
|
50
|
+
ppef validate # Validate configuration
|
|
51
|
+
ppef plan # Dry-run execution plan
|
|
52
|
+
ppef aggregate # Post-process results
|
|
53
|
+
ppef evaluate # Run evaluators on results
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Quick Start
|
|
57
|
+
|
|
58
|
+
Create a minimal experiment with three files and a config:
|
|
59
|
+
|
|
60
|
+
**experiment.json**
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"experiment": {
|
|
64
|
+
"name": "string-length",
|
|
65
|
+
"description": "Compare string length implementations"
|
|
66
|
+
},
|
|
67
|
+
"executor": {
|
|
68
|
+
"repetitions": 3
|
|
69
|
+
},
|
|
70
|
+
"suts": [
|
|
71
|
+
{
|
|
72
|
+
"id": "builtin-length",
|
|
73
|
+
"module": "./sut.mjs",
|
|
74
|
+
"exportName": "createSut",
|
|
75
|
+
"registration": {
|
|
76
|
+
"name": "Built-in .length",
|
|
77
|
+
"version": "1.0.0",
|
|
78
|
+
"role": "primary"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"cases": [
|
|
83
|
+
{
|
|
84
|
+
"id": "hello-world",
|
|
85
|
+
"module": "./case.mjs",
|
|
86
|
+
"exportName": "createCase"
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"metricsExtractor": {
|
|
90
|
+
"module": "./metrics.mjs",
|
|
91
|
+
"exportName": "extract"
|
|
92
|
+
},
|
|
93
|
+
"output": {
|
|
94
|
+
"path": "./results"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**sut.mjs** — System Under Test factory
|
|
100
|
+
```js
|
|
101
|
+
export function createSut() {
|
|
102
|
+
return {
|
|
103
|
+
id: "builtin-length",
|
|
104
|
+
config: {},
|
|
105
|
+
run: async (input) => ({ length: input.text.length }),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**case.mjs** — Test case definition
|
|
111
|
+
```js
|
|
112
|
+
export function createCase() {
|
|
113
|
+
return {
|
|
114
|
+
case: {
|
|
115
|
+
caseId: "hello-world",
|
|
116
|
+
caseClass: "basic",
|
|
117
|
+
name: "Hello World",
|
|
118
|
+
version: "1.0.0",
|
|
119
|
+
inputs: { text: "hello world" },
|
|
120
|
+
},
|
|
121
|
+
getInput: async () => ({ text: "hello world" }),
|
|
122
|
+
getInputs: () => ({ text: "hello world" }),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**metrics.mjs** — Metrics extractor
|
|
128
|
+
```js
|
|
129
|
+
export function extract(result) {
|
|
130
|
+
return { length: result.length ?? 0 };
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Run it:
|
|
135
|
+
```bash
|
|
136
|
+
npx ppef experiment.json
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Workflows
|
|
140
|
+
|
|
141
|
+
The typical pipeline chains CLI commands: validate, run, aggregate, then evaluate.
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
ppef validate config.json
|
|
145
|
+
→ ppef run config.json
|
|
146
|
+
→ ppef aggregate results.json
|
|
147
|
+
→ ppef evaluate aggregates.json -t claims -c claims.json
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 1. Validate Configuration
|
|
151
|
+
|
|
152
|
+
Check an experiment config for errors before running:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
ppef validate experiment.json
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 2. Preview Execution Plan
|
|
159
|
+
|
|
160
|
+
See what would run without executing (SUTs x cases x repetitions):
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
ppef plan experiment.json
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 3. Run an Experiment
|
|
167
|
+
|
|
168
|
+
Execute all SUTs against all cases with worker thread isolation:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
ppef run experiment.json
|
|
172
|
+
ppef run experiment.json -o ./output -j 4 --verbose
|
|
173
|
+
ppef run experiment.json --unsafe-in-process # No worker isolation (debugging only)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
The output directory contains a results JSON and (by default) an aggregates JSON.
|
|
177
|
+
|
|
178
|
+
### 4. Aggregate Results
|
|
179
|
+
|
|
180
|
+
Compute summary statistics, pairwise comparisons, and rankings from raw results:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
ppef aggregate results.json
|
|
184
|
+
ppef aggregate results.json -o aggregates.json --compute-comparisons
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 5. Evaluate Results
|
|
188
|
+
|
|
189
|
+
Run evaluators against aggregated (or raw) results. Each evaluator type takes a JSON config file.
|
|
190
|
+
|
|
191
|
+
#### Claims — Test Explicit Hypotheses
|
|
192
|
+
|
|
193
|
+
Test whether SUT A outperforms baseline B on a given metric with statistical significance:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
ppef evaluate aggregates.json -t claims -c claims.json -v
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**claims.json**:
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"claims": [
|
|
203
|
+
{
|
|
204
|
+
"claimId": "C001",
|
|
205
|
+
"description": "Primary has greater accuracy than baseline",
|
|
206
|
+
"sut": "primary-sut",
|
|
207
|
+
"baseline": "baseline-sut",
|
|
208
|
+
"metric": "accuracy",
|
|
209
|
+
"direction": "greater",
|
|
210
|
+
"scope": "global"
|
|
211
|
+
}
|
|
212
|
+
],
|
|
213
|
+
"significanceLevel": 0.05
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
#### Metrics — Threshold, Baseline, and Range Criteria
|
|
218
|
+
|
|
219
|
+
Evaluate metrics against fixed thresholds, baselines, or target ranges:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
ppef evaluate aggregates.json -t metrics -c metrics-config.json
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**metrics-config.json**:
|
|
226
|
+
```json
|
|
227
|
+
{
|
|
228
|
+
"criteria": [
|
|
229
|
+
{
|
|
230
|
+
"criterionId": "exec-time",
|
|
231
|
+
"description": "Execution time under 1000ms",
|
|
232
|
+
"type": "threshold",
|
|
233
|
+
"metric": "executionTime",
|
|
234
|
+
"sut": "*",
|
|
235
|
+
"threshold": { "operator": "lt", "value": 1000 }
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"criterionId": "f1-range",
|
|
239
|
+
"description": "F1 score in [0.8, 1.0]",
|
|
240
|
+
"type": "target-range",
|
|
241
|
+
"metric": "f1Score",
|
|
242
|
+
"sut": "*",
|
|
243
|
+
"targetRange": { "min": 0.8, "max": 1.0, "minInclusive": true, "maxInclusive": true }
|
|
244
|
+
}
|
|
245
|
+
]
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
#### Robustness — Sensitivity Under Perturbations
|
|
250
|
+
|
|
251
|
+
Measure how performance degrades under perturbations at varying intensity levels:
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
ppef evaluate results.json -t robustness -c robustness-config.json
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**robustness-config.json**:
|
|
258
|
+
```json
|
|
259
|
+
{
|
|
260
|
+
"metrics": ["executionTime", "accuracy"],
|
|
261
|
+
"perturbations": ["edge-removal", "noise", "seed-shift"],
|
|
262
|
+
"intensityLevels": [0.1, 0.2, 0.3, 0.4, 0.5],
|
|
263
|
+
"runsPerLevel": 10
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
#### Output Formats
|
|
268
|
+
|
|
269
|
+
All evaluators support JSON and LaTeX output:
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
ppef evaluate aggregates.json -t claims -c claims.json -f latex
|
|
273
|
+
ppef evaluate aggregates.json -t metrics -c metrics.json -f json -o results.json
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Inline Evaluators
|
|
277
|
+
|
|
278
|
+
Evaluator configs can be embedded directly in the experiment config via the optional `evaluators` field, making the config self-contained:
|
|
279
|
+
|
|
280
|
+
```json
|
|
281
|
+
{
|
|
282
|
+
"experiment": { "name": "my-experiment" },
|
|
283
|
+
"executor": { "repetitions": 10 },
|
|
284
|
+
"suts": [ ... ],
|
|
285
|
+
"cases": [ ... ],
|
|
286
|
+
"metricsExtractor": { ... },
|
|
287
|
+
"output": { "path": "./results" },
|
|
288
|
+
"evaluators": [
|
|
289
|
+
{
|
|
290
|
+
"type": "claims",
|
|
291
|
+
"config": {
|
|
292
|
+
"claims": [ ... ]
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
]
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### JSON Schema Validation
|
|
300
|
+
|
|
301
|
+
Experiment configs can reference the generated schema for IDE autocompletion:
|
|
302
|
+
|
|
303
|
+
```json
|
|
304
|
+
{
|
|
305
|
+
"$schema": "./ppef.schema.json",
|
|
306
|
+
"experiment": { ... }
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
Standalone evaluator configs reference schema `$defs`:
|
|
311
|
+
|
|
312
|
+
```json
|
|
313
|
+
{
|
|
314
|
+
"$schema": "./ppef.schema.json#/$defs/ClaimsEvaluatorConfig",
|
|
315
|
+
"claims": [ ... ]
|
|
316
|
+
}
|
|
53
317
|
```
|
|
54
318
|
|
|
55
319
|
## Architecture
|
|
@@ -114,7 +378,7 @@ Available subpaths: `ppef/types`, `ppef/registry`, `ppef/executor`, `ppef/collec
|
|
|
114
378
|
- Node.js native test runner (`node:test` + `node:assert`) — not Vitest/Jest
|
|
115
379
|
- Coverage via c8 (text + html + json-summary in `./coverage/`)
|
|
116
380
|
- Conventional commits enforced via commitlint + husky
|
|
117
|
-
- Semantic release from
|
|
381
|
+
- Semantic release from main branch
|
|
118
382
|
- No `any` types — use `unknown` with type guards
|
|
119
383
|
- Executor produces deterministic `runId` via SHA-256 hash of inputs
|
|
120
384
|
|
|
@@ -268,6 +268,66 @@ describe("evaluate command - integration tests", () => {
|
|
|
268
268
|
assert.ok(mockLogger.calls.some((call) => call.startsWith("error:") && call.includes("aggregate")));
|
|
269
269
|
});
|
|
270
270
|
});
|
|
271
|
+
describe("exploratory evaluation", () => {
|
|
272
|
+
it("should evaluate exploratory analysis successfully", async () => {
|
|
273
|
+
const aggregatesFile = "/mock/aggregates.json";
|
|
274
|
+
const configFile = "/mock/config.json";
|
|
275
|
+
const mockFS = new MockFS({
|
|
276
|
+
[aggregatesFile]: createMockAggregatesFile(),
|
|
277
|
+
[configFile]: JSON.stringify({ metrics: ["accuracy"] }),
|
|
278
|
+
});
|
|
279
|
+
const mockLogger = new SpyLogger();
|
|
280
|
+
let exitCode;
|
|
281
|
+
const mockExit = (code) => {
|
|
282
|
+
exitCode = code;
|
|
283
|
+
throw new Error(`Exit ${code}`);
|
|
284
|
+
};
|
|
285
|
+
try {
|
|
286
|
+
await executeEvaluate(aggregatesFile, {
|
|
287
|
+
type: "exploratory",
|
|
288
|
+
config: configFile,
|
|
289
|
+
verbose: true,
|
|
290
|
+
}, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit });
|
|
291
|
+
}
|
|
292
|
+
catch (e) {
|
|
293
|
+
if (exitCode !== undefined) {
|
|
294
|
+
const errorLogs = mockLogger.calls.filter((call) => call.startsWith("error:"));
|
|
295
|
+
assert.fail(`processExit was called with code ${exitCode}. Logged errors:\n${errorLogs.join("\n")}`);
|
|
296
|
+
}
|
|
297
|
+
throw e;
|
|
298
|
+
}
|
|
299
|
+
assert.strictEqual(exitCode, undefined, "processExit should not be called on success");
|
|
300
|
+
assert.ok(mockLogger.calls.some((call) => call.startsWith("info:Evaluation complete:")));
|
|
301
|
+
});
|
|
302
|
+
it("should handle empty config for exploratory", async () => {
|
|
303
|
+
const aggregatesFile = "/mock/aggregates.json";
|
|
304
|
+
const configFile = "/mock/config.json";
|
|
305
|
+
const mockFS = new MockFS({
|
|
306
|
+
[aggregatesFile]: createMockAggregatesFile(),
|
|
307
|
+
[configFile]: JSON.stringify({}),
|
|
308
|
+
});
|
|
309
|
+
const mockLogger = new SpyLogger();
|
|
310
|
+
let exitCode;
|
|
311
|
+
const mockExit = (code) => {
|
|
312
|
+
exitCode = code;
|
|
313
|
+
throw new Error(`Exit ${code}`);
|
|
314
|
+
};
|
|
315
|
+
try {
|
|
316
|
+
await executeEvaluate(aggregatesFile, {
|
|
317
|
+
type: "exploratory",
|
|
318
|
+
config: configFile,
|
|
319
|
+
}, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit });
|
|
320
|
+
}
|
|
321
|
+
catch (e) {
|
|
322
|
+
if (exitCode !== undefined) {
|
|
323
|
+
const errorLogs = mockLogger.calls.filter((call) => call.startsWith("error:"));
|
|
324
|
+
assert.fail(`processExit was called with code ${exitCode}. Logged errors:\n${errorLogs.join("\n")}`);
|
|
325
|
+
}
|
|
326
|
+
throw e;
|
|
327
|
+
}
|
|
328
|
+
assert.strictEqual(exitCode, undefined, "processExit should not be called on success");
|
|
329
|
+
});
|
|
330
|
+
});
|
|
271
331
|
describe("robustness evaluation", () => {
|
|
272
332
|
it("should require raw results for robustness", async () => {
|
|
273
333
|
const aggregatesFile = "/mock/aggregates.json";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate-command.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/cli/evaluate-command.integration.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evaluate-command.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/cli/evaluate-command.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/examples.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Integration Tests
|
|
3
|
+
*
|
|
4
|
+
* Runs example experiments via the CLI binary to verify
|
|
5
|
+
* end-to-end functionality. Requires `pnpm build` first.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, before, after } from "node:test";
|
|
8
|
+
import { strict as assert } from "node:assert";
|
|
9
|
+
import { execFile } from "node:child_process";
|
|
10
|
+
import { mkdtemp, rm, readdir, readFile, access } from "node:fs/promises";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { tmpdir } from "node:os";
|
|
13
|
+
import { promisify } from "node:util";
|
|
14
|
+
const execFileAsync = promisify(execFile);
|
|
15
|
+
const PROJECT_ROOT = join(import.meta.dirname, "..", "..");
|
|
16
|
+
const BIN_PATH = join(PROJECT_ROOT, "bin", "ppef.mjs");
|
|
17
|
+
const EXAMPLES_DIR = join(PROJECT_ROOT, "examples");
|
|
18
|
+
/**
|
|
19
|
+
* Verify dist/ exists before running tests.
|
|
20
|
+
*/
|
|
21
|
+
async function assertDistExists() {
|
|
22
|
+
try {
|
|
23
|
+
await access(join(PROJECT_ROOT, "dist"));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw new Error("dist/ not found — run `pnpm build` before running integration tests");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
describe("Example Integration Tests", () => {
|
|
30
|
+
let tempDir;
|
|
31
|
+
before(async () => {
|
|
32
|
+
await assertDistExists();
|
|
33
|
+
tempDir = await mkdtemp(join(tmpdir(), "ppef-examples-"));
|
|
34
|
+
});
|
|
35
|
+
after(async () => {
|
|
36
|
+
if (tempDir) {
|
|
37
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
describe("string-length example", () => {
|
|
41
|
+
it("runs end-to-end and produces results", async () => {
|
|
42
|
+
const outputDir = join(tempDir, "string-length-results");
|
|
43
|
+
const configPath = join(EXAMPLES_DIR, "string-length", "experiment.json");
|
|
44
|
+
// Read the config and override output path
|
|
45
|
+
const configContent = JSON.parse(await readFile(configPath, "utf-8"));
|
|
46
|
+
configContent.output.path = outputDir;
|
|
47
|
+
// Write modified config to temp dir
|
|
48
|
+
const tempConfig = join(tempDir, "experiment.json");
|
|
49
|
+
const { writeFile: writeFileFs } = await import("node:fs/promises");
|
|
50
|
+
await writeFileFs(tempConfig, JSON.stringify(configContent));
|
|
51
|
+
// Copy example modules to temp dir so relative paths resolve
|
|
52
|
+
const { copyFile } = await import("node:fs/promises");
|
|
53
|
+
await copyFile(join(EXAMPLES_DIR, "string-length", "sut.mjs"), join(tempDir, "sut.mjs"));
|
|
54
|
+
await copyFile(join(EXAMPLES_DIR, "string-length", "case.mjs"), join(tempDir, "case.mjs"));
|
|
55
|
+
await copyFile(join(EXAMPLES_DIR, "string-length", "metrics.mjs"), join(tempDir, "metrics.mjs"));
|
|
56
|
+
const { stdout } = await execFileAsync("node", [BIN_PATH, "run", tempConfig, "--unsafe-in-process"], {
|
|
57
|
+
cwd: tempDir,
|
|
58
|
+
timeout: 30000,
|
|
59
|
+
});
|
|
60
|
+
assert.ok(stdout.length > 0, "Expected CLI output");
|
|
61
|
+
// Verify output directory exists with results
|
|
62
|
+
const files = await readdir(outputDir);
|
|
63
|
+
assert.ok(files.length > 0, `Expected result files in ${outputDir}, found none`);
|
|
64
|
+
// Find a results JSON file and verify structure
|
|
65
|
+
const jsonFiles = files.filter((f) => f.endsWith(".json"));
|
|
66
|
+
assert.ok(jsonFiles.length > 0, "Expected at least one JSON result file");
|
|
67
|
+
const resultContent = JSON.parse(await readFile(join(outputDir, jsonFiles[0]), "utf-8"));
|
|
68
|
+
// Verify results have the expected structure
|
|
69
|
+
assert.ok(resultContent.results ?? resultContent.aggregates, "Expected results or aggregates in output");
|
|
70
|
+
});
|
|
71
|
+
it("validates config successfully", async () => {
|
|
72
|
+
const configPath = join(EXAMPLES_DIR, "string-length", "experiment.json");
|
|
73
|
+
const { stdout } = await execFileAsync("node", [BIN_PATH, "validate", configPath], {
|
|
74
|
+
cwd: PROJECT_ROOT,
|
|
75
|
+
timeout: 10000,
|
|
76
|
+
});
|
|
77
|
+
assert.ok(stdout.length > 0, "Expected validation output");
|
|
78
|
+
});
|
|
79
|
+
it("dry-run produces no output files", async () => {
|
|
80
|
+
const outputDir = join(tempDir, "dry-run-results");
|
|
81
|
+
const configPath = join(EXAMPLES_DIR, "string-length", "experiment.json");
|
|
82
|
+
// Read config and override output path
|
|
83
|
+
const configContent = JSON.parse(await readFile(configPath, "utf-8"));
|
|
84
|
+
configContent.output.path = outputDir;
|
|
85
|
+
const tempConfig = join(tempDir, "dry-run-experiment.json");
|
|
86
|
+
const { writeFile: writeFileFs } = await import("node:fs/promises");
|
|
87
|
+
await writeFileFs(tempConfig, JSON.stringify(configContent));
|
|
88
|
+
// Copy modules
|
|
89
|
+
// (already copied from previous test, but be explicit)
|
|
90
|
+
const { copyFile } = await import("node:fs/promises");
|
|
91
|
+
for (const file of ["sut.mjs", "case.mjs", "metrics.mjs"]) {
|
|
92
|
+
await copyFile(join(EXAMPLES_DIR, "string-length", file), join(tempDir, file));
|
|
93
|
+
}
|
|
94
|
+
await execFileAsync("node", [BIN_PATH, "plan", tempConfig], {
|
|
95
|
+
cwd: tempDir,
|
|
96
|
+
timeout: 10000,
|
|
97
|
+
});
|
|
98
|
+
// Verify no output directory was created
|
|
99
|
+
try {
|
|
100
|
+
await access(outputDir);
|
|
101
|
+
assert.fail("Expected output directory to not exist after dry-run");
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Expected — directory should not exist
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("two-sut evaluation pipeline", () => {
|
|
109
|
+
let twoSutOutputDir;
|
|
110
|
+
let twoSutAggregatesPath;
|
|
111
|
+
it("runs two-SUT experiment end-to-end", async () => {
|
|
112
|
+
twoSutOutputDir = join(tempDir, "two-sut-results");
|
|
113
|
+
const configPath = join(EXAMPLES_DIR, "string-length", "experiment-two-suts.json");
|
|
114
|
+
// Read config and override output path
|
|
115
|
+
const configContent = JSON.parse(await readFile(configPath, "utf-8"));
|
|
116
|
+
configContent.output.path = twoSutOutputDir;
|
|
117
|
+
const tempConfig = join(tempDir, "experiment-two-suts.json");
|
|
118
|
+
const { writeFile: writeFileFs, copyFile } = await import("node:fs/promises");
|
|
119
|
+
await writeFileFs(tempConfig, JSON.stringify(configContent));
|
|
120
|
+
// Copy all required modules
|
|
121
|
+
for (const file of [
|
|
122
|
+
"sut.mjs",
|
|
123
|
+
"sut-spread.mjs",
|
|
124
|
+
"case.mjs",
|
|
125
|
+
"case-unicode.mjs",
|
|
126
|
+
"metrics.mjs",
|
|
127
|
+
]) {
|
|
128
|
+
await copyFile(join(EXAMPLES_DIR, "string-length", file), join(tempDir, file));
|
|
129
|
+
}
|
|
130
|
+
const { stdout } = await execFileAsync("node", [BIN_PATH, "run", tempConfig, "--unsafe-in-process"], {
|
|
131
|
+
cwd: tempDir,
|
|
132
|
+
timeout: 30000,
|
|
133
|
+
});
|
|
134
|
+
assert.ok(stdout.length > 0, "Expected CLI output");
|
|
135
|
+
// Find the aggregates file
|
|
136
|
+
const files = await readdir(twoSutOutputDir);
|
|
137
|
+
const aggregatesFiles = files.filter((f) => f.includes("aggregates"));
|
|
138
|
+
assert.ok(aggregatesFiles.length > 0, "Expected aggregates file");
|
|
139
|
+
twoSutAggregatesPath = join(twoSutOutputDir, aggregatesFiles[0]);
|
|
140
|
+
// Verify aggregates structure
|
|
141
|
+
const aggContent = JSON.parse(await readFile(twoSutAggregatesPath, "utf-8"));
|
|
142
|
+
assert.ok(Array.isArray(aggContent.aggregates), "Expected aggregates array in output");
|
|
143
|
+
assert.ok(aggContent.aggregates.length >= 2, "Expected at least 2 aggregated results");
|
|
144
|
+
});
|
|
145
|
+
it("evaluates claims on two-SUT results", async () => {
|
|
146
|
+
assert.ok(twoSutAggregatesPath, "Aggregates path must be set by previous test");
|
|
147
|
+
const claimsConfig = join(EXAMPLES_DIR, "string-length", "eval-claims.json");
|
|
148
|
+
const claimsOutput = join(tempDir, "claims-output.json");
|
|
149
|
+
const { stdout } = await execFileAsync("node", [
|
|
150
|
+
BIN_PATH,
|
|
151
|
+
"evaluate",
|
|
152
|
+
twoSutAggregatesPath,
|
|
153
|
+
"-t",
|
|
154
|
+
"claims",
|
|
155
|
+
"-c",
|
|
156
|
+
claimsConfig,
|
|
157
|
+
"-o",
|
|
158
|
+
claimsOutput,
|
|
159
|
+
"-v",
|
|
160
|
+
], {
|
|
161
|
+
cwd: tempDir,
|
|
162
|
+
timeout: 15000,
|
|
163
|
+
});
|
|
164
|
+
assert.ok(stdout.length > 0, "Expected CLI output");
|
|
165
|
+
const output = JSON.parse(await readFile(claimsOutput, "utf-8"));
|
|
166
|
+
assert.strictEqual(output.type, "claims", "Expected claims evaluation type");
|
|
167
|
+
});
|
|
168
|
+
it("evaluates exploratory analysis on two-SUT results", async () => {
|
|
169
|
+
assert.ok(twoSutAggregatesPath, "Aggregates path must be set by previous test");
|
|
170
|
+
const exploratoryConfig = join(EXAMPLES_DIR, "string-length", "eval-exploratory.json");
|
|
171
|
+
const exploratoryOutput = join(tempDir, "exploratory-output.json");
|
|
172
|
+
const { stdout } = await execFileAsync("node", [
|
|
173
|
+
BIN_PATH,
|
|
174
|
+
"evaluate",
|
|
175
|
+
twoSutAggregatesPath,
|
|
176
|
+
"-t",
|
|
177
|
+
"exploratory",
|
|
178
|
+
"-c",
|
|
179
|
+
exploratoryConfig,
|
|
180
|
+
"-o",
|
|
181
|
+
exploratoryOutput,
|
|
182
|
+
"-v",
|
|
183
|
+
], {
|
|
184
|
+
cwd: tempDir,
|
|
185
|
+
timeout: 15000,
|
|
186
|
+
});
|
|
187
|
+
assert.ok(stdout.length > 0, "Expected CLI output");
|
|
188
|
+
const output = JSON.parse(await readFile(exploratoryOutput, "utf-8"));
|
|
189
|
+
assert.strictEqual(output.type, "exploratory", "Expected exploratory evaluation type");
|
|
190
|
+
assert.ok(output.data.rankings, "Expected rankings in exploratory output");
|
|
191
|
+
assert.ok(Array.isArray(output.data.pairwiseComparisons), "Expected pairwiseComparisons array");
|
|
192
|
+
});
|
|
193
|
+
it("evaluates metrics on two-SUT results", async () => {
|
|
194
|
+
assert.ok(twoSutAggregatesPath, "Aggregates path must be set by previous test");
|
|
195
|
+
const metricsConfig = join(EXAMPLES_DIR, "metrics-only", "eval-config.json");
|
|
196
|
+
const metricsOutput = join(tempDir, "metrics-output.json");
|
|
197
|
+
const { stdout } = await execFileAsync("node", [
|
|
198
|
+
BIN_PATH,
|
|
199
|
+
"evaluate",
|
|
200
|
+
twoSutAggregatesPath,
|
|
201
|
+
"-t",
|
|
202
|
+
"metrics",
|
|
203
|
+
"-c",
|
|
204
|
+
metricsConfig,
|
|
205
|
+
"-o",
|
|
206
|
+
metricsOutput,
|
|
207
|
+
"-v",
|
|
208
|
+
], {
|
|
209
|
+
cwd: tempDir,
|
|
210
|
+
timeout: 15000,
|
|
211
|
+
});
|
|
212
|
+
assert.ok(stdout.length > 0, "Expected CLI output");
|
|
213
|
+
const output = JSON.parse(await readFile(metricsOutput, "utf-8"));
|
|
214
|
+
assert.strictEqual(output.type, "metrics", "Expected metrics evaluation type");
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe("invalid config", () => {
|
|
218
|
+
it("rejects malformed config with non-zero exit code", async () => {
|
|
219
|
+
const invalidConfig = join(tempDir, "invalid.json");
|
|
220
|
+
const { writeFile: writeFileFs } = await import("node:fs/promises");
|
|
221
|
+
await writeFileFs(invalidConfig, JSON.stringify({ invalid: true }));
|
|
222
|
+
try {
|
|
223
|
+
await execFileAsync("node", [BIN_PATH, invalidConfig], {
|
|
224
|
+
cwd: tempDir,
|
|
225
|
+
timeout: 10000,
|
|
226
|
+
});
|
|
227
|
+
assert.fail("Expected non-zero exit code for invalid config");
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
// execFile rejects on non-zero exit code
|
|
231
|
+
assert.ok(error, "Expected error for invalid config");
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
//# sourceMappingURL=examples.integration.test.js.map
|