// 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 Int16List asInt16List([int offsetInBytes = 0, int length ])
/// Creates a Int16List view of a region of this byte buffer.
/// ...
/// The start index and length must describe a valid 16-bit aligned range of the
/// buffer:
/// - offsetInBytes must not be negative,
/// - offsetInBytes must be divisible by two,
/// - length must not be negative, and
/// - offsetInBytes + length * 2 must not be greater than lengthInBytes.
/// @description Checks that creating Int16List view with negative offset,
/// with offset not divisible by four, with negative length, or with
/// 'offsetInBytes + length * 2' 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 = (Int16List.bytesPerElement == 2) ? 1 : 0;
  // creates Int16List view with negative offset
  Expect.throws(() {
    buffer.asInt16List(-2);
  });
  // creates Int16List view with offset not divisible by two
  Expect.throws(() {
    buffer.asInt16List(1);
  });
  // creates Int16List view with negative length
  Expect.throws(() {
    buffer.asInt16List(0, -8);
  });
  // creates Int16List view with 'offsetInBytes + length * 2'
  // greater then buffer length
  Expect.throws(() {
    buffer.asInt16List(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);
  if (!isJS) {
    check((new Int64List.fromList(list2)).buffer);
  }
  check((new Int32x4List.fromList(list4)).buffer);
}
