// Copyright (c) 2012, 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 native float arrays.

// @dart = 2.9

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

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

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

void testCreateFloat32Array() {
  Float32List floatArray;

  floatArray = new Float32List(0);
  Expect.equals(0, floatArray.length);

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

void testSetRange32() {
  Float32List floatArray = new Float32List(3);

  List<double> list = [10.0, 11.0, 12.0];
  floatArray.setRange(0, 3, list);
  for (int i = 0; i < 3; i++) {
    Expect.equals(10 + i, floatArray[i]);
  }

  floatArray[0] = 20.0;
  floatArray[1] = 21.0;
  floatArray[2] = 22.0;
  list.setRange(0, 3, floatArray);
  for (int i = 0; i < 3; i++) {
    Expect.equals(20 + i, list[i]);
  }

  // 4.0e40 is larger than the largest representable float.
  floatArray.setRange(1, 3, const [8.0, 4.0e40]);
  Expect.equals(20, floatArray[0]);
  Expect.equals(8, floatArray[1]);
  Expect.equals(double.infinity, floatArray[2]);
}

void testIndexOutOfRange32() {
  Float32List floatArray = new Float32List(3);
  List<double> list = const [0.0, 1.0, 2.0, 3.0];

  Expect.throws(() {
    floatArray[5] = 2.0;
  });
  Expect.throws(() {
    floatArray.setRange(0, 4, list);
  });

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

void testIndexOf32() {
  var 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 testCreateFloat64Array() {
  Float64List floatArray;

  floatArray = new Float64List(0);
  Expect.equals(0, floatArray.length);

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

void testSetRange64() {
  Float64List floatArray = new Float64List(3);

  List<double> list = [10.0, 11.0, 12.0];
  floatArray.setRange(0, 3, list);
  for (int i = 0; i < 3; i++) {
    Expect.equals(10 + i, floatArray[i]);
  }

  floatArray[0] = 20.0;
  floatArray[1] = 21.0;
  floatArray[2] = 22.0;
  list.setRange(0, 3, floatArray);
  for (int i = 0; i < 3; i++) {
    Expect.equals(20 + i, list[i]);
  }

  // Unlike Float32Array we can properly represent 4.0e40
  floatArray.setRange(1, 3, const [8.0, 4.0e40]);
  Expect.equals(20, floatArray[0]);
  Expect.equals(8, floatArray[1]);
  Expect.equals(4.0e40, floatArray[2]);
}

void testIndexOutOfRange64() {
  Float64List floatArray = new Float64List(3);
  List<double> list = const [0.0, 1.0, 2.0, 3.0];

  Expect.throws(() {
    floatArray[5] = 2.0;
  });
  Expect.throws(() {
    floatArray.setRange(0, 4, list);
  });

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

void testIndexOf64() {
  var list = new Float64List(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));
}

storeIt32(Float32List a, int index, value) {
  a[index] = value;
}

storeIt64(Float64List a, int index, value) {
  a[index] = value;
}

testPolymorphicLoad(var list) {
  return list[0];
}

main() {
  var a32 = new Float32List(5);
  for (int i = 0; i < 20; i++) {
    testCreateFloat32Array();
    testSetRange32();
    testIndexOutOfRange32();
    testIndexOf32();
    storeIt32(a32, 1, 2.0);
    testPolymorphicLoad(a32);
  }
  var a64 = new Float64List(5);
  for (int i = 0; i < 20; i++) {
    testCreateFloat64Array();
    testSetRange64();
    testIndexOutOfRange64();
    testIndexOf64();
    storeIt64(a64, 1, 2.0);
    testPolymorphicLoad(a64);
  }
  var f32x4 = new Float32x4List(5);
  for (int i = 0; i < 20; i++) {
    testPolymorphicLoad(f32x4);
  }

  // Check optimized (inlined) version of []=
  Expect.throws(() {
    storeIt32(a32, 1, 2);
  });
  Expect.throws(() {
    storeIt64(a64, 1, 2);
  });
}
