187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// Copyright 2008 the V8 project authors. All rights reserved. 287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// Redistribution and use in source and binary forms, with or without 387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// modification, are permitted provided that the following conditions are 487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// met: 587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// * Redistributions of source code must retain the above copyright 787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// notice, this list of conditions and the following disclaimer. 887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// * Redistributions in binary form must reproduce the above 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// copyright notice, this list of conditions and the following 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// disclaimer in the documentation and/or other materials provided 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// with the distribution. 1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// * Neither the name of Google Inc. nor the names of its 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// contributors may be used to endorse or promote products derived 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// from this software without specific prior written permission. 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesfunction props(x) { 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines var array = []; 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (var p in x) array.push(p); 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return array.sort(); 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(0, props({}).length, "olen0"); 3587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(1, props({x:1}).length, "olen1"); 3687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(2, props({x:1, y:2}).length, "olen2"); 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertArrayEquals(["x"], props({x:1}), "x"); 3987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertArrayEquals(["x", "y"], props({x:1, y:2}), "xy"); 4087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertArrayEquals(["x", "y", "zoom"], props({x:1, y:2, zoom:3}), "xyzoom"); 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(0, props([]).length, "alen0"); 4387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(1, props([1]).length, "alen1"); 4487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(2, props([1,2]).length, "alen2"); 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertArrayEquals(["0"], props([1]), "0"); 4787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertArrayEquals(["0", "1"], props([1,2]), "01"); 4887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertArrayEquals(["0", "1", "2"], props([1,2,3]), "012"); 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvar o = {}; 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvar a = []; 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesfor (var i = 0x0020; i < 0x01ff; i+=2) { 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines var s = 'char:' + String.fromCharCode(i); 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines a.push(s); 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines o[s] = i; 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 5787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertArrayEquals(a, props(o), "charcodes"); 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvar a = []; 6087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(0, props(a).length, "proplen0"); 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa[Math.pow(2,30)-1] = 0; 6287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(1, props(a).length, "proplen1"); 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa[Math.pow(2,31)-1] = 0; 6487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(2, props(a).length, "proplen2"); 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa[1] = 0; 6687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(3, props(a).length, "proplen3"); 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesfor (var hest = 'hest' in {}) { } 6987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals('hest', hest, "empty-no-override"); 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvar result = ''; 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesfor (var p in {a : [0], b : 1}) { result += p; } 7387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals('ab', result, "ab"); 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvar result = ''; 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesfor (var p in {a : {v:1}, b : 1}) { result += p; } 7787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals('ab', result, "ab-nodeep"); 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvar result = ''; 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesfor (var p in { get a() {}, b : 1}) { result += p; } 8187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals('ab', result, "abget"); 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvar result = ''; 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesfor (var p in { get a() {}, set a(x) {}, b : 1}) { result += p; } 8587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals('ab', result, "abgetset"); 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// Test that for-in in the global scope works with a keyed property as "each". 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// Test outside a loop and in a loop for multiple iterations. 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa = [1,2,3,4]; 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesx = {foo:5, bar:6, zip:7, glep:9, 10:11}; 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesdelete x.bar; 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesy = {} 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesfor (a[2] in x) { 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines y[a[2]] = x[a[2]]; 9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(5, y.foo, "y.foo"); 10087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals("undefined", typeof y.bar, "y.bar"); 10187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(7, y.zip, "y.zip"); 10287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(9, y.glep, "y.glep"); 10387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals(11, y[10], "y[10]"); 10487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals("undefined", typeof y[2], "y[2]"); 10587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesassertEquals("undefined", typeof y[0], "y[0]"); 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesfor (i=0 ; i < 3; ++i) { 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines y = {} 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (a[2] in x) { 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines y[a[2]] = x[a[2]]; 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assertEquals(5, y.foo, "y.foo"); 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assertEquals("undefined", typeof y.bar, "y.bar"); 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assertEquals(7, y.zip, "y.zip"); 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assertEquals(9, y.glep, "y.glep"); 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assertEquals(11, y[10], "y[10]"); 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assertEquals("undefined", typeof y[2], "y[2]"); 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assertEquals("undefined", typeof y[0], "y[0]"); 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines