From 4e330d6e8196ac426d919aaf10e3af97e8dd50f8 Mon Sep 17 00:00:00 2001 From: Jiun Bae Date: Thu, 5 Mar 2026 15:07:46 +0900 Subject: [PATCH 1/2] [OAC] Add tests for claude-counter.ts Automated contribution by OAC. --- tests/budget/claude-counter.test.ts | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tests/budget/claude-counter.test.ts b/tests/budget/claude-counter.test.ts index a3dd558..1a6d5b2 100644 --- a/tests/budget/claude-counter.test.ts +++ b/tests/budget/claude-counter.test.ts @@ -97,4 +97,56 @@ describe("ClaudeTokenCounter.reset", () => { counter.reset(); expect(tiktokenMocks.free).not.toHaveBeenCalled(); }); + + it("consecutive resets only free the encoder once", async () => { + const { ClaudeTokenCounter } = await loadClaudeCounterModule(); + const counter = new ClaudeTokenCounter(); + + counter.countTokens("init"); + counter.reset(); + counter.reset(); + + expect(tiktokenMocks.free).toHaveBeenCalledTimes(1); + }); + + it("reset on one instance clears the shared module-level encoder for all instances", async () => { + const { ClaudeTokenCounter } = await loadClaudeCounterModule(); + const a = new ClaudeTokenCounter(); + const b = new ClaudeTokenCounter(); + + a.countTokens("setup"); + expect(tiktokenMocks.getEncoding).toHaveBeenCalledTimes(1); + + b.reset(); + a.countTokens("after reset by b"); + expect(tiktokenMocks.getEncoding).toHaveBeenCalledTimes(2); + }); +}); + +describe("ClaudeTokenCounter.countTokens – edge cases", () => { + it("handles whitespace-only input", async () => { + const { ClaudeTokenCounter } = await loadClaudeCounterModule(); + const counter = new ClaudeTokenCounter(); + + expect(counter.countTokens(" ")).toBe(3); + expect(tiktokenMocks.encode).toHaveBeenCalledWith(" "); + }); + + it("handles multi-line input", async () => { + const { ClaudeTokenCounter } = await loadClaudeCounterModule(); + const counter = new ClaudeTokenCounter(); + const multiLine = "line1\nline2\nline3"; + + expect(counter.countTokens(multiLine)).toBe(multiLine.length); + expect(tiktokenMocks.encode).toHaveBeenCalledWith(multiLine); + }); + + it("handles unicode input", async () => { + const { ClaudeTokenCounter } = await loadClaudeCounterModule(); + const counter = new ClaudeTokenCounter(); + const unicode = "안녕하세요"; + + expect(counter.countTokens(unicode)).toBe(unicode.length); + expect(tiktokenMocks.encode).toHaveBeenCalledWith(unicode); + }); }); From 508727a6b750f6231063858f4bf8b23a65ea9f80 Mon Sep 17 00:00:00 2001 From: Jiun Bae Date: Thu, 5 Mar 2026 15:07:48 +0900 Subject: [PATCH 2/2] [OAC] Add contribution metadata --- .../2026-03-05-0607-b74d99076a3edde2.json | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .oac/contributions/2026-03-05-0607-b74d99076a3edde2.json diff --git a/.oac/contributions/2026-03-05-0607-b74d99076a3edde2.json b/.oac/contributions/2026-03-05-0607-b74d99076a3edde2.json new file mode 100644 index 0000000..7b2c06c --- /dev/null +++ b/.oac/contributions/2026-03-05-0607-b74d99076a3edde2.json @@ -0,0 +1,20 @@ +{ + "version": "1.0", + "runId": "e9c717f6-ebac-4f44-97b3-55ff1d9a41cf", + "timestamp": "2026-03-05T06:07:48.943Z", + "contributor": "jiun", + "task": { + "id": "b74d99076a3edde2", + "title": "Add tests for claude-counter.ts", + "source": "test-gap", + "complexity": "simple" + }, + "execution": { + "success": true, + "tokensUsed": 233243, + "duration": 68.459, + "filesChanged": [ + "tests/budget/claude-counter.test.ts" + ] + } +}