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

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

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

// 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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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<1000; i++) {
    OptimizedByteArrayTest.testMain();
  }
}
