// 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>(typed_data.length + 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();
}
