]> git.saurik.com Git - apple/javascriptcore.git/blob - tests/mozilla/js1_5/Object/regress-90596-003.js
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / tests / mozilla / js1_5 / Object / regress-90596-003.js
1 /*
2 * The contents of this file are subject to the Netscape Public
3 * License Version 1.1 (the "License"); you may not use this file
4 * except in compliance with the License. You may obtain a copy of
5 * the License at http://www.mozilla.org/NPL/
6 *
7 * Software distributed under the License is distributed on an "AS
8 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9 * implied. See the License for the specific language governing
10 * rights and limitations under the License.
11 *
12 * The Original Code is mozilla.org code.
13 *
14 * The Initial Developer of the Original Code is Netscape
15 * Communications Corporation. Portions created by Netscape are
16 * Copyright (C) 1998 Netscape Communications Corporation.
17 * All Rights Reserved.
18 *
19 * Contributor(s): pschwartau@netscape.com
20 * Date: 28 August 2001
21 *
22 * SUMMARY: A [DontEnum] prop, if overridden, should appear in for-in loops.
23 * See http://bugzilla.mozilla.org/show_bug.cgi?id=90596
24 *
25 * NOTE: some inefficiencies in the test are made for the sake of readability.
26 * For example, we quote string values like "Hi" in lines like this:
27 *
28 * actual = enumerateThis(obj);
29 * expect = '{prop:"Hi"}';
30 *
31 * But enumerateThis(obj) gets literal value Hi for obj.prop, not literal "Hi".
32 * We take care of all these details in the compactThis(), sortThis() functions.
33 * Sorting properties alphabetically is necessary for the test to work in Rhino.
34 */
35 //-----------------------------------------------------------------------------
36 var UBound = 0;
37 var bug = 90596;
38 var summary = '[DontEnum] props (if overridden) should appear in for-in loops';
39 var cnCOMMA = ',';
40 var cnCOLON = ':';
41 var cnLBRACE = '{';
42 var cnRBRACE = '}';
43 var status = '';
44 var statusitems = [];
45 var actual = '';
46 var actualvalues = [];
47 var expect= '';
48 var expectedvalues = [];
49 var obj = {};
50
51
52 status = inSection(1);
53 obj = {toString:9};
54 actual = enumerateThis(obj);
55 expect = '{toString:9}';
56 addThis();
57
58 status = inSection(2);
59 obj = {hasOwnProperty:"Hi"};
60 actual = enumerateThis(obj);
61 expect = '{hasOwnProperty:"Hi"}';
62 addThis();
63
64 status = inSection(3);
65 obj = {toString:9, hasOwnProperty:"Hi"};
66 actual = enumerateThis(obj);
67 expect = '{toString:9, hasOwnProperty:"Hi"}';
68 addThis();
69
70 status = inSection(4);
71 obj = {prop1:1, toString:9, hasOwnProperty:"Hi"};
72 actual = enumerateThis(obj);
73 expect = '{prop1:1, toString:9, hasOwnProperty:"Hi"}';
74 addThis();
75
76
77 // TRY THE SAME THING IN EVAL CODE
78 var s = '';
79
80 status = inSection(5);
81 s = 'obj = {toString:9}';
82 eval(s);
83 actual = enumerateThis(obj);
84 expect = '{toString:9}';
85 addThis();
86
87 status = inSection(6);
88 s = 'obj = {hasOwnProperty:"Hi"}';
89 eval(s);
90 actual = enumerateThis(obj);
91 expect = '{hasOwnProperty:"Hi"}';
92 addThis();
93
94 status = inSection(7);
95 s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
96 eval(s);
97 actual = enumerateThis(obj);
98 expect = '{toString:9, hasOwnProperty:"Hi"}';
99 addThis();
100
101 status = inSection(8);
102 s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
103 eval(s);
104 actual = enumerateThis(obj);
105 expect = '{prop1:1, toString:9, hasOwnProperty:"Hi"}';
106 addThis();
107
108
109 // TRY THE SAME THING IN FUNCTION CODE
110 function A()
111 {
112 status = inSection(9);
113 var s = 'obj = {toString:9}';
114 eval(s);
115 actual = enumerateThis(obj);
116 expect = '{toString:9}';
117 addThis();
118 }
119 A();
120
121 function B()
122 {
123 status = inSection(10);
124 var s = 'obj = {hasOwnProperty:"Hi"}';
125 eval(s);
126 actual = enumerateThis(obj);
127 expect = '{hasOwnProperty:"Hi"}';
128 addThis();
129 }
130 B();
131
132 function C()
133 {
134 status = inSection(11);
135 var s = 'obj = {toString:9, hasOwnProperty:"Hi"}';
136 eval(s);
137 actual = enumerateThis(obj);
138 expect = '{toString:9, hasOwnProperty:"Hi"}';
139 addThis();
140 }
141 C();
142
143 function D()
144 {
145 status = inSection(12);
146 var s = 'obj = {prop1:1, toString:9, hasOwnProperty:"Hi"}';
147 eval(s);
148 actual = enumerateThis(obj);
149 expect = '{prop1:1, toString:9, hasOwnProperty:"Hi"}';
150 addThis();
151 }
152 D();
153
154
155
156 //-----------------------------------------------------------------------------
157 test();
158 //-----------------------------------------------------------------------------
159
160
161
162 function enumerateThis(obj)
163 {
164 var arr = new Array();
165
166 for (var prop in obj)
167 {
168 arr.push(prop + cnCOLON + obj[prop]);
169 }
170
171 var ret = addBraces(String(arr));
172 return ret;
173 }
174
175
176 function addBraces(text)
177 {
178 return cnLBRACE + text + cnRBRACE;
179 }
180
181
182 /*
183 * Sort properties alphabetically so the test will work in Rhino
184 */
185 function addThis()
186 {
187 statusitems[UBound] = status;
188 actualvalues[UBound] = sortThis(actual);
189 expectedvalues[UBound] = sortThis(expect);
190 UBound++;
191 }
192
193
194 /*
195 * Takes a string of the form '{"c", "b", "a", 2}' and returns '{2,a,b,c}'
196 */
197 function sortThis(sList)
198 {
199 sList = compactThis(sList);
200 sList = stripBraces(sList);
201 var arr = sList.split(cnCOMMA);
202 arr = arr.sort();
203 var ret = String(arr);
204 ret = addBraces(ret);
205 return ret;
206 }
207
208
209 /*
210 * Strips out any whitespace or quotes from the text -
211 */
212 function compactThis(text)
213 {
214 var charCode = 0;
215 var ret = '';
216
217 for (var i=0; i<text.length; i++)
218 {
219 charCode = text.charCodeAt(i);
220
221 if (!isWhiteSpace(charCode) && !isQuote(charCode))
222 ret += text.charAt(i);
223 }
224
225 return ret;
226 }
227
228
229 function isWhiteSpace(charCode)
230 {
231 switch (charCode)
232 {
233 case (0x0009):
234 case (0x000B):
235 case (0x000C):
236 case (0x0020):
237 case (0x000A): // '\n'
238 case (0x000D): // '\r'
239 return true;
240 break;
241
242 default:
243 return false;
244 }
245 }
246
247
248 function isQuote(charCode)
249 {
250 switch (charCode)
251 {
252 case (0x0027): // single quote
253 case (0x0022): // double quote
254 return true;
255 break;
256
257 default:
258 return false;
259 }
260 }
261
262
263 /*
264 * strips off braces at beginning and end of text -
265 */
266 function stripBraces(text)
267 {
268 // remember to escape the braces...
269 var arr = text.match(/^\{(.*)\}$/);
270
271 // defend against a null match...
272 if (arr != null && arr[1] != null)
273 return arr[1];
274 return text;
275 }
276
277
278 function test()
279 {
280 enterFunc ('test');
281 printBugNumber (bug);
282 printStatus (summary);
283
284 for (var i=0; i<UBound; i++)
285 {
286 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
287 }
288
289 exitFunc ('test');
290 }