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