1import { describe, it, vi } from "@effect/vitest"
2import * as StackTraceLimit from "effect/internal/stackTraceLimit"
3import { assertFalse, assertTrue, strictEqual } from "./utils/assert.ts"
4
5const getLimit = (): number | undefined => (Error as { stackTraceLimit?: number | undefined }).stackTraceLimit
6
7describe("stackTraceLimit", () => {
8 describe("writable environment", () => {
9 it("isStackTraceLimitWritable returns true", () => {
10 assertTrue(StackTraceLimit.isStackTraceLimitWritable())
11 })
12
13 it("getStackTraceLimit reflects the current value", () => {
14 const prev = getLimit()
15 StackTraceLimit.setStackTraceLimit(5)
16 strictEqual(StackTraceLimit.getStackTraceLimit(), 5)
17 StackTraceLimit.setStackTraceLimit(prev)
18 })
19
20 it("setStackTraceLimit updates and restores the limit", () => {
21 const prev = StackTraceLimit.getStackTraceLimit()
22 StackTraceLimit.setStackTraceLimit(7)
23 strictEqual(getLimit(), 7)
24 StackTraceLimit.setStackTraceLimit(prev)
25 strictEqual(getLimit(), prev)
26 })
27 })
28
29 describe("frozen intrinsics (non-writable Error.stackTraceLimit)", () => {
30 // The writability check is cached at module load, so re-import the module
31 // after redefining the property to exercise the frozen path.
32 it("degrades to a no-op without throwing", async () => {
33 const original = Object.getOwnPropertyDescriptor(Error, "stackTraceLimit")
34 Object.defineProperty(Error, "stackTraceLimit", {
35 value: 10,
36 writable: false,
37 configurable: true,
38 enumerable: original?.enumerable ?? false
39 })
40 try {
41 vi.resetModules()
42 const frozen = await import("effect/internal/stackTraceLimit")
43
44 assertFalse(frozen.isStackTraceLimitWritable())
45
46 // reading still works
47 strictEqual(frozen.getStackTraceLimit(), 10)
48
49 // setStackTraceLimit is a silent no-op rather than throwing
50 frozen.setStackTraceLimit(0)
51 strictEqual(getLimit(), 10)
52 } finally {
53 if (original !== undefined) {
54 Object.defineProperty(Error, "stackTraceLimit", original)
55 }
56 vi.resetModules()
57 }
58 })
59 })
60})