// 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) {
    print(interestingLength);

    Expect.throws(() {
      var bytearray = new Uint8List(interestingLength);
      print(bytearray.first);
    }, (e) => e is OutOfMemoryError);

    Expect.throws(() {
      var bytearray = new Uint8ClampedList(interestingLength);
      print(bytearray.first);
    }, (e) => e is OutOfMemoryError);

    Expect.throws(() {
      var bytearray = new Int8List(interestingLength);
      print(bytearray.first);
    }, (e) => e is OutOfMemoryError);

    Expect.throws(() {
      var bytearray = new ByteData(interestingLength);
      print(bytearray.getUint8(0));
    }, (e) => e is OutOfMemoryError);
  }
}
