blob: 4bdf8226a8551c0fa250ffcdeb2c3f99b5ce08a1 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2013 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028// ArrayBuffer
29
30function TestByteLength(param, expectedByteLength) {
31 var ab = new ArrayBuffer(param);
32 assertSame(expectedByteLength, ab.byteLength);
33}
34
35function TestArrayBufferCreation() {
36 TestByteLength(1, 1);
37 TestByteLength(256, 256);
38 TestByteLength(2.567, 2);
39
40 TestByteLength("abc", 0);
41
42 TestByteLength(0, 0);
43
44 assertThrows(function() { new ArrayBuffer(-10); }, RangeError);
45 assertThrows(function() { new ArrayBuffer(-2.567); }, RangeError);
46
47/* TODO[dslomov]: Reenable the test
48 assertThrows(function() {
49 var ab1 = new ArrayBuffer(0xFFFFFFFFFFFF)
50 }, RangeError);
51*/
52
53 var ab = new ArrayBuffer();
54 assertSame(0, ab.byteLength);
55 assertEquals("[object ArrayBuffer]",
56 Object.prototype.toString.call(ab));
57}
58
59TestArrayBufferCreation();
60
61function TestByteLengthNotWritable() {
62 var ab = new ArrayBuffer(1024);
63 assertSame(1024, ab.byteLength);
64
65 assertThrows(function() { "use strict"; ab.byteLength = 42; }, TypeError);
66}
67
68TestByteLengthNotWritable();
69
70function TestSlice(expectedResultLen, initialLen, start, end) {
71 var ab = new ArrayBuffer(initialLen);
72 var a1 = new Uint8Array(ab);
73 for (var i = 0; i < a1.length; i++) {
74 a1[i] = 0xCA;
75 }
76 var slice = ab.slice(start, end);
77 assertSame(expectedResultLen, slice.byteLength);
78 var a2 = new Uint8Array(slice);
79 for (var i = 0; i < a2.length; i++) {
80 assertSame(0xCA, a2[i]);
81 }
82}
83
84function TestArrayBufferSlice() {
85 var ab = new ArrayBuffer(1024);
86 var ab1 = ab.slice(512, 1024);
87 assertSame(512, ab1.byteLength);
88
89 TestSlice(512, 1024, 512, 1024);
90 TestSlice(512, 1024, 512);
91
92 TestSlice(0, 0, 1, 20);
93 TestSlice(100, 100, 0, 100);
94 TestSlice(100, 100, 0, 1000);
95
96 TestSlice(0, 100, 5, 1);
97
98 TestSlice(1, 100, -11, -10);
99 TestSlice(9, 100, -10, 99);
100 TestSlice(0, 100, -10, 80);
101 TestSlice(10, 100, 80, -10);
102
103 TestSlice(10, 100, 90, "100");
104 TestSlice(10, 100, "90", "100");
105
106 TestSlice(0, 100, 90, "abc");
107 TestSlice(10, 100, "abc", 10);
108
109 TestSlice(10, 100, 0.96, 10.96);
110 TestSlice(10, 100, 0.96, 10.01);
111 TestSlice(10, 100, 0.01, 10.01);
112 TestSlice(10, 100, 0.01, 10.96);
113
114 TestSlice(10, 100, 90);
115 TestSlice(10, 100, -10);
116}
117
118TestArrayBufferSlice();
119
120// Typed arrays
121
122function TestTypedArray(constr, elementSize, typicalElement) {
123 assertSame(elementSize, constr.BYTES_PER_ELEMENT);
124
125 var ab = new ArrayBuffer(256*elementSize);
126
127 var a0 = new constr(30);
128 assertEquals("[object " + constr.name + "]",
129 Object.prototype.toString.call(a0));
130
131 assertTrue(ArrayBuffer.isView(a0));
132 assertSame(elementSize, a0.BYTES_PER_ELEMENT);
133 assertSame(30, a0.length);
134 assertSame(30*elementSize, a0.byteLength);
135 assertSame(0, a0.byteOffset);
136 assertSame(30*elementSize, a0.buffer.byteLength);
137
138 var aLen0 = new constr(0);
139 assertSame(elementSize, aLen0.BYTES_PER_ELEMENT);
140 assertSame(0, aLen0.length);
141 assertSame(0, aLen0.byteLength);
142 assertSame(0, aLen0.byteOffset);
143 assertSame(0, aLen0.buffer.byteLength);
144
145 var aOverBufferLen0 = new constr(ab, 128*elementSize, 0);
146 assertSame(ab, aOverBufferLen0.buffer);
147 assertSame(elementSize, aOverBufferLen0.BYTES_PER_ELEMENT);
148 assertSame(0, aOverBufferLen0.length);
149 assertSame(0, aOverBufferLen0.byteLength);
150 assertSame(128*elementSize, aOverBufferLen0.byteOffset);
151
152 var a1 = new constr(ab, 128*elementSize, 128);
153 assertSame(ab, a1.buffer);
154 assertSame(elementSize, a1.BYTES_PER_ELEMENT);
155 assertSame(128, a1.length);
156 assertSame(128*elementSize, a1.byteLength);
157 assertSame(128*elementSize, a1.byteOffset);
158
159
160 var a2 = new constr(ab, 64*elementSize, 128);
161 assertSame(ab, a2.buffer);
162 assertSame(elementSize, a2.BYTES_PER_ELEMENT);
163 assertSame(128, a2.length);
164 assertSame(128*elementSize, a2.byteLength);
165 assertSame(64*elementSize, a2.byteOffset);
166
167 var a3 = new constr(ab, 192*elementSize);
168 assertSame(ab, a3.buffer);
169 assertSame(64, a3.length);
170 assertSame(64*elementSize, a3.byteLength);
171 assertSame(192*elementSize, a3.byteOffset);
172
173 var a4 = new constr(ab);
174 assertSame(ab, a4.buffer);
175 assertSame(256, a4.length);
176 assertSame(256*elementSize, a4.byteLength);
177 assertSame(0, a4.byteOffset);
178
179
180 var i;
181 for (i = 0; i < 128; i++) {
182 a1[i] = typicalElement;
183 }
184
185 for (i = 0; i < 128; i++) {
186 assertSame(typicalElement, a1[i]);
187 }
188
189 for (i = 0; i < 64; i++) {
190 assertSame(0, a2[i]);
191 }
192
193 for (i = 64; i < 128; i++) {
194 assertSame(typicalElement, a2[i]);
195 }
196
197 for (i = 0; i < 64; i++) {
198 assertSame(typicalElement, a3[i]);
199 }
200
201 for (i = 0; i < 128; i++) {
202 assertSame(0, a4[i]);
203 }
204
205 for (i = 128; i < 256; i++) {
206 assertSame(typicalElement, a4[i]);
207 }
208
209 var aAtTheEnd = new constr(ab, 256*elementSize);
210 assertSame(elementSize, aAtTheEnd.BYTES_PER_ELEMENT);
211 assertSame(0, aAtTheEnd.length);
212 assertSame(0, aAtTheEnd.byteLength);
213 assertSame(256*elementSize, aAtTheEnd.byteOffset);
214
215 assertThrows(function () { new constr(ab, 257*elementSize); }, RangeError);
216 assertThrows(
217 function () { new constr(ab, 128*elementSize, 192); },
218 RangeError);
219
220 if (elementSize !== 1) {
221 assertThrows(function() { new constr(ab, 128*elementSize - 1, 10); },
222 RangeError);
223 var unalignedArrayBuffer = new ArrayBuffer(10*elementSize + 1);
224 var goodArray = new constr(unalignedArrayBuffer, 0, 10);
225 assertSame(10, goodArray.length);
226 assertSame(10*elementSize, goodArray.byteLength);
227 assertThrows(function() { new constr(unalignedArrayBuffer)}, RangeError);
228 assertThrows(function() { new constr(unalignedArrayBuffer, 5*elementSize)},
229 RangeError);
230 }
231
232 var aFromString = new constr("30");
233 assertSame(elementSize, aFromString.BYTES_PER_ELEMENT);
234 assertSame(30, aFromString.length);
235 assertSame(30*elementSize, aFromString.byteLength);
236 assertSame(0, aFromString.byteOffset);
237 assertSame(30*elementSize, aFromString.buffer.byteLength);
238
239 var jsArray = [];
240 for (i = 0; i < 30; i++) {
241 jsArray.push(typicalElement);
242 }
243 var aFromArray = new constr(jsArray);
244 assertSame(elementSize, aFromArray.BYTES_PER_ELEMENT);
245 assertSame(30, aFromArray.length);
246 assertSame(30*elementSize, aFromArray.byteLength);
247 assertSame(0, aFromArray.byteOffset);
248 assertSame(30*elementSize, aFromArray.buffer.byteLength);
249 for (i = 0; i < 30; i++) {
250 assertSame(typicalElement, aFromArray[i]);
251 }
252
253 var abLen0 = new ArrayBuffer(0);
254 var aOverAbLen0 = new constr(abLen0);
255 assertSame(abLen0, aOverAbLen0.buffer);
256 assertSame(elementSize, aOverAbLen0.BYTES_PER_ELEMENT);
257 assertSame(0, aOverAbLen0.length);
258 assertSame(0, aOverAbLen0.byteLength);
259 assertSame(0, aOverAbLen0.byteOffset);
260
261 var aNoParam = new constr();
262 assertSame(elementSize, aNoParam.BYTES_PER_ELEMENT);
263 assertSame(0, aNoParam.length);
264 assertSame(0, aNoParam.byteLength);
265 assertSame(0, aNoParam.byteOffset);
266
267 var a = new constr(ab, 64*elementSize, 128);
268 assertEquals("[object " + constr.name + "]",
269 Object.prototype.toString.call(a));
270 var desc = Object.getOwnPropertyDescriptor(
271 constr.prototype.__proto__, Symbol.toStringTag);
272 assertTrue(desc.configurable);
273 assertFalse(desc.enumerable);
274 assertFalse(!!desc.writable);
275 assertFalse(!!desc.set);
276 assertEquals("function", typeof desc.get);
277
278 // Test that the constructor can be called with an iterable
279 function* gen() { for (var i = 0; i < 10; i++) yield i; }
280 var genArr = new constr(gen());
281 assertEquals(10, genArr.length);
282 assertEquals(0, genArr[0]);
283 assertEquals(9, genArr[9]);
284 // Arrays can be converted to TypedArrays
285 genArr = new constr([1, 2, 3]);
286 assertEquals(3, genArr.length);
287 assertEquals(1, genArr[0]);
288 assertEquals(3, genArr[2]);
289 // Redefining Array.prototype[Symbol.iterator] still works
290 var arrayIterator = Array.prototype[Symbol.iterator];
291 Array.prototype[Symbol.iterator] = gen;
292 genArr = new constr([1, 2, 3]);
293 assertEquals(10, genArr.length);
294 assertEquals(0, genArr[0]);
295 assertEquals(9, genArr[9]);
296 Array.prototype[Symbol.iterator] = arrayIterator;
297 // Other array-like things can be made into a TypedArray
298 var myObject = { 0: 5, 1: 6, length: 2 };
299 genArr = new constr(myObject);
300 assertEquals(2, genArr.length);
301 assertEquals(5, genArr[0]);
302 assertEquals(6, genArr[1]);
303 // Iterator takes precedence over array-like, and the property
304 // is read only once.
305 var iteratorReadCount = 0;
306 Object.defineProperty(myObject, Symbol.iterator, {
307 get: function() { iteratorReadCount++; return gen; }
308 });
309 genArr = new constr(myObject);
310 assertEquals(10, genArr.length);
311 assertEquals(0, genArr[0]);
312 assertEquals(9, genArr[9]);
313 assertEquals(1, iteratorReadCount);
314}
315
316TestTypedArray(Uint8Array, 1, 0xFF);
317TestTypedArray(Int8Array, 1, -0x7F);
318TestTypedArray(Uint16Array, 2, 0xFFFF);
319TestTypedArray(Int16Array, 2, -0x7FFF);
320TestTypedArray(Uint32Array, 4, 0xFFFFFFFF);
321TestTypedArray(Int32Array, 4, -0x7FFFFFFF);
322TestTypedArray(Float32Array, 4, 0.5);
323TestTypedArray(Float64Array, 8, 0.5);
324TestTypedArray(Uint8ClampedArray, 1, 0xFF);
325
326function SubarrayTestCase(constructor, item, expectedResultLen, expectedStartIndex,
327 initialLen, start, end) {
328 var a = new constructor(initialLen);
329 var s = a.subarray(start, end);
330 assertSame(constructor, s.constructor);
331 assertSame(expectedResultLen, s.length);
332 if (s.length > 0) {
333 s[0] = item;
334 assertSame(item, a[expectedStartIndex]);
335 }
336}
337
338function TestSubArray(constructor, item) {
339 SubarrayTestCase(constructor, item, 512, 512, 1024, 512, 1024);
340 SubarrayTestCase(constructor, item, 512, 512, 1024, 512);
341
342 SubarrayTestCase(constructor, item, 0, undefined, 0, 1, 20);
343 SubarrayTestCase(constructor, item, 100, 0, 100, 0, 100);
344 SubarrayTestCase(constructor, item, 100, 0, 100, 0, 1000);
345 SubarrayTestCase(constructor, item, 0, undefined, 100, 5, 1);
346
347 SubarrayTestCase(constructor, item, 1, 89, 100, -11, -10);
348 SubarrayTestCase(constructor, item, 9, 90, 100, -10, 99);
349 SubarrayTestCase(constructor, item, 0, undefined, 100, -10, 80);
350 SubarrayTestCase(constructor, item, 10,80, 100, 80, -10);
351
352 SubarrayTestCase(constructor, item, 10,90, 100, 90, "100");
353 SubarrayTestCase(constructor, item, 10,90, 100, "90", "100");
354
355 SubarrayTestCase(constructor, item, 0, undefined, 100, 90, "abc");
356 SubarrayTestCase(constructor, item, 10,0, 100, "abc", 10);
357
358 SubarrayTestCase(constructor, item, 10,0, 100, 0.96, 10.96);
359 SubarrayTestCase(constructor, item, 10,0, 100, 0.96, 10.01);
360 SubarrayTestCase(constructor, item, 10,0, 100, 0.01, 10.01);
361 SubarrayTestCase(constructor, item, 10,0, 100, 0.01, 10.96);
362
363
364 SubarrayTestCase(constructor, item, 10,90, 100, 90);
365 SubarrayTestCase(constructor, item, 10,90, 100, -10);
366
367 var method = constructor.prototype.subarray;
368 method.call(new constructor(100), 0, 100);
369 var o = {};
370 assertThrows(function() { method.call(o, 0, 100); }, TypeError);
371}
372
373TestSubArray(Uint8Array, 0xFF);
374TestSubArray(Int8Array, -0x7F);
375TestSubArray(Uint16Array, 0xFFFF);
376TestSubArray(Int16Array, -0x7FFF);
377TestSubArray(Uint32Array, 0xFFFFFFFF);
378TestSubArray(Int32Array, -0x7FFFFFFF);
379TestSubArray(Float32Array, 0.5);
380TestSubArray(Float64Array, 0.5);
381TestSubArray(Uint8ClampedArray, 0xFF);
382
383function TestTypedArrayOutOfRange(constructor, value, result) {
384 var a = new constructor(1);
385 a[0] = value;
386 assertSame(result, a[0]);
387}
388
389TestTypedArrayOutOfRange(Uint8Array, 0x1FA, 0xFA);
390TestTypedArrayOutOfRange(Uint8Array, -1, 0xFF);
391
392TestTypedArrayOutOfRange(Int8Array, 0x1FA, 0x7A - 0x80);
393
394TestTypedArrayOutOfRange(Uint16Array, 0x1FFFA, 0xFFFA);
395TestTypedArrayOutOfRange(Uint16Array, -1, 0xFFFF);
396TestTypedArrayOutOfRange(Int16Array, 0x1FFFA, 0x7FFA - 0x8000);
397
398TestTypedArrayOutOfRange(Uint32Array, 0x1FFFFFFFA, 0xFFFFFFFA);
399TestTypedArrayOutOfRange(Uint32Array, -1, 0xFFFFFFFF);
400TestTypedArrayOutOfRange(Int32Array, 0x1FFFFFFFA, 0x7FFFFFFA - 0x80000000);
401
402TestTypedArrayOutOfRange(Uint8ClampedArray, 0x1FA, 0xFF);
403TestTypedArrayOutOfRange(Uint8ClampedArray, -1, 0);
404
405var typedArrayConstructors = [
406 Uint8Array,
407 Int8Array,
408 Uint16Array,
409 Int16Array,
410 Uint32Array,
411 Int32Array,
412 Uint8ClampedArray,
413 Float32Array,
414 Float64Array];
415
416function TestPropertyTypeChecks(constructor) {
417 function CheckProperty(name) {
418 assertThrows(function() { 'use strict'; new constructor(10)[name] = 0; })
419 var d = Object.getOwnPropertyDescriptor(constructor.prototype.__proto__, name);
420 var o = {};
421 assertThrows(function() {d.get.call(o);}, TypeError);
422 for (var i = 0; i < typedArrayConstructors.length; i++) {
423 var ctor = typedArrayConstructors[i];
424 var a = new ctor(10);
425 d.get.call(a); // shouldn't throw
426 }
427 }
428
429 CheckProperty("buffer");
430 CheckProperty("byteOffset");
431 CheckProperty("byteLength");
432 CheckProperty("length");
433}
434
435for(i = 0; i < typedArrayConstructors.length; i++) {
436 TestPropertyTypeChecks(typedArrayConstructors[i]);
437}
438
439
440function TestTypedArraySet() {
441 // Test array.set in different combinations.
442
443 function assertArrayPrefix(expected, array) {
444 for (var i = 0; i < expected.length; ++i) {
445 assertEquals(expected[i], array[i]);
446 }
447 }
448
449 var a11 = new Int16Array([1, 2, 3, 4, 0, -1])
450 var a12 = new Uint16Array(15)
451 a12.set(a11, 3)
452 assertArrayPrefix([0, 0, 0, 1, 2, 3, 4, 0, 0xffff, 0, 0], a12)
453 assertThrows(function(){ a11.set(a12) })
454
455 var a21 = [1, undefined, 10, NaN, 0, -1, {valueOf: function() {return 3}}]
456 var a22 = new Int32Array(12)
457 a22.set(a21, 2)
458 assertArrayPrefix([0, 0, 1, 0, 10, 0, 0, -1, 3, 0], a22)
459
460 var a31 = new Float32Array([2, 4, 6, 8, 11, NaN, 1/0, -3])
461 var a32 = a31.subarray(2, 6)
462 a31.set(a32, 4)
463 assertArrayPrefix([2, 4, 6, 8, 6, 8, 11, NaN], a31)
464 assertArrayPrefix([6, 8, 6, 8], a32)
465
466 var a4 = new Uint8ClampedArray([3,2,5,6])
467 a4.set(a4)
468 assertArrayPrefix([3, 2, 5, 6], a4)
469
470 // Cases with overlapping backing store but different element sizes.
471 var b = new ArrayBuffer(4)
472 var a5 = new Int16Array(b)
473 var a50 = new Int8Array(b)
474 var a51 = new Int8Array(b, 0, 2)
475 var a52 = new Int8Array(b, 1, 2)
476 var a53 = new Int8Array(b, 2, 2)
477
478 a5.set([0x5050, 0x0a0a])
479 assertArrayPrefix([0x50, 0x50, 0x0a, 0x0a], a50)
480 assertArrayPrefix([0x50, 0x50], a51)
481 assertArrayPrefix([0x50, 0x0a], a52)
482 assertArrayPrefix([0x0a, 0x0a], a53)
483
484 a50.set([0x50, 0x50, 0x0a, 0x0a])
485 a51.set(a5)
486 assertArrayPrefix([0x50, 0x0a, 0x0a, 0x0a], a50)
487
488 a50.set([0x50, 0x50, 0x0a, 0x0a])
489 a52.set(a5)
490 assertArrayPrefix([0x50, 0x50, 0x0a, 0x0a], a50)
491
492 a50.set([0x50, 0x50, 0x0a, 0x0a])
493 a53.set(a5)
494 assertArrayPrefix([0x50, 0x50, 0x50, 0x0a], a50)
495
496 a50.set([0x50, 0x51, 0x0a, 0x0b])
497 a5.set(a51)
498 assertArrayPrefix([0x0050, 0x0051], a5)
499
500 a50.set([0x50, 0x51, 0x0a, 0x0b])
501 a5.set(a52)
502 assertArrayPrefix([0x0051, 0x000a], a5)
503
504 a50.set([0x50, 0x51, 0x0a, 0x0b])
505 a5.set(a53)
506 assertArrayPrefix([0x000a, 0x000b], a5)
507
508 // Mixed types of same size.
509 var a61 = new Float32Array([1.2, 12.3])
510 var a62 = new Int32Array(2)
511 a62.set(a61)
512 assertArrayPrefix([1, 12], a62)
513 a61.set(a62)
514 assertArrayPrefix([1, 12], a61)
515
516 // Invalid source
517 var a = new Uint16Array(50);
518 var expected = [];
519 for (i = 0; i < 50; i++) {
520 a[i] = i;
521 expected.push(i);
522 }
523 a.set({});
524 assertArrayPrefix(expected, a);
525 assertThrows(function() { a.set.call({}) }, TypeError);
526 assertThrows(function() { a.set.call([]) }, TypeError);
527
528 assertThrows(function() { a.set(0); }, TypeError);
529 assertThrows(function() { a.set(0, 1); }, TypeError);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100530
531 assertEquals(1, a.set.length);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000532}
533
534TestTypedArraySet();
535
536function TestTypedArraysWithIllegalIndices() {
537 var a = new Int32Array(100);
538
539 a[-10] = 10;
540 assertEquals(undefined, a[-10]);
541 a["-10"] = 10;
542 assertEquals(undefined, a["-10"]);
543
544 var s = " -10";
545 a[s] = 10;
546 assertEquals(10, a[s]);
547 var s1 = " -10 ";
548 a[s] = 10;
549 assertEquals(10, a[s]);
550
551 a["-1e2"] = 10;
552 assertEquals(10, a["-1e2"]);
553 assertEquals(undefined, a[-1e2]);
554
555 a["-0"] = 256;
556 var s2 = " -0";
557 a[s2] = 255;
558 assertEquals(undefined, a["-0"]);
559 assertEquals(255, a[s2]);
560 assertEquals(0, a[-0]);
561
562 a[-Infinity] = 50;
563 assertEquals(undefined, a[-Infinity]);
564
565 a[1.5] = 10;
566 assertEquals(undefined, a[1.5]);
567 var nan = Math.sqrt(-1);
568 a[nan] = 5;
569 assertEquals(undefined, a[nan]);
570
571 var x = 0;
572 var y = -0;
573 assertEquals(Infinity, 1/x);
574 assertEquals(-Infinity, 1/y);
575 a[x] = 5;
576 a[y] = 27;
577 assertEquals(27, a[x]);
578 assertEquals(27, a[y]);
579}
580
581TestTypedArraysWithIllegalIndices();
582
583function TestTypedArraysWithIllegalIndicesStrict() {
584 'use strict';
585 var a = new Int32Array(100);
586
587 a[-10] = 10;
588 assertEquals(undefined, a[-10]);
589 a["-10"] = 10;
590 assertEquals(undefined, a["-10"]);
591
592 var s = " -10";
593 a[s] = 10;
594 assertEquals(10, a[s]);
595 var s1 = " -10 ";
596 a[s] = 10;
597 assertEquals(10, a[s]);
598
599 a["-1e2"] = 10;
600 assertEquals(10, a["-1e2"]);
601 assertEquals(undefined, a[-1e2]);
602
603 a["-0"] = 256;
604 var s2 = " -0";
605 a[s2] = 255;
606 assertEquals(undefined, a["-0"]);
607 assertEquals(255, a[s2]);
608 assertEquals(0, a[-0]);
609
610 /* Chromium bug: 424619
611 * a[-Infinity] = 50;
612 * assertEquals(undefined, a[-Infinity]);
613 */
614 a[1.5] = 10;
615 assertEquals(undefined, a[1.5]);
616 var nan = Math.sqrt(-1);
617 a[nan] = 5;
618 assertEquals(undefined, a[nan]);
619
620 var x = 0;
621 var y = -0;
622 assertEquals(Infinity, 1/x);
623 assertEquals(-Infinity, 1/y);
624 a[x] = 5;
625 a[y] = 27;
626 assertEquals(27, a[x]);
627 assertEquals(27, a[y]);
628}
629
630TestTypedArraysWithIllegalIndicesStrict();
631
632// DataView
633function TestDataViewConstructor() {
634 var ab = new ArrayBuffer(256);
635
636 var d1 = new DataView(ab, 1, 255);
637 assertTrue(ArrayBuffer.isView(d1));
638 assertSame(ab, d1.buffer);
639 assertSame(1, d1.byteOffset);
640 assertSame(255, d1.byteLength);
641
642 var d2 = new DataView(ab, 2);
643 assertSame(ab, d2.buffer);
644 assertSame(2, d2.byteOffset);
645 assertSame(254, d2.byteLength);
646
647 var d3 = new DataView(ab);
648 assertSame(ab, d3.buffer);
649 assertSame(0, d3.byteOffset);
650 assertSame(256, d3.byteLength);
651
652 var d3a = new DataView(ab, 1, 0);
653 assertSame(ab, d3a.buffer);
654 assertSame(1, d3a.byteOffset);
655 assertSame(0, d3a.byteLength);
656
657 var d3b = new DataView(ab, 256, 0);
658 assertSame(ab, d3b.buffer);
659 assertSame(256, d3b.byteOffset);
660 assertSame(0, d3b.byteLength);
661
662 var d3c = new DataView(ab, 256);
663 assertSame(ab, d3c.buffer);
664 assertSame(256, d3c.byteOffset);
665 assertSame(0, d3c.byteLength);
666
667 var d4 = new DataView(ab, 1, 3.1415926);
668 assertSame(ab, d4.buffer);
669 assertSame(1, d4.byteOffset);
670 assertSame(3, d4.byteLength);
671
672
673 // error cases
674 assertThrows(function() { new DataView(ab, -1); }, RangeError);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000675 assertThrows(function() { new DataView(); }, TypeError);
676 assertThrows(function() { new DataView([]); }, TypeError);
677 assertThrows(function() { new DataView(ab, 257); }, RangeError);
678 assertThrows(function() { new DataView(ab, 1, 1024); }, RangeError);
679}
680
681TestDataViewConstructor();
682
683function TestDataViewPropertyTypeChecks() {
684 var a = new DataView(new ArrayBuffer(10));
685 function CheckProperty(name) {
686 var d = Object.getOwnPropertyDescriptor(DataView.prototype, name);
687 var o = {}
688 assertThrows(function() {d.get.call(o);}, TypeError);
689 d.get.call(a); // shouldn't throw
690 }
691
692 CheckProperty("buffer");
693 CheckProperty("byteOffset");
694 CheckProperty("byteLength");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100695
696 function CheckGetSetLength(name) {
697 assertEquals(1, DataView.prototype["get" + name].length);
698 assertEquals(2, DataView.prototype["set" + name].length);
699 }
700 CheckGetSetLength("Int8");
701 CheckGetSetLength("Uint8");
702 CheckGetSetLength("Int16");
703 CheckGetSetLength("Uint16");
704 CheckGetSetLength("Int32");
705 CheckGetSetLength("Uint32");
706 CheckGetSetLength("Float32");
707 CheckGetSetLength("Float64");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000708}
709
710
711TestDataViewPropertyTypeChecks();
712
713
714function TestDataViewToStringTag() {
715 var a = new DataView(new ArrayBuffer(10));
716 assertEquals("[object DataView]", Object.prototype.toString.call(a));
717 var desc = Object.getOwnPropertyDescriptor(
718 DataView.prototype, Symbol.toStringTag);
719 assertTrue(desc.configurable);
720 assertFalse(desc.enumerable);
721 assertFalse(desc.writable);
722 assertEquals("DataView", desc.value);
723}
724
725
726// General tests for properties
727
728// Test property attribute [[Enumerable]]
729function TestEnumerable(func, obj) {
730 function props(x) {
731 var array = [];
732 for (var p in x) array.push(p);
733 return array.sort();
734 }
735 assertArrayEquals([], props(func));
736 assertArrayEquals([], props(func.prototype));
737 if (obj)
738 assertArrayEquals([], props(obj));
739}
740TestEnumerable(ArrayBuffer, new ArrayBuffer());
741for(i = 0; i < typedArrayConstructors.length; i++) {
742 TestEnumerable(typedArrayConstructors[i]);
743}
744TestEnumerable(DataView, new DataView(new ArrayBuffer()));
745
746// Test arbitrary properties on ArrayBuffer
747function TestArbitrary(m) {
748 function TestProperty(map, property, value) {
749 map[property] = value;
750 assertEquals(value, map[property]);
751 }
752 for (var i = 0; i < 20; i++) {
753 TestProperty(m, 'key' + i, 'val' + i);
754 TestProperty(m, 'foo' + i, 'bar' + i);
755 }
756}
757TestArbitrary(new ArrayBuffer(256));
758for(i = 0; i < typedArrayConstructors.length; i++) {
759 TestArbitrary(new typedArrayConstructors[i](10));
760}
761TestArbitrary(new DataView(new ArrayBuffer(256)));
762
763
764// Test direct constructor call
765assertThrows(function() { ArrayBuffer(); }, TypeError);
766assertThrows(function() { DataView(new ArrayBuffer()); }, TypeError);
767
768function TestNonConfigurableProperties(constructor) {
769 var arr = new constructor([100])
770 assertFalse(Object.getOwnPropertyDescriptor(arr,"0").configurable)
771 assertFalse(delete arr[0])
772}
773
774for(i = 0; i < typedArrayConstructors.length; i++) {
775 TestNonConfigurableProperties(typedArrayConstructors[i]);
776}