Bug 1929040 - [wpt-sync] Update web-platform-tests to d4fb35c4980b6581ce0535b2dac71cb...
[gecko.git] / js / src / tests / non262 / Exceptions / errstack-001.js
blob042e357fa6e53c1648ea6e83af5a94589cc86ec7
1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 /*
7  *
8  * Date:    28 Feb 2002
9  * SUMMARY: Testing that Error.stack distinguishes between:
10  *
11  * A) top-level calls: myFunc();
12  * B) no-name function calls: function() { myFunc();} ()
13  *
14  * The stack frame for A) should begin with '@'
15  * The stack frame for B) should begin with '()'
16  *
17  * This behavior was coded by Brendan during his fix for bug 127136.
18  * See http://bugzilla.mozilla.org/show_bug.cgi?id=127136#c13
19  *
20  * Note: our function getStackFrames(err) orders the array of stack frames
21  * so that the 0th element will correspond to the highest frame, i.e. will
22  * correspond to a line in top-level code. The 1st element will correspond
23  * to the function that is called first, and so on...
24  *
25  * NOTE: At present Rhino does not have an Error.stack property. It is an
26  * ECMA extension, see http://bugzilla.mozilla.org/show_bug.cgi?id=123177
27  */
28 //-----------------------------------------------------------------------------
29 var UBound = 0;
30 var BUGNUMBER = '(none)';
31 var summary = 'Testing Error.stack';
32 var status = '';
33 var statusitems = [];
34 var actual = '';
35 var actualvalues = [];
36 var expect= '';
37 var expectedvalues = [];
38 var myErr = '';
39 var stackFrames = '';
42 function A(x,y)
44   return B(x+1,y+1);
47 function B(x,z)
49   return C(x+1,z+1);
52 function C(x,y)
54   return D(x+1,y+1);
57 function D(x,z)
59   try
60   {
61     throw new Error('meep!');
62   }
63   catch (e)
64   {
65     return e;
66   }
70 myErr = A(44,13);
71 stackFrames = getStackFrames(myErr);
72 status = inSection(1);
73 actual = stackFrames[0].substring(0,1);
74 expect = '@';
75 addThis();
77 status = inSection(2);
78 actual = stackFrames[1].substring(0,2);
79 expect = 'A@';
80 addThis();
82 status = inSection(3);
83 actual = stackFrames[2].substring(0,2);
84 expect = 'B@';
85 addThis();
87 status = inSection(4);
88 actual = stackFrames[3].substring(0,2);
89 expect = 'C@';
90 addThis();
92 status = inSection(5);
93 actual = stackFrames[4].substring(0,2);
94 expect = 'D@';
95 addThis();
99 myErr = A('44:foo','13:bar');
100 stackFrames = getStackFrames(myErr);
101 status = inSection(6);
102 actual = stackFrames[0].substring(0,1);
103 expect = '@';
104 addThis();
106 status = inSection(7);
107 actual = stackFrames[1].substring(0,2);
108 expect = 'A@';
109 addThis();
111 status = inSection(8);
112 actual = stackFrames[2].substring(0,2);
113 expect = 'B@';
114 addThis();
116 status = inSection(9);
117 actual = stackFrames[3].substring(0,2);
118 expect = 'C@';
119 addThis();
121 status = inSection(10);
122 actual = stackFrames[4].substring(0,2);
123 expect = 'D@';;
124 addThis();
129  * Make the first frame occur in a function with an empty name -
130  */
131 myErr = function() { return A(44,13); } ();
132 stackFrames = getStackFrames(myErr);
133 status = inSection(11);
134 actual = stackFrames[0].substring(0,1);
135 expect = '@';
136 addThis();
138 status = inSection(12);
139 actual = stackFrames[1].substring(0,7);
140 expect = 'myErr<@';
141 addThis();
143 status = inSection(13);
144 actual = stackFrames[2].substring(0,2);
145 expect = 'A@';
146 addThis();
148 // etc. for the rest of the frames as above
153  * Make the first frame occur in a function with name 'anonymous' -
154  */
155 var f = Function('return A(44,13);');
156 myErr = f();
157 stackFrames = getStackFrames(myErr);
158 status = inSection(14);
159 actual = stackFrames[0].substring(0,1);
160 expect = '@';
161 addThis();
163 status = inSection(15);
164 actual = stackFrames[1].substring(0,10);
165 expect = 'anonymous@';
166 addThis();
168 status = inSection(16);
169 actual = stackFrames[2].substring(0,2);
170 expect = 'A@';
171 addThis();
173 // etc. for the rest of the frames as above
178  * Make a user-defined error via the Error() function -
179  */
180 var message = 'Hi there!'; var fileName = 'file name'; var lineNumber = 0;
181 myErr = Error(message, fileName, lineNumber);
182 stackFrames = getStackFrames(myErr);
183 status = inSection(17);
184 actual = stackFrames[0].substring(0,1);
185 expect = '@';
186 addThis();
190  * Now use the |new| keyword. Re-use the same params -
191  */
192 myErr = new Error(message, fileName, lineNumber);
193 stackFrames = getStackFrames(myErr);
194 status = inSection(18);
195 actual = stackFrames[0].substring(0,1);
196 expect = '@';
197 addThis();
202 //-----------------------------------------------------------------------------
203 test();
204 //-----------------------------------------------------------------------------
209  * Split the string |err.stack| along its '\n' delimiter.
210  * As of 2002-02-28 |err.stack| ends with the delimiter, so
211  * the resulting array has an empty string as its last element.
213  * Pop that useless element off before doing anything.
214  * Then reverse the array, for convenience of indexing -
215  */
216 function getStackFrames(err)
218   var arr = err.stack.split('\n');
219   arr.pop();
220   return arr.reverse();
224 function addThis()
226   statusitems[UBound] = status;
227   actualvalues[UBound] = actual;
228   expectedvalues[UBound] = expect;
229   UBound++;
233 function test()
235   printBugNumber(BUGNUMBER);
236   printStatus(summary);
238   for (var i=0; i<UBound; i++)
239   {
240     reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
241   }