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

// @dart = 2.9

// 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();
}
