// 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.
// Tests that the VM does not crash on weird corner cases of class Math.
// VMOptions=--optimization_counter_threshold=100 --no-background_compilation

library math_vm_test;

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

class FakeNumber {
  const FakeNumber();
  void toDouble() {}
}

class MathTest {
  static bool testParseInt(x) {
    try {
      int.parse(x);  // Expects string.
      return true;
    } catch (e) {
      return false;
    }
  }

  static bool testSqrt(x) {
    try {
      sqrt(x);  // Expects number.
      return true;
    } catch (e) {
      return false;
    }
  }

  static void testMain() {
    Expect.equals(false, testParseInt(5));
    Expect.equals(false, testSqrt(const FakeNumber()));
  }
}

testDoublePow() {
  Expect.equals((1 << 32).toDouble(), pow(2.0, 32));
}


testSinCos(a) {
  double sVal = sin(a);
  double cVal = cos(a);
  return sVal + cVal;
}

main() {
  const double value = 1.54;
  final firstRes = testSinCos(value);
  for (int i = 0; i < 200; i++) {
    MathTest.testMain();
    testDoublePow();
    testSinCos(value);
  }
  Expect.equals(firstRes, testSinCos(value));
}
