// Copyright 2020 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
// Files: tools/clusterfuzz/v8_mock.js
// Files: tools/clusterfuzz/v8_mock_archs.js

// Test foozzie architecture-specific mocks for differential fuzzing.

// Max typed array length is mocked and restricted to 1MiB buffer.
const maxBytes = 1048576;

// The maximum also holds for array buffer and shared array buffer.
assertEquals(maxBytes, new ArrayBuffer(maxBytes + 1).byteLength);
assertEquals(maxBytes, new SharedArrayBuffer(maxBytes + 1).byteLength);

function testArrayType(type) {
  const name = type.name;
  const bytesPerElem = type.BYTES_PER_ELEMENT;
  const maxElem = maxBytes / bytesPerElem;

  function testLength(expectedLength, arr) {
    const expectedBytes = expectedLength * bytesPerElem;
    assertEquals(expectedBytes, arr.byteLength, name);
    assertEquals(expectedLength, arr.length, name);
  }

  // Test length argument in constructor.
  testLength(maxElem - 1, new type(maxElem - 1));
  testLength(maxElem, new type(maxElem));
  testLength(maxElem, new type(maxElem + 1));

  // Test buffer argument in constructor.
  // Unaligned offsets don't throw.
  const buffer = new ArrayBuffer(maxBytes);
  new type(buffer, 1);
  new type(buffer, 3);

  // Offsets work or are capped.
  function bytes(elements) {
    return elements * bytesPerElem;
  }
  testLength(maxElem, new type(buffer, 0));
  testLength(maxElem - 1, new type(buffer, bytes(1)));
  testLength(1, new type(buffer, bytes(maxElem - 1)));
  testLength(0, new type(buffer, bytes(maxElem)));
  testLength(0, new type(buffer, bytes(maxElem + 1)));

  // Offset and length work or are capped.
  testLength(1, new type(buffer, 0, 1));
  testLength(1, new type(buffer, bytesPerElem, 1));
  testLength(maxElem - 2, new type(buffer, bytes(1), maxElem - 2));
  testLength(maxElem - 1, new type(buffer, bytes(1), maxElem - 1));
  testLength(maxElem - 1, new type(buffer, bytes(1), maxElem));
  testLength(0, new type(buffer, bytes(maxElem - 1), 0));
  testLength(1, new type(buffer, bytes(maxElem - 1), 1));
  testLength(1, new type(buffer, bytes(maxElem - 1), 2));

  // Insertion with "set" works or is capped.
  let set0 = 0;
  let set1 = 1;
  if (name.startsWith("Big")) {
    set0 = 0n;
    set1 = 1n;
  }
  arr = new type(4);
  arr.set([set1], 1);
  assertEquals(new type([set0, set1, set0, set0]), arr, name);
  arr.set([set1, set1], 3);  // Capped to 2.
  assertEquals(new type([set0, set1, set1, set1]), arr, name);
}

testArrayType(Int8Array);
testArrayType(Uint8Array);
testArrayType(Uint8ClampedArray);
testArrayType(Int16Array);
testArrayType(Uint16Array);
testArrayType(Int32Array);
testArrayType(Uint32Array);
testArrayType(BigInt64Array);
testArrayType(BigUint64Array);
testArrayType(Float32Array);
testArrayType(Float64Array);
