|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */ |
|
5 |
|
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 = ''; |
|
40 |
|
41 |
|
42 function A(x,y) |
|
43 { |
|
44 return B(x+1,y+1); |
|
45 } |
|
46 |
|
47 function B(x,z) |
|
48 { |
|
49 return C(x+1,z+1); |
|
50 } |
|
51 |
|
52 function C(x,y) |
|
53 { |
|
54 return D(x+1,y+1); |
|
55 } |
|
56 |
|
57 function D(x,z) |
|
58 { |
|
59 try |
|
60 { |
|
61 throw new Error('meep!'); |
|
62 } |
|
63 catch (e) |
|
64 { |
|
65 return e; |
|
66 } |
|
67 } |
|
68 |
|
69 |
|
70 myErr = A(44,13); |
|
71 stackFrames = getStackFrames(myErr); |
|
72 status = inSection(1); |
|
73 actual = stackFrames[0].substring(0,1); |
|
74 expect = '@'; |
|
75 addThis(); |
|
76 |
|
77 status = inSection(2); |
|
78 actual = stackFrames[1].substring(0,2); |
|
79 expect = 'A@'; |
|
80 addThis(); |
|
81 |
|
82 status = inSection(3); |
|
83 actual = stackFrames[2].substring(0,2); |
|
84 expect = 'B@'; |
|
85 addThis(); |
|
86 |
|
87 status = inSection(4); |
|
88 actual = stackFrames[3].substring(0,2); |
|
89 expect = 'C@'; |
|
90 addThis(); |
|
91 |
|
92 status = inSection(5); |
|
93 actual = stackFrames[4].substring(0,2); |
|
94 expect = 'D@'; |
|
95 addThis(); |
|
96 |
|
97 |
|
98 |
|
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(); |
|
105 |
|
106 status = inSection(7); |
|
107 actual = stackFrames[1].substring(0,2); |
|
108 expect = 'A@'; |
|
109 addThis(); |
|
110 |
|
111 status = inSection(8); |
|
112 actual = stackFrames[2].substring(0,2); |
|
113 expect = 'B@'; |
|
114 addThis(); |
|
115 |
|
116 status = inSection(9); |
|
117 actual = stackFrames[3].substring(0,2); |
|
118 expect = 'C@'; |
|
119 addThis(); |
|
120 |
|
121 status = inSection(10); |
|
122 actual = stackFrames[4].substring(0,2); |
|
123 expect = 'D@';; |
|
124 addThis(); |
|
125 |
|
126 |
|
127 |
|
128 /* |
|
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(); |
|
137 |
|
138 status = inSection(12); |
|
139 actual = stackFrames[1].substring(0,7); |
|
140 expect = 'myErr<@'; |
|
141 addThis(); |
|
142 |
|
143 status = inSection(13); |
|
144 actual = stackFrames[2].substring(0,2); |
|
145 expect = 'A@'; |
|
146 addThis(); |
|
147 |
|
148 // etc. for the rest of the frames as above |
|
149 |
|
150 |
|
151 |
|
152 /* |
|
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(); |
|
162 |
|
163 status = inSection(15); |
|
164 actual = stackFrames[1].substring(0,10); |
|
165 expect = 'anonymous@'; |
|
166 addThis(); |
|
167 |
|
168 status = inSection(16); |
|
169 actual = stackFrames[2].substring(0,2); |
|
170 expect = 'A@'; |
|
171 addThis(); |
|
172 |
|
173 // etc. for the rest of the frames as above |
|
174 |
|
175 |
|
176 |
|
177 /* |
|
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(); |
|
187 |
|
188 |
|
189 /* |
|
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(); |
|
198 |
|
199 |
|
200 |
|
201 |
|
202 //----------------------------------------------------------------------------- |
|
203 test(); |
|
204 //----------------------------------------------------------------------------- |
|
205 |
|
206 |
|
207 |
|
208 /* |
|
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. |
|
212 * |
|
213 * Pop that useless element off before doing anything. |
|
214 * Then reverse the array, for convenience of indexing - |
|
215 */ |
|
216 function getStackFrames(err) |
|
217 { |
|
218 var arr = err.stack.split('\n'); |
|
219 arr.pop(); |
|
220 return arr.reverse(); |
|
221 } |
|
222 |
|
223 |
|
224 function addThis() |
|
225 { |
|
226 statusitems[UBound] = status; |
|
227 actualvalues[UBound] = actual; |
|
228 expectedvalues[UBound] = expect; |
|
229 UBound++; |
|
230 } |
|
231 |
|
232 |
|
233 function test() |
|
234 { |
|
235 enterFunc('test'); |
|
236 printBugNumber(BUGNUMBER); |
|
237 printStatus(summary); |
|
238 |
|
239 for (var i=0; i<UBound; i++) |
|
240 { |
|
241 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); |
|
242 } |
|
243 |
|
244 exitFunc ('test'); |
|
245 } |