Skip to content

Commit 33cf4b0

Browse files
committed
Test Error.stackTraceLimit corner cases.
1 parent f0fe553 commit 33cf4b0

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
6+
*/
7+
/*
8+
* Test that getting Error.stackTraceLimit is side-effect-free.
9+
*/
10+
11+
class MyError extends Error {
12+
}
13+
14+
function recurse(n) {
15+
if (n == 0) {
16+
throw new MyError("boom");
17+
} else {
18+
return recurse(n - 1);
19+
}
20+
}
21+
22+
function countOccurrences(str, search) {
23+
var count = 0;
24+
var pos = 0;
25+
while ((pos = str.indexOf(search, pos)) >= 0) {
26+
count++;
27+
pos++;
28+
}
29+
return count;
30+
}
31+
32+
Error.stackTraceLimit = 10;
33+
assertThrows(() => recurse(20), MyError, e => assertSame(10, countOccurrences(e.stack, 'recurse')));
34+
35+
var sideEffect = false;
36+
Object.defineProperty(Error, "stackTraceLimit", {get: function() { sideEffect = true; return 5; }, configurable: true})
37+
assertThrows(() => recurse(20), MyError);
38+
assertSame(false, sideEffect);
39+
40+
Object.defineProperty(Error, "stackTraceLimit", {get: function() { throw "oh no"; }, configurable: true})
41+
assertThrows(() => recurse(20), MyError);
42+
43+
Object.defineProperty(Error, "stackTraceLimit", {get: function() { throw new Error("oh no"); }, configurable: true})
44+
assertThrows(() => recurse(20), MyError);
45+
46+
Object.defineProperty(Error, "stackTraceLimit", {value: 5, configurable: true, writable: true})
47+
assertThrows(() => recurse(20), MyError, e => assertSame(5, countOccurrences(e.stack, 'recurse')));
48+
49+
Error.stackTraceLimit = 0;
50+
assertThrows(() => recurse(20), MyError, e => {assertSame(0, countOccurrences(String(e.stack), 'recurse')); assertSame(true, 'stack' in e);});
51+
52+
// stackTraceLimit missing or not of type Number.
53+
var invalidLimit = e => {assertSame(0, countOccurrences(String(e.stack), 'recurse')); assertSame(true, 'stack' in e);};
54+
55+
delete Error.stackTraceLimit;
56+
assertSame(false, 'stackTraceLimit' in Error);
57+
assertThrows(() => recurse(20), MyError, invalidLimit);
58+
59+
Error.prototype.stackTraceLimit = 10;
60+
assertThrows(() => recurse(20), MyError, invalidLimit);
61+
62+
Error.stackTraceLimit = {valueOf() { return 10; }};
63+
assertThrows(() => recurse(20), MyError, invalidLimit);
64+
65+
Error.stackTraceLimit = "10";
66+
assertThrows(() => recurse(20), MyError, invalidLimit);
67+
68+
Error.stackTraceLimit = 10n;
69+
assertThrows(() => recurse(20), MyError, invalidLimit);
70+
71+
function assertThrows(fn, errorType, verifier) {
72+
try {
73+
fn();
74+
} catch (e) {
75+
if (errorType) {
76+
if (!(e instanceof errorType)) {
77+
throw new Error('expected ' + errorType.name + ', actual: ' + (e.name || e));
78+
}
79+
}
80+
if (verifier) {
81+
verifier(e);
82+
}
83+
return;
84+
}
85+
throw Error('should have thrown: ' + fn);
86+
}
87+
88+
function assertSame(expected, actual) {
89+
if (expected !== actual) {
90+
throw new Error('expected: [' + expected + '], actual: [' + actual +']');
91+
}
92+
}

0 commit comments

Comments
 (0)