blob: bfeb227c5c4128050d702a7434d0d044076e150f [file] [log] [blame]
// 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.
// Flags: --allow-natives-syntax
function ArrayMaker(x) {
return x;
}
ArrayMaker.prototype = Array.prototype;
var arrayConstructors = [
Uint8Array,
Int8Array,
Uint16Array,
Int16Array,
Uint32Array,
Int32Array,
Uint8ClampedArray,
Float32Array,
Float64Array,
ArrayMaker // Also test arrays
];
function assertArrayLikeEquals(value, expected, 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 arrayConstructors) {
// Test reversing both even and odd length arrays
var a = new constructor([1, 2, 3]);
assertArrayLikeEquals(a.reverse(), [3, 2, 1], constructor);
assertArrayLikeEquals(a, [3, 2, 1], constructor);
a = new constructor([1, 2, 3, 4]);
assertArrayLikeEquals(a.reverse(), [4, 3, 2, 1], constructor);
assertArrayLikeEquals(a, [4, 3, 2, 1], constructor);
if (constructor != ArrayMaker) {
// Cannot be called on objects which are not TypedArrays
assertThrows(function () { a.reverse.call({ length: 0 }); }, TypeError);
} else {
// Array.reverse works on array-like objects
var x = { length: 2, 1: 5 };
a.reverse.call(x);
assertEquals(2, x.length);
assertFalse(Object.hasOwnProperty(x, '1'));
assertEquals(5, x[0]);
}
assertEquals(0, a.reverse.length);
// Detached Operation
if (constructor != ArrayMaker) {
var array = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
%ArrayBufferNeuter(array.buffer);
assertThrows(() => array.reverse(), TypeError);
}
}