1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met:
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions of source code must retain the above copyright
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       notice, this list of conditions and the following disclaimer.
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions in binary form must reproduce the above
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       copyright notice, this list of conditions and the following
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       disclaimer in the documentation and/or other materials provided
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       with the distribution.
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Neither the name of Google Inc. nor the names of its
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       contributors may be used to endorse or promote products derived
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       from this software without specific prior written permission.
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ArrayBuffer
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestByteLength(param, expectedByteLength) {
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ab = new ArrayBuffer(param);
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(expectedByteLength, ab.byteLength);
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestArrayBufferCreation() {
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestByteLength(1, 1);
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestByteLength(256, 256);
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestByteLength(2.567, 2);
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestByteLength("abc", 0);
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestByteLength(0, 0);
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { new ArrayBuffer(-10); }, RangeError);
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { new ArrayBuffer(-2.567); }, RangeError);
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/* TODO[dslomov]: Reenable the test
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var ab1 = new ArrayBuffer(0xFFFFFFFFFFFF)
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, RangeError);
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch*/
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ab = new ArrayBuffer();
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, ab.byteLength);
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArrayBufferCreation();
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestByteLengthNotWritable() {
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ab = new ArrayBuffer(1024);
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(1024, ab.byteLength);
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { "use strict"; ab.byteLength = 42; }, TypeError);
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestByteLengthNotWritable();
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSlice(expectedResultLen, initialLen, start, end) {
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ab = new ArrayBuffer(initialLen);
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a1 = new Uint8Array(ab);
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < a1.length; i++) {
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    a1[i] = 0xCA;
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var slice = ab.slice(start, end);
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(expectedResultLen, slice.byteLength);
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a2 = new Uint8Array(slice);
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < a2.length; i++) {
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(0xCA, a2[i]);
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestArrayBufferSlice() {
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ab = new ArrayBuffer(1024);
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ab1 = ab.slice(512, 1024);
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(512, ab1.byteLength);
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(512, 1024, 512, 1024);
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(512, 1024, 512);
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(0, 0, 1, 20);
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(100, 100, 0, 100);
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(100, 100, 0, 1000);
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(0, 100, 5, 1);
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(1, 100, -11, -10);
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(9, 100, -10, 99);
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(0, 100, -10, 80);
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, 80, -10);
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, 90, "100");
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, "90", "100");
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(0,  100, 90, "abc");
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, "abc", 10);
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, 0.96, 10.96);
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, 0.96, 10.01);
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, 0.01, 10.01);
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, 0.01, 10.96);
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, 90);
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestSlice(10, 100, -10);
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArrayBufferSlice();
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Typed arrays
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestTypedArray(constr, elementSize, typicalElement) {
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, constr.BYTES_PER_ELEMENT);
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ab = new ArrayBuffer(256*elementSize);
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a0 = new constr(30);
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(ArrayBuffer.isView(a0));
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, a0.BYTES_PER_ELEMENT);
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(30, a0.length);
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(30*elementSize, a0.byteLength);
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, a0.byteOffset);
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(30*elementSize, a0.buffer.byteLength);
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var aLen0 = new constr(0);
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, aLen0.BYTES_PER_ELEMENT);
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aLen0.length);
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aLen0.byteLength);
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aLen0.byteOffset);
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aLen0.buffer.byteLength);
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var aOverBufferLen0 = new constr(ab, 128*elementSize, 0);
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, aOverBufferLen0.buffer);
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, aOverBufferLen0.BYTES_PER_ELEMENT);
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aOverBufferLen0.length);
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aOverBufferLen0.byteLength);
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(128*elementSize, aOverBufferLen0.byteOffset);
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a1 = new constr(ab, 128*elementSize, 128);
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, a1.buffer);
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, a1.BYTES_PER_ELEMENT);
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(128, a1.length);
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(128*elementSize, a1.byteLength);
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(128*elementSize, a1.byteOffset);
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a2 = new constr(ab, 64*elementSize, 128);
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, a2.buffer);
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, a2.BYTES_PER_ELEMENT);
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(128, a2.length);
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(128*elementSize, a2.byteLength);
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(64*elementSize, a2.byteOffset);
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a3 = new constr(ab, 192*elementSize);
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, a3.buffer);
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(64, a3.length);
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(64*elementSize, a3.byteLength);
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(192*elementSize, a3.byteOffset);
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a4 = new constr(ab);
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, a4.buffer);
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(256, a4.length);
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(256*elementSize, a4.byteLength);
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, a4.byteOffset);
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var i;
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 0; i < 128; i++) {
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    a1[i] = typicalElement;
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 0; i < 128; i++) {
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(typicalElement, a1[i]);
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 0; i < 64; i++) {
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(0, a2[i]);
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 64; i < 128; i++) {
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(typicalElement, a2[i]);
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 0; i < 64; i++) {
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(typicalElement, a3[i]);
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 0; i < 128; i++) {
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(0, a4[i]);
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 128; i < 256; i++) {
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(typicalElement, a4[i]);
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var aAtTheEnd = new constr(ab, 256*elementSize);
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, aAtTheEnd.BYTES_PER_ELEMENT);
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aAtTheEnd.length);
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aAtTheEnd.byteLength);
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(256*elementSize, aAtTheEnd.byteOffset);
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function () { new constr(ab, 257*elementSize); }, RangeError);
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      function () { new constr(ab, 128*elementSize, 192); },
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RangeError);
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (elementSize !== 1) {
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertThrows(function() { new constr(ab, 128*elementSize - 1, 10); },
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 RangeError);
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var unalignedArrayBuffer = new ArrayBuffer(10*elementSize + 1);
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var goodArray = new constr(unalignedArrayBuffer, 0, 10);
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(10, goodArray.length);
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(10*elementSize, goodArray.byteLength);
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertThrows(function() { new constr(unalignedArrayBuffer)}, RangeError);
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertThrows(function() { new constr(unalignedArrayBuffer, 5*elementSize)},
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 RangeError);
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var aFromString = new constr("30");
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, aFromString.BYTES_PER_ELEMENT);
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(30, aFromString.length);
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(30*elementSize, aFromString.byteLength);
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aFromString.byteOffset);
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(30*elementSize, aFromString.buffer.byteLength);
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var jsArray = [];
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 0; i < 30; i++) {
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    jsArray.push(typicalElement);
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var aFromArray = new constr(jsArray);
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, aFromArray.BYTES_PER_ELEMENT);
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(30, aFromArray.length);
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(30*elementSize, aFromArray.byteLength);
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aFromArray.byteOffset);
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(30*elementSize, aFromArray.buffer.byteLength);
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 0; i < 30; i++) {
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(typicalElement, aFromArray[i]);
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var abLen0 = new ArrayBuffer(0);
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var aOverAbLen0 = new constr(abLen0);
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(abLen0, aOverAbLen0.buffer);
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, aOverAbLen0.BYTES_PER_ELEMENT);
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aOverAbLen0.length);
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aOverAbLen0.byteLength);
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aOverAbLen0.byteOffset);
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var aNoParam = new constr();
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(elementSize, aNoParam.BYTES_PER_ELEMENT);
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aNoParam.length);
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aNoParam.byteLength);
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, aNoParam.byteOffset);
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Uint8Array, 1, 0xFF);
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Int8Array, 1, -0x7F);
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Uint16Array, 2, 0xFFFF);
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Int16Array, 2, -0x7FFF);
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Uint32Array, 4, 0xFFFFFFFF);
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Int32Array, 4, -0x7FFFFFFF);
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Float32Array, 4, 0.5);
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Float64Array, 8, 0.5);
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Uint8ClampedArray, 1, 0xFF);
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SubarrayTestCase(constructor, item, expectedResultLen, expectedStartIndex,
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          initialLen, start, end) {
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new constructor(initialLen);
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var s = a.subarray(start, end);
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(constructor, s.constructor);
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(expectedResultLen, s.length);
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (s.length > 0) {
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    s[0] = item;
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(item, a[expectedStartIndex]);
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSubArray(constructor, item) {
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 512, 512, 1024, 512, 1024);
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 512, 512, 1024, 512);
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 0, undefined, 0, 1, 20);
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 100, 0,       100, 0, 100);
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 100, 0,       100,  0, 1000);
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 0, undefined, 100, 5, 1);
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 1, 89,        100, -11, -10);
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 9, 90,        100, -10, 99);
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 0, undefined, 100, -10, 80);
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,80,        100, 80, -10);
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,90,        100, 90, "100");
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,90,        100, "90", "100");
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 0, undefined, 100, 90, "abc");
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,0,         100, "abc", 10);
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,0,         100, 0.96, 10.96);
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,0,         100, 0.96, 10.01);
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,0,         100, 0.01, 10.01);
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,0,         100, 0.01, 10.96);
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,90,        100, 90);
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SubarrayTestCase(constructor, item, 10,90,        100, -10);
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var method = constructor.prototype.subarray;
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  method.call(new constructor(100), 0, 100);
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var o = {};
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { method.call(o, 0, 100); }, TypeError);
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Uint8Array, 0xFF);
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Int8Array, -0x7F);
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Uint16Array, 0xFFFF);
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Int16Array, -0x7FFF);
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Uint32Array, 0xFFFFFFFF);
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Int32Array, -0x7FFFFFFF);
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Float32Array, 0.5);
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Float64Array, 0.5);
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Uint8ClampedArray, 0xFF);
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestTypedArrayOutOfRange(constructor, value, result) {
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new constructor(1);
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a[0] = value;
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(result, a[0]);
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint8Array, 0x1FA, 0xFA);
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint8Array, -1, 0xFF);
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Int8Array, 0x1FA, 0x7A - 0x80);
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint16Array, 0x1FFFA, 0xFFFA);
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint16Array, -1, 0xFFFF);
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Int16Array, 0x1FFFA, 0x7FFA - 0x8000);
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint32Array, 0x1FFFFFFFA, 0xFFFFFFFA);
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint32Array, -1, 0xFFFFFFFF);
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Int32Array, 0x1FFFFFFFA, 0x7FFFFFFA - 0x80000000);
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint8ClampedArray, 0x1FA, 0xFF);
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint8ClampedArray, -1, 0);
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar typedArrayConstructors = [
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Uint8Array,
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int8Array,
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Uint16Array,
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int16Array,
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Uint32Array,
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32Array,
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Uint8ClampedArray,
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Float32Array,
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Float64Array];
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestPropertyTypeChecks(constructor) {
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new constructor();
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function CheckProperty(name) {
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var d = Object.getOwnPropertyDescriptor(constructor.prototype, name);
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var o = {}
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertThrows(function() {d.get.call(o);}, TypeError);
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    d.get.call(a); // shouldn't throw
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0 ; i < typedArrayConstructors.length; i++) {
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      d.get.call(new typedArrayConstructors[i](10));
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckProperty("buffer");
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckProperty("byteOffset");
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckProperty("byteLength");
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckProperty("length");
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor(i = 0; i < typedArrayConstructors.lenght; i++) {
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestPropertyTypeChecks(typedArrayConstructors[i]);
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestTypedArraySet() {
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test array.set in different combinations.
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function assertArrayPrefix(expected, array) {
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < expected.length; ++i) {
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      assertEquals(expected[i], array[i]);
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a11 = new Int16Array([1, 2, 3, 4, 0, -1])
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a12 = new Uint16Array(15)
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a12.set(a11, 3)
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0, 0, 0, 1, 2, 3, 4, 0, 0xffff, 0, 0], a12)
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function(){ a11.set(a12) })
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a21 = [1, undefined, 10, NaN, 0, -1, {valueOf: function() {return 3}}]
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a22 = new Int32Array(12)
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a22.set(a21, 2)
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0, 0, 1, 0, 10, 0, 0, -1, 3, 0], a22)
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a31 = new Float32Array([2, 4, 6, 8, 11, NaN, 1/0, -3])
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a32 = a31.subarray(2, 6)
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a31.set(a32, 4)
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([2, 4, 6, 8, 6, 8, 11, NaN], a31)
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([6, 8, 6, 8], a32)
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a4 = new Uint8ClampedArray([3,2,5,6])
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a4.set(a4)
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([3, 2, 5, 6], a4)
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Cases with overlapping backing store but different element sizes.
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var b = new ArrayBuffer(4)
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a5 = new Int16Array(b)
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a50 = new Int8Array(b)
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a51 = new Int8Array(b, 0, 2)
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a52 = new Int8Array(b, 1, 2)
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a53 = new Int8Array(b, 2, 2)
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a5.set([0x5050, 0x0a0a])
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x50, 0x50, 0x0a, 0x0a], a50)
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x50, 0x50], a51)
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x50, 0x0a], a52)
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x0a, 0x0a], a53)
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a50.set([0x50, 0x50, 0x0a, 0x0a])
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a51.set(a5)
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x50, 0x0a, 0x0a, 0x0a], a50)
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a50.set([0x50, 0x50, 0x0a, 0x0a])
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a52.set(a5)
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x50, 0x50, 0x0a, 0x0a], a50)
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a50.set([0x50, 0x50, 0x0a, 0x0a])
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a53.set(a5)
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x50, 0x50, 0x50, 0x0a], a50)
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a50.set([0x50, 0x51, 0x0a, 0x0b])
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a5.set(a51)
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x0050, 0x0051], a5)
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a50.set([0x50, 0x51, 0x0a, 0x0b])
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a5.set(a52)
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x0051, 0x000a], a5)
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a50.set([0x50, 0x51, 0x0a, 0x0b])
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a5.set(a53)
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([0x000a, 0x000b], a5)
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Mixed types of same size.
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a61 = new Float32Array([1.2, 12.3])
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a62 = new Int32Array(2)
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a62.set(a61)
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([1, 12], a62)
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a61.set(a62)
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix([1, 12], a61)
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Invalid source
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new Uint16Array(50);
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var expected = [];
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = 0; i < 50; i++) {
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    a[i] = i;
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expected.push(i);
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  a.set({});
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayPrefix(expected, a);
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { a.set.call({}) }, TypeError);
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { a.set.call([]) }, TypeError);
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { a.set(0); }, TypeError);
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { a.set(0, 1); }, TypeError);
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArraySet();
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DataView
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDataViewConstructor() {
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ab = new ArrayBuffer(256);
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var d1 = new DataView(ab, 1, 255);
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(ArrayBuffer.isView(d1));
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, d1.buffer);
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(1, d1.byteOffset);
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(255, d1.byteLength);
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var d2 = new DataView(ab, 2);
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, d2.buffer);
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(2, d2.byteOffset);
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(254, d2.byteLength);
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var d3 = new DataView(ab);
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, d3.buffer);
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, d3.byteOffset);
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(256, d3.byteLength);
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var d3a = new DataView(ab, 1, 0);
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, d3a.buffer);
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(1, d3a.byteOffset);
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, d3a.byteLength);
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var d3b = new DataView(ab, 256, 0);
506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, d3b.buffer);
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(256, d3b.byteOffset);
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, d3b.byteLength);
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var d3c = new DataView(ab, 256);
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, d3c.buffer);
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(256, d3c.byteOffset);
513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, d3c.byteLength);
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var d4 = new DataView(ab, 1, 3.1415926);
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(ab, d4.buffer);
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(1, d4.byteOffset);
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(3, d4.byteLength);
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // error cases
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { new DataView(ab, -1); }, RangeError);
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { new DataView(ab, 1, -1); }, RangeError);
524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { new DataView(); }, TypeError);
525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { new DataView([]); }, TypeError);
526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { new DataView(ab, 257); }, RangeError);
527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() { new DataView(ab, 1, 1024); }, RangeError);
528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDataViewConstructor();
531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDataViewPropertyTypeChecks() {
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var a = new DataView(new ArrayBuffer(10));
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function CheckProperty(name) {
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var d = Object.getOwnPropertyDescriptor(DataView.prototype, name);
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var o = {}
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertThrows(function() {d.get.call(o);}, TypeError);
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    d.get.call(a); // shouldn't throw
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckProperty("buffer");
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckProperty("byteOffset");
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CheckProperty("byteLength");
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDataViewPropertyTypeChecks();
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// General tests for properties
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test property attribute [[Enumerable]]
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestEnumerable(func, obj) {
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function props(x) {
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var array = [];
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var p in x) array.push(p);
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return array.sort();
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([], props(func));
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([], props(func.prototype));
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (obj)
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertArrayEquals([], props(obj));
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestEnumerable(ArrayBuffer, new ArrayBuffer());
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor(i = 0; i < typedArrayConstructors.lenght; i++) {
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestEnumerable(typedArrayConstructors[i]);
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestEnumerable(DataView, new DataView(new ArrayBuffer()));
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test arbitrary properties on ArrayBuffer
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestArbitrary(m) {
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function TestProperty(map, property, value) {
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map[property] = value;
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(value, map[property]);
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < 20; i++) {
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestProperty(m, i, 'val' + i);
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestProperty(m, 'foo' + i, 'bar' + i);
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArbitrary(new ArrayBuffer(256));
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor(i = 0; i < typedArrayConstructors.lenght; i++) {
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestArbitary(new typedArrayConstructors[i](10));
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArbitrary(new DataView(new ArrayBuffer(256)));
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test direct constructor call
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows(function() { ArrayBuffer(); }, TypeError);
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows(function() { DataView(new ArrayBuffer()); }, TypeError);
590