From 37a6b5177e793d8ea446f75cc691d4dffc3b39fd Mon Sep 17 00:00:00 2001 From: James Alexander Date: Mon, 3 Nov 2025 09:24:45 -0500 Subject: [PATCH] Add unit tests for util functions: iife, lazy, timeout (#3791) --- packages/opencode/test/util/iife.test.ts | 36 +++++++++++++++ packages/opencode/test/util/lazy.test.ts | 50 +++++++++++++++++++++ packages/opencode/test/util/timeout.test.ts | 21 +++++++++ 3 files changed, 107 insertions(+) create mode 100644 packages/opencode/test/util/iife.test.ts create mode 100644 packages/opencode/test/util/lazy.test.ts create mode 100644 packages/opencode/test/util/timeout.test.ts diff --git a/packages/opencode/test/util/iife.test.ts b/packages/opencode/test/util/iife.test.ts new file mode 100644 index 00000000..3873ddc2 --- /dev/null +++ b/packages/opencode/test/util/iife.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, test } from "bun:test" +import { iife } from "../../src/util/iife" + +describe("util.iife", () => { + test("should execute function immediately and return result", () => { + let called = false + const result = iife(() => { + called = true + return 42 + }) + + expect(called).toBe(true) + expect(result).toBe(42) + }) + + test("should work with async functions", async () => { + let called = false + const result = await iife(async () => { + called = true + return "async result" + }) + + expect(called).toBe(true) + expect(result).toBe("async result") + }) + + test("should handle functions with no return value", () => { + let called = false + const result = iife(() => { + called = true + }) + + expect(called).toBe(true) + expect(result).toBeUndefined() + }) +}) diff --git a/packages/opencode/test/util/lazy.test.ts b/packages/opencode/test/util/lazy.test.ts new file mode 100644 index 00000000..66a08b78 --- /dev/null +++ b/packages/opencode/test/util/lazy.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, test } from "bun:test" +import { lazy } from "../../src/util/lazy" + +describe("util.lazy", () => { + test("should call function only once", () => { + let callCount = 0 + const getValue = () => { + callCount++ + return "expensive value" + } + + const lazyValue = lazy(getValue) + + expect(callCount).toBe(0) + + const result1 = lazyValue() + expect(result1).toBe("expensive value") + expect(callCount).toBe(1) + + const result2 = lazyValue() + expect(result2).toBe("expensive value") + expect(callCount).toBe(1) + }) + + test("should preserve the same reference", () => { + const obj = { value: 42 } + const lazyObj = lazy(() => obj) + + const result1 = lazyObj() + const result2 = lazyObj() + + expect(result1).toBe(obj) + expect(result2).toBe(obj) + expect(result1).toBe(result2) + }) + + test("should work with different return types", () => { + const lazyString = lazy(() => "string") + const lazyNumber = lazy(() => 123) + const lazyBoolean = lazy(() => true) + const lazyNull = lazy(() => null) + const lazyUndefined = lazy(() => undefined) + + expect(lazyString()).toBe("string") + expect(lazyNumber()).toBe(123) + expect(lazyBoolean()).toBe(true) + expect(lazyNull()).toBe(null) + expect(lazyUndefined()).toBe(undefined) + }) +}) diff --git a/packages/opencode/test/util/timeout.test.ts b/packages/opencode/test/util/timeout.test.ts new file mode 100644 index 00000000..db1b0347 --- /dev/null +++ b/packages/opencode/test/util/timeout.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, test } from "bun:test" +import { withTimeout } from "../../src/util/timeout" + +describe("util.timeout", () => { + test("should resolve when promise completes before timeout", async () => { + const fastPromise = new Promise((resolve) => { + setTimeout(() => resolve("fast"), 10) + }) + + const result = await withTimeout(fastPromise, 100) + expect(result).toBe("fast") + }) + + test("should reject when promise exceeds timeout", async () => { + const slowPromise = new Promise((resolve) => { + setTimeout(() => resolve("slow"), 200) + }) + + await expect(withTimeout(slowPromise, 50)).rejects.toThrow("Operation timed out after 50ms") + }) +})