61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
import { describe, it, vi } from "@effect/vitest"
|
|
import * as StackTraceLimit from "effect/internal/stackTraceLimit"
|
|
import { assertFalse, assertTrue, strictEqual } from "./utils/assert.ts"
|
|
|
|
const getLimit = (): number | undefined => (Error as { stackTraceLimit?: number | undefined }).stackTraceLimit
|
|
|
|
describe("stackTraceLimit", () => {
|
|
describe("writable environment", () => {
|
|
it("isStackTraceLimitWritable returns true", () => {
|
|
assertTrue(StackTraceLimit.isStackTraceLimitWritable())
|
|
})
|
|
|
|
it("getStackTraceLimit reflects the current value", () => {
|
|
const prev = getLimit()
|
|
StackTraceLimit.setStackTraceLimit(5)
|
|
strictEqual(StackTraceLimit.getStackTraceLimit(), 5)
|
|
StackTraceLimit.setStackTraceLimit(prev)
|
|
})
|
|
|
|
it("setStackTraceLimit updates and restores the limit", () => {
|
|
const prev = StackTraceLimit.getStackTraceLimit()
|
|
StackTraceLimit.setStackTraceLimit(7)
|
|
strictEqual(getLimit(), 7)
|
|
StackTraceLimit.setStackTraceLimit(prev)
|
|
strictEqual(getLimit(), prev)
|
|
})
|
|
})
|
|
|
|
describe("frozen intrinsics (non-writable Error.stackTraceLimit)", () => {
|
|
// The writability check is cached at module load, so re-import the module
|
|
// after redefining the property to exercise the frozen path.
|
|
it("degrades to a no-op without throwing", async () => {
|
|
const original = Object.getOwnPropertyDescriptor(Error, "stackTraceLimit")
|
|
Object.defineProperty(Error, "stackTraceLimit", {
|
|
value: 10,
|
|
writable: false,
|
|
configurable: true,
|
|
enumerable: original?.enumerable ?? false
|
|
})
|
|
try {
|
|
vi.resetModules()
|
|
const frozen = await import("effect/internal/stackTraceLimit")
|
|
|
|
assertFalse(frozen.isStackTraceLimitWritable())
|
|
|
|
// reading still works
|
|
strictEqual(frozen.getStackTraceLimit(), 10)
|
|
|
|
// setStackTraceLimit is a silent no-op rather than throwing
|
|
frozen.setStackTraceLimit(0)
|
|
strictEqual(getLimit(), 10)
|
|
} finally {
|
|
if (original !== undefined) {
|
|
Object.defineProperty(Error, "stackTraceLimit", original)
|
|
}
|
|
vi.resetModules()
|
|
}
|
|
})
|
|
})
|
|
})
|