Home | History | Annotate | Download | only in Statements
      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 (at) 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:    30 Jan 2002
     38 * Revised: 10 Apr 2002
     39 * Revised: 14 July 2002
     40 *
     41 * SUMMARY: JS should error on |for(i in undefined)|, |for(i in null)|
     42 * See http://bugzilla.mozilla.org/show_bug.cgi?id=121744
     43 *
     44 * ECMA-262 3rd Edition Final spec says such statements should error. See:
     45 *
     46 *               Section 12.6.4  The for-in Statement
     47 *               Section 9.9     ToObject
     48 *
     49 *
     50 * BUT: SpiderMonkey has decided NOT to follow this; it's a bug in the spec.
     51 * See http://bugzilla.mozilla.org/show_bug.cgi?id=131348
     52 *
     53 * UPDATE: Rhino has also decided not to follow the spec on this.
     54 * See http://bugzilla.mozilla.org/show_bug.cgi?id=136893
     55 *
     56 
     57   |--------------------------------------------------------------------|
     58   |                                                                    |
     59   | So for now, adding an early return for this test so it won't run.  |
     60   |                                                                    |
     61   |--------------------------------------------------------------------|
     62 
     63 *
     64 */
     65 //-----------------------------------------------------------------------------
     66 var UBound = 0;
     67 var bug = 121744;
     68 var summary = 'JS should error on |for(i in undefined)|, |for(i in null)|';
     69 var TEST_PASSED = 'TypeError';
     70 var TEST_FAILED = 'Generated an error, but NOT a TypeError!';
     71 var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
     72 var status = '';
     73 var statusitems = [];
     74 var actual = '';
     75 var actualvalues = [];
     76 var expect= '';
     77 var expectedvalues = [];
     78 
     79 /*
     80  * AS OF 14 JULY 2002, DON'T RUN THIS TEST IN EITHER RHINO OR SPIDERMONKEY -
     81  */
     82 quit();
     83 
     84 
     85 status = inSection(1);
     86 expect = TEST_PASSED;
     87 actual = TEST_FAILED_BADLY;
     88 /*
     89  * OK, this should generate a TypeError
     90  */
     91 try
     92 {
     93   for (var i in undefined)
     94   {
     95     print(i);
     96   }
     97 }
     98 catch(e)
     99 {
    100   if (e instanceof TypeError)
    101     actual = TEST_PASSED;
    102   else
    103     actual = TEST_FAILED;
    104 }
    105 addThis();
    106 
    107 
    108 
    109 status = inSection(2);
    110 expect = TEST_PASSED;
    111 actual = TEST_FAILED_BADLY;
    112 /*
    113  * OK, this should generate a TypeError
    114  */
    115 try
    116 {
    117   for (var i in null)
    118   {
    119     print(i);
    120   }
    121 }
    122 catch(e)
    123 {
    124   if (e instanceof TypeError)
    125     actual = TEST_PASSED;
    126   else
    127     actual = TEST_FAILED;
    128 }
    129 addThis();
    130 
    131 
    132 
    133 status = inSection(3);
    134 expect = TEST_PASSED;
    135 actual = TEST_FAILED_BADLY;
    136 /*
    137  * Variable names that cannot be looked up generate ReferenceErrors; however,
    138  * property names like obj.ZZZ that cannot be looked up are set to |undefined|
    139  *
    140  * Therefore, this should indirectly test | for (var i in undefined) |
    141  */
    142 try
    143 {
    144   for (var i in this.ZZZ)
    145   {
    146     print(i);
    147   }
    148 }
    149 catch(e)
    150 {
    151   if(e instanceof TypeError)
    152     actual = TEST_PASSED;
    153   else
    154     actual = TEST_FAILED;
    155 }
    156 addThis();
    157 
    158 
    159 
    160 status = inSection(4);
    161 expect = TEST_PASSED;
    162 actual = TEST_FAILED_BADLY;
    163 /*
    164  * The result of an unsuccessful regexp match is the null value
    165  * Therefore, this should indirectly test | for (var i in null) |
    166  */
    167 try
    168 {
    169   for (var i in 'bbb'.match(/aaa/))
    170   {
    171     print(i);
    172   }
    173 }
    174 catch(e)
    175 {
    176   if(e instanceof TypeError)
    177     actual = TEST_PASSED;
    178   else
    179     actual = TEST_FAILED;
    180 }
    181 addThis();
    182 
    183 
    184 
    185 //-----------------------------------------------------------------------------
    186 test();
    187 //-----------------------------------------------------------------------------
    188 
    189 
    190 
    191 function addThis()
    192 {
    193   statusitems[UBound] = status;
    194   actualvalues[UBound] = actual;
    195   expectedvalues[UBound] = expect;
    196   UBound++;
    197 }
    198 
    199 
    200 function test()
    201 {
    202   enterFunc('test');
    203   printBugNumber(bug);
    204   printStatus(summary);
    205 
    206   for (var i=0; i<UBound; i++)
    207   {
    208     reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
    209   }
    210 
    211   exitFunc ('test');
    212 }
    213