string-index.js revision a7e24c173cf37484693b9abb38e494fa7bd7baeb
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
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("F", foo["0" + ""], "string index");
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("o", foo["1"], "string index");
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("o", foo["2"], "string index");
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[3]), "out of range");
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SpiderMonkey 1.5 fails this next one.  So does FF 2.0.6.
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[-1]), "known failure in SpiderMonkey 1.5");
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[-2]), "negative index");
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfoo[0] = "f";
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Foo", foo);
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfoo[3] = "t";
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Foo", foo);
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[3]), "out of range");
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(foo[-2]), "negative index");
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar S = new String("foo");
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("foo", S);
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S[0], "string object");
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S["0"], "string object");
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS[0] = 'bente';
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S[0], "string object");
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S["0"], "string object");
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS[-2] = 'spider';
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('spider', S[-2]);
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS[3] = 'monkey';
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('monkey', S[3]);
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS['foo'] = 'Fu';
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Fu", S.foo);
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// In FF this is ignored I think.  In V8 it puts a property on the String object
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// but you won't ever see it because it is hidden by the 0th character in the
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// string.  The net effect is pretty much the same.
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockS["0"] = 'bente';
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S[0], "string object");
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("f", S["0"], "string object");
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, 0 in S, "0 in");
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, -1 in S, "-1 in");
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, 2 in S, "2 in");
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, 3 in S, "3 in");
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, 4 in S, "3 in");
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "0" in S, '"0" in');
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "-1" in S, '"-1" in');
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "2" in S, '"2" in');
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "3" in S, '"3" in');
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "4" in S, '"3" in');
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty(0), "0 hasOwnProperty");
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, S.hasOwnProperty(-1), "-1 hasOwnProperty");
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty(2), "2 hasOwnProperty");
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty(3), "3 hasOwnProperty");
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, S.hasOwnProperty(4), "3 hasOwnProperty");
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty("0"), '"0" hasOwnProperty');
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, S.hasOwnProperty("-1"), '"-1" hasOwnProperty');
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty("2"), '"2" hasOwnProperty');
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, S.hasOwnProperty("3"), '"3" hasOwnProperty');
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, S.hasOwnProperty("4"), '"3" hasOwnProperty');
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "foo".hasOwnProperty(0), "foo 0 hasOwnProperty");
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "foo".hasOwnProperty(-1), "foo -1 hasOwnProperty");
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "foo".hasOwnProperty(2), "foo 2 hasOwnProperty");
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "foo".hasOwnProperty(4), "foo 3 hasOwnProperty");
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "foo".hasOwnProperty("0"), 'foo "0" hasOwnProperty');
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "foo".hasOwnProperty("-1"), 'foo "-1" hasOwnProperty');
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(true, "foo".hasOwnProperty("2"), 'foo "2" hasOwnProperty');
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "foo".hasOwnProperty("4"), 'foo "3" hasOwnProperty');
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(true, 0 in "foo", "0 in");
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(false, -1 in "foo", "-1 in");
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(true, 2 in "foo", "2 in");
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(false, 3 in "foo", "3 in");
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(true, "0" in "foo", '"0" in');
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(false, "-1" in "foo", '"-1" in');
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(true, "2" in "foo", '"2" in');
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//assertEquals(false, "3" in "foo", '"3" in');
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdelete S[3];
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("undefined", typeof(S[3]));
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, 3 in S);
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(false, "3" in S);
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar N = new Number(43);
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals(43, N);
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockN[-2] = "Alpha";
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Alpha", N[-2]);
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockN[0] = "Zappa";
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Zappa", N[0]);
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals("Zappa", N["0"]);
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar A = ["V", "e", "t", "t", "e", "r"];
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar A2 = (A[0] = "v");
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('v', A[0]);
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('v', A2);
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar S = new String("Onkel");
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar S2 = (S[0] = 'o');
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('O', S[0]);
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('o', S2);
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar s = "Tante";
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar s2 = (s[0] = 't');
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('T', s[0]);
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('t', s2);
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar S2 = (S[-2] = 'o');
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('o', S[-2]);
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('o', S2);
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar s2 = (s[-2] = 't');
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('undefined', typeof(s[-2]));
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertEquals('t', s2);
155