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