// Copyright (c) 2012, 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.
// VMOptions=--optimization_counter_threshold=10 --disable_alloc_stubs_after_gc --no-background-compilation

// Library tag to be able to run in html test framework.
library byte_array_test;

import "package:expect/expect.dart";
import 'dart:typed_data';

class ByteArrayTest {
  static testInt8ListImpl(Int8List array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(10, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(10, array.lengthInBytes);
    Expect.listEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], array);
    Expect.throws(() {
      array[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x100 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -10 + i;
    }
    Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x7F - i;
    }
    Expect
        .listEquals([127, 126, 125, 124, 123, 122, 121, 120, 119, 118], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -0x80 + i;
    }
    Expect.listEquals(
        [-128, -127, -126, -125, -124, -123, -122, -121, -120, -119], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = i;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Int8List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Int8List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    array.setRange(3, 7, [-128, 0, 1, 127]);
    Expect.listEquals([0, 1, 2, -128, 0, 1, 127, 7, 8, 9], array);
  }

  static testInt8List() {
    Expect.throws(() {
      new Int8List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Int8List(10);
    testInt8ListImpl(array);
  }

  static testUint8ListImpl(Uint8List array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(10, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(10, array.lengthInBytes);
    Expect.listEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], array);
    Expect.throws(() {
      array[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x100 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFF - i;
    }
    Expect.listEquals(
        [0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = i;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Uint8List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Uint8List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    array.setRange(3, 7, [257, 0, 1, 255]);
    Expect.listEquals([0, 1, 2, 1, 0, 1, 255, 7, 8, 9], array);
  }

  static testUint8List() {
    Expect.throws(() {
      new Uint8List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Uint8List(10);
    testUint8ListImpl(array);
  }

  static testUint8ClampedListImpl(Uint8ClampedList array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(10, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(10, array.lengthInBytes);
    Expect.listEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], array);
    Expect.throws(() {
      array[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = -1 + i;
    }
    Expect.listEquals([0, 0, 1, 2, 3, 4, 5, 6, 7, 8], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x100 + i;
    }
    Expect
        .listEquals([255, 255, 255, 255, 255, 255, 255, 255, 255, 255], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFF - i;
    }
    Expect.listEquals(
        [0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = i;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Uint8ClampedList);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Uint8ClampedList);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    array.setRange(3, 7, [257, 0, 1, 255]);
    Expect.listEquals([0, 1, 2, 255, 0, 1, 255, 7, 8, 9], array);
  }

  static testUint8ClampedList() {
    Expect.throws(() {
      new Uint8ClampedList(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Uint8ClampedList(10);
    testUint8ClampedListImpl(array);
  }

  static testInt16ListImpl(Int16List array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(10, array.length);
    Expect.equals(2, array.elementSizeInBytes);
    Expect.equals(20, array.lengthInBytes);
    Expect.listEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], array);
    Expect.throws(() {
      array[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x10000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -10 + i;
    }
    Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x7FFF - i;
    }
    Expect.listEquals([
      0x7FFF,
      0x7FFE,
      0x7FFD,
      0x7FFC,
      0x7FFB,
      0x7FFA,
      0x7FF9,
      0x7FF8,
      0x7FF7,
      0x7FF6
    ], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -0x8000 + i;
    }
    Expect.listEquals([
      -0x8000,
      -0x7FFF,
      -0x7FFE,
      -0x7FFD,
      -0x7FFC,
      -0x7FFB,
      -0x7FFA,
      -0x7FF9,
      -0x7FF8,
      -0x7FF7
    ], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = i;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Int16List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Int16List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    array.setRange(3, 7, [-32768, 0, 1, 32767]);
    Expect.listEquals([0, 1, 2, -32768, 0, 1, 32767, 7, 8, 9], array);
  }

  static testInt16List() {
    Expect.throws(() {
      new Int16List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Int16List(10);
    testInt16ListImpl(array);
  }

  static testUint16ListImpl(Uint16List array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(10, array.length);
    Expect.equals(2, array.elementSizeInBytes);
    Expect.equals(20, array.lengthInBytes);
    Expect.listEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], array);
    Expect.throws(() {
      array[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x10000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFFFF - i;
    }
    Expect.listEquals([
      0xFFFF,
      0xFFFE,
      0xFFFD,
      0xFFFC,
      0xFFFB,
      0xFFFA,
      0xFFF9,
      0xFFF8,
      0xFFF7,
      0xFFF6
    ], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = i;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Uint16List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Uint16List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    array.setRange(3, 7, [0x10001, 0, 1, 0xFFFF]);
    Expect.listEquals([0, 1, 2, 1, 0, 1, 0xFFFF, 7, 8, 9], array);
  }

  static testUint16List() {
    Expect.throws(() {
      new Uint16List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Uint16List(10);
    testUint16ListImpl(array);
  }

  static testInt32ListImpl(Int32List array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(10, array.length);
    Expect.equals(4, array.elementSizeInBytes);
    Expect.equals(40, array.lengthInBytes);
    Expect.listEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], array);
    Expect.throws(() {
      array[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x100000000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -10 + i;
    }
    Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x7FFFFFFF - i;
    }
    Expect.listEquals([
      0x7FFFFFFF,
      0x7FFFFFFE,
      0x7FFFFFFD,
      0x7FFFFFFC,
      0x7FFFFFFB,
      0x7FFFFFFA,
      0x7FFFFFF9,
      0x7FFFFFF8,
      0x7FFFFFF7,
      0x7FFFFFF6
    ], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -0x80000000 + i;
    }
    Expect.listEquals([
      -0x80000000,
      -0x7FFFFFFF,
      -0x7FFFFFFE,
      -0x7FFFFFFD,
      -0x7FFFFFFC,
      -0x7FFFFFFB,
      -0x7FFFFFFA,
      -0x7FFFFFF9,
      -0x7FFFFFF8,
      -0x7FFFFFF7
    ], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = i;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Int32List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Int32List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    array.setRange(3, 7, [-0x80000000, 0, 1, 0x7FFFFFFF]);
    Expect.listEquals([0, 1, 2, -0x80000000, 0, 1, 0x7FFFFFFF, 7, 8, 9], array);
  }

  static testInt32List() {
    Expect.throws(() {
      new Int32List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Int32List(10);
    testInt32ListImpl(array);
  }

  static testUint32ListImpl(Uint32List array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(10, array.length);
    Expect.equals(4, array.elementSizeInBytes);
    Expect.equals(40, array.lengthInBytes);
    Expect.listEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], array);
    Expect.throws(() {
      array[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x100000000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFFFFFFFF - i;
    }
    Expect.listEquals([
      0xFFFFFFFF,
      0xFFFFFFFE,
      0xFFFFFFFD,
      0xFFFFFFFC,
      0xFFFFFFFB,
      0xFFFFFFFA,
      0xFFFFFFF9,
      0xFFFFFFF8,
      0xFFFFFFF7,
      0xFFFFFFF6
    ], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = i;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Uint32List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Uint32List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    array.setRange(3, 7, [0x100000001, 0, 1, 0xFFFFFFFF]);
    Expect.listEquals([0, 1, 2, 1, 0, 1, 0xFFFFFFFF, 7, 8, 9], array);
  }

  static testUint32List() {
    Expect.throws(() {
      new Uint32List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    Expect.throws(() {
      new Uint32List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Uint32List(10);
    testUint32ListImpl(array);
  }

  static testInt64ListImpl(Int64List array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(10, array.length);
    Expect.equals(8, array.elementSizeInBytes);
    Expect.equals(80, array.lengthInBytes);
    Expect.listEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], array);
    Expect.throws(() {
      array[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -10 + i;
    }
    Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0x7FFFFFFFFFFFFFFF - i;
    }
    Expect.listEquals([
      0x7FFFFFFFFFFFFFFF,
      0x7FFFFFFFFFFFFFFE,
      0x7FFFFFFFFFFFFFFD,
      0x7FFFFFFFFFFFFFFC,
      0x7FFFFFFFFFFFFFFB,
      0x7FFFFFFFFFFFFFFA,
      0x7FFFFFFFFFFFFFF9,
      0x7FFFFFFFFFFFFFF8,
      0x7FFFFFFFFFFFFFF7,
      0x7FFFFFFFFFFFFFF6
    ], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -0x8000000000000000 + i;
    }
    Expect.listEquals([
      -0x8000000000000000,
      -0x7FFFFFFFFFFFFFFF,
      -0x7FFFFFFFFFFFFFFE,
      -0x7FFFFFFFFFFFFFFD,
      -0x7FFFFFFFFFFFFFFC,
      -0x7FFFFFFFFFFFFFFB,
      -0x7FFFFFFFFFFFFFFA,
      -0x7FFFFFFFFFFFFFF9,
      -0x7FFFFFFFFFFFFFF8,
      -0x7FFFFFFFFFFFFFF7
    ], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = i;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Int64List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Int64List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    array.setRange(3, 7, [-0x8000000000000000, 0, 1, 0x7FFFFFFFFFFFFFFF]);
    Expect.listEquals(
        [0, 1, 2, -0x8000000000000000, 0, 1, 0x7FFFFFFFFFFFFFFF, 7, 8, 9],
        array);
  }

  static testInt64List() {
    Expect.throws(() {
      new Int64List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Int64List(10);
    testInt64ListImpl(array);
  }

  static testUint64ListImpl(Uint64List array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(10, array.length);
    Expect.equals(8, array.elementSizeInBytes);
    Expect.equals(80, array.lengthInBytes);
    Expect.listEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], array);
    Expect.throws(() {
      array[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFFFFFFFFFFFFFFFF - i;
    }
    Expect.listEquals([
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFE,
      0xFFFFFFFFFFFFFFFD,
      0xFFFFFFFFFFFFFFFC,
      0xFFFFFFFFFFFFFFFB,
      0xFFFFFFFFFFFFFFFA,
      0xFFFFFFFFFFFFFFF9,
      0xFFFFFFFFFFFFFFF8,
      0xFFFFFFFFFFFFFFF7,
      0xFFFFFFFFFFFFFFF6
    ], array);
    for (int i = 0; i < array.length; ++i) {
      array[i] = i;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Uint64List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Uint64List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    array.setRange(3, 7, [-0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
    Expect.listEquals(
        [0, 1, 2, -0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9],
        array);
  }

  static testUint64List() {
    Expect.throws(() {
      new Uint64List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Uint64List(10);
    testUint64ListImpl(array);
  }

  static testFloat32ListImpl(Float32List array) {
    Expect.isTrue(array is List<double>);
    Expect.equals(10, array.length);
    Expect.equals(4, array.elementSizeInBytes);
    Expect.equals(40, array.lengthInBytes);
    Expect
        .listEquals([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], array);
    Expect.throws(() {
      array[-1] = 0.0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0.0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0.0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0.0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1.0 + i;
    }
    Expect
        .listEquals([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], array);
    // TODO: min, max, and round
    for (int i = 0; i < array.length; ++i) {
      array[i] = i * 1.0;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Float32List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Float32List);
    Expect.equals(4, region.length);
    Expect.listEquals([3.0, 4.0, 5.0, 6.0], region);
    array.setRange(3, 7, [double.negativeInfinity, 0.0, 1.0, double.infinity]);
    Expect.listEquals([
      0.0,
      1.0,
      2.0,
      double.negativeInfinity,
      0.0,
      1.0,
      double.infinity,
      7.0,
      8.0,
      9.0
    ], array);
  }

  static testFloat32List() {
    Expect.throws(() {
      new Float32List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Float32List(10);
    testFloat32ListImpl(array);
  }

  static testFloat64ListImpl(Float64List array) {
    Expect.isTrue(array is List<double>);
    Expect.equals(10, array.length);
    Expect.equals(8, array.elementSizeInBytes);
    Expect.equals(80, array.lengthInBytes);
    Expect
        .listEquals([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], array);
    Expect.throws(() {
      array[-1] = 0.0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return array[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array[10] = 0.0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      array.add(0.0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.addAll([0.0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      array.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < array.length; ++i) {
      array[i] = 1.0 + i;
    }
    Expect
        .listEquals([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], array);
    // TODO: min, max
    for (int i = 0; i < array.length; ++i) {
      array[i] = i * 1.0;
    }
    var copy = array.sublist(0, array.length);
    Expect.isFalse(identical(copy, array));
    Expect.isTrue(copy is Float64List);
    Expect.equals(10, copy.length);
    Expect.listEquals(array, copy);
    var empty = array.sublist(array.length, array.length);
    Expect.equals(0, empty.length);
    empty = array.sublist(array.length);
    Expect.equals(0, empty.length);

    var region = array.sublist(3, array.length - 3);
    Expect.isTrue(copy is Float64List);
    Expect.equals(4, region.length);
    Expect.listEquals([3.0, 4.0, 5.0, 6.0], region);
    array.setRange(3, 7, [double.negativeInfinity, 0.0, 1.0, double.infinity]);
    Expect.listEquals([
      0.0,
      1.0,
      2.0,
      double.negativeInfinity,
      0.0,
      1.0,
      double.infinity,
      7.0,
      8.0,
      9.0
    ], array);
  }

  static testFloat64List() {
    Expect.throws(() {
      new Float64List(-1);
    }, (e) {
      return e is ArgumentError;
    });
    var array = new Float64List(10);
    testFloat64ListImpl(array);
  }

  static testByteList() {
    var array = new Uint8List(8);
    Expect.equals(8, array.length);
    Expect.equals(8, array.lengthInBytes);
    var byte_array = new ByteData.view(array.buffer);
    Expect.equals(8, byte_array.lengthInBytes);
    Expect.throws(() {
      byte_array.getInt8(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getUint8(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getInt16(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getUint16(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getInt32(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getUint32(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getInt64(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getUint64(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getFloat32(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getFloat64(-1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setInt8(-1, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setUint8(-1, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setInt16(-1, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setUint16(-1, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setInt32(-1, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setUint32(-1, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setInt64(-1, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setUint64(-1, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setFloat32(-1, 0.0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setFloat64(-1, 0.0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getInt8(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getUint8(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getInt16(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getUint16(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getInt32(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getUint32(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getInt64(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getUint64(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getFloat32(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.getFloat64(8);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setInt8(8, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setUint8(8, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setInt16(8, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setUint16(8, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setInt32(8, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setUint32(8, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setInt64(8, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setUint64(8, 0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setFloat32(8, 0.0);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      byte_array.setFloat64(8, 0.0);
    }, (e) {
      return e is RangeError;
    });
    Expect.equals(0, byte_array.getInt8(0));
    Expect.equals(0, byte_array.getUint8(0));
    Expect.equals(0, byte_array.getInt16(0));
    Expect.equals(0, byte_array.getUint16(0));
    Expect.equals(0, byte_array.getInt32(0));
    Expect.equals(0, byte_array.getUint32(0));
    Expect.equals(0, byte_array.getInt64(0));
    Expect.equals(0, byte_array.getUint64(0));
    Expect.equals(0.0, byte_array.getFloat32(0));
    Expect.equals(0.0, byte_array.getFloat64(0));
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFF;
    }
    Expect.equals(-1, byte_array.getInt8(0));
    Expect.equals(0xFF, byte_array.getUint8(0));
    Expect.equals(-1, byte_array.getInt16(0));
    Expect.equals(0xFFFF, byte_array.getUint16(0));
    Expect.equals(-1, byte_array.getInt32(0));
    Expect.equals(0xFFFFFFFF, byte_array.getUint32(0));
    Expect.equals(-1, byte_array.getInt64(0));
    Expect.equals(0xFFFFFFFFFFFFFFFF, byte_array.getUint64(0));
    Expect.isTrue(byte_array.getFloat32(0).isNaN);
    Expect.isTrue(byte_array.getFloat64(0).isNaN);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFF - i;
    }
    byte_array.setUint32(0, 0xBF800000, Endian.little);
    Expect.equals(0, byte_array.getInt8(0));
    Expect.equals(0, byte_array.getInt8(1));
    Expect.equals(-128, byte_array.getInt8(2));
    Expect.equals(-65, byte_array.getInt8(3));
    Expect.equals(-5, byte_array.getInt8(4));
    Expect.equals(-6, byte_array.getInt8(5));
    Expect.equals(-7, byte_array.getInt8(6));
    Expect.equals(-8, byte_array.getInt8(7));
    Expect.equals(0x00, byte_array.getUint8(0));
    Expect.equals(0x00, byte_array.getUint8(1));
    Expect.equals(0x80, byte_array.getUint8(2));
    Expect.equals(0xBF, byte_array.getUint8(3));
    Expect.equals(0xFB, byte_array.getUint8(4));
    Expect.equals(0xFA, byte_array.getUint8(5));
    Expect.equals(0xF9, byte_array.getUint8(6));
    Expect.equals(0xF8, byte_array.getUint8(7));
    Expect.equals(0, byte_array.getInt16(0));
    Expect.equals(-16512, byte_array.getInt16(2, Endian.little));
    Expect.equals(-1285, byte_array.getInt16(4, Endian.little));
    Expect.equals(-1799, byte_array.getInt16(6, Endian.little));
    Expect.equals(0x0000, byte_array.getUint16(0, Endian.little));
    Expect.equals(0xBF80, byte_array.getUint16(2, Endian.little));
    Expect.equals(0xFAFB, byte_array.getUint16(4, Endian.little));
    Expect.equals(0xF8F9, byte_array.getUint16(6, Endian.little));
    Expect.equals(-1082130432, byte_array.getInt32(0, Endian.little));
    Expect.equals(0xBF800000, byte_array.getUint32(0, Endian.little));
    Expect.equals(-506097523945897984, byte_array.getInt64(0, Endian.little));
    Expect.equals(0xF8F9FAFBBF800000, byte_array.getUint64(0, Endian.little));
    Expect.equals(-1.0, byte_array.getFloat32(0, Endian.little));
    // TODO: byte_array.getFloat64(0)
  }

  static testInt8ListViewImpl(var array) {
    Expect.equals(12, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(12, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFF;
    }
    Expect.throws(() {
      new Int8List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int8List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int8List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int8List.view(array.buffer, 0, array.length + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int8List.view(array.buffer, array.length - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Int8List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<int>);
    Expect.isTrue(empty is Int8List);
    Expect.equals(0, empty.length);
    var whole = new Int8List.view(array.buffer);
    Expect.isTrue(whole is List<int>);
    Expect.isTrue(whole is Int8List);
    Expect.equals(12, whole.length);
    var view = new Int8List.view(array.buffer, 1, array.length - 2);
    Expect.isTrue(view is List<int>);
    Expect.isTrue(view is Int8List);
    Expect.equals(10, view.length);
    Expect.equals(1, view.elementSizeInBytes);
    Expect.equals(10, view.lengthInBytes);
    Expect.listEquals([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], view);
    Expect.throws(() {
      view[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, view.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], view);
    Expect.listEquals([0xFF, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0xFF], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x100 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
    Expect.listEquals([0xFF, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xFF], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = -10 + i;
    }
    Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], view);
    Expect.listEquals([
      0xFF,
      0xF6,
      0xF7,
      0xF8,
      0xF9,
      0xFA,
      0xFB,
      0xFC,
      0xFD,
      0xFE,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x7F - i;
    }
    Expect.listEquals([127, 126, 125, 124, 123, 122, 121, 120, 119, 118], view);
    Expect.listEquals(
        [0xFF, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 0xFF], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = -0x80 + i;
    }
    Expect.listEquals(
        [-128, -127, -126, -125, -124, -123, -122, -121, -120, -119], view);
    Expect.listEquals([
      0xFF,
      0x80,
      0x81,
      0x82,
      0x83,
      0x84,
      0x85,
      0x86,
      0x87,
      0x88,
      0x89,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = i;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Int8List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Int8List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    view.setRange(3, 7, [-128, 0, 1, 127]);
    Expect.listEquals([0, 1, 2, -128, 0, 1, 127, 7, 8, 9], view);
    Expect.listEquals([0xFF, 0, 1, 2, 128, 0, 1, 127, 7, 8, 9, 0xFF], array);
  }

  static testInt8ListView() {
    var array = new Uint8List(12);
    testInt8ListViewImpl(array);
  }

  static testUint8ListViewImpl(var array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(12, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(12, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -1;
    }
    Expect.throws(() {
      new Uint8List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint8List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint8List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint8List.view(array.buffer, 0, array.length + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint8List.view(array.buffer, array.length - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Uint8List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<int>);
    Expect.isTrue(empty is Uint8List);
    Expect.equals(0, empty.length);
    var whole = new Uint8List.view(array.buffer);
    Expect.isTrue(whole is List<int>);
    Expect.isTrue(whole is Uint8List);
    Expect.equals(12, whole.length);
    var view = new Uint8List.view(array.buffer, 1, array.length - 2);
    Expect.isTrue(view is List<int>);
    Expect.isTrue(view is Uint8List);
    Expect.equals(10, view.length);
    Expect.equals(1, view.elementSizeInBytes);
    Expect.equals(10, view.lengthInBytes);
    Expect.listEquals(
        [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], view);
    Expect.throws(() {
      view[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, view.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], view);
    Expect.listEquals([-1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x100 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
    Expect.listEquals([-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0xFF - i;
    }
    Expect.listEquals(
        [0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6], view);
    Expect.listEquals([-1, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -1], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = i;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Uint8List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Uint8List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    view.setRange(3, 7, [257, 0, 1, 255]);
    Expect.listEquals([0, 1, 2, 1, 0, 1, 255, 7, 8, 9], view);
  }

  static testUint8ListView() {
    var array = new Int8List(12);
    testUint8ListViewImpl(array);
  }

  static testInt16ListViewImpl(var array) {
    Expect.equals(24, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(24, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFF;
    }
    Expect.throws(() {
      new Int16List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int16List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int16List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int16List.view(array.buffer, 0, array.length + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int16List.view(array.buffer, array.length - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Int16List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<int>);
    Expect.isTrue(empty is Int16List);
    Expect.equals(0, empty.length);
    var whole = new Int16List.view(array.buffer);
    Expect.isTrue(whole is List<int>);
    Expect.isTrue(whole is Int16List);
    Expect.equals(12, whole.length);
    var view = new Int16List.view(array.buffer, 2, 10);
    Expect.isTrue(view is List<int>);
    Expect.isTrue(view is Int16List);
    Expect.equals(10, view.length);
    Expect.equals(2, view.elementSizeInBytes);
    Expect.equals(20, view.lengthInBytes);
    Expect.listEquals([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], view);
    Expect.throws(() {
      view[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, view.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0x01,
      0x00,
      0x02,
      0x00,
      0x03,
      0x00,
      0x04,
      0x00,
      0x05,
      0x00,
      0x06,
      0x00,
      0x07,
      0x00,
      0x08,
      0x00,
      0x09,
      0x00,
      0x0A,
      0x00,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x10000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0x00,
      0x00,
      0x01,
      0x00,
      0x02,
      0x00,
      0x03,
      0x00,
      0x04,
      0x00,
      0x05,
      0x00,
      0x06,
      0x00,
      0x07,
      0x00,
      0x08,
      0x00,
      0x09,
      0x00,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = -10 + i;
    }
    Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xF6,
      0xFF,
      0xF7,
      0xFF,
      0xF8,
      0xFF,
      0xF9,
      0xFF,
      0xFA,
      0xFF,
      0xFB,
      0xFF,
      0xFC,
      0xFF,
      0xFD,
      0xFF,
      0xFE,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x7FFF - i;
    }
    Expect.listEquals([
      0x7FFF,
      0x7FFE,
      0x7FFD,
      0x7FFC,
      0x7FFB,
      0x7FFA,
      0x7FF9,
      0x7FF8,
      0x7FF7,
      0x7FF6
    ], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xFE,
      0x7F,
      0xFD,
      0x7F,
      0xFC,
      0x7F,
      0xFB,
      0x7F,
      0xFA,
      0x7F,
      0xF9,
      0x7F,
      0xF8,
      0x7F,
      0xF7,
      0x7F,
      0xF6,
      0x7F,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = -0x8000 + i;
    }
    Expect.listEquals([
      -0x8000,
      -0x7FFF,
      -0x7FFE,
      -0x7FFD,
      -0x7FFC,
      -0x7FFB,
      -0x7FFA,
      -0x7FF9,
      -0x7FF8,
      -0x7FF7
    ], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0x00,
      0x80,
      0x01,
      0x80,
      0x02,
      0x80,
      0x03,
      0x80,
      0x04,
      0x80,
      0x05,
      0x80,
      0x06,
      0x80,
      0x07,
      0x80,
      0x08,
      0x80,
      0x09,
      0x80,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = i;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Int16List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Int16List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    view.setRange(3, 7, [-32768, 0, 1, 32767]);
    Expect.listEquals([0, 1, 2, -32768, 0, 1, 32767, 7, 8, 9], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0x00,
      0x00,
      0x01,
      0x00,
      0x02,
      0x00,
      0x00,
      0x80,
      0x00,
      0x00,
      0x01,
      0x00,
      0xFF,
      0x7F,
      0x07,
      0x00,
      0x08,
      0x00,
      0x09,
      0x00,
      0xFF,
      0xFF
    ], array);
  }

  static testInt16ListView() {
    var array = new Uint8List(24);
    testInt16ListViewImpl(array);
  }

  static testUint16ListViewImpl(var array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(24, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(24, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -1;
    }
    Expect.throws(() {
      new Uint16List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint16List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint16List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint16List.view(array.buffer, 0, array.length + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint16List.view(array.buffer, array.length - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Uint16List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<int>);
    Expect.isTrue(empty is Uint16List);
    Expect.equals(0, empty.length);
    var whole = new Uint16List.view(array.buffer);
    Expect.isTrue(whole is List<int>);
    Expect.isTrue(whole is Uint16List);
    Expect.equals(12, whole.length);
    var view = new Uint16List.view(array.buffer, 2, 10);
    Expect.isTrue(view is List<int>);
    Expect.isTrue(view is Uint16List);
    Expect.equals(10, view.length);
    Expect.equals(2, view.elementSizeInBytes);
    Expect.equals(20, view.lengthInBytes);
    Expect.listEquals([
      0xFFFF,
      0xFFFF,
      0xFFFF,
      0xFFFF,
      0xFFFF,
      0xFFFF,
      0xFFFF,
      0xFFFF,
      0xFFFF,
      0xFFFF
    ], view);
    Expect.throws(() {
      view[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, view.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], view);
    Expect.listEquals([
      -1,
      -1,
      1,
      0,
      2,
      0,
      3,
      0,
      4,
      0,
      5,
      0,
      6,
      0,
      7,
      0,
      8,
      0,
      9,
      0,
      10,
      0,
      -1,
      -1
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x10000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
    Expect.listEquals([
      -1,
      -1,
      0,
      0,
      1,
      0,
      2,
      0,
      3,
      0,
      4,
      0,
      5,
      0,
      6,
      0,
      7,
      0,
      8,
      0,
      9,
      0,
      -1,
      -1
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0xFFFF - i;
    }
    Expect.listEquals([
      0xFFFF,
      0xFFFE,
      0xFFFD,
      0xFFFC,
      0xFFFB,
      0xFFFA,
      0xFFF9,
      0xFFF8,
      0xFFF7,
      0xFFF6
    ], view);
    Expect.listEquals([
      -1,
      -1,
      -1,
      -1,
      -2,
      -1,
      -3,
      -1,
      -4,
      -1,
      -5,
      -1,
      -6,
      -1,
      -7,
      -1,
      -8,
      -1,
      -9,
      -1,
      -10,
      -1,
      -1,
      -1
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = i;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Uint16List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Uint16List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    view.setRange(3, 7, [0x10001, 0, 1, 0xFFFF]);
    Expect.listEquals([0, 1, 2, 1, 0, 1, 0xFFFF, 7, 8, 9], view);
    Expect.listEquals([
      -1,
      -1,
      0,
      0,
      1,
      0,
      2,
      0,
      1,
      0,
      0,
      0,
      1,
      0,
      -1,
      -1,
      7,
      0,
      8,
      0,
      9,
      0,
      -1,
      -1
    ], array);
  }

  static testUint16ListView() {
    var array = new Int8List(24);
    testUint16ListViewImpl(array);
  }

  static testInt32ListView() {
    var array = new Uint8List(48);
    Expect.equals(48, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(48, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFF;
    }
    Expect.throws(() {
      new Int32List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int32List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int32List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int32List.view(array.buffer, 0, array.length + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int32List.view(array.buffer, array.length - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Int32List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<int>);
    Expect.isTrue(empty is Int32List);
    Expect.equals(0, empty.length);
    var whole = new Int32List.view(array.buffer);
    Expect.isTrue(whole is List<int>);
    Expect.isTrue(whole is Int32List);
    Expect.equals(12, whole.length);
    var view = new Int32List.view(array.buffer, 4, 10);
    Expect.isTrue(view is List<int>);
    Expect.isTrue(view is Int32List);
    Expect.equals(10, view.length);
    Expect.equals(4, view.elementSizeInBytes);
    Expect.equals(40, view.lengthInBytes);
    Expect.listEquals([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], view);
    Expect.throws(() {
      view[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, view.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x01,
      0x00,
      0x00,
      0x00,
      0x02,
      0x00,
      0x00,
      0x00,
      0x03,
      0x00,
      0x00,
      0x00,
      0x04,
      0x00,
      0x00,
      0x00,
      0x05,
      0x00,
      0x00,
      0x00,
      0x06,
      0x00,
      0x00,
      0x00,
      0x07,
      0x00,
      0x00,
      0x00,
      0x08,
      0x00,
      0x00,
      0x00,
      0x09,
      0x00,
      0x00,
      0x00,
      0x0A,
      0x00,
      0x00,
      0x00,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x100000000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x00,
      0x00,
      0x00,
      0x00,
      0x01,
      0x00,
      0x00,
      0x00,
      0x02,
      0x00,
      0x00,
      0x00,
      0x03,
      0x00,
      0x00,
      0x00,
      0x04,
      0x00,
      0x00,
      0x00,
      0x05,
      0x00,
      0x00,
      0x00,
      0x06,
      0x00,
      0x00,
      0x00,
      0x07,
      0x00,
      0x00,
      0x00,
      0x08,
      0x00,
      0x00,
      0x00,
      0x09,
      0x00,
      0x00,
      0x00,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = -10 + i;
    }
    Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xF6,
      0xFF,
      0xFF,
      0xFF,
      0xF7,
      0xFF,
      0xFF,
      0xFF,
      0xF8,
      0xFF,
      0xFF,
      0xFF,
      0xF9,
      0xFF,
      0xFF,
      0xFF,
      0xFA,
      0xFF,
      0xFF,
      0xFF,
      0xFB,
      0xFF,
      0xFF,
      0xFF,
      0xFC,
      0xFF,
      0xFF,
      0xFF,
      0xFD,
      0xFF,
      0xFF,
      0xFF,
      0xFE,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x7FFFFFFF - i;
    }
    Expect.listEquals([
      0x7FFFFFFF,
      0x7FFFFFFE,
      0x7FFFFFFD,
      0x7FFFFFFC,
      0x7FFFFFFB,
      0x7FFFFFFA,
      0x7FFFFFF9,
      0x7FFFFFF8,
      0x7FFFFFF7,
      0x7FFFFFF6
    ], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xFE,
      0xFF,
      0xFF,
      0x7F,
      0xFD,
      0xFF,
      0xFF,
      0x7F,
      0xFC,
      0xFF,
      0xFF,
      0x7F,
      0xFB,
      0xFF,
      0xFF,
      0x7F,
      0xFA,
      0xFF,
      0xFF,
      0x7F,
      0xF9,
      0xFF,
      0xFF,
      0x7F,
      0xF8,
      0xFF,
      0xFF,
      0x7F,
      0xF7,
      0xFF,
      0xFF,
      0x7F,
      0xF6,
      0xFF,
      0xFF,
      0x7F,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = -0x80000000 + i;
    }
    Expect.listEquals([
      -0x80000000,
      -0x7FFFFFFF,
      -0x7FFFFFFE,
      -0x7FFFFFFD,
      -0x7FFFFFFC,
      -0x7FFFFFFB,
      -0x7FFFFFFA,
      -0x7FFFFFF9,
      -0x7FFFFFF8,
      -0x7FFFFFF7
    ], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x00,
      0x00,
      0x00,
      0x80,
      0x01,
      0x00,
      0x00,
      0x80,
      0x02,
      0x00,
      0x00,
      0x80,
      0x03,
      0x00,
      0x00,
      0x80,
      0x04,
      0x00,
      0x00,
      0x80,
      0x05,
      0x00,
      0x00,
      0x80,
      0x06,
      0x00,
      0x00,
      0x80,
      0x07,
      0x00,
      0x00,
      0x80,
      0x08,
      0x00,
      0x00,
      0x80,
      0x09,
      0x00,
      0x00,
      0x80,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = i;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Int32List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Int32List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    view.setRange(3, 7, [-0x80000000, 0, 1, 0x7FFFFFFF]);
    Expect.listEquals([0, 1, 2, -0x80000000, 0, 1, 0x7FFFFFFF, 7, 8, 9], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x00,
      0x00,
      0x00,
      0x00,
      0x01,
      0x00,
      0x00,
      0x00,
      0x02,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x00,
      0x00,
      0x00,
      0x00,
      0x01,
      0x00,
      0x00,
      0x00,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0x07,
      0x00,
      0x00,
      0x00,
      0x08,
      0x00,
      0x00,
      0x00,
      0x09,
      0x00,
      0x00,
      0x00,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
  }

  static testUint32ListViewImpl(var array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(48, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(48, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -1;
    }
    Expect.throws(() {
      new Uint32List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint32List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint32List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint32List.view(array.buffer, 0, array.length + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint32List.view(array.buffer, array.length - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Uint32List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<int>);
    Expect.isTrue(empty is Uint32List);
    Expect.equals(0, empty.length);
    var whole = new Uint32List.view(array.buffer);
    Expect.isTrue(whole is List<int>);
    Expect.isTrue(whole is Uint32List);
    Expect.equals(12, whole.length);
    var view = new Uint32List.view(array.buffer, 4, 10);
    Expect.isTrue(view is List<int>);
    Expect.isTrue(view is Uint32List);
    Expect.equals(10, view.length);
    Expect.equals(4, view.elementSizeInBytes);
    Expect.equals(40, view.lengthInBytes);
    Expect.listEquals([
      0xFFFFFFFF,
      0xFFFFFFFF,
      0xFFFFFFFF,
      0xFFFFFFFF,
      0xFFFFFFFF,
      0xFFFFFFFF,
      0xFFFFFFFF,
      0xFFFFFFFF,
      0xFFFFFFFF,
      0xFFFFFFFF
    ], view);
    Expect.throws(() {
      view[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, view.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], view);
    Expect.listEquals([
      -1,
      -1,
      -1,
      -1,
      1,
      0,
      0,
      0,
      2,
      0,
      0,
      0,
      3,
      0,
      0,
      0,
      4,
      0,
      0,
      0,
      5,
      0,
      0,
      0,
      6,
      0,
      0,
      0,
      7,
      0,
      0,
      0,
      8,
      0,
      0,
      0,
      9,
      0,
      0,
      0,
      10,
      0,
      0,
      0,
      -1,
      -1,
      -1,
      -1
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x100000000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], view);
    Expect.listEquals([
      -1,
      -1,
      -1,
      -1,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      2,
      0,
      0,
      0,
      3,
      0,
      0,
      0,
      4,
      0,
      0,
      0,
      5,
      0,
      0,
      0,
      6,
      0,
      0,
      0,
      7,
      0,
      0,
      0,
      8,
      0,
      0,
      0,
      9,
      0,
      0,
      0,
      -1,
      -1,
      -1,
      -1
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0xFFFFFFFF - i;
    }
    Expect.listEquals([
      0xFFFFFFFF,
      0xFFFFFFFE,
      0xFFFFFFFD,
      0xFFFFFFFC,
      0xFFFFFFFB,
      0xFFFFFFFA,
      0xFFFFFFF9,
      0xFFFFFFF8,
      0xFFFFFFF7,
      0xFFFFFFF6
    ], view);
    Expect.listEquals([
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -2,
      -1,
      -1,
      -1,
      -3,
      -1,
      -1,
      -1,
      -4,
      -1,
      -1,
      -1,
      -5,
      -1,
      -1,
      -1,
      -6,
      -1,
      -1,
      -1,
      -7,
      -1,
      -1,
      -1,
      -8,
      -1,
      -1,
      -1,
      -9,
      -1,
      -1,
      -1,
      -10,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = i;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Uint32List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Uint32List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    view.setRange(3, 7, [0x100000001, 0, 1, 0xFFFFFFFF]);
    Expect.listEquals([0, 1, 2, 1, 0, 1, 0xFFFFFFFF, 7, 8, 9], view);
    Expect.listEquals([
      -1,
      -1,
      -1,
      -1,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      2,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      -1,
      -1,
      -1,
      -1,
      7,
      0,
      0,
      0,
      8,
      0,
      0,
      0,
      9,
      0,
      0,
      0,
      -1,
      -1,
      -1,
      -1
    ], array);
  }

  static testUint32ListView() {
    var array = new Int8List(48);
    testUint32ListViewImpl(array);
  }

  static testInt64ListViewImpl(var array) {
    Expect.equals(96, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(96, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xFF;
    }
    Expect.throws(() {
      new Int64List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int64List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int64List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int64List.view(array.buffer, 0, array.length + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Int64List.view(array.buffer, array.length - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Int64List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<int>);
    Expect.isTrue(empty is Int64List);
    Expect.equals(0, empty.length);
    var whole = new Int64List.view(array.buffer);
    Expect.isTrue(whole is List<int>);
    Expect.isTrue(whole is Int64List);
    Expect.equals(12, whole.length);
    var view = new Int64List.view(array.buffer, 8, 10);
    Expect.isTrue(view is List<int>);
    Expect.isTrue(view is Int64List);
    Expect.equals(10, view.length);
    Expect.equals(8, view.elementSizeInBytes);
    Expect.equals(80, view.lengthInBytes);
    Expect.listEquals([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], view);
    Expect.throws(() {
      view[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[10] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, view.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x01,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x02,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x03,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x04,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x05,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x06,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x07,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x08,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x09,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x0A,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = -10 + i;
    }
    Expect.listEquals([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xF6,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xF7,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xF8,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xF9,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFA,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFB,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFC,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFD,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFE,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0x7FFFFFFFFFFFFFFF - i;
    }
    Expect.listEquals([
      0x7FFFFFFFFFFFFFFF,
      0x7FFFFFFFFFFFFFFE,
      0x7FFFFFFFFFFFFFFD,
      0x7FFFFFFFFFFFFFFC,
      0x7FFFFFFFFFFFFFFB,
      0x7FFFFFFFFFFFFFFA,
      0x7FFFFFFFFFFFFFF9,
      0x7FFFFFFFFFFFFFF8,
      0x7FFFFFFFFFFFFFF7,
      0x7FFFFFFFFFFFFFF6
    ], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xFE,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xFD,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xFC,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xFB,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xFA,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xF9,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xF8,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xF7,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xF6,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = -0x8000000000000000 + i;
    }
    Expect.listEquals([
      -0x8000000000000000,
      -0x7FFFFFFFFFFFFFFF,
      -0x7FFFFFFFFFFFFFFE,
      -0x7FFFFFFFFFFFFFFD,
      -0x7FFFFFFFFFFFFFFC,
      -0x7FFFFFFFFFFFFFFB,
      -0x7FFFFFFFFFFFFFFA,
      -0x7FFFFFFFFFFFFFF9,
      -0x7FFFFFFFFFFFFFF8,
      -0x7FFFFFFFFFFFFFF7
    ], view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x01,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x02,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x03,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x04,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x05,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x06,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x07,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x08,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x09,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = i;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Int64List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Int64List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    view.setRange(3, 7, [-0x8000000000000000, 0, 1, 0x7FFFFFFFFFFFFFFF]);
    Expect.listEquals(
        [0, 1, 2, -0x8000000000000000, 0, 1, 0x7FFFFFFFFFFFFFFF, 7, 8, 9],
        view);
    Expect.listEquals([
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x01,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x02,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x80,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x01,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0x7F,
      0x07,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x08,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x09,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF,
      0xFF
    ], array);
  }

  static testInt64ListView() {
    var array = new Uint8List(96);
    testInt64ListViewImpl(array);
  }

  static testUint64ListViewImpl(var array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(96, array.length);
    Expect.equals(1, array.elementSizeInBytes);
    Expect.equals(96, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = -1;
    }
    Expect.throws(() {
      new Uint64List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint64List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint64List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint64List.view(array.buffer, 0, array.length + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Uint64List.view(array.buffer, array.length - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Uint64List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<int>);
    Expect.isTrue(empty is Uint64List);
    Expect.equals(0, empty.length);
    var whole = new Uint64List.view(array.buffer);
    Expect.isTrue(whole is List<int>);
    Expect.isTrue(whole is Uint64List);
    Expect.equals(12, whole.length);
    var view = new Uint64List.view(array.buffer, 8, 10);
    Expect.isTrue(view is List<int>);
    Expect.isTrue(view is Uint64List);
    Expect.equals(10, view.length);
    Expect.equals(8, view.elementSizeInBytes);
    Expect.equals(80, view.lengthInBytes);
    Expect.listEquals([
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFF
    ], view);
    Expect.throws(() {
      view[-1] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[view.length] = 0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, view.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1 + i;
    }
    Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], view);
    Expect.listEquals([
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      1,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      2,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      3,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      4,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      5,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      6,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      7,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      8,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      9,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      10,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = 0xFFFFFFFFFFFFFFFF - i;
    }
    Expect.listEquals([
      0xFFFFFFFFFFFFFFFF,
      0xFFFFFFFFFFFFFFFE,
      0xFFFFFFFFFFFFFFFD,
      0xFFFFFFFFFFFFFFFC,
      0xFFFFFFFFFFFFFFFB,
      0xFFFFFFFFFFFFFFFA,
      0xFFFFFFFFFFFFFFF9,
      0xFFFFFFFFFFFFFFF8,
      0xFFFFFFFFFFFFFFF7,
      0xFFFFFFFFFFFFFFF6
    ], view);
    Expect.listEquals([
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -2,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -3,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -4,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -5,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -6,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -7,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -8,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -9,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -10,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1
    ], array);
    for (int i = 0; i < view.length; ++i) {
      view[i] = i;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Uint64List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Uint64List);
    Expect.equals(4, region.length);
    Expect.listEquals([3, 4, 5, 6], region);
    view.setRange(3, 7, [0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
    Expect.listEquals(
        [0, 1, 2, 0x8000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF, 7, 8, 9], view);
    Expect.listEquals([
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      2,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      0,
      0,
      -128,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      7,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      8,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      9,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1,
      -1
    ], array);
  }

  static testUint64ListView() {
    var array = new Int8List(96);
    testUint64ListViewImpl(array);
  }

  static testFloat32ListViewImpl(var array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(12, array.length);
    Expect.equals(4, array.elementSizeInBytes);
    Expect.equals(48, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xBF800000;
    }
    Expect.throws(() {
      new Float32List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Float32List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Float32List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Float32List.view(array.buffer, 0, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Float32List.view(array.buffer, array.lengthInBytes - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Float32List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<double>);
    Expect.isTrue(empty is Float32List);
    Expect.equals(0, empty.length);
    var whole = new Float32List.view(array.buffer);
    Expect.isTrue(whole is List<double>);
    Expect.isTrue(whole is Float32List);
    Expect.equals(12, whole.length);
    var view = new Float32List.view(array.buffer, 4, 10);
    Expect.isTrue(view is List<double>);
    Expect.isTrue(view is Float32List);
    Expect.equals(10, view.length);
    Expect.equals(4, view.elementSizeInBytes);
    Expect.equals(40, view.lengthInBytes);
    Expect.listEquals(
        [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], view);
    Expect.throws(() {
      view[-1] = 0.0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[10] = 0.0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0.0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0.0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1.0 + i;
    }
    Expect
        .listEquals([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], view);
    Expect.listEquals([
      0xBF800000,
      0x3F800000,
      0x40000000,
      0x40400000,
      0x40800000,
      0x40A00000,
      0x40C00000,
      0x40E00000,
      0x41000000,
      0x41100000,
      0x41200000,
      0xBF800000
    ], array);
    // TODO: min, max, and round
    for (int i = 0; i < view.length; ++i) {
      view[i] = i * 1.0;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Float32List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Float32List);
    Expect.equals(4, region.length);
    Expect.listEquals([3.0, 4.0, 5.0, 6.0], region);
    view.setRange(3, 7, [double.negativeInfinity, 0.0, 1.0, double.infinity]);
    Expect.listEquals([
      0.0,
      1.0,
      2.0,
      double.negativeInfinity,
      0.0,
      1.0,
      double.infinity,
      7.0,
      8.0,
      9.0
    ], view);
    Expect.listEquals([
      0xBF800000,
      0x00000000,
      0x3F800000,
      0x40000000,
      0xFF800000,
      0x00000000,
      0x3F800000,
      0x7F800000,
      0x40E00000,
      0x41000000,
      0x41100000,
      0xBF800000
    ], array);
  }

  static testFloat32ListView() {
    var array = new Uint32List(12);
    testFloat32ListViewImpl(array);
  }

  static testFloat64ListViewImpl(var array) {
    Expect.isTrue(array is List<int>);
    Expect.equals(12, array.length);
    Expect.equals(8, array.elementSizeInBytes);
    Expect.equals(96, array.lengthInBytes);
    for (int i = 0; i < array.length; ++i) {
      array[i] = 0xBFF0000000000000;
    }
    Expect.throws(() {
      new Float64List.view(array.buffer, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Float64List.view(array.buffer, 0, -1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Float64List.view(array.buffer, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Float64List.view(array.buffer, 0, array.lengthInBytes + 1);
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      new Float64List.view(array.buffer, array.lengthInBytes - 1, 2);
    }, (e) {
      return e is RangeError;
    });
    var empty = new Float64List.view(array.buffer, array.lengthInBytes);
    Expect.isTrue(empty is List<double>);
    Expect.isTrue(empty is Float64List);
    Expect.equals(0, empty.length);
    var whole = new Float64List.view(array.buffer);
    Expect.isTrue(whole is List<double>);
    Expect.isTrue(whole is Float64List);
    Expect.equals(12, whole.length);
    var view = new Float64List.view(array.buffer, 8, 10);
    Expect.isTrue(view is List<double>);
    Expect.isTrue(view is Float64List);
    Expect.equals(10, view.length);
    Expect.equals(8, view.elementSizeInBytes);
    Expect.equals(80, view.lengthInBytes);
    Expect.listEquals(
        [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], view);
    Expect.throws(() {
      view[-1] = 0.0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      return view[-1];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[10];
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view[10] = 0.0;
    }, (e) {
      return e is RangeError;
    });
    Expect.throws(() {
      view.add(0.0);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.addAll([0.0]);
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.clear();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.length = 0;
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeLast();
    }, (e) {
      return e is UnsupportedError;
    });
    Expect.throws(() {
      view.removeRange(0, array.length - 1);
    }, (e) {
      return e is UnsupportedError;
    });
    for (int i = 0; i < view.length; ++i) {
      view[i] = 1.0 + i;
    }
    Expect
        .listEquals([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], view);
    Expect.listEquals([
      0xBFF0000000000000,
      0x3FF0000000000000,
      0x4000000000000000,
      0x4008000000000000,
      0x4010000000000000,
      0x4014000000000000,
      0x4018000000000000,
      0x401C000000000000,
      0x4020000000000000,
      0x4022000000000000,
      0x4024000000000000,
      0xBFF0000000000000
    ], array);
    // TODO: min, max
    for (int i = 0; i < view.length; ++i) {
      view[i] = i * 1.0;
    }
    var copy = view.sublist(0, view.length);
    Expect.isFalse(identical(copy, view));
    Expect.isTrue(copy is Float64List);
    Expect.equals(10, copy.length);
    Expect.listEquals(view, copy);
    var region = view.sublist(3, view.length - 3);
    Expect.isTrue(copy is Float64List);
    Expect.equals(4, region.length);
    Expect.listEquals([3.0, 4.0, 5.0, 6.0], region);
    view.setRange(3, 7, [double.negativeInfinity, 0.0, 1.0, double.infinity]);
    Expect.listEquals([
      0.0,
      1.0,
      2.0,
      double.negativeInfinity,
      0.0,
      1.0,
      double.infinity,
      7.0,
      8.0,
      9.0
    ], view);
    Expect.listEquals([
      0xBFF0000000000000,
      0x0000000000000000,
      0x3FF0000000000000,
      0x4000000000000000,
      0xFFF0000000000000,
      0x0000000000000000,
      0x3FF0000000000000,
      0x7FF0000000000000,
      0x401C000000000000,
      0x4020000000000000,
      0x4022000000000000,
      0xBFF0000000000000
    ], array);
  }

  static testFloat64ListView() {
    var array = new Uint64List(12);
    testFloat64ListViewImpl(array);
  }

  static testMain() {
    testInt8List();
    testUint8List();
    testUint8ClampedList();
    testInt16List();
    testUint16List();
    testInt32List();
    testUint32List();
    testInt64List();
    testUint64List();
    testFloat32List();
    testFloat64List();

    testInt8ListView();
    testUint8ListView();
    testInt16ListView();
    testUint16ListView();
    testInt32ListView();
    testUint32ListView();
    testInt64ListView();
    testUint64ListView();
    testFloat32ListView();
    testFloat64ListView();

    testByteList();
  }
}

main() {
  for (var i = 0; i < 20; i++) {
    ByteArrayTest.testMain();
  }
}
