Explorar o código

Add unit tests for util functions: iife, lazy, timeout (#3791)

James Alexander hai 5 meses
pai
achega
37a6b5177e

+ 36 - 0
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()
+  })
+})

+ 50 - 0
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)
+  })
+})

+ 21 - 0
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<string>((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<string>((resolve) => {
+      setTimeout(() => resolve("slow"), 200)
+    })
+
+    await expect(withTimeout(slowPromise, 50)).rejects.toThrow("Operation timed out after 50ms")
+  })
+})