// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// Dart test program for testing typed data.

// VMOptions=--optimization_counter_threshold=10 --no-background_compilation

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

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

void testCreateUint8TypedData() {
  Uint8List typed_data;

  typed_data = new Uint8List(0);
  Expect.isTrue(typed_data is Uint8List);
  Expect.isFalse(typed_data is Uint8ClampedList);
  Expect.equals(0, typed_data.length);

  typed_data = new Uint8List(10);
  Expect.equals(10, typed_data.length);
  for (int i = 0; i < 10; i++) {
    Expect.equals(0, typed_data[i]);
  }
}

void testCreateClampedUint8TypedData() {
  Uint8ClampedList typed_data;

  typed_data = new Uint8ClampedList(0);
  Expect.isTrue(typed_data is Uint8ClampedList);
  Expect.isFalse(typed_data is Uint8List);
  Expect.equals(0, typed_data.length);
  Expect.equals(0, typed_data.lengthInBytes);

  typed_data = new Uint8ClampedList(10);
  Expect.equals(10, typed_data.length);
  for (int i = 0; i < 10; i++) {
    Expect.equals(0, typed_data[i]);
  }
}

void testTypedDataRange(bool check_throws) {
  Int8List typed_data;
  typed_data = new Int8List(10);
  typed_data[1] = 0;
  Expect.equals(0, typed_data[1]);
  typed_data[2] = -128;
  Expect.equals(-128, typed_data[2]);
  typed_data[3] = 127;
  Expect.equals(127, typed_data[3]);
  // This should eventually throw.
  typed_data[0] = 128;
  typed_data[4] = -129;
  Expect.throws(() => typed_data[-1]);
  Expect.throws(() => typed_data[100]);
}

void testUnsignedTypedDataRange(bool check_throws) {
  Uint8List typed_data;
  typed_data = new Uint8List(10);

  typed_data[1] = 255;
  Expect.equals(255, typed_data[1]);
  typed_data[1] = 0;
  Expect.equals(0, typed_data[1]);

  for (int i = 0; i < typed_data.length; i++) {
    typed_data[i] = i;
  }
  for (int i = 0; i < typed_data.length; i++) {
    Expect.equals(i, typed_data[i]);
  }

  // These should eventually throw.
  typed_data[1] = 256;
  typed_data[1] = -1;
  typed_data[2] = -129;
  Expect.throws(() => typed_data[-1]);
  Expect.throws(() => typed_data[100]);
}

void testClampedUnsignedTypedDataRangeHelper(
    Uint8ClampedList typed_data, bool check_throws) {
  Uint8ClampedList typed_data;
  typed_data = new Uint8ClampedList(10);

  typed_data[1] = 255;
  Expect.equals(255, typed_data[1]);
  typed_data[1] = 0;
  Expect.equals(0, typed_data[1]);
  for (int i = 0; i < typed_data.length; i++) {
    typed_data[i] = i;
  }
  for (int i = 0; i < typed_data.length; i++) {
    Expect.equals(i, typed_data[i]);
  }

  // These should eventually throw.
  typed_data[1] = 256;
  typed_data[2] = -129;
  Expect.equals(255, typed_data[1]);
  Expect.equals(0, typed_data[2]);
}

void testClampedUnsignedTypedDataRange(bool check_throws) {
  testClampedUnsignedTypedDataRangeHelper(
      new Uint8ClampedList(10), check_throws);
}

void testSetRangeHelper(typed_data) {
  List<int> list = [10, 11, 12];
  typed_data.setRange(0, 3, list);
  for (int i = 0; i < 3; i++) {
    Expect.equals(10 + i, typed_data[i]);
  }

  typed_data[0] = 20;
  typed_data[1] = 21;
  typed_data[2] = 22;
  list.setRange(0, 3, typed_data);
  for (int i = 0; i < 3; i++) {
    Expect.equals(20 + i, list[i]);
  }

  typed_data.setRange(1, 3, const [8, 9]);
  Expect.equals(20, typed_data[0]);
  Expect.equals(8, typed_data[1]);
  Expect.equals(9, typed_data[2]);
}

void testSetRange() {
  testSetRangeHelper(new Uint8List(3));
  testSetRangeHelper(new Uint8ClampedList(3));
  testSetRangeHelper(new Uint16List(3));
  testSetRangeHelper(new Int16List(3));

  var list;
  list = new Uint8List(4);
  list.setRange(0, 4, "abcd".codeUnits, 0);
  Expect.listEquals(list, "abcd".codeUnits);
  list = new Uint16List(4);
  list.setRange(0, 4, "abcd".codeUnits, 0);
  Expect.listEquals(list, "abcd".codeUnits);
  list.setRange(0, 4, "\xff\u0100\uffff\x00".codeUnits, 0);
  Expect.listEquals(list, "\xff\u0100\uffff\x00".codeUnits);
  list = new Int16List(4);
  list.setRange(0, 4, "abcd".codeUnits, 0);
  Expect.listEquals(list, "abcd".codeUnits);
  list.setRange(0, 4, "\xff\u0100\u7fff\x00".codeUnits, 0);
  Expect.listEquals(list, "\xff\u0100\u7fff\x00".codeUnits);
}

