diff --git a/src/runtime.test.ts b/src/runtime.test.ts index f59c6ee1d011..01d3f15fddfa 100644 --- a/src/runtime.test.ts +++ b/src/runtime.test.ts @@ -10,7 +10,7 @@ vi.mock("../packages/terminal-core/src/restore.js", () => ({ restoreTerminalState: vi.fn(), })); -import { createNonExitingRuntime, writeRuntimeJson } from "./runtime.js"; +import { createNonExitingRuntime, ExitError, writeRuntimeJson } from "./runtime.js"; describe("createNonExitingRuntime", () => { it("returns runtime with exit function", () => { @@ -18,14 +18,25 @@ describe("createNonExitingRuntime", () => { expect(typeof runtime.exit).toBe("function"); }); - it("exit function throws error", () => { + it("exit function throws ExitError", () => { const runtime = createNonExitingRuntime(); - expect(() => runtime.exit(1)).toThrow("exit 1"); + expect(() => runtime.exit(1)).toThrow(ExitError); }); - it("exit function includes code in error message", () => { + it("ExitError includes exit code", () => { const runtime = createNonExitingRuntime(); expect(() => runtime.exit(42)).toThrow("exit 42"); + expect(() => runtime.exit(42)).toThrow(ExitError); + }); + + it("ExitError is distinguishable from generic Error", () => { + const runtime = createNonExitingRuntime(); + try { + runtime.exit(1); + } catch (err) { + expect(err instanceof ExitError).toBe(true); + expect(err instanceof Error).toBe(true); + } }); }); diff --git a/src/runtime.ts b/src/runtime.ts index 4fc9129862a6..9c17ef61d1d0 100644 --- a/src/runtime.ts +++ b/src/runtime.ts @@ -95,11 +95,22 @@ export const defaultRuntime: OutputRuntimeEnv = { }, }; +/** Error thrown by createNonExitingRuntime.exit() to signal simulated process exit. */ +export class ExitError extends Error { + constructor( + public readonly code: number, + message?: string, + ) { + super(message ?? `exit ${code}`); + this.name = "ExitError"; + } +} + export function createNonExitingRuntime(): OutputRuntimeEnv { return { ...createRuntimeIo(), exit: (code: number) => { - throw new Error(`exit ${code}`); + throw new ExitError(code); }, }; }