17be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Copyright 2009 the V8 project authors. All rights reserved.
27be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Redistribution and use in source and binary forms, with or without
37be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// modification, are permitted provided that the following conditions are
47be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// met:
57be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//
67be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//     * Redistributions of source code must retain the above copyright
77be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//       notice, this list of conditions and the following disclaimer.
87be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//     * Redistributions in binary form must reproduce the above
97be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//       copyright notice, this list of conditions and the following
107be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//       disclaimer in the documentation and/or other materials provided
117be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//       with the distribution.
127be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//     * Neither the name of Google Inc. nor the names of its
137be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//       contributors may be used to endorse or promote products derived
147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//       from this software without specific prior written permission.
157be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org//
167be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
287be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgvar obj = {
297be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    a: 7,
307be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    b: { x: 12, y: 24 },
317be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    c: 'Zebra'
327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org}
337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgassertEquals(7, obj.a);
357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgassertEquals(12, obj.b.x);
367be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgassertEquals(24, obj.b.y);
377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgassertEquals('Zebra', obj.c);
387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgvar z = 24;
407be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
417be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgvar obj2 = {
427be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    a: 7,
437be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    b: { x: 12, y: z },
447be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    c: 'Zebra'
457be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org}
467be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
477be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgassertEquals(7, obj2.a);
487be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgassertEquals(12, obj2.b.x);
497be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgassertEquals(24, obj2.b.y);
507be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgassertEquals('Zebra', obj2.c);
517be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
527be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgvar arr = [];
537be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgfor (var i = 0; i < 2; i++) {
547be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  arr[i] = {
557be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      a: 7,
567be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      b: { x: 12, y: 24 },
577be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      c: 'Zebra'
587be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
597be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org}
607be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
61bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgarr[0].b.x = 2;
62bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgassertEquals(2, arr[0].b.x);
63bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgassertEquals(12, arr[1].b.x);
64bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
65bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
66bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgfunction makeSparseArray() {
67bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return {
68bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    '0': { x: 12, y: 24 },
69bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    '1000000': { x: 0, y: 0 }
70bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  };
71bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org}
72bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
73bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgvar sa1 = makeSparseArray();
74bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgsa1[0].x = 0;
75bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgvar sa2 = makeSparseArray();
76bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgassertEquals(12, sa2[0].x);
77bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
78bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// Test that non-constant literals work.
79bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgvar n = new Object();
80bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
81bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgfunction makeNonConstantArray() { return [ [ n ] ]; }
82bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
83bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgvar a = makeNonConstantArray();
84bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orga[0][0].foo = "bar";
85bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgassertEquals("bar", n.foo);
86bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
87bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgfunction makeNonConstantObject() { return { a: { b: n } }; }
88bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
89bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orga = makeNonConstantObject();
90bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orga.a.b.bar = "foo";
91bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgassertEquals("foo", n.bar);
92bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
93bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// Test that exceptions for regexps still hold.
94bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgfunction makeRegexpInArray() { return [ [ /a*/, {} ] ]; }
95bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
96bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orga = makeRegexpInArray();
97bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgvar b = makeRegexpInArray();
98c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.orgassertFalse(a[0][0] === b[0][0]);
99bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgassertFalse(a[0][1] === b[0][1]);
100bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
101bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgfunction makeRegexpInObject() { return { a: { b: /b*/, c: {} } }; }
102bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orga = makeRegexpInObject();
103bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgb = makeRegexpInObject();
104c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.orgassertFalse(a.a.b === b.a.b);
105bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgassertFalse(a.a.c === b.a.c);
106d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org
107d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org
1087b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org// Test keywords are valid as property names in initializers and dot-access.
109d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.orgvar keywords = [
110d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "break",
111d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "case",
112d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "catch",
113d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "const",
114d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "continue",
115d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "debugger",
116d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "default",
117d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "delete",
118d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "do",
119d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "else",
120d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "false",
121d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "finally",
122d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "for",
123d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "function",
124d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "if",
125d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "in",
126d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "instanceof",
127d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "new",
128d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "null",
129d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "return",
130d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "switch",
131d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "this",
132d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "throw",
133d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "true",
134d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "try",
135d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "typeof",
136d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "var",
137d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "void",
138d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  "while",
1397b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  "with"
140d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org];
141d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org
142d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.orgfunction testKeywordProperty(keyword) {
143d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  var exception = false;
144d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  try {
145d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org    // Sanity check that what we get is a keyword.
146d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org    eval("var " + keyword + " = 42;");
147d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  } catch (e) {
148d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org    exception = true;
149d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  }
150d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  assertTrue(exception);
15126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
152d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  // Simple property, read and write.
153d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  var x = eval("({" + keyword + ": 42})");
154d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(42, x[keyword]);
155d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(42, eval("x." + keyword));
156d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  eval("x." + keyword + " = 37");
157d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(37, x[keyword]);
158d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(37, eval("x." + keyword));
15926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
160d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  // Getter/setter property, read and write.
161d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  var y = eval("({value : 42, get " + keyword + "(){return this.value}," +
162d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org               " set " + keyword + "(v) { this.value = v; }})");
163d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(42, y[keyword]);
164d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(42, eval("y." + keyword));
165d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  eval("y." + keyword + " = 37");
166d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(37, y[keyword]);
167d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(37, eval("y." + keyword));
16826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
169d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  // Quoted keyword works is read back by unquoted as well.
170d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  var z = eval("({\"" + keyword + "\": 42})");
171d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(42, z[keyword]);
172d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertEquals(42, eval("z." + keyword));
17326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
174d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  // Function property, called.
175d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  var was_called;
176d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  function test_call() { this.was_called = true; was_called = true; }
177d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  var w = eval("({" + keyword + ": test_call, was_called: false})");
178d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  eval("w." + keyword + "();");
179d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertTrue(was_called);
180d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertTrue(w.was_called);
181d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org
182d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  // Function property, constructed.
183d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  function construct() { this.constructed = true; }
184d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  var v = eval("({" + keyword + ": construct})");
185d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  var vo = eval("new v." + keyword + "()");
186d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertTrue(vo instanceof construct);
187d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  assertTrue(vo.constructed);
188d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org}
189d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org
190d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.orgfor (var i = 0; i < keywords.length; i++) {
191d3b3be0240773cedde121ab23064d32f2c50a74fsgjesse@chromium.org  testKeywordProperty(keywords[i]);
192d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}
193a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
194a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
195a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org(function TestNumericNames() {
196a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  var o = {
197a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    1: 1,
198a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    2.: 2,
199a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    3.0: 3,
200a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    4e0: 4,
201a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    5E0: 5,
202a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    6e-0: 6,
203a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    7E-0: 7,
204a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    0x8: 8,
205a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    0X9: 9,
206a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
207a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  assertEquals(['1', '2', '3', '4', '5', '6', '7', '8', '9'], Object.keys(o));
208a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
209a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  o = {
210a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    1.2: 1.2,
211a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    1.30: 1.3
212a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  };
213a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  assertEquals(['1.2', '1.3'], Object.keys(o));
214a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org})();
215a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
216a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
217a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgfunction TestNumericNamesGetter(expectedKeys, object) {
218a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  assertEquals(expectedKeys, Object.keys(object));
219a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  expectedKeys.forEach(function(key) {
220a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    var descr = Object.getOwnPropertyDescriptor(object, key);
221a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    assertEquals(key, descr.get.name);
222a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  });
223a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
224a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTestNumericNamesGetter(['1', '2', '3', '4', '5', '6', '7', '8', '9'], {
225a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 1() {},
226a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 2.() {},
227a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 3.0() {},
228a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 4e0() {},
229a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 5E0() {},
230a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 6e-0() {},
231a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 7E-0() {},
232a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 0x8() {},
233a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 0X9() {},
234a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org});
235a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTestNumericNamesGetter(['1.2', '1.3'], {
236a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 1.2() {},
237a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  get 1.30() {}
238a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org});
239a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
240a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
241a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgfunction TestNumericNamesSetter(expectedKeys, object) {
242a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  assertEquals(expectedKeys, Object.keys(object));
243a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  expectedKeys.forEach(function(key) {
244a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    var descr = Object.getOwnPropertyDescriptor(object, key);
245a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    assertEquals(key, descr.set.name);
246a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  });
247a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
248a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTestNumericNamesSetter(['1', '2', '3', '4', '5', '6', '7', '8', '9'], {
249a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 1(_) {},
250a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 2.(_) {},
251a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 3.0(_) {},
252a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 4e0(_) {},
253a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 5E0(_) {},
254a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 6e-0(_) {},
255a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 7E-0(_) {},
256a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 0x8(_) {},
257a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 0X9(_) {},
258a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org});
259a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTestNumericNamesSetter(['1.2', '1.3'], {
260a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 1.2(_) {; },
261a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  set 1.30(_) {; }
262a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org});
263