// Copyright (c) 2011, 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 static void approxEquals(num expected, num actual,
///   [num tolerance = null, String reason = ''])
/// Failure if the difference between expected and actual is greater than the
/// given tolerance.
/// @description Checks that using negative tolerance (except negative zero) or
/// NAN as either argument always results in failure. Negative tolerances tested
/// include doubles of minimum and maximum possible magnitude.
/// @author rodionov

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

import "dart:math" as Math;

main() {
  final double MIN_DOUBLE = Math.pow(2.0, -1074) as double;
  final double NEG_MIN_DOUBLE = -1 * MIN_DOUBLE; 
  final double MAX_DOUBLE =
      (2 - Math.pow(2.0, -52)) * Math.pow(2.0, 1023) as double;
  final double NEG_MAX_DOUBLE = -1 * MAX_DOUBLE; 

  check(0, 0, double.negativeInfinity);
  check(0, 0, double.negativeInfinity, "");
  check(0, 0, double.negativeInfinity, "not empty");

  check(0, 0, NEG_MAX_DOUBLE);
  check(0, 0, NEG_MAX_DOUBLE, "");
  check(0, 0, NEG_MAX_DOUBLE, "not empty");

  check(0, 0, NEG_MIN_DOUBLE);
  check(0, 0, NEG_MIN_DOUBLE, "");
  check(0, 0, NEG_MIN_DOUBLE, "not empty");

  // inf - inf -> NaN
  check(double.infinity, double.infinity, double.infinity);
  check(double.infinity, double.infinity, double.infinity, "");
  check(double.infinity, double.infinity, double.infinity, "not empty");

  check(double.negativeInfinity, double.negativeInfinity, double.infinity);
  check(double.negativeInfinity, double.negativeInfinity, double.infinity, "");
  check(double.negativeInfinity, double.negativeInfinity, double.infinity,
      "not empty");

  check(0, double.nan, double.infinity);
  check(0, double.nan, double.infinity, "");
  check(0, double.nan, double.infinity, "not empty");

  check(0, 0, double.nan);
  check(0, 0, double.nan, "");
  check(0, 0, double.nan, "not empty");
}

void check(num arg1, num arg2, num tolerance, [String reason = '']) {
  try {
    Expect.approxEquals(arg1, arg2, tolerance, reason);
    throw new Exception("ExpectException expected");
  } on ExpectException catch(e) {
  }
}
