From a1acba56486a819af00aeaebcb36f6b89ecabc05 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:42:32 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AA=20Add=20test=20for=20unexpected=20?= =?UTF-8?q?errors=20in=20evaluateDocument?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a test in `src/engine/engine.test.ts` to mock evaluation failure and verify the engine safely catches it, nulls the value, populates the error string, and logs a warning. Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com> --- src/engine/engine.test.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/engine/engine.test.ts b/src/engine/engine.test.ts index e8d8454..960cc1b 100644 --- a/src/engine/engine.test.ts +++ b/src/engine/engine.test.ts @@ -1,9 +1,11 @@ -import { describe, it, expect, beforeAll } from "vitest"; +import { describe, it, expect, beforeAll, vi } from "vitest"; import { SumEngine } from "./index"; import { qty, EvalError, XRefError } from "./types"; import type { XRefResolution, EvalCtx } from "./evaluator"; +import * as evaluator from "./evaluator"; import { evaluate } from "./evaluator"; import { formatValue } from "./formatter"; +import { logger } from "../logger"; let eng: SumEngine; @@ -451,4 +453,21 @@ describe("evaluation errors", () => { } as unknown as EvalCtx; expect(() => evaluate({ k: "xref", sheet: "Sheet", key: "key" }, ctx)).toThrowError(XRefError); }); + + it("evaluateDocument captures unexpected errors", () => { + const mockEval = vi.spyOn(evaluator, "evaluate").mockImplementation(() => { + throw new Error("Boom"); + }); + + const warnSpy = vi.spyOn(logger, "warn").mockImplementation(() => {}); + + const result = eng.evaluateDocument("1 + 1"); + + expect(result[0].error).toBe("Boom"); + expect(result[0].value).toBeNull(); + expect(warnSpy).toHaveBeenCalledWith("evaluate failed:", expect.any(Error)); + + warnSpy.mockRestore(); + mockEval.mockRestore(); + }); });