// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-typedarray-buffer-byteoffset-length
description: >
  ToIndex(byteOffset) operations
info: |
  22.2.4.5 TypedArray ( buffer [ , byteOffset [ , length ] ] )

  This description applies only if the TypedArray function is called with at
  least one argument and the Type of the first argument is Object and that
  object has an [[ArrayBufferData]] internal slot.

  ...
  7. Let offset be ? ToIndex(byteOffset).
  8. If offset modulo elementSize ≠ 0, throw a RangeError exception.
  ...
includes: [testBigIntTypedArray.js]
features: [BigInt, TypedArray]
---*/

var buffer = new ArrayBuffer(16);

var obj1 = {
  valueOf: function() {
    return 8;
  }
};

var obj2 = {
  toString: function() {
    return 8;
  }
};

var items = [
  [-0, 0, "-0"],
  [obj1, 8, "object's valueOf"],
  [obj2, 8, "object's toString"],
  ["", 0, "the Empty string"],
  ["0", 0, "string '0'"],
  ["8", 8, "string '8'"],
  [false, 0, "false"],
  [NaN, 0, "NaN"],
  [null, 0, "null"],
  [undefined, 0, "undefined"],
  [0.1, 0, "0.1"],
  [0.9, 0, "0.9"],
  [8.1, 8, "8.1"],
  [8.9, 8, "8.9"],
  [-0.1, 0, "-0.1"],
  [-0.99999, 0, "-0.99999"]
];

testWithBigIntTypedArrayConstructors(function(TA) {
  items.forEach(function(item) {
    var offset = item[0];
    var expected = item[1];
    var name = item[2];

    var typedArray = new TA(buffer, offset);
    assert.sameValue(typedArray.byteOffset, expected, name + " byteOffset");
    assert.sameValue(typedArray.constructor, TA, name + " constructor");
    assert.sameValue(
      Object.getPrototypeOf(typedArray),
      TA.prototype,
      name + " prototype"
    );
  });

  // Testing `true`. See step 8
  if (TA.BYTES_PER_ELEMENT === 1) {
    var typedArray = new TA(buffer, true);
    assert.sameValue(typedArray.byteOffset, 1, "true => 1 byteOffset");
    assert.sameValue(typedArray.constructor, TA, "true => 1 constructor");
    assert.sameValue(
      Object.getPrototypeOf(typedArray),
      TA.prototype,
      "true => 1 prototype"
    );
  } else {
    assert.throws(RangeError, function() {
      new TA(buffer, true);
    }, "1 modulo elementSize ≠ 0, throws a RangeError");
  }
});
