mirror of
https://github.com/aljazceru/opencode.git
synced 2026-01-03 07:55:05 +01:00
Add unit tests for util functions: iife, lazy, timeout (#3791)
This commit is contained in:
36
packages/opencode/test/util/iife.test.ts
Normal file
36
packages/opencode/test/util/iife.test.ts
Normal file
@@ -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
packages/opencode/test/util/lazy.test.ts
Normal file
50
packages/opencode/test/util/lazy.test.ts
Normal file
@@ -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
packages/opencode/test/util/timeout.test.ts
Normal file
21
packages/opencode/test/util/timeout.test.ts
Normal file
@@ -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")
|
||||||
|
})
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user