// 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

// 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] = 0x10000000000000000 + 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] = 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] = 0x10000000000000000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4,
                       5, 6, 7, 8, 9],
                      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, [0x10000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
    Expect.listEquals([0, 1, 2, 1, 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]); },
                  (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.NEGATIVE_INFINITY, 0.0, 1.0, double.INFINITY]);
    Expect.listEquals([0.0, 1.0, 2.0, double.NEGATIVE_INFINITY, 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]); },
                  (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.NEGATIVE_INFINITY, 0.0, 1.0, double.INFINITY]);
    Expect.listEquals([0.0, 1.0, 2.0, double.NEGATIVE_INFINITY, 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, Endianness.LITTLE_ENDIAN);
    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, Endianness.LITTLE_ENDIAN));
    Expect.equals(-1285, byte_array.getInt16(4, Endianness.LITTLE_ENDIAN));
    Expect.equals(-1799, byte_array.getInt16(6, Endianness.LITTLE_ENDIAN));
    Expect.equals(0x0000, byte_array.getUint16(0, Endianness.LITTLE_ENDIAN));
    Expect.equals(0xBF80, byte_array.getUint16(2, Endianness.LITTLE_ENDIAN));
    Expect.equals(0xFAFB, byte_array.getUint16(4, Endianness.LITTLE_ENDIAN));
    Expect.equals(0xF8F9, byte_array.getUint16(6, Endianness.LITTLE_ENDIAN));
    Expect.equals(-1082130432,
                  byte_array.getInt32(0, Endianness.LITTLE_ENDIAN));
    Expect.equals(0xBF800000,
                  byte_array.getUint32(0, Endianness.LITTLE_ENDIAN));
    Expect.equals(-506097523945897984,
                  byte_array.getInt64(0, Endianness.LITTLE_ENDIAN));
    Expect.equals(0xF8F9FAFBBF800000,
                  byte_array.getUint64(0, Endianness.LITTLE_ENDIAN));
    Expect.equals(-1.0, byte_array.getFloat32(0, Endianness.LITTLE_ENDIAN));
    // 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] = 0x10000000000000000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4,
                       5, 6, 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,
                       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,
                       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] = 0x10000000000000000 + i;
    }
    Expect.listEquals([0, 1, 2, 3, 4,
                       5, 6, 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,
                       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,
                       -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, [0x10000000000000001, 0, 1, 0xFFFFFFFFFFFFFFFF]);
    Expect.listEquals([0, 1, 2, 1, 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, 0,
                       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(() { array.add(0.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 < 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.NEGATIVE_INFINITY, 0.0, 1.0, double.INFINITY]);
    Expect.listEquals([0.0, 1.0, 2.0, double.NEGATIVE_INFINITY, 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(() { array.add(0.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 < 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.NEGATIVE_INFINITY, 0.0, 1.0, double.INFINITY]);
    Expect.listEquals([0.0, 1.0, 2.0, double.NEGATIVE_INFINITY, 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();
  }
}