class C {
  final x;
  C(this.x);
  operator <(o) => false;
  operator >=(o) => false;
  operator *(o) => x;
}

void testIndexOutOfRangeHelper(typed_data, value) {
  List<int> list = new List<int>.filled(typed_data.length + 1, -1);
  for (int i = 0; i < list.length; i++) list[i] = i;

  Expect.throws(() {
    typed_data.setRange(0, 4, list);
  });

  Expect.throws(() {
    typed_data.setRange(3, 4, list);
  });

  Expect.throws(() {
    typed_data[new C(-4000000)] = value;
  });

  Expect.throws(() {
    var size = typed_data.elementSizeInBytes;
    var i = (typed_data.length - 1) * size + 1;
    typed_data[new C(i)] = value;
  });

  Expect.throws(() {
    typed_data[new C(-1)] = value;
  });
}

void testIndexOutOfRange() {
  testIndexOutOfRangeHelper(new Int8List(3), 0);
  testIndexOutOfRangeHelper(new Uint8List(3), 0);
  testIndexOutOfRangeHelper(new Uint8ClampedList(3), 0);
  testIndexOutOfRangeHelper(new Int16List(3), 0);
  testIndexOutOfRangeHelper(new Uint16List(3), 0);
  testIndexOutOfRangeHelper(new Int32List(3), 0);
  testIndexOutOfRangeHelper(new Uint32List(3), 0);
  testIndexOutOfRangeHelper(new Int64List(3), 0);
  testIndexOutOfRangeHelper(new Uint64List(3), 0);
  testIndexOutOfRangeHelper(new Float32List(3), 0.0);
  testIndexOutOfRangeHelper(new Float64List(3), 0.0);
  testIndexOutOfRangeHelper(new Int64List(3), 0);
  testIndexOutOfRangeHelper(new Uint64List(3), 0);
}

void testNoNullValueLoopSetter(list, value) {
  for (int i = 0; i < list.length; i++) {
    list[i] = value;
  }
}

void testNoNullValueDirectSetter(list, value) {
  list[0] = value;
  list[1] = value;
  list[2] = value;
}

void testNoNullValueHelper(list, value) {
  testNoNullValueLoopSetter(list, value + 1);
  for (int i = 0; i < list.length; i++) {
    Expect.equals(value + 1, list[i]);
  }
  testNoNullValueDirectSetter(list, value + 2);
  for (int i = 0; i < list.length; i++) {
    Expect.equals(value + 2, list[i]);
  }

  Expect.throws(() {
    testNoNullValueLoopSetter(list, null);
  });

  Expect.throws(() {
    testNoNullValueDirectSetter(list, null);
  });
}

void testNoNullValue() {
  testNoNullValueHelper(new Int8List(3), 1);
  testNoNullValueHelper(new Uint8List(3), 1);
  testNoNullValueHelper(new Uint8ClampedList(3), 1);
  testNoNullValueHelper(new Int16List(3), 1);
  testNoNullValueHelper(new Uint16List(3), 1);
  testNoNullValueHelper(new Int32List(3), 1);
  testNoNullValueHelper(new Uint32List(3), 1);
  testNoNullValueHelper(new Int64List(3), 1);
  testNoNullValueHelper(new Uint64List(3), 1);
  testNoNullValueHelper(new Float32List(3), 1.0);
  testNoNullValueHelper(new Float64List(3), 1.0);
  testNoNullValueHelper(new Int64List(3), 1);
  testNoNullValueHelper(new Uint64List(3), 1);
}

void testIndexOfHelper(list) {
  for (int i = 0; i < list.length; i++) {
    list[i] = i + 10;
  }
  Expect.equals(0, list.indexOf(10));
  Expect.equals(5, list.indexOf(15));
  Expect.equals(9, list.indexOf(19));
  Expect.equals(-1, list.indexOf(20));

  list = new Float32List(10);
  for (int i = 0; i < list.length; i++) {
    list[i] = i + 10.0;
  }
  Expect.equals(0, list.indexOf(10.0));
  Expect.equals(5, list.indexOf(15.0));
  Expect.equals(9, list.indexOf(19.0));
  Expect.equals(-1, list.indexOf(20.0));
}

void testIndexOf() {
  testIndexOfHelper(new Uint8List(10));
  testIndexOfHelper(new Uint8ClampedList(10));
}

