Files
reverse-engineering-anything/src/native/NativeUiInterruptionControl.test.ts
T
morluto 36d156ff05 fix(native): retain UI interruption source through final cleanup
Record caller cancellation versus the owned deadline once and share that provenance through helper execution, scenario waits and finalization. Preserve independent failures and partial reports, consolidate scenario failure handling and dispose listeners on every exit.

Fixes #5056
2026-10-19 01:41:52 +08:00

58 lines
1.8 KiB
TypeScript

import {
AnalysisCancelledError,
AnalysisTimeoutError,
} from "../domain/analysisErrorCore.js";
import { expect, it } from "vitest";
import { NativeUiInterruptionControl } from "./NativeUiInterruptionControl.js";
it("gives a pre-aborted caller priority over a pre-aborted deadline", () => {
const reason = { phase: "shared" };
const caller = new AbortController();
const deadline = new AbortController();
caller.abort(reason);
deadline.abort(reason);
const control = new NativeUiInterruptionControl(
caller.signal,
deadline.signal,
);
expect(control.error("observe_native_ui")).toBeInstanceOf(
AnalysisCancelledError,
);
expect(control.error("observe_native_ui")?.cause).toBe(reason);
control.dispose();
});
it("keeps the first observed source when caller and deadline share a reason", () => {
const reason = { phase: "shared" };
const caller = new AbortController();
const deadline = new AbortController();
const control = new NativeUiInterruptionControl(
caller.signal,
deadline.signal,
);
deadline.abort(reason);
caller.abort(reason);
expect(control.error("observe_native_ui")).toBeInstanceOf(
AnalysisTimeoutError,
);
expect(control.error("observe_native_ui")?.cause).toBe(reason);
control.dispose();
});
it("records a caller interruption before a later deadline", () => {
const reason = { phase: "shared" };
const caller = new AbortController();
const deadline = new AbortController();
const control = new NativeUiInterruptionControl(
caller.signal,
deadline.signal,
);
caller.abort(reason);
deadline.abort(reason);
expect(control.error("observe_native_ui")).toBeInstanceOf(
AnalysisCancelledError,
);
expect(control.error("observe_native_ui")?.cause).toBe(reason);
control.dispose();
});