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

/**
 * @assertion
 * double getFloat32(
 *     int byteOffset, [
 *     Endian endian = Endian.big
 * ])
 * Returns the floating point number represented by the four bytes at the
 * specified [byteOffset] in this object, in IEEE 754 single-precision binary
 * floating-point format (binary32).
 * @description Checks that the correct value is returned.
 * @author msyabro
 */

import "dart:typed_data";
import "../../../Utils/expect.dart";

main() {
  var f32 = new Float32List.fromList([
    .0, .12, 0.123e32, -0.312e-31, 10.0, 1.401298464324817e-45,
    1.1754943508222875e-38
  ]);
  var u32 = new Uint32List.fromList(
      [0x62e7a17b, 0xf7ec7100, 0xe7180101, 0x1f83ccbb]);
  var sizeInBytes =  Float32List.bytesPerElement;

  var byteDataFromF32 = new ByteData.view(f32.buffer);
  for (int i = 0; i < byteDataFromF32.lengthInBytes / sizeInBytes; ++i) {
    Expect.approxEquals(f32[i], byteDataFromF32.getFloat32(i * sizeInBytes,
        Endian.little),(f32[i] / 1e7).abs());
  }

  var byteDataFromU32 = new ByteData.view(u32.buffer);
  var expectedBigEndian = [
    1.6813055904049544e+36, 1.0462418034594343e-38,
    2.3711424564181874e-38, -0.006241216789931059
  ];
  var expectedLittleEndian = [
    2.136416887544574e+21, -9.591202897651812e+33,
    -7.178182241978538e+23, 5.581935619425446e-20
  ];
  for (int i = 0; i < byteDataFromU32.lengthInBytes / sizeInBytes; ++i) {
    Expect.approxEquals(expectedBigEndian[i],
        byteDataFromU32.getFloat32(i * sizeInBytes, Endian.big),
        (expectedBigEndian[i] / 1e7).abs());
    Expect.approxEquals(expectedLittleEndian[i],
        byteDataFromU32.getFloat32(i * sizeInBytes, Endian.little),
        (expectedLittleEndian[i] / 1e7).abs());
  }
}