void testGetAtIndex(TypedData list, num initial_value) {
  var bdata = new ByteData.view(list.buffer);
  for (int i = 0; i < bdata.lengthInBytes; i++) {
    Expect.equals(42, bdata.getUint8(i));
    Expect.equals(42, bdata.getInt8(i));
  }
  for (int i = 0; i < bdata.lengthInBytes - 1; i += 2) {
    Expect.equals(10794, bdata.getUint16(i, Endian.little));
    Expect.equals(10794, bdata.getInt16(i, Endian.little));
  }
  for (int i = 0; i < bdata.lengthInBytes - 3; i += 4) {
    Expect.equals(707406378, bdata.getUint32(i, Endian.little));
    Expect.equals(707406378, bdata.getInt32(i, Endian.little));
    Expect.equals(1.511366173271439e-13, bdata.getFloat32(i, Endian.little));
  }
  for (int i = 0; i < bdata.lengthInBytes - 7; i += 8) {
    Expect.equals(3038287259199220266, bdata.getUint64(i, Endian.little));
    Expect.equals(3038287259199220266, bdata.getInt64(i, Endian.little));
    Expect.equals(1.4260258159703532e-105, bdata.getFloat64(i, Endian.little));
  }
}

void testSetAtIndex(List list, num initial_value, [bool use_double = false]) {
  void validate([reinit = true]) {
    for (int i = 0; i < list.length; i++) {
      Expect.equals(initial_value, list[i]);
      if (reinit) list[i] = use_double ? 0.0 : 0;
    }
  }

  var bdata = new ByteData.view((list as TypedData).buffer);
  for (int i = 0; i < bdata.lengthInBytes; i++) {
    bdata.setUint8(i, 42);
  }
  validate();
  for (int i = 0; i < bdata.lengthInBytes; i++) {
    bdata.setInt8(i, 42);
  }
  validate();
  for (int i = 0; i < bdata.lengthInBytes - 1; i += 2) {
    bdata.setUint16(i, 10794, Endian.little);
  }
  validate();
  for (int i = 0; i < bdata.lengthInBytes - 1; i += 2) {
    bdata.setInt16(i, 10794, Endian.little);
  }
  validate();
  for (int i = 0; i < bdata.lengthInBytes - 3; i += 4) {
    bdata.setUint32(i, 707406378, Endian.little);
  }
  validate();
  for (int i = 0; i < bdata.lengthInBytes - 3; i += 4) {
    bdata.setInt32(i, 707406378, Endian.little);
  }
  validate();
  for (int i = 0; i < bdata.lengthInBytes - 3; i += 4) {
    bdata.setFloat32(i, 1.511366173271439e-13, Endian.little);
  }
  validate();
  for (int i = 0; i < bdata.lengthInBytes - 7; i += 8) {
    bdata.setUint64(i, 3038287259199220266, Endian.little);
  }
  validate();
  for (int i = 0; i < bdata.lengthInBytes - 7; i += 8) {
    bdata.setInt64(i, 3038287259199220266, Endian.little);
  }
  validate();
  for (int i = 0; i < bdata.lengthInBytes - 7; i += 8) {
    bdata.setFloat64(i, 1.4260258159703532e-105, Endian.little);
  }
  validate(false);
}

