~ubuntu-branches/ubuntu/saucy/mozjs17/saucy

« back to all changes in this revision

Viewing changes to js/src/tests/js1_5/Object/regress-90596-003.js

  • Committer: Package Import Robot
  • Author(s): Rico Tzschichholz
  • Date: 2013-05-25 12:24:23 UTC
  • Revision ID: package-import@ubuntu.com-20130525122423-zmxucrhtensw90xy
Tags: upstream-17.0.0
ImportĀ upstreamĀ versionĀ 17.0.0

Show diffs side-by-side

added added

removed removed

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