|
1 | 1 | import assert from 'node:assert/strict'; |
2 | 2 | import { test } from 'vitest'; |
| 3 | +import { AppError } from '@agent-device/kernel/errors'; |
3 | 4 | import type { ReplaySuiteResult } from '@agent-device/contracts/replay'; |
4 | 5 | import { |
5 | 6 | getReplayTestReporterExitCode, |
@@ -252,3 +253,30 @@ test('reporter exit codes can raise but never lower the suite exit code', () => |
252 | 253 | 1, |
253 | 254 | ); |
254 | 255 | }); |
| 256 | + |
| 257 | +test.each([0, 1, 3, 255, undefined])('preserves valid reporter exit code %s', (code) => { |
| 258 | + const reporters: ReplayTestReporter[] = [{ name: 'valid', getExitCode: () => code }]; |
| 259 | + assert.equal(getReplayTestReporterExitCode(reporters, suite()), code ?? 0); |
| 260 | + assert.equal(getReplayTestReporterExitCode(reporters, suite(1)), Math.max(1, code ?? 0)); |
| 261 | +}); |
| 262 | + |
| 263 | +test.each([-1, 0.5, 256, 512, Number.NaN, Infinity, -Infinity, '3', null])( |
| 264 | + 'rejects invalid reporter exit code %s instead of coercing or wrapping it', |
| 265 | + (code) => { |
| 266 | + const reporters: ReplayTestReporter[] = [ |
| 267 | + { name: 'valid', getExitCode: () => 3 }, |
| 268 | + { name: 'invalid', getExitCode: () => code as number }, |
| 269 | + ]; |
| 270 | + for (const value of [suite(), suite(1)]) { |
| 271 | + assert.throws( |
| 272 | + () => getReplayTestReporterExitCode(reporters, value), |
| 273 | + (error: unknown) => |
| 274 | + error instanceof AppError && |
| 275 | + error.code === 'INVALID_ARGS' && |
| 276 | + error.message.includes('invalid') && |
| 277 | + error.message.includes('getExitCode') && |
| 278 | + error.message.includes('0 to 255'), |
| 279 | + ); |
| 280 | + } |
| 281 | + }, |
| 282 | +); |
0 commit comments