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

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

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

testGetters() {
  bool host_is_little_endian =
      (new Uint8List.view(new Uint16List.fromList([1]).buffer))[0] == 1;

  var list = new Uint8List(8);
  list[0] = 0xf1;
  list[1] = 0xf2;
  list[2] = 0xf3;
  list[3] = 0xf4;
  list[4] = 0xf5;
  list[5] = 0xf6;
  list[6] = 0xf7;
  list[7] = 0xf8;
  var ba = list.buffer;

  ByteData bd = new ByteData.view(ba);
  var value;
  int expected_value_be = -3598;
  int expected_value_le = -3343;

  value = bd.getInt16(0); // Default is big endian access.
  Expect.equals(expected_value_be, value);
  value = bd.getInt16(0, Endian.big);
  Expect.equals(expected_value_be, value);
  value = bd.getInt16(0, Endian.little);
  Expect.equals(expected_value_le, value);
  value = bd.getInt16(0, Endian.host);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    Expect.equals(expected_value_le, value);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    Expect.equals(expected_value_be, value);
  }

  value = bd.getUint16(0); // Default is big endian access.
  Expect.equals(0xf1f2, value);
  value = bd.getUint16(0, Endian.big);
  Expect.equals(0xf1f2, value);
  value = bd.getUint16(0, Endian.little);
  Expect.equals(0xf2f1, value);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    Expect.equals(0xf2f1, value);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    Expect.equals(0xf1f2, value);
  }

  expected_value_be = -235736076;
  expected_value_le = -185339151;

  value = bd.getInt32(0); // Default is big endian access.
  Expect.equals(expected_value_be, value);
  value = bd.getInt32(0, Endian.big);
  Expect.equals(expected_value_be, value);
  value = bd.getInt32(0, Endian.little);
  Expect.equals(expected_value_le, value);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    Expect.equals(expected_value_le, value);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    Expect.equals(expected_value_be, value);
  }

  value = bd.getUint32(0); // Default is big endian access.
  Expect.equals(0xf1f2f3f4, value);
  value = bd.getUint32(0, Endian.big);
  Expect.equals(0xf1f2f3f4, value);
  value = bd.getUint32(0, Endian.little);
  Expect.equals(0xf4f3f2f1, value);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    Expect.equals(0xf4f3f2f1, value);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    Expect.equals(0xf1f2f3f4, value);
  }

  expected_value_be = -1012478732780767240;
  expected_value_le = -506664896818842895;

  value = bd.getInt64(0); // Default is big endian access.
  Expect.equals(expected_value_be, value);
  value = bd.getInt64(0, Endian.big);
  Expect.equals(expected_value_be, value);
  value = bd.getInt64(0, Endian.little);
  Expect.equals(expected_value_le, value);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    Expect.equals(expected_value_le, value);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    Expect.equals(expected_value_be, value);
  }

  value = bd.getUint64(0); // Default is big endian access.
  Expect.equals(0xf1f2f3f4f5f6f7f8, value);
  value = bd.getUint64(0, Endian.big);
  Expect.equals(0xf1f2f3f4f5f6f7f8, value);
  value = bd.getUint64(0, Endian.little);
  Expect.equals(0xf8f7f6f5f4f3f2f1, value);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    Expect.equals(0xf8f7f6f5f4f3f2f1, value);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    Expect.equals(0xf1f2f3f4f5f6f7f8, value);
  }

  double expected_be_value = -2.4060893954673178e+30;
  double expected_le_value = -1.5462104171572421e+32;
  value = bd.getFloat32(0); // Default is big endian access.
  Expect.equals(expected_be_value, value);
  value = bd.getFloat32(0, Endian.big);
  Expect.equals(expected_be_value, value);
  value = bd.getFloat32(0, Endian.little);
  Expect.equals(expected_le_value, value);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    Expect.equals(expected_le_value, value);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    Expect.equals(expected_be_value, value);
  }

  expected_be_value = -7.898661740976602e+240;
  expected_le_value = -5.185705956736366e+274;
  value = bd.getFloat64(0); // Default is big endian access.
  Expect.equals(expected_be_value, value);
  value = bd.getFloat64(0, Endian.big);
  Expect.equals(expected_be_value, value);
  value = bd.getFloat64(0, Endian.little);
  Expect.equals(expected_le_value, value);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    Expect.equals(expected_le_value, value);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    Expect.equals(expected_be_value, value);
  }
}

validate16be(var list) {
  Expect.equals(0xf1, list[0]);
  Expect.equals(0xf2, list[1]);
}

validate16le(var list) {
  Expect.equals(0xf2, list[0]);
  Expect.equals(0xf1, list[1]);
}

validate32be(var list) {
  Expect.equals(0xf1, list[0]);
  Expect.equals(0xf2, list[1]);
  Expect.equals(0xf3, list[2]);
  Expect.equals(0xf4, list[3]);
}

validate32le(var list) {
  Expect.equals(0xf4, list[0]);
  Expect.equals(0xf3, list[1]);
  Expect.equals(0xf2, list[2]);
  Expect.equals(0xf1, list[3]);
}

validate64be(var list) {
  Expect.equals(0xf1, list[0]);
  Expect.equals(0xf2, list[1]);
  Expect.equals(0xf3, list[2]);
  Expect.equals(0xf4, list[3]);
  Expect.equals(0xf5, list[4]);
  Expect.equals(0xf6, list[5]);
  Expect.equals(0xf7, list[6]);
  Expect.equals(0xf8, list[7]);
}

validate64le(var list) {
  Expect.equals(0xf8, list[0]);
  Expect.equals(0xf7, list[1]);
  Expect.equals(0xf6, list[2]);
  Expect.equals(0xf5, list[3]);
  Expect.equals(0xf4, list[4]);
  Expect.equals(0xf3, list[5]);
  Expect.equals(0xf2, list[6]);
  Expect.equals(0xf1, list[7]);
}

testSetters() {
  bool host_is_little_endian =
      (new Uint8List.view(new Uint16List.fromList([1]).buffer))[0] == 1;

  var list = new Uint8List(8);
  for (int i = 0; i < list.length; i++) {
    list[i] = 0;
  }
  var ba = list.buffer;
  ByteData bd = new ByteData.view(ba);

  bd.setInt16(0, 0xf1f2); // Default is big endian access.
  validate16be(list);
  bd.setInt16(0, 0xf1f2, Endian.big);
  validate16be(list);
  bd.setInt16(0, 0xf1f2, Endian.little);
  validate16le(list);
  bd.setInt16(0, 0xf1f2, Endian.host);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    validate16le(list);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    validate16be(list);
  }

  bd.setUint16(0, 0xf1f2); // Default is big endian access.
  validate16be(list);
  bd.setUint16(0, 0xf1f2, Endian.big);
  validate16be(list);
  bd.setUint16(0, 0xf1f2, Endian.little);
  validate16le(list);
  bd.setUint16(0, 0xf1f2, Endian.host);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    validate16le(list);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    validate16be(list);
  }

  bd.setInt32(0, 0xf1f2f3f4); // Default is big endian access.
  validate32be(list);
  bd.setInt32(0, 0xf1f2f3f4, Endian.big);
  validate32be(list);
  bd.setInt32(0, 0xf1f2f3f4, Endian.little);
  validate32le(list);
  bd.setInt32(0, 0xf1f2f3f4, Endian.host);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    validate32le(list);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    validate32be(list);
  }

  bd.setUint32(0, 0xf1f2f3f4); // Default is big endian access.
  validate32be(list);
  bd.setUint32(0, 0xf1f2f3f4, Endian.big);
  validate32be(list);
  bd.setUint32(0, 0xf1f2f3f4, Endian.little);
  validate32le(list);
  bd.setUint32(0, 0xf1f2f3f4, Endian.host);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    validate32le(list);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    validate32be(list);
  }

  bd.setInt64(0, 0xf1f2f3f4f5f6f7f8); // Default is big endian access.
  validate64be(list);
  bd.setInt64(0, 0xf1f2f3f4f5f6f7f8, Endian.big);
  validate64be(list);
  bd.setInt64(0, 0xf1f2f3f4f5f6f7f8, Endian.little);
  validate64le(list);
  bd.setInt64(0, 0xf1f2f3f4f5f6f7f8, Endian.host);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    validate64le(list);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    validate64be(list);
  }

  bd.setUint64(0, 0xf1f2f3f4f5f6f7f8); // Default is big endian access.
  validate64be(list);
  bd.setUint64(0, 0xf1f2f3f4f5f6f7f8, Endian.big);
  validate64be(list);
  bd.setUint64(0, 0xf1f2f3f4f5f6f7f8, Endian.little);
  validate64le(list);
  bd.setUint64(0, 0xf1f2f3f4f5f6f7f8, Endian.host);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    validate64le(list);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    validate64be(list);
  }

  bd.setFloat32(0, -2.4060893954673178e+30); // Default is big endian access.
  validate32be(list);
  bd.setFloat32(0, -2.4060893954673178e+30, Endian.big);
  validate32be(list);
  bd.setFloat32(0, -2.4060893954673178e+30, Endian.little);
  validate32le(list);
  bd.setFloat32(0, -2.4060893954673178e+30, Endian.host);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    validate32le(list);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    validate32be(list);
  }

  bd.setFloat64(0, -7.898661740976602e+240); // Default is big endian access.
  validate64be(list);
  bd.setFloat64(0, -7.898661740976602e+240, Endian.big);
  validate64be(list);
  bd.setFloat64(0, -7.898661740976602e+240, Endian.little);
  validate64le(list);
  bd.setFloat64(0, -7.898661740976602e+240, Endian.host);
  if (host_is_little_endian) {
    Expect.isTrue(identical(Endian.host, Endian.little));
    validate64le(list);
  } else {
    Expect.isTrue(identical(Endian.host, Endian.big));
    validate64be(list);
  }
}

main() {
  testGetters();
  testSetters();
}
