Home | History | Annotate | Download | only in Statements
      1 /**
      2  *  File Name:          forin-001.js
      3  *  ECMA Section:
      4  *  Description:        The forin-001 statement
      5  *
      6  *  Verify that the property name is assigned to the property on the left
      7  *  hand side of the for...in expression.
      8  *
      9  *  Author:             christine (at) netscape.com
     10  *  Date:               28 August 1998
     11  */
     12     var SECTION = "forin-001";
     13     var VERSION = "ECMA_2";
     14     var TITLE   = "The for...in  statement";
     15     var BUGNUMBER="330890";
     16     var BUGNUMBER="http://scopus.mcom.com/bugsplat/show_bug.cgi?id=344855";
     17 
     18     startTest();
     19     writeHeaderToLog( SECTION + " "+ TITLE);
     20 
     21     var tc = 0;
     22     var testcases = new Array();
     23 
     24     ForIn_1( { length:4, company:"netscape", year:2000, 0:"zero" } );
     25     ForIn_2( { length:4, company:"netscape", year:2000, 0:"zero" } );
     26     ForIn_3( { length:4, company:"netscape", year:2000, 0:"zero" } );
     27 
     28 //    ForIn_6({ length:4, company:"netscape", year:2000, 0:"zero" });
     29 //    ForIn_7({ length:4, company:"netscape", year:2000, 0:"zero" });
     30     ForIn_8({ length:4, company:"netscape", year:2000, 0:"zero" });
     31 
     32     test();
     33 
     34     /**
     35      *  Verify that the left side argument is evaluated with every iteration.
     36      *  Verify that the name of each property of the object is assigned to a
     37      *  a property.
     38      *
     39      */
     40     function ForIn_1( object ) {
     41         PropertyArray = new Array();
     42         ValueArray = new Array();
     43 
     44         for ( PropertyArray[PropertyArray.length] in object ) {
     45             ValueArray[ValueArray.length] =
     46                 object[PropertyArray[PropertyArray.length-1]];
     47         }
     48 
     49         for ( var i = 0; i < PropertyArray.length; i++ ) {
     50             testcases[tc++] = new TestCase(
     51                 SECTION,
     52                 "object[" + PropertyArray[i] +"]",
     53                 object[PropertyArray[i]],
     54                 ValueArray[i]
     55             );
     56         }
     57 
     58         testcases[tc++] = new TestCase(
     59             SECTION,
     60             "object.length",
     61             PropertyArray.length,
     62             object.length );
     63     }
     64 
     65     /**
     66      *  Similar to ForIn_1, except it should increment the counter variable
     67      *  every time the left hand expression is evaluated.
     68      */
     69     function ForIn_2( object ) {
     70         PropertyArray = new Array();
     71         ValueArray = new Array();
     72         var i = 0;
     73 
     74         for ( PropertyArray[i++] in object ) {
     75             ValueArray[ValueArray.length] =
     76                 object[PropertyArray[PropertyArray.length-1]];
     77         }
     78 
     79         for ( i = 0; i < PropertyArray.length; i++ ) {
     80             testcases[tc++] = new TestCase(
     81                 SECTION,
     82                 "object[" + PropertyArray[i] +"]",
     83                 object[PropertyArray[i]],
     84                 ValueArray[i]
     85             );
     86         }
     87 
     88         testcases[tc++] = new TestCase(
     89             SECTION,
     90             "object.length",
     91             PropertyArray.length,
     92             object.length );
     93     }
     94 
     95     /**
     96      *  Break out of a for...in loop
     97      *
     98      *
     99      */
    100     function ForIn_3( object ) {
    101         var checkBreak = "pass";
    102         var properties = new Array();
    103         var values = new Array();
    104 
    105         for ( properties[properties.length] in object ) {
    106             values[values.length] = object[properties[properties.length-1]];
    107             break;
    108             checkBreak = "fail";
    109         }
    110 
    111         testcases[tc++] = new TestCase(
    112             SECTION,
    113             "check break out of for...in",
    114             "pass",
    115             checkBreak );
    116 
    117         testcases[tc++] = new TestCase(
    118             SECTION,
    119             "properties.length",
    120             1,
    121             properties.length );
    122 
    123         testcases[tc++] = new TestCase(
    124             SECTION,
    125             "object["+properties[0]+"]",
    126             values[0],
    127             object[properties[0]] );
    128     }
    129 
    130     /**
    131      *  Break out of a labeled for...in loop.
    132      */
    133     function ForIn_4( object ) {
    134         var result1 = 0;
    135         var result2 = 0;
    136         var result3 = 0;
    137         var result4 = 0;
    138         var i = 0;
    139         var property = new Array();
    140 
    141         butterbean: {
    142             result1++;
    143 
    144             for ( property[i++] in object ) {
    145                 result2++;
    146                 break;
    147                 result4++;
    148             }
    149             result3++;
    150         }
    151 
    152         testcases[tc++] = new TestCase(
    153             SECTION,
    154             "verify labeled statement is only executed once",
    155             true,
    156             result1 == 1 );
    157 
    158         testcases[tc++] = new TestCase(
    159             SECTION,
    160             "verify statements in for loop are evaluated",
    161             true,
    162             result2 == i );
    163 
    164         testcases[tc++] = new TestCase(
    165             SECTION,
    166             "verify break out of labeled for...in loop",
    167             true,
    168             result4 == 0 );
    169 
    170         testcases[tc++] = new TestCase(
    171             SECTION,
    172             "verify break out of labeled block",
    173             true,
    174             result3 == 0 );
    175     }
    176 
    177     /**
    178      *  Labeled break out of a labeled for...in loop.
    179      */
    180     function ForIn_5 (object) {
    181         var result1 = 0;
    182         var result2 = 0;
    183         var result3 = 0;
    184         var result4 = 0;
    185         var i = 0;
    186         var property = new Array();
    187 
    188         bigredbird: {
    189             result1++;
    190             for ( property[i++] in object ) {
    191                 result2++;
    192                 break bigredbird;
    193                 result4++;
    194             }
    195             result3++;
    196         }
    197 
    198         testcases[tc++] = new TestCase(
    199             SECTION,
    200             "verify labeled statement is only executed once",
    201             true,
    202             result1 == 1 );
    203 
    204         testcases[tc++] = new TestCase(
    205             SECTION,
    206             "verify statements in for loop are evaluated",
    207             true,
    208             result2 == i );
    209 
    210         testcases[tc++] = new TestCase(
    211             SECTION,
    212             "verify break out of labeled for...in loop",
    213             true,
    214             result4 == 0 );
    215 
    216         testcases[tc++] = new TestCase(
    217             SECTION,
    218             "verify break out of labeled block",
    219             true,
    220             result3 == 0 );
    221     }
    222 
    223     /**
    224      *  Labeled continue from a labeled for...in loop
    225      */
    226     function ForIn_7( object ) {
    227         var result1 = 0;
    228         var result2 = 0;
    229         var result3 = 0;
    230         var result4 = 0;
    231         var i = 0;
    232         var property = new Array();
    233 
    234         bigredbird:
    235             for ( property[i++] in object ) {
    236                 result2++;
    237                 continue bigredbird;
    238                 result4++;
    239             }
    240 
    241         testcases[tc++] = new TestCase(
    242             SECTION,
    243             "verify statements in for loop are evaluated",
    244             true,
    245             result2 == i );
    246 
    247         testcases[tc++] = new TestCase(
    248             SECTION,
    249             "verify break out of labeled for...in loop",
    250             true,
    251             result4 == 0 );
    252 
    253         testcases[tc++] = new TestCase(
    254             SECTION,
    255             "verify break out of labeled block",
    256             true,
    257             result3 == 1 );
    258     }
    259 
    260 
    261     /**
    262      *  continue in a for...in loop
    263      *
    264      */
    265     function ForIn_8( object ) {
    266         var checkBreak = "pass";
    267         var properties = new Array();
    268         var values = new Array();
    269 
    270         for ( properties[properties.length] in object ) {
    271             values[values.length] = object[properties[properties.length-1]];
    272             break;
    273             checkBreak = "fail";
    274         }
    275 
    276         testcases[tc++] = new TestCase(
    277             SECTION,
    278             "check break out of for...in",
    279             "pass",
    280             checkBreak );
    281 
    282         testcases[tc++] = new TestCase(
    283             SECTION,
    284             "properties.length",
    285             1,
    286             properties.length );
    287 
    288         testcases[tc++] = new TestCase(
    289             SECTION,
    290             "object["+properties[0]+"]",
    291             values[0],
    292             object[properties[0]] );
    293     }
    294 
    295