1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @fileoverview Test indexing on strings with [].
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar foo = "Foo";
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Foo", foo);
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("F", foo[0]);
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("o", foo[1]);
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("o", foo[2]);
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Test string keyed load IC.
396ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfor (var i = 0; i < 10; i++) {
406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals("F", foo[0]);
416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals("o", foo[1]);
426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals("o", foo[2]);
436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals("F", (foo[0] + "BarBazQuuxFooBarQuux")[0]);
446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("F", foo["0" + ""], "string index");
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("o", foo["1"], "string index");
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("o", foo["2"], "string index");
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[3]), "out of range");
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SpiderMonkey 1.5 fails this next one.  So does FF 2.0.6.
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[-1]), "known failure in SpiderMonkey 1.5");
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[-2]), "negative index");
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfoo[0] = "f";
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Foo", foo);
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfoo[3] = "t";
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Foo", foo);
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[3]), "out of range");
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[-2]), "negative index");
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar S = new String("foo");
64257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(Object("foo"), S);
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S[0], "string object");
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S["0"], "string object");
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS[0] = 'bente';
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S[0], "string object");
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S["0"], "string object");
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS[-2] = 'spider';
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('spider', S[-2]);
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS[3] = 'monkey';
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('monkey', S[3]);
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS['foo'] = 'Fu';
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Fu", S.foo);
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// In FF this is ignored I think.  In V8 it puts a property on the String object
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// but you won't ever see it because it is hidden by the 0th character in the
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// string.  The net effect is pretty much the same.
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS["0"] = 'bente';
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S[0], "string object");
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S["0"], "string object");
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, 0 in S, "0 in");
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, -1 in S, "-1 in");
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, 2 in S, "2 in");
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, 3 in S, "3 in");
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, 4 in S, "3 in");
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "0" in S, '"0" in');
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "-1" in S, '"-1" in');
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "2" in S, '"2" in');
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "3" in S, '"3" in');
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "4" in S, '"3" in');
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty(0), "0 hasOwnProperty");
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, S.hasOwnProperty(-1), "-1 hasOwnProperty");
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty(2), "2 hasOwnProperty");
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty(3), "3 hasOwnProperty");
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, S.hasOwnProperty(4), "3 hasOwnProperty");
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty("0"), '"0" hasOwnProperty');
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, S.hasOwnProperty("-1"), '"-1" hasOwnProperty');
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty("2"), '"2" hasOwnProperty');
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty("3"), '"3" hasOwnProperty');
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, S.hasOwnProperty("4"), '"3" hasOwnProperty');
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "foo".hasOwnProperty(0), "foo 0 hasOwnProperty");
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "foo".hasOwnProperty(-1), "foo -1 hasOwnProperty");
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "foo".hasOwnProperty(2), "foo 2 hasOwnProperty");
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "foo".hasOwnProperty(4), "foo 3 hasOwnProperty");
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "foo".hasOwnProperty("0"), 'foo "0" hasOwnProperty');
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "foo".hasOwnProperty("-1"), 'foo "-1" hasOwnProperty');
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "foo".hasOwnProperty("2"), 'foo "2" hasOwnProperty');
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "foo".hasOwnProperty("4"), 'foo "3" hasOwnProperty');
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(true, 0 in "foo", "0 in");
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(false, -1 in "foo", "-1 in");
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(true, 2 in "foo", "2 in");
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(false, 3 in "foo", "3 in");
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(true, "0" in "foo", '"0" in');
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(false, "-1" in "foo", '"-1" in');
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(true, "2" in "foo", '"2" in');
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(false, "3" in "foo", '"3" in');
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdelete S[3];
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(S[3]));
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, 3 in S);
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "3" in S);
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar N = new Number(43);
134257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(Object(43), N);
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockN[-2] = "Alpha";
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Alpha", N[-2]);
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockN[0] = "Zappa";
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Zappa", N[0]);
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Zappa", N["0"]);
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar A = ["V", "e", "t", "t", "e", "r"];
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar A2 = (A[0] = "v");
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('v', A[0]);
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('v', A2);
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar S = new String("Onkel");
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar S2 = (S[0] = 'o');
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('O', S[0]);
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('o', S2);
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar s = "Tante";
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar s2 = (s[0] = 't');
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('T', s[0]);
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('t', s2);
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar S2 = (S[-2] = 'o');
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('o', S[-2]);
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('o', S2);
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar s2 = (s[-2] = 't');
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('undefined', typeof(s[-2]));
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('t', s2);
1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Make sure enough of the one-char string cache is filled.
1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar alpha = ['@'];
1666ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfor (var i = 1; i < 128; i++) {
1676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var c = String.fromCharCode(i);
1686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  alpha[i] = c[0];
1696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
1706ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar alphaStr = alpha.join("");
1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Now test chars.
1736ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfor (var i = 1; i < 128; i++) {
1746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals(alpha[i], alphaStr[i]);
1756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals(String.fromCharCode(i), alphaStr[i]);
1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Test for keyed ic.
1796ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar foo = ['a12', ['a', 2, 'c'], 'a31', 42];
1806ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar results = [1, 2, 3, NaN];
1816ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfor (var i = 0; i < 200; ++i) {
1826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var index = Math.floor(i / 50);
1836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var receiver = foo[index];
1846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var expected = results[index];
1856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var actual = +(receiver[1]);
1866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals(expected, actual);
1876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
1886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1896ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar keys = [0, '1', 2, 3.0, -1, 10];
1906ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar str = 'abcd', arr = ['a', 'b', 'c', 'd', undefined, undefined];
1916ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfor (var i = 0; i < 300; ++i) {
1926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var index = Math.floor(i / 50);
1936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var key = keys[index];
1946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var expected = arr[index];
1956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var actual = str[key];
1966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals(expected, actual);
1976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
1986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Test heap number case.
2006ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar keys = [0, Math.floor(2) * 0.5];
2016ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar str = 'ab', arr = ['a', 'b'];
2026ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfor (var i = 0; i < 100; ++i) {
2036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var index = Math.floor(i / 50);
2046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var key = keys[index];
2056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var expected = arr[index];
2066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var actual = str[key];
2076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals(expected, actual);
2086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
2096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2107f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch// Test negative zero case.
2117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvar keys = [0, -0.0];
2127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvar str = 'ab', arr = ['a', 'a'];
2137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochfor (var i = 0; i < 100; ++i) {
2147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var index = Math.floor(i / 50);
2157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var key = keys[index];
2167f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var expected = arr[index];
2177f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var actual = str[key];
2187f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  assertEquals(expected, actual);
2197f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
2207f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
2217f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch// Test "not-an-array-index" case.
2227f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvar keys = [0, 0.5];
2237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvar str = 'ab', arr = ['a', undefined];
2247f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochfor (var i = 0; i < 100; ++i) {
2257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var index = Math.floor(i / 50);
2267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var key = keys[index];
2277f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var expected = arr[index];
2287f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  var actual = str[key];
2297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  assertEquals(expected, actual);
2307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
2317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
2326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Test out of range case.
2336ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar keys = [0, -1];
2346ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar str = 'ab', arr = ['a', undefined];
2356ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfor (var i = 0; i < 100; ++i) {
2366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var index = Math.floor(i / 50);
2376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var key = keys[index];
2386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var expected = arr[index];
2396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var actual = str[key];
2406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals(expected, actual);
2416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
2426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2436ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar keys = [0, 10];
2446ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar str = 'ab', arr = ['a', undefined];
2456ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfor (var i = 0; i < 100; ++i) {
2466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var index = Math.floor(i / 50);
2476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var key = keys[index];
2486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var expected = arr[index];
2496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var actual = str[key];
2506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals(expected, actual);
2516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
2526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Test two byte string.
2546ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvar str = '\u0427', arr = ['\u0427'];
2556ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfor (var i = 0; i < 50; ++i) {
2566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var expected = arr[0];
2576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  var actual = str[0];
2586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  assertEquals(expected, actual);
2597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
260