// Copyright (c) 2019, 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.

// @dart = 2.9

import 'dart:typed_data';

import 'package:expect/expect.dart';

const interestingLengths = <int>[
  0x3FFFFFFF00000000,
  0x3FFFFFFFFFFFFFF0,
  0x3FFFFFFFFFFFFFFE,
  0x3FFFFFFFFFFFFFFF,
  0x7FFFFFFF00000000,
  0x7FFFFFFFFFFFFFF0,
  0x7FFFFFFFFFFFFFFE,
  0x7FFFFFFFFFFFFFFF,
];

main() {
  for (int interestingLength in interestingLengths) {
    bool exceptionCheck(e) {
      // Allow RangeError as the range check may happen before the allocation.
      return e is RangeError || e is OutOfMemoryError;
    }

    print(interestingLength);

    Expect.throws(() {
      var bytearray = new Uint8List(interestingLength);
      print(bytearray.first);
    }, exceptionCheck);

    Expect.throws(() {
      var bytearray = new Uint8ClampedList(interestingLength);
      print(bytearray.first);
    }, exceptionCheck);

    Expect.throws(() {
      var bytearray = new Int8List(interestingLength);
      print(bytearray.first);
    }, exceptionCheck);

    Expect.throws(() {
      var bytearray = new ByteData(interestingLength);
      print(bytearray.getUint8(0));
    }, exceptionCheck);
  }
}
