// 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 arguments with (non-NAN) difference exceeding
/// the specified non-negative, non-NAN tolerance always results in failure.
/// @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(100.0, 101, 0.1);
  check(100.0, 101, 0.2, "");
  check(100.0, 101, 0.3, "not empty");

  check(101, 100.0, 0);
  check(101, 100.0, 0, "");
  check(101, 100.0, 0, "not empty");

  check(100.0, 101, 0.0);
  check(100.0, 101, 0.0, "");
  check(100.0, 101, 0.0, "not empty");

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

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

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

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

  check(double.infinity, NEG_MAX_DOUBLE, MAX_DOUBLE);
  check(double.infinity, NEG_MAX_DOUBLE, MAX_DOUBLE, "");
  check(double.infinity, NEG_MAX_DOUBLE, MAX_DOUBLE, "not empty");

  check(double.negativeInfinity, NEG_MAX_DOUBLE, MAX_DOUBLE);
  check(double.negativeInfinity, NEG_MAX_DOUBLE, MAX_DOUBLE, "");
  check(double.negativeInfinity, NEG_MAX_DOUBLE, MAX_DOUBLE, "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) {
  }
}
