/*
 * Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * @assertion Int32List asInt32List([int offsetInBytes = 0, int length ])
 * Creates a Int32List view of a region of this byte buffer.
 * ...
 * The start index and length must describe a valid 32-bit aligned range of the
 * buffer:
 * - offsetInBytes must not be negative,
 * - offsetInBytes must be divisible by four,
 * - length must not be negative, and
 * - offsetInBytes + length * 4 must not be greater than lengthInBytes.
 * @description Checks that creating Int32List view with negative offset,
 * with offset not divisible by four, with negative length, or with
 * 'offsetInBytes + length * 4' greater then buffer length causes throwing
 * error at runtime.
 * @author ngl@unipro.ru
 */

import "dart:typed_data";
import "../../../Utils/expect.dart";

void check(ByteBuffer buffer) {
  int shift = (Int32List.bytesPerElement == 4) ? 2 : 0;
  // creates Int32List view with negative offset
  Expect.throws(() {
    buffer.asInt32List(-1);
  });
  // creates Int32List view with offset not divisible by four
  Expect.throws(() {
    buffer.asInt32List(1);
  });
  // creates Int32List view with negative length
  Expect.throws(() {
    buffer.asInt32List(0, -8);
  });
  // creates Int32List view with 'offsetInBytes + length * 4'
  // greater then buffer length
  Expect.throws(() {
    buffer.asInt32List(4, buffer.lengthInBytes >> shift);
  });
}

main() {
  var list2 = new List.filled(8, 0);
  var list4 = new Int32x4List(6);

  check((new Int8List.fromList(list2)).buffer);
  check((new Int16List.fromList(list2)).buffer);
  check((new Int32List.fromList(list2)).buffer);
  check((new Int64List.fromList(list2)).buffer);
  check((new Int32x4List.fromList(list4)).buffer);
}
