typedarray-reverse.js 1.75 KB
Newer Older
1 2 3 4
// 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.

5 6
// Flags: --allow-natives-syntax

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
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);
56 57 58 59 60 61 62

  // 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);
  }
63
}