Index: test/mjsunit/array-concat.js |
diff --git a/test/mjsunit/array-concat.js b/test/mjsunit/array-concat.js |
index 2346c8de67d8faf99ebe6c4324032a503066ca5f..db89f4d0b8001868d01ba6b21a48941706ce59a0 100644 |
--- a/test/mjsunit/array-concat.js |
+++ b/test/mjsunit/array-concat.js |
@@ -29,7 +29,82 @@ |
* @fileoverview Test concat on small and large arrays |
*/ |
-var poses = [140, 4000000000]; |
+var poses; |
+ |
+poses = [140, 4000000000]; |
+while (pos = poses.shift()) { |
+ var a = new Array(pos); |
+ var array_proto = []; |
+ a.__proto__ = array_proto; |
+ assertEquals(pos, a.length); |
+ a.push('foo'); |
+ assertEquals(pos + 1, a.length); |
+ var b = ['bar']; |
+ var c = a.concat(b); |
+ assertEquals(pos + 2, c.length); |
+ assertEquals("undefined", typeof(c[pos - 1])); |
+ assertEquals("foo", c[pos]); |
+ assertEquals("bar", c[pos + 1]); |
+ |
+ // Can we fool the system by putting a number in a string? |
+ var onetwofour = "124"; |
+ a[onetwofour] = 'doo'; |
+ assertEquals(a[124], 'doo'); |
+ c = a.concat(b); |
+ assertEquals(c[124], 'doo'); |
+ |
+ // If we put a number in the prototype, then the spec says it should be |
+ // copied on concat. |
+ array_proto["123"] = 'baz'; |
+ assertEquals(a[123], 'baz'); |
+ |
+ c = a.concat(b); |
+ assertEquals(pos + 2, c.length); |
+ assertEquals("baz", c[123]); |
+ assertEquals("undefined", typeof(c[pos - 1])); |
+ assertEquals("foo", c[pos]); |
+ assertEquals("bar", c[pos + 1]); |
+ |
+ // When we take the number off the prototype it disappears from a, but |
+ // the concat put it in c itself. |
+ array_proto["123"] = undefined; |
+ assertEquals("undefined", typeof(a[123])); |
+ assertEquals("baz", c[123]); |
+ |
+ // If the element of prototype is shadowed, the element on the instance |
+ // should be copied, but not the one on the prototype. |
+ array_proto[123] = 'baz'; |
+ a[123] = 'xyz'; |
+ assertEquals('xyz', a[123]); |
+ c = a.concat(b); |
+ assertEquals('xyz', c[123]); |
+ |
+ // Non-numeric properties on the prototype or the array shouldn't get |
+ // copied. |
+ array_proto.moe = 'joe'; |
+ a.ben = 'jerry'; |
+ assertEquals(a["moe"], 'joe'); |
+ assertEquals(a["ben"], 'jerry'); |
+ c = a.concat(b); |
+ // ben was not copied |
+ assertEquals("undefined", typeof(c.ben)); |
+ |
+ // When we take moe off the prototype it disappears from all arrays. |
+ array_proto.moe = undefined; |
+ assertEquals("undefined", typeof(c.moe)); |
+ |
+ // Negative indices don't get concated. |
+ a[-1] = 'minus1'; |
+ assertEquals("minus1", a[-1]); |
+ assertEquals("undefined", typeof(a[0xffffffff])); |
+ c = a.concat(b); |
+ assertEquals("undefined", typeof(c[-1])); |
+ assertEquals("undefined", typeof(c[0xffffffff])); |
+ assertEquals(c.length, a.length + 1); |
+ |
+} |
+ |
+poses = [140, 4000000000]; |
while (pos = poses.shift()) { |
var a = new Array(pos); |
assertEquals(pos, a.length); |
@@ -91,7 +166,7 @@ while (pos = poses.shift()) { |
Array.prototype.moe = undefined; |
assertEquals("undefined", typeof(c.moe)); |
- // Negative indeces don't get concated. |
+ // Negative indices don't get concated. |
a[-1] = 'minus1'; |
assertEquals("minus1", a[-1]); |
assertEquals("undefined", typeof(a[0xffffffff])); |