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

// 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 testIndexOf32() {
  var list = new Float32List(10);
  for (int i = 0; i < list.length; i++) {
    list[i] = i + 10.0;
  }

  // These used to be type errors when passing integers to indexOf() which
  // expects a double, but are no longer an error because of int-to-double.
  Expect.equals(0, list.indexOf(10));
  Expect.equals(5, list.indexOf(15));
  Expect.equals(9, list.indexOf(19));
  Expect.equals(-1, list.indexOf(20));
}

void testBadValues32() {
  var list = new Float32List(10);
  list[0] = 2.0;
  list[0] = 2; // Not an error because of int-to-double.
  list[0] = "hello";
  //        ^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  // [cfe] A value of type 'String' can't be assigned to a variable of type 'double'.
}

void testIndexOf64() {
  var list = new Float64List(10);
  for (int i = 0; i < list.length; i++) {
    list[i] = i + 10.0;
  }

  // These used to be type errors when passing integers to indexOf() which
  // expects a double, but are no longer an error because of int-to-double.
  Expect.equals(0, list.indexOf(10));
  Expect.equals(5, list.indexOf(15));
  Expect.equals(9, list.indexOf(19));
  Expect.equals(-1, list.indexOf(20));
}

void testBadValues64() {
  var list = new Float64List(10);
  list[0] = 2.0;
  list[0] = 2; // Not an error because of int-to-double.
  list[0] = "hello";
  //        ^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  // [cfe] A value of type 'String' can't be assigned to a variable of type 'double'.
}

main() {
  testIndexOf32();
  testIndexOf64();
  testBadValues32();
  testBadValues64();
}
