























@@ -1,6 +1,7 @@
11import { describe, expect, it } from "vitest";
22import {
33createPostCompactionLoopGuard,
4+PostCompactionLoopPersistedError,
45type PostCompactionLoopGuard,
56} from "./post-compaction-loop-guard.js";
67@@ -111,3 +112,37 @@ describe("createPostCompactionLoopGuard", () => {
111112expect(guard.snapshot().remainingAttempts).toBe(0);
112113});
113114});
115+116+describe("PostCompactionLoopPersistedError", () => {
117+it("captures the detector, count, toolName, and message", () => {
118+const err = new PostCompactionLoopPersistedError("loop persisted", {
119+detector: "compaction_loop_persisted",
120+count: 4,
121+toolName: "gateway",
122+});
123+expect(err).toBeInstanceOf(Error);
124+expect(err).toBeInstanceOf(PostCompactionLoopPersistedError);
125+expect(err.name).toBe("PostCompactionLoopPersistedError");
126+expect(err.message).toBe("loop persisted");
127+expect(err.detector).toBe("compaction_loop_persisted");
128+expect(err.count).toBe(4);
129+expect(err.toolName).toBe("gateway");
130+});
131+132+it("can be built from a guard verdict via fromVerdict", () => {
133+const guard = createPostCompactionLoopGuard({ windowSize: 2 });
134+guard.armPostCompaction();
135+guard.observe(callOutcome("read", { path: "/x" }, "r1"));
136+const verdict = guard.observe(callOutcome("read", { path: "/x" }, "r1"));
137+expect(verdict.shouldAbort).toBe(true);
138+if (!verdict.shouldAbort) {
139+throw new Error("verdict was expected to abort");
140+}
141+const err = PostCompactionLoopPersistedError.fromVerdict(verdict);
142+expect(err).toBeInstanceOf(PostCompactionLoopPersistedError);
143+expect(err.detector).toBe(verdict.detector);
144+expect(err.count).toBe(verdict.count);
145+expect(err.toolName).toBe(verdict.toolName);
146+expect(err.message).toBe(verdict.message);
147+});
148+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。