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

// We temporarily test both the new math library and the old Math
// class. This can easily be simplified once we get rid of the Math
// class entirely.
library math_test;

import "package:expect/expect.dart";

import 'dart:math' as math;

class MathLibraryTest {
  static void testConstants() {
    // Source for mathematical constants is Wolfram Alpha.
    Expect.equals(
      2.7182818284590452353602874713526624977572470936999595749669,
      math.e,
    );
    Expect.equals(
      2.3025850929940456840179914546843642076011014886287729760333,
      math.ln10,
    );
    Expect.equals(
      0.6931471805599453094172321214581765680755001343602552541206,
      math.ln2,
    );
    Expect.equals(
      1.4426950408889634073599246810018921374266459541529859341354,
      math.log2e,
    );
    Expect.equals(
      0.4342944819032518276511289189166050822943970058036665661144,
      math.log10e,
    );
    Expect.equals(
      3.1415926535897932384626433832795028841971693993751058209749,
      math.pi,
    );
    Expect.equals(
      0.7071067811865475244008443621048490392848359376884740365883,
      math.sqrt1_2,
    );
    Expect.equals(
      1.4142135623730950488016887242096980785696718753769480731766,
      math.sqrt2,
    );
  }

  static checkClose(double a, double b, EPSILON) {
    Expect.equals(true, a - EPSILON <= b);
    Expect.equals(true, b <= a + EPSILON);
  }

  static void testSin() {
    // Given the imprecision of pi we can't expect better results than this.
    final double EPSILON = 1e-15;
    checkClose(0.0, math.sin(0.0), EPSILON);
    checkClose(0.0, math.sin(math.pi), EPSILON);
    checkClose(0.0, math.sin(2.0 * math.pi), EPSILON);
    checkClose(1.0, math.sin(math.pi / 2.0), EPSILON);
    checkClose(-1.0, math.sin(math.pi * (3.0 / 2.0)), EPSILON);
  }

  static void testCos() {
    // Given the imprecision of pi we can't expect better results than this.
    final double EPSILON = 1e-15;
    checkClose(1.0, math.cos(0.0), EPSILON);
    checkClose(-1.0, math.cos(math.pi), EPSILON);
    checkClose(1.0, math.cos(2.0 * math.pi), EPSILON);
    checkClose(0.0, math.cos(math.pi / 2.0), EPSILON);
    checkClose(0.0, math.cos(math.pi * (3.0 / 2.0)), EPSILON);
  }

  static void testTan() {
    // Given the imprecision of pi we can't expect better results than this.
    final double EPSILON = 1e-15;
    checkClose(0.0, math.tan(0.0), EPSILON);
    checkClose(0.0, math.tan(math.pi), EPSILON);
    checkClose(0.0, math.tan(2.0 * math.pi), EPSILON);
    checkClose(1.0, math.tan(math.pi / 4.0), EPSILON);
  }

  static void testAsin() {
    // Given the imprecision of pi we can't expect better results than this.
    final double EPSILON = 1e-15;
    checkClose(0.0, math.asin(0.0), EPSILON);
    checkClose(math.pi / 2.0, math.asin(1.0), EPSILON);
    checkClose(-math.pi / 2.0, math.asin(-1.0), EPSILON);
  }

  static void testAcos() {
    // Given the imprecision of pi we can't expect better results than this.
    final double EPSILON = 1e-15;
    checkClose(0.0, math.acos(1.0), EPSILON);
    checkClose(math.pi, math.acos(-1.0), EPSILON);
    checkClose(math.pi / 2.0, math.acos(0.0), EPSILON);
  }

  static void testAtan() {
    // Given the imprecision of pi we can't expect better results than this.
    final double EPSILON = 1e-15;
    checkClose(0.0, math.atan(0.0), EPSILON);
    checkClose(math.pi / 4.0, math.atan(1.0), EPSILON);
    checkClose(-math.pi / 4.0, math.atan(-1.0), EPSILON);
  }

  static void testAtan2() {
    // Given the imprecision of pi we can't expect better results than this.
    final double EPSILON = 1e-15;
    checkClose(0.0, math.atan2(0.0, 5.0), EPSILON);
    checkClose(math.pi / 4.0, math.atan2(2.0, 2.0), EPSILON);
    checkClose(3 * math.pi / 4.0, math.atan2(0.5, -0.5), EPSILON);
    checkClose(-3 * math.pi / 4.0, math.atan2(-2.5, -2.5), EPSILON);
  }

  static checkVeryClose(double a, num b) {
    // We find a ulp (unit in the last place) by shifting the original number
    // to the right. This only works if we are not too close to infinity or if
    // we work with denormals.
    // We special case or 0.0, but not for infinity.
    if (a == 0.0) {
      final minimalDouble = 4.9406564584124654e-324;
      Expect.equals(true, b.abs() <= minimalDouble);
      return;
    }
    if (b == 0.0) {
      // No need to look if they are close. Otherwise the check for 'a' above
      // would have triggered.
      Expect.equals(a, b);
    }
    final double shiftRightBy52 = 2.220446049250313080847263336181640625e-16;
    final double shiftedA = (a * shiftRightBy52).abs();
    // Compared to 'a', 'shiftedA' is now ~1-2 ulp.

    final double limitLow = a - shiftedA;
    final double limitHigh = a + shiftedA;
    Expect.equals(false, a == limitLow);
    Expect.equals(false, a == limitHigh);
    Expect.equals(true, limitLow <= b);
    Expect.equals(true, b <= limitHigh);
  }

  static void testSqrt() {
    checkVeryClose(2.0, math.sqrt(4.0));
    checkVeryClose(math.sqrt2, math.sqrt(2.0));
    checkVeryClose(math.sqrt1_2, math.sqrt(0.5));
    checkVeryClose(1e50, math.sqrt(1e100));
    checkVeryClose(
      1.1111111061110855443054405046358901279277111935183977e56,
      math.sqrt(12345678901234e99),
    );
  }

  static void testExp() {
    checkVeryClose(math.e, math.exp(1.0));
    final EPSILON = 1e-15;
    checkClose(10.0, math.exp(math.ln10), EPSILON);
    checkClose(2.0, math.exp(math.ln2), EPSILON);
  }

  static void testLog() {
    // Even though E is imprecise, it is good enough to get really close to 1.
    // We still provide an epsilon.
    checkClose(1.0, math.log(math.e), 1e-16);
    checkVeryClose(math.ln10, math.log(10.0));
    checkVeryClose(math.ln2, math.log(2.0));
  }

  static void testPow() {
    checkVeryClose(16.0, math.pow(4.0, 2.0));
    checkVeryClose(math.sqrt2, math.pow(2.0, 0.5));
    checkVeryClose(math.sqrt1_2, math.pow(0.5, 0.5));
  }

  static bool parseIntThrowsFormatException(str) {
    try {
      int.parse(str);
      return false;
    } on FormatException catch (e) {
      return true;
    }
  }

  static void testParseInt() {
    Expect.equals(499, int.parse("499"));
    Expect.equals(499, int.parse("+499"));
    Expect.equals(-499, int.parse("-499"));
    Expect.equals(499, int.parse("   499   "));
    Expect.equals(499, int.parse("   +499   "));
    Expect.equals(-499, int.parse("   -499   "));
    Expect.equals(0, int.parse("0"));
    Expect.equals(0, int.parse("+0"));
    Expect.equals(0, int.parse("-0"));
    Expect.equals(0, int.parse("   0   "));
    Expect.equals(0, int.parse("   +0   "));
    Expect.equals(0, int.parse("   -0   "));
    Expect.equals(0x1234567890, int.parse("0x1234567890"));
    Expect.equals(-0x1234567890, int.parse("-0x1234567890"));
    Expect.equals(0x1234567890, int.parse("   0x1234567890   "));
    Expect.equals(-0x1234567890, int.parse("   -0x1234567890   "));
    Expect.equals(256, int.parse("0x100"));
    Expect.equals(-256, int.parse("-0x100"));
    Expect.equals(256, int.parse("   0x100   "));
    Expect.equals(-256, int.parse("   -0x100   "));
    Expect.equals(0xabcdef, int.parse("0xabcdef"));
    Expect.equals(0xABCDEF, int.parse("0xABCDEF"));
    Expect.equals(0xabcdef, int.parse("0xabCDEf"));
    Expect.equals(-0xabcdef, int.parse("-0xabcdef"));
    Expect.equals(-0xABCDEF, int.parse("-0xABCDEF"));
    Expect.equals(0xabcdef, int.parse("   0xabcdef   "));
    Expect.equals(0xABCDEF, int.parse("   0xABCDEF   "));
    Expect.equals(-0xabcdef, int.parse("   -0xabcdef   "));
    Expect.equals(-0xABCDEF, int.parse("   -0xABCDEF   "));
    Expect.equals(0xabcdef, int.parse("0x00000abcdef"));
    Expect.equals(0xABCDEF, int.parse("0x00000ABCDEF"));
    Expect.equals(-0xabcdef, int.parse("-0x00000abcdef"));
    Expect.equals(-0xABCDEF, int.parse("-0x00000ABCDEF"));
    Expect.equals(0xabcdef, int.parse("   0x00000abcdef   "));
    Expect.equals(0xABCDEF, int.parse("   0x00000ABCDEF   "));
    Expect.equals(-0xabcdef, int.parse("   -0x00000abcdef   "));
    Expect.equals(-0xABCDEF, int.parse("   -0x00000ABCDEF   "));
    Expect.equals(10, int.parse("010"));
    Expect.equals(-10, int.parse("-010"));
    Expect.equals(10, int.parse("   010   "));
    Expect.equals(-10, int.parse("   -010   "));
    Expect.equals(9, int.parse("09"));
    Expect.equals(9, int.parse(" 09 "));
    Expect.equals(-9, int.parse("-09"));
    Expect.equals(0x1234567890, int.parse("+0x1234567890"));
    Expect.equals(0x1234567890, int.parse("   +0x1234567890   "));
    Expect.equals(0x100, int.parse("+0x100"));
    Expect.equals(0x100, int.parse("   +0x100   "));

    Expect.equals(true, parseIntThrowsFormatException("1b"));
    Expect.equals(true, parseIntThrowsFormatException(" 1b "));
    Expect.equals(true, parseIntThrowsFormatException(" 1 b "));
    Expect.equals(true, parseIntThrowsFormatException("1e2"));
    Expect.equals(true, parseIntThrowsFormatException(" 1e2 "));
    Expect.equals(true, parseIntThrowsFormatException("00x12"));
    Expect.equals(true, parseIntThrowsFormatException(" 00x12 "));
    Expect.equals(true, parseIntThrowsFormatException("-1b"));
    Expect.equals(true, parseIntThrowsFormatException(" -1b "));
    Expect.equals(true, parseIntThrowsFormatException(" -1 b "));
    Expect.equals(true, parseIntThrowsFormatException("-1e2"));
    Expect.equals(true, parseIntThrowsFormatException(" -1e2 "));
    Expect.equals(true, parseIntThrowsFormatException("-00x12"));
    Expect.equals(true, parseIntThrowsFormatException(" -00x12 "));
    Expect.equals(true, parseIntThrowsFormatException("  -00x12 "));
    Expect.equals(true, parseIntThrowsFormatException("0x0x12"));
    Expect.equals(true, parseIntThrowsFormatException("0.1"));
    Expect.equals(true, parseIntThrowsFormatException("0x3.1"));
    Expect.equals(true, parseIntThrowsFormatException("5."));
    Expect.equals(true, parseIntThrowsFormatException("+-5"));
    Expect.equals(true, parseIntThrowsFormatException("-+5"));
    Expect.equals(true, parseIntThrowsFormatException("--5"));
    Expect.equals(true, parseIntThrowsFormatException("++5"));
    Expect.equals(true, parseIntThrowsFormatException("+ 5"));
    Expect.equals(true, parseIntThrowsFormatException("- 5"));
    Expect.equals(true, parseIntThrowsFormatException(""));
    Expect.equals(true, parseIntThrowsFormatException("  "));
  }

  static testMain() {
    testConstants();
    testSin();
    testCos();
    testTan();
    testAsin();
    testAcos();
    testAtan();
    testAtan2();
    testSqrt();
    testLog();
    testExp();
    testPow();
    testParseInt();
  }
}

main() {
  MathLibraryTest.testMain();
}
