1/* ***** BEGIN LICENSE BLOCK *****
2* Version: NPL 1.1/GPL 2.0/LGPL 2.1
3*
4* The contents of this file are subject to the Netscape Public License
5* Version 1.1 (the "License"); you may not use this file except in
6* compliance with the License. You may obtain a copy of the License at
7* http://www.mozilla.org/NPL/
8*
9* Software distributed under the License is distributed on an "AS IS" basis,
10* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11* for the specific language governing rights and limitations under the
12* License.
13*
14* The Original Code is JavaScript Engine testing utilities.
15*
16* The Initial Developer of the Original Code is Netscape Communications Corp.
17* Portions created by the Initial Developer are Copyright (C) 2002
18* the Initial Developer. All Rights Reserved.
19*
20* Contributor(s): pschwartau@netscape.com
21*
22* Alternatively, the contents of this file may be used under the terms of
23* either the GNU General Public License Version 2 or later (the "GPL"), or
24* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
25* in which case the provisions of the GPL or the LGPL are applicable instead
26* of those above. If you wish to allow use of your version of this file only
27* under the terms of either the GPL or the LGPL, and not to allow others to
28* use your version of this file under the terms of the NPL, indicate your
29* decision by deleting the provisions above and replace them with the notice
30* and other provisions required by the GPL or the LGPL. If you do not delete
31* the provisions above, a recipient may use your version of this file under
32* the terms of any one of the NPL, the GPL or the LGPL.
33*
34* ***** END LICENSE BLOCK *****
35*
36*
37* Date:    10 Apr 2002
38* Revised: 14 July 2002
39*
40* SUMMARY: JS should NOT error on |for(i in undefined)|, |for(i in null)|
41*
42* ECMA-262 3rd Edition Final spec says such statements SHOULD error. See:
43*
44*               Section 12.6.4  The for-in Statement
45*               Section 9.9     ToObject
46*
47*
48* But SpiderMonkey has decided NOT to follow this; it's a bug in the spec.
49* See http://bugzilla.mozilla.org/show_bug.cgi?id=131348
50*
51* Update: Rhino has also decided not to follow the spec on this
52* See http://bugzilla.mozilla.org/show_bug.cgi?id=136893
53*/
54//-----------------------------------------------------------------------------
55var UBound = 0;
56var bug = 131348;
57var summary = 'JS should not error on |for(i in undefined)|, |for(i in null)|';
58var TEST_PASSED = 'No error';
59var TEST_FAILED = 'An error was generated!!!';
60var status = '';
61var statusitems = [];
62var actual = '';
63var actualvalues = [];
64var expect= '';
65var expectedvalues = [];
66
67
68
69status = inSection(1);
70expect = TEST_PASSED;
71actual = TEST_PASSED;
72try
73{
74  for (var i in undefined)
75  {
76    print(i);
77  }
78}
79catch(e)
80{
81  actual = TEST_FAILED;
82}
83addThis();
84
85
86
87status = inSection(2);
88expect = TEST_PASSED;
89actual = TEST_PASSED;
90try
91{
92  for (var i in null)
93  {
94    print(i);
95  }
96}
97catch(e)
98{
99  actual = TEST_FAILED;
100}
101addThis();
102
103
104
105status = inSection(3);
106expect = TEST_PASSED;
107actual = TEST_PASSED;
108/*
109 * Variable names that cannot be looked up generate ReferenceErrors; however,
110 * property names like obj.ZZZ that cannot be looked up are set to |undefined|
111 *
112 * Therefore, this should indirectly test | for (var i in undefined) |
113 */
114try
115{
116  for (var i in this.ZZZ)
117  {
118    print(i);
119  }
120}
121catch(e)
122{
123  actual = TEST_FAILED;
124}
125addThis();
126
127
128
129status = inSection(4);
130expect = TEST_PASSED;
131actual = TEST_PASSED;
132/*
133 * The result of an unsuccessful regexp match is the null value
134 * Therefore, this should indirectly test | for (var i in null) |
135 */
136try
137{
138  for (var i in 'bbb'.match(/aaa/))
139  {
140    print(i);
141  }
142}
143catch(e)
144{
145  actual = TEST_FAILED;
146}
147addThis();
148
149
150
151
152//-----------------------------------------------------------------------------
153test();
154//-----------------------------------------------------------------------------
155
156
157
158function addThis()
159{
160  statusitems[UBound] = status;
161  actualvalues[UBound] = actual;
162  expectedvalues[UBound] = expect;
163  UBound++;
164}
165
166
167function test()
168{
169  enterFunc('test');
170  printBugNumber(bug);
171  printStatus(summary);
172
173  for (var i=0; i<UBound; i++)
174  {
175    reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
176  }
177
178  exitFunc ('test');
179}
180