// 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  Float64List asFloat64List([int offsetInBytes = 0, int length ])
/// Creates a Float64List view of a region of this byte buffer.
/// ...
/// The start index and length must describe a valid 64-bit aligned range of the
/// buffer:
/// - offsetInBytes must not be negative,
/// - offsetInBytes must be divisible by eight,
/// - length must not be negative, and
/// - offsetInBytes + length * 8 must not be greater than lengthInBytes.
///
/// @description Checks that creating Float64List view with negative offset,
/// with offset not divisible by eight, with negative length, or with
/// 'offsetInBytes + length * 8' 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 = (Float64List.bytesPerElement == 8) ? 3 : 0;
  // creates Float64List view with negative offset
  Expect.throws(() {
    buffer.asFloat64List(-8);
  });
  // creates Float64List view with offset not divisible by four
  Expect.throws(() {
    buffer.asFloat64List(1);
  });
  // creates Float64List view with negative length
  Expect.throws(() {
    buffer.asFloat64List(0, -8);
  });
  // creates Float64List view with 'offsetInBytes + length * 4'
  // greater then buffer length
  Expect.throws(() {
    buffer.asFloat64List(8, 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);
}