testViewCreation() {
  var bytes = new Uint8List(1024).buffer;
  var view;
  view = new ByteData.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Uint8List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Int8List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Uint8ClampedList.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Uint16List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Int16List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Uint32List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Int32List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Uint64List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Int64List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Float32List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Float64List.view(bytes, 24);
  Expect.equals(1000, view.lengthInBytes);
  view = new Int32x4List.view(bytes, 16);
  Expect.equals(1008, view.lengthInBytes); // Must be 16-byte aligned.
  view = new Float32x4List.view(bytes, 16);
  Expect.equals(1008, view.lengthInBytes);
  view = new Float64x2List.view(bytes, 16);
  Expect.equals(1008, view.lengthInBytes);

  view = bytes.asByteData(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asUint8List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asInt8List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asUint8ClampedList(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asUint16List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asInt16List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asUint32List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asInt32List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asUint64List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asInt64List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asFloat32List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asFloat64List(24);
  Expect.equals(1000, view.lengthInBytes);
  view = bytes.asInt32x4List(16);
  Expect.equals(1008, view.lengthInBytes);
  view = bytes.asFloat32x4List(16);
  Expect.equals(1008, view.lengthInBytes);
  view = bytes.asFloat64x2List(16);
  Expect.equals(1008, view.lengthInBytes);

  view = bytes.asByteData(24, 800);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asUint8List(24, 800);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asInt8List(24, 800);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asUint8ClampedList(24, 800);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asUint16List(24, 400);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asInt16List(24, 400);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asUint32List(24, 200);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asInt32List(24, 200);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asUint64List(24, 100);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asInt64List(24, 100);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asFloat32List(24, 200);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asFloat64List(24, 100);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asInt32x4List(32, 50);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asFloat32x4List(32, 50);
  Expect.equals(800, view.lengthInBytes);
  view = bytes.asFloat64x2List(32, 50);
  Expect.equals(800, view.lengthInBytes);
}

testWhere() {
  var bytes = new Uint8List(13);
  bytes.setRange(0, 5, [1, 1, 1, 1, 1]);
  Expect.equals(5, bytes.where((v) => v > 0).length);
}

testCreationFromList() {
  var intList = [
    -1000000000000000000,
    -255,
    -127,
    0,
    128,
    256,
    1000000000000000000
  ];
  var intLists = [];
  intLists.add(new Int8List.fromList(intList));
  intLists.add(new Int16List.fromList(intList));
  intLists.add(new Int32List.fromList(intList));
  intLists.add(new Int64List.fromList(intList));
  intLists.add(new Uint8List.fromList(intList));
  intLists.add(new Uint16List.fromList(intList));
  intLists.add(new Uint32List.fromList(intList));
  intLists.add(new Uint64List.fromList(intList));
  var doubleList = [
    -123123123123.123123123123,
    -123.0,
    0.0,
    123.0,
    123123123123.123123123
  ];
  var doubleLists = [];
  doubleLists.add(new Float32List.fromList(doubleList));
  doubleLists.add(new Float64List.fromList(doubleList));
  for (var ints in intLists) {
    for (var doubles in doubleLists) {
      Expect.throws(() => ints[0] = doubles[0]);
      Expect.throws(() => doubles[0] = ints[0]);
    }
  }
}

void testStrings() {
  test(List<int> list) {
    Uint16List uints = new Uint16List(list.length)..setAll(0, list);
    String string = new String.fromCharCodes(list);
    for (int i = 0; i < string.length; i++) {
      for (int j = i; j < string.length; j++) {
        int length = j - i;
        {
          Uint16List copy = new Uint16List(length);
          copy.setRange(0, length, string.codeUnits, i);
          Expect.listEquals(uints.sublist(i, j), copy);
        }
        {
          Uint8List buffer = new Uint8List(length * 2 + 8);
          Uint16List copy = new Uint16List.view(buffer.buffer, 4, length);
          copy.setRange(0, length, string.codeUnits, i);
          Expect.listEquals(uints.sublist(i, j), copy);
        }
        {
          String copy = new String.fromCharCodes(uints, i, j);
          Expect.equals(string.substring(i, j), copy);
        }
      }
    }
  }

  test([]);
  test([0x00, 0x7f, 0xff]);
  test([0x00, 0xdfff, 0xffff]);
  test([0xd800, 0xdc00, 0x20, 0xdbff, 0xdfff]);
}

main() {
  for (int i = 0; i < 20; i++) {
    testCreateUint8TypedData();
    testCreateClampedUint8TypedData();
    testTypedDataRange(false);
    testUnsignedTypedDataRange(false);
    testClampedUnsignedTypedDataRange(false);
    testSetRange();
    testIndexOutOfRange();
    testNoNullValue();
    testIndexOf();

    var int8list = new Int8List(128);
    testSetAtIndex(int8list, 42);
    testGetAtIndex(int8list, 42);

    var uint8list = new Uint8List(128);
    testSetAtIndex(uint8list, 42);
    testGetAtIndex(uint8list, 42);

    var int16list = new Int16List(64);
    testSetAtIndex(int16list, 10794);
    testGetAtIndex(int16list, 10794);

    var uint16list = new Uint16List(64);
    testSetAtIndex(uint16list, 10794);
    testGetAtIndex(uint16list, 10794);

    var int32list = new Int32List(32);
    testSetAtIndex(int32list, 707406378);
    testGetAtIndex(int32list, 707406378);

    var uint32list = new Uint32List(32);
    testSetAtIndex(uint32list, 707406378);
    testGetAtIndex(uint32list, 707406378);

    var int64list = new Int64List(16);
    testSetAtIndex(int64list, 3038287259199220266);
    testGetAtIndex(int64list, 3038287259199220266);

    var uint64list = new Uint64List(16);
    testSetAtIndex(uint64list, 3038287259199220266);
    testGetAtIndex(uint64list, 3038287259199220266);

    var float32list = new Float32List(32);
    testSetAtIndex(float32list, 1.511366173271439e-13, true);
    testGetAtIndex(float32list, 1.511366173271439e-13);

    var float64list = new Float64List(16);
    testSetAtIndex(float64list, 1.4260258159703532e-105, true);
    testGetAtIndex(float64list, 1.4260258159703532e-105);
  }
  testTypedDataRange(true);
  testUnsignedTypedDataRange(true);
  testViewCreation();
  testWhere();
  testCreationFromList();
  testStrings();
  testSetRange();
}
