// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Tests for standard TypedArray array iteration functions. // Flags: --allow-natives-syntax var typedArrayConstructors = [ Uint8Array, Int8Array, Uint16Array, Int16Array, Uint32Array, Int32Array, Uint8ClampedArray, Float32Array, Float64Array ]; function assertArrayLikeEquals(expected, value, type) { assertEquals(value.__proto__, type.prototype); assertEquals(expected.length, value.length); for (var i = 0; i < value.length; ++i) { assertEquals(expected[i], value[i]); } } for (var constructor of typedArrayConstructors) { (function TypedArrayFilterTest() { // Simple use. var a = new constructor([0, 1]); assertArrayLikeEquals([0], a.filter(function(n) { return n == 0; }), constructor); assertArrayLikeEquals([0, 1], a, constructor); // Use specified object as this object when calling the function. var o = { value: 42 } a = new constructor([1, 42, 3, 42, 4]); assertArrayLikeEquals([42, 42], a.filter(function(n) { return this.value == n }, o), constructor); // Modify original array. a = new constructor([1, 42, 3, 42, 4]); assertArrayLikeEquals([42, 42], a.filter(function(n, index, array) { array[index] = 43; return 42 == n; }), constructor); assertArrayLikeEquals([43, 43, 43, 43, 43], a, constructor); // Create a new object in each function call when receiver is a // primitive value. See ECMA-262, Annex C. a = []; new constructor([1, 2]).filter(function() { a.push(this) }, ''); assertTrue(a[0] !== a[1]); // Do not create a new object otherwise. a = []; new constructor([1, 2]).filter(function() { a.push(this) }, {}); assertEquals(a[0], a[1]); // In strict mode primitive values should not be coerced to an object. a = []; new constructor([1, 2]).filter(function() { 'use strict'; a.push(this); }, ''); assertEquals('', a[0]); assertEquals(a[0], a[1]); // Calling this method on other types is a TypeError assertThrows(function() { constructor.prototype.filter.call([], function() {}); }, TypeError); // Shadowing the length property doesn't change anything a = new constructor([1, 2]); Object.defineProperty(a, 'length', { value: 1 }); assertArrayLikeEquals([2], a.filter(function(elt) { return elt == 2; }), constructor); // Detached Operation var array = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); %ArrayBufferDetach(array.buffer); assertThrows(() => array.filter(() => false), TypeError); })(); (function TypedArrayMapTest() { var a = new constructor([0, 1, 2, 3, 4]); // Simple use. var result = [1, 2, 3, 4, 5]; assertArrayLikeEquals(result, a.map(function(n) { return n + 1; }), constructor); assertEquals(a, a); // Use specified object as this object when calling the function. var o = { delta: 42 } result = [42, 43, 44, 45, 46]; assertArrayLikeEquals(result, a.map(function(n) { return this.delta + n; }, o), constructor); // Modify original array. a = new constructor([0, 1, 2, 3, 4]); result = [1, 2, 3, 4, 5]; assertArrayLikeEquals(result, a.map(function(n, index, array) { array[index] = n + 1; return n + 1; }), constructor); assertArrayLikeEquals(result, a, constructor); // Create a new object in each function call when receiver is a // primitive value. See ECMA-262, Annex C. a = []; new constructor([1, 2]).map(function() { a.push(this) }, ''); assertTrue(a[0] !== a[1]); // Do not create a new object otherwise. a = []; new constructor([1, 2]).map(function() { a.push(this) }, {}); assertEquals(a[0], a[1]); // In strict mode primitive values should not be coerced to an object. a = []; new constructor([1, 2]).map(function() { 'use strict'; a.push(this); }, ''); assertEquals('', a[0]); assertEquals(a[0], a[1]); // Test that the result is converted to the right type assertArrayLikeEquals([3, 3], new constructor([1, 2]).map(function() { return "3"; }), constructor); if (constructor !== Float32Array && constructor !== Float64Array) { assertArrayLikeEquals([0, 0], new constructor([1, 2]).map(function() { return NaN; }), constructor); } // Detached Operation var array = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); %ArrayBufferDetach(array.buffer); assertThrows(() => array.map((v) => v), TypeError); })(); // // %TypedArray%.prototype.some // (function TypedArraySomeTest() { var a = new constructor([0, 1, 2, 3, 4]); // Simple use. assertTrue(a.some(function(n) { return n == 3})); assertFalse(a.some(function(n) { return n == 5})); // Use specified object as this object when calling the function. var o = { element: 42 }; a = new constructor([1, 42, 3]); assertTrue(a.some(function(n) { return this.element == n; }, o)); a = new constructor([1]); assertFalse(a.some(function(n) { return this.element == n; }, o)); // Modify original array. a = new constructor([0, 1, 2, 3]); assertTrue(a.some(function(n, index, array) { array[index] = n + 1; return n == 2; })); assertArrayLikeEquals([1, 2, 3, 3], a, constructor); // Create a new object in each function call when receiver is a // primitive value. See ECMA-262, Annex C. a = []; new constructor([1, 2]).some(function() { a.push(this) }, ''); assertTrue(a[0] !== a[1]); // Do not create a new object otherwise. a = []; new constructor([1, 2]).some(function() { a.push(this) }, {}); assertEquals(a[0], a[1]); // In strict mode primitive values should not be coerced to an object. a = []; new constructor([1, 2]).some(function() { 'use strict'; a.push(this); }, ''); assertEquals('', a[0]); assertEquals(a[0], a[1]); // Calling this method on other types is a TypeError assertThrows(function() { constructor.prototype.some.call([], function() {}); }, TypeError); // Shadowing the length property doesn't change anything a = new constructor([1, 2]); Object.defineProperty(a, 'length', { value: 1 }); assertEquals(true, a.some(function(elt) { return elt == 2; })); assertEquals(false, Array.prototype.some.call(a, function(elt) { return elt == 2; })); // Detached Operation var array = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); %ArrayBufferDetach(array.buffer); assertThrows(() => array.some((v) => false), TypeError); })(); }