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

// This test exercises optimized [] and []= operators
// on byte array views.
class OptimizedByteArrayTest {
  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);
    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);
    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 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);
    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);
    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);
    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);
    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);
    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);
    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);
    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);
    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 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();
    testInt16List();
    testUint16List();
    testInt32List();
    testUint32List();
    testInt64List();
    testUint64List();
    testFloat32List();
    testFloat64List();
    //testByteList();
    testInt8ListView();
    testUint8ListView();
    testInt16ListView();
    testUint16ListView();
    testInt32ListView();
    testUint32ListView();
    testInt64ListView();
    testUint64ListView();
    testFloat32ListView();
    testFloat64ListView();
  }
}

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