ppef 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/bin/ppef.mjs +20 -0
  2. package/dist/__tests__/framework-pipeline.integration.test.js +13 -11
  3. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  4. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  5. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/index-exports.unit.test.js +127 -0
  7. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  8. package/dist/__tests__/registry-executor.integration.test.js +12 -9
  9. package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
  10. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  11. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  12. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  13. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  14. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  15. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  16. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  17. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  18. package/dist/aggregation/aggregators.d.ts +9 -0
  19. package/dist/aggregation/aggregators.d.ts.map +1 -1
  20. package/dist/aggregation/aggregators.js +1 -1
  21. package/dist/aggregation/aggregators.js.map +1 -1
  22. package/dist/aggregation/index.d.ts +1 -1
  23. package/dist/aggregation/index.d.ts.map +1 -1
  24. package/dist/aggregation/index.js +1 -1
  25. package/dist/aggregation/index.js.map +1 -1
  26. package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
  27. package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
  28. package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
  29. package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
  30. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  31. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  32. package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
  33. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  34. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  35. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  36. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  37. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  38. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  39. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  40. package/dist/cli/__tests__/index.unit.test.js +65 -0
  41. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  42. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  43. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  44. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  45. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  46. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  47. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  48. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  49. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  50. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  51. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  52. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  53. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  54. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  55. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  56. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  57. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  58. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  59. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  61. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  62. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  63. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  64. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  65. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  66. package/dist/cli/command-deps.d.ts +125 -0
  67. package/dist/cli/command-deps.d.ts.map +1 -0
  68. package/dist/cli/command-deps.js +7 -0
  69. package/dist/cli/command-deps.js.map +1 -0
  70. package/dist/cli/commands/aggregate.d.ts +35 -0
  71. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  72. package/dist/cli/commands/aggregate.js +121 -0
  73. package/dist/cli/commands/aggregate.js.map +1 -0
  74. package/dist/cli/commands/plan.d.ts +36 -0
  75. package/dist/cli/commands/plan.d.ts.map +1 -0
  76. package/dist/cli/commands/plan.js +109 -0
  77. package/dist/cli/commands/plan.js.map +1 -0
  78. package/dist/cli/commands/run.d.ts +33 -0
  79. package/dist/cli/commands/run.d.ts.map +1 -0
  80. package/dist/cli/commands/run.js +185 -0
  81. package/dist/cli/commands/run.js.map +1 -0
  82. package/dist/cli/commands/validate.d.ts +27 -0
  83. package/dist/cli/commands/validate.d.ts.map +1 -0
  84. package/dist/cli/commands/validate.js +88 -0
  85. package/dist/cli/commands/validate.js.map +1 -0
  86. package/dist/cli/config-loader.d.ts +30 -0
  87. package/dist/cli/config-loader.d.ts.map +1 -0
  88. package/dist/cli/config-loader.js +181 -0
  89. package/dist/cli/config-loader.js.map +1 -0
  90. package/dist/cli/index.d.ts +26 -0
  91. package/dist/cli/index.d.ts.map +1 -0
  92. package/dist/cli/index.js +58 -0
  93. package/dist/cli/index.js.map +1 -0
  94. package/dist/cli/logger.d.ts +75 -0
  95. package/dist/cli/logger.d.ts.map +1 -0
  96. package/dist/cli/logger.js +131 -0
  97. package/dist/cli/logger.js.map +1 -0
  98. package/dist/cli/module-loader.d.ts +46 -0
  99. package/dist/cli/module-loader.d.ts.map +1 -0
  100. package/dist/cli/module-loader.js +116 -0
  101. package/dist/cli/module-loader.js.map +1 -0
  102. package/dist/cli/output-writer.d.ts +51 -0
  103. package/dist/cli/output-writer.d.ts.map +1 -0
  104. package/dist/cli/output-writer.js +65 -0
  105. package/dist/cli/output-writer.js.map +1 -0
  106. package/dist/cli/types.d.ts +174 -0
  107. package/dist/cli/types.d.ts.map +1 -0
  108. package/dist/cli/types.js +7 -0
  109. package/dist/cli/types.js.map +1 -0
  110. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  111. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  112. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  113. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  114. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  115. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  116. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  117. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  118. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
  119. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
  120. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
  121. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
  122. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
  123. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
  124. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +105 -1
  125. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  126. package/dist/executor/__tests__/executor.unit.test.js +69 -1
  127. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  128. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  129. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  130. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  131. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  132. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
  133. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
  134. package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
  135. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
  136. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  137. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  138. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  139. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  140. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  141. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  142. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  143. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  144. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  145. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  146. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  147. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  148. package/dist/executor/parallel-executor.d.ts +186 -0
  149. package/dist/executor/parallel-executor.d.ts.map +1 -1
  150. package/dist/executor/parallel-executor.js +218 -83
  151. package/dist/executor/parallel-executor.js.map +1 -1
  152. package/dist/executor/run-id.d.ts.map +1 -1
  153. package/dist/executor/run-id.js +8 -1
  154. package/dist/executor/run-id.js.map +1 -1
  155. package/dist/executor/worker-entry.d.ts +2 -0
  156. package/dist/executor/worker-entry.d.ts.map +1 -1
  157. package/dist/executor/worker-entry.js +29 -54
  158. package/dist/executor/worker-entry.js.map +1 -1
  159. package/dist/executor/worker-executor.d.ts +156 -0
  160. package/dist/executor/worker-executor.d.ts.map +1 -0
  161. package/dist/executor/worker-executor.js +88 -0
  162. package/dist/executor/worker-executor.js.map +1 -0
  163. package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
  164. package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
  165. package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
  166. package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
  167. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  168. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  169. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  170. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  171. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  172. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  173. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  174. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  175. package/package.json +8 -1
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Unit tests for CLI Validate Command
3
+ *
4
+ * Tests validate command functionality including:
5
+ * - Config validation
6
+ * - Error handling for invalid configs
7
+ * - Display of parsed configuration
8
+ */
9
+ import { describe, it } from "node:test";
10
+ import { strict as assert } from "node:assert";
11
+ import { writeFile } from "node:fs/promises";
12
+ import { unlink } from "node:fs/promises";
13
+ import { join } from "node:path";
14
+ import { mkdtemp, rmdir } from "node:fs/promises";
15
+ import { tmpdir } from "node:os";
16
+ import { validateConfig } from "../config-loader.js";
17
+ describe("validate command", () => {
18
+ it("should validate a valid config", async () => {
19
+ const tempDir = await mkdtemp(join(tmpdir(), "ppef-test-"));
20
+ const configPath = join(tempDir, "config.json");
21
+ const validConfig = {
22
+ experiment: {
23
+ name: "Test Experiment",
24
+ version: "1.0.0",
25
+ },
26
+ executor: {
27
+ repetitions: 10,
28
+ },
29
+ suts: [
30
+ {
31
+ id: "test-sut",
32
+ module: "./test.js",
33
+ exportName: "createSUT",
34
+ registration: {
35
+ name: "Test SUT",
36
+ version: "1.0.0",
37
+ role: "primary",
38
+ tags: [],
39
+ },
40
+ },
41
+ ],
42
+ cases: [
43
+ {
44
+ id: "test-case",
45
+ module: "./case.js",
46
+ exportName: "createCase",
47
+ },
48
+ ],
49
+ metricsExtractor: {
50
+ module: "./metrics.js",
51
+ exportName: "extractMetrics",
52
+ },
53
+ };
54
+ await writeFile(configPath, JSON.stringify(validConfig), "utf-8");
55
+ const result = validateConfig(validConfig);
56
+ assert.strictEqual(result.valid, true);
57
+ assert.strictEqual(result.errors.length, 0);
58
+ await unlink(configPath);
59
+ await rmdir(tempDir);
60
+ });
61
+ it("should detect missing experiment name", () => {
62
+ const invalidConfig = {
63
+ experiment: {},
64
+ executor: {},
65
+ suts: [],
66
+ cases: [],
67
+ metricsExtractor: {
68
+ module: "./metrics.js",
69
+ exportName: "extractMetrics",
70
+ },
71
+ };
72
+ const result = validateConfig(invalidConfig);
73
+ assert.strictEqual(result.valid, false);
74
+ assert.ok(result.errors.some((e) => e.includes("experiment.name is required")));
75
+ });
76
+ it("should detect invalid role values", () => {
77
+ const invalidConfig = {
78
+ experiment: {
79
+ name: "Test",
80
+ },
81
+ executor: {},
82
+ suts: [
83
+ {
84
+ id: "test-sut",
85
+ module: "./test.js",
86
+ exportName: "createSUT",
87
+ registration: {
88
+ name: "Test SUT",
89
+ version: "1.0.0",
90
+ role: "invalid",
91
+ tags: [],
92
+ },
93
+ },
94
+ ],
95
+ cases: [],
96
+ metricsExtractor: {
97
+ module: "./metrics.js",
98
+ exportName: "extractMetrics",
99
+ },
100
+ };
101
+ const result = validateConfig(invalidConfig);
102
+ assert.strictEqual(result.valid, false);
103
+ assert.ok(result.errors.some((e) => e.includes("role must be one of")));
104
+ });
105
+ it("should detect duplicate SUT IDs", () => {
106
+ const invalidConfig = {
107
+ experiment: {
108
+ name: "Test",
109
+ },
110
+ executor: {},
111
+ suts: [
112
+ {
113
+ id: "duplicate-sut",
114
+ module: "./test1.js",
115
+ exportName: "createSUT",
116
+ registration: {
117
+ name: "Test SUT 1",
118
+ version: "1.0.0",
119
+ role: "primary",
120
+ tags: [],
121
+ },
122
+ },
123
+ {
124
+ id: "duplicate-sut",
125
+ module: "./test2.js",
126
+ exportName: "createSUT",
127
+ registration: {
128
+ name: "Test SUT 2",
129
+ version: "1.0.0",
130
+ role: "baseline",
131
+ tags: [],
132
+ },
133
+ },
134
+ ],
135
+ cases: [],
136
+ metricsExtractor: {
137
+ module: "./metrics.js",
138
+ exportName: "extractMetrics",
139
+ },
140
+ };
141
+ const result = validateConfig(invalidConfig);
142
+ assert.strictEqual(result.valid, false);
143
+ assert.ok(result.errors.some((e) => e.includes("Duplicate SUT ID")));
144
+ });
145
+ it("should detect negative repetitions", () => {
146
+ const invalidConfig = {
147
+ experiment: {
148
+ name: "Test",
149
+ },
150
+ executor: {
151
+ repetitions: -1,
152
+ },
153
+ suts: [],
154
+ cases: [],
155
+ metricsExtractor: {
156
+ module: "./metrics.js",
157
+ exportName: "extractMetrics",
158
+ },
159
+ };
160
+ const result = validateConfig(invalidConfig);
161
+ assert.strictEqual(result.valid, false);
162
+ assert.ok(result.errors.some((e) => e.includes("repetitions must be at least 1")));
163
+ });
164
+ it("should validate required SUT fields", () => {
165
+ const invalidConfig = {
166
+ experiment: {
167
+ name: "Test",
168
+ },
169
+ executor: {},
170
+ suts: [
171
+ {
172
+ id: "test-sut",
173
+ module: "./test.js",
174
+ exportName: "createSUT",
175
+ registration: {
176
+ name: "Test SUT",
177
+ // Missing version
178
+ role: "primary",
179
+ tags: [],
180
+ },
181
+ },
182
+ ],
183
+ cases: [],
184
+ metricsExtractor: {
185
+ module: "./metrics.js",
186
+ exportName: "extractMetrics",
187
+ },
188
+ };
189
+ const result = validateConfig(invalidConfig);
190
+ assert.strictEqual(result.valid, false);
191
+ assert.ok(result.errors.some((e) => e.includes("registration.version") && e.includes("required")));
192
+ });
193
+ it("should detect missing required case fields", () => {
194
+ const invalidConfig = {
195
+ experiment: {
196
+ name: "Test",
197
+ },
198
+ executor: {},
199
+ suts: [],
200
+ cases: [
201
+ {
202
+ // Missing id
203
+ module: "./case.js",
204
+ exportName: "createCase",
205
+ },
206
+ ],
207
+ metricsExtractor: {
208
+ module: "./metrics.js",
209
+ exportName: "extractMetrics",
210
+ },
211
+ };
212
+ const result = validateConfig(invalidConfig);
213
+ assert.strictEqual(result.valid, false);
214
+ assert.ok(result.errors.some((e) => e.includes("id") && e.includes("required")));
215
+ });
216
+ });
217
+ //# sourceMappingURL=commands.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.unit.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/commands.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Unit tests for CLI Index
3
+ *
4
+ * Tests CLI entry point functionality including:
5
+ * - createCliProgram function
6
+ * - command registration
7
+ * - program configuration
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=index.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.unit.test.d.ts","sourceRoot":"","sources":["../../../src/cli/__tests__/index.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Unit tests for CLI Index
3
+ *
4
+ * Tests CLI entry point functionality including:
5
+ * - createCliProgram function
6
+ * - command registration
7
+ * - program configuration
8
+ */
9
+ import { describe, it } from "node:test";
10
+ import { strict as assert } from "node:assert";
11
+ import { Command } from "commander";
12
+ import { createCliProgram } from "../index.js";
13
+ describe("CLI index", () => {
14
+ describe("createCliProgram", () => {
15
+ it("should create and configure commander program", () => {
16
+ const program = createCliProgram();
17
+ assert.ok(program instanceof Command);
18
+ assert.strictEqual(program.name(), "ppef");
19
+ });
20
+ it("should register all commands", () => {
21
+ const program = createCliProgram();
22
+ const commandNames = program.commands.map((cmd) => cmd.name());
23
+ assert.ok(commandNames.includes("run"));
24
+ assert.ok(commandNames.includes("validate"));
25
+ assert.ok(commandNames.includes("plan"));
26
+ assert.ok(commandNames.includes("aggregate"));
27
+ });
28
+ it("should have correct program description", () => {
29
+ const program = createCliProgram();
30
+ // The program should have a description
31
+ assert.ok(program.description());
32
+ });
33
+ });
34
+ describe("command options", () => {
35
+ it("run command should have expected options", () => {
36
+ const program = createCliProgram();
37
+ const runCommand = program.commands.find((cmd) => cmd.name() === "run");
38
+ assert.ok(runCommand, "run command should be registered");
39
+ const options = runCommand.options;
40
+ // Check for expected options (Commander returns flags like --output, -f, etc.)
41
+ const optionFlags = options.map((opt) => {
42
+ const option = opt;
43
+ return option.long ?? option.short ?? "";
44
+ });
45
+ assert.ok(optionFlags.some((flag) => flag.includes("output")));
46
+ assert.ok(optionFlags.some((flag) => flag.includes("format") || flag.includes("f")));
47
+ });
48
+ it("validate command should be registered", () => {
49
+ const program = createCliProgram();
50
+ const validateCommand = program.commands.find((cmd) => cmd.name() === "validate");
51
+ assert.ok(validateCommand, "validate command should be registered");
52
+ });
53
+ it("plan command should be registered", () => {
54
+ const program = createCliProgram();
55
+ const planCommand = program.commands.find((cmd) => cmd.name() === "plan");
56
+ assert.ok(planCommand, "plan command should be registered");
57
+ });
58
+ it("aggregate command should be registered", () => {
59
+ const program = createCliProgram();
60
+ const aggregateCommand = program.commands.find((cmd) => cmd.name() === "aggregate");
61
+ assert.ok(aggregateCommand, "aggregate command should be registered");
62
+ });
63
+ });
64
+ });
65
+ //# sourceMappingURL=index.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.unit.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/index.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Unit tests for CLI Logger
3
+ *
4
+ * Tests logger functionality including:
5
+ * - Header and subheader output
6
+ * - Info, error, and warning messages
7
+ * - Progress reporter integration
8
+ * - Verbosity control
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=logger.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.unit.test.d.ts","sourceRoot":"","sources":["../../../src/cli/__tests__/logger.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Unit tests for CLI Logger
3
+ *
4
+ * Tests logger functionality including:
5
+ * - Header and subheader output
6
+ * - Info, error, and warning messages
7
+ * - Progress reporter integration
8
+ * - Verbosity control
9
+ */
10
+ import { describe, it, mock } from "node:test";
11
+ import { strict as assert } from "node:assert";
12
+ import { CliLogger, createLogger } from "../logger.js";
13
+ describe("CliLogger", () => {
14
+ describe("constructor", () => {
15
+ it("should create logger with default options", () => {
16
+ const logger = new CliLogger({});
17
+ assert.ok(logger instanceof CliLogger);
18
+ });
19
+ it("should create logger with verbose enabled", () => {
20
+ const logger = new CliLogger({ verbose: true });
21
+ assert.ok(logger instanceof CliLogger);
22
+ });
23
+ it("should create logger with quiet mode", () => {
24
+ const logger = new CliLogger({ quiet: true });
25
+ assert.ok(logger instanceof CliLogger);
26
+ });
27
+ });
28
+ describe("header", () => {
29
+ it("should print header with default styling", () => {
30
+ const logger = new CliLogger({});
31
+ const consoleSpy = mock.method(console, "log");
32
+ logger.header("Test Header");
33
+ assert.strictEqual(consoleSpy.mock.calls.length, 2);
34
+ assert.strictEqual(consoleSpy.mock.calls[0].arguments[0], "");
35
+ assert.strictEqual(consoleSpy.mock.calls[1].arguments[0], "=== Test Header ===");
36
+ consoleSpy.mock.restore();
37
+ });
38
+ it("should suppress header in quiet mode", () => {
39
+ const logger = new CliLogger({ quiet: true });
40
+ const consoleSpy = mock.method(console, "log");
41
+ logger.header("Test Header");
42
+ assert.strictEqual(consoleSpy.mock.calls.length, 0);
43
+ consoleSpy.mock.restore();
44
+ });
45
+ });
46
+ describe("subheader", () => {
47
+ it("should print subheader with styling", () => {
48
+ const logger = new CliLogger({});
49
+ const consoleSpy = mock.method(console, "log");
50
+ logger.subheader("Test Subheader");
51
+ assert.strictEqual(consoleSpy.mock.calls.length, 1);
52
+ assert.strictEqual(consoleSpy.mock.calls[0].arguments[0], "--- Test Subheader");
53
+ consoleSpy.mock.restore();
54
+ });
55
+ it("should suppress subheader in quiet mode", () => {
56
+ const logger = new CliLogger({ quiet: true });
57
+ const consoleSpy = mock.method(console, "log");
58
+ logger.subheader("Test Subheader");
59
+ assert.strictEqual(consoleSpy.mock.calls.length, 0);
60
+ consoleSpy.mock.restore();
61
+ });
62
+ });
63
+ describe("info", () => {
64
+ it("should print info message", () => {
65
+ const logger = new CliLogger({});
66
+ const consoleSpy = mock.method(console, "log");
67
+ logger.info("Test info");
68
+ assert.strictEqual(consoleSpy.mock.calls.length, 1);
69
+ assert.strictEqual(consoleSpy.mock.calls[0].arguments[0], "Test info");
70
+ consoleSpy.mock.restore();
71
+ });
72
+ it("should suppress info in quiet mode", () => {
73
+ const logger = new CliLogger({ quiet: true });
74
+ const consoleSpy = mock.method(console, "log");
75
+ logger.info("Test info");
76
+ assert.strictEqual(consoleSpy.mock.calls.length, 0);
77
+ consoleSpy.mock.restore();
78
+ });
79
+ });
80
+ describe("debug", () => {
81
+ it("should not print debug messages when verbose is false", () => {
82
+ const logger = new CliLogger({ verbose: false });
83
+ const consoleSpy = mock.method(console, "log");
84
+ logger.debug("Debug message");
85
+ assert.strictEqual(consoleSpy.mock.calls.length, 0);
86
+ consoleSpy.mock.restore();
87
+ });
88
+ it("should print debug messages when verbose is true", () => {
89
+ const logger = new CliLogger({ verbose: true });
90
+ const consoleSpy = mock.method(console, "log");
91
+ logger.debug("Debug message");
92
+ assert.strictEqual(consoleSpy.mock.calls.length, 1);
93
+ assert.strictEqual(consoleSpy.mock.calls[0].arguments[0], "[DEBUG] Debug message");
94
+ consoleSpy.mock.restore();
95
+ });
96
+ });
97
+ describe("error", () => {
98
+ it("should print error message", () => {
99
+ const logger = new CliLogger({});
100
+ const consoleSpy = mock.method(console, "log");
101
+ logger.error("Test error");
102
+ assert.strictEqual(consoleSpy.mock.calls.length, 1);
103
+ assert.strictEqual(consoleSpy.mock.calls[0].arguments[0], "Error: Test error");
104
+ consoleSpy.mock.restore();
105
+ });
106
+ it("should suppress errors in quiet mode", () => {
107
+ const logger = new CliLogger({ quiet: true });
108
+ const consoleSpy = mock.method(console, "log");
109
+ logger.error("Test error");
110
+ assert.strictEqual(consoleSpy.mock.calls.length, 0);
111
+ consoleSpy.mock.restore();
112
+ });
113
+ });
114
+ describe("warn", () => {
115
+ it("should print warning message", () => {
116
+ const logger = new CliLogger({});
117
+ const consoleSpy = mock.method(console, "log");
118
+ logger.warn("Test warning");
119
+ assert.strictEqual(consoleSpy.mock.calls.length, 1);
120
+ assert.strictEqual(consoleSpy.mock.calls[0].arguments[0], "Warning: Test warning");
121
+ consoleSpy.mock.restore();
122
+ });
123
+ });
124
+ describe("progress", () => {
125
+ it("should handle progress updates", () => {
126
+ const logger = new CliLogger({});
127
+ logger.setProgress(true);
128
+ // Just ensure it doesn't throw
129
+ logger.progress({
130
+ completed: 5,
131
+ total: 10,
132
+ failed: 0,
133
+ currentSut: "test-sut",
134
+ currentCase: "test-case",
135
+ currentRepetition: 0,
136
+ elapsedMs: 1000,
137
+ });
138
+ });
139
+ it("should not show progress when disabled", () => {
140
+ const logger = new CliLogger({});
141
+ logger.setProgress(false);
142
+ const writeSpy = mock.method(process.stdout, "write");
143
+ logger.progress({
144
+ completed: 5,
145
+ total: 10,
146
+ failed: 0,
147
+ elapsedMs: 1000,
148
+ });
149
+ // Should not call write when progress is disabled
150
+ const calls = writeSpy.mock.calls;
151
+ assert.strictEqual(calls.length, 0);
152
+ writeSpy.mock.restore();
153
+ });
154
+ });
155
+ describe("createProgressReporter", () => {
156
+ it("should create progress reporter function", () => {
157
+ const logger = new CliLogger({});
158
+ const reporter = logger.createProgressReporter();
159
+ assert.strictEqual(typeof reporter, "function");
160
+ // Ensure it doesn't throw
161
+ reporter({
162
+ completed: 1,
163
+ total: 10,
164
+ failed: 0,
165
+ elapsedMs: 100,
166
+ });
167
+ });
168
+ });
169
+ });
170
+ describe("createLogger", () => {
171
+ it("should create default logger", () => {
172
+ const logger = createLogger();
173
+ assert.ok(logger instanceof CliLogger);
174
+ });
175
+ it("should create logger with options", () => {
176
+ const logger = createLogger({ verbose: true });
177
+ assert.ok(logger instanceof CliLogger);
178
+ });
179
+ });
180
+ //# sourceMappingURL=logger.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.unit.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/logger.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Unit tests for CLI Module Loader
3
+ *
4
+ * Tests module loading functionality including:
5
+ * - Loading SUT factories
6
+ * - Loading case definitions
7
+ * - Loading metrics extractors
8
+ * - Error handling for invalid modules
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=module-loader.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-loader.unit.test.d.ts","sourceRoot":"","sources":["../../../src/cli/__tests__/module-loader.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}