// 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 for testing Math.min and Math.max.

negate(x) => -x;

main() {
  // Test matrix:
  var minNonZero = 5e-324;
  var maxDenormal = 2.225073858507201e-308;
  var minNormal = 2.2250738585072014e-308;
  var maxFraction = 0.9999999999999999;
  var minAbove1 = 1.0000000000000002;
  var maxNonInt = 4503599627370495.5;
  var maxNonIntFloorAsDouble = maxNonInt.floor();
  var maxNonIntFloorAsInt = maxNonIntFloorAsDouble.toInt();
  var maxExactIntAsDouble = 9007199254740992.0;
  var maxExactIntAsInt = 9007199254740992;
  var two53 = 1 << 53;  // Same as maxExactIntAsInt.
  var two53p1 = two53 + 1;
  var maxFiniteAsDouble = 1.7976931348623157e+308;
  var maxFiniteAsInt = maxFiniteAsDouble.toInt();
  int huge = 1 << 2000;
  int hugeP1 = huge + 1;
  var inf = double.INFINITY;
  var nan = double.NAN;
  var mnan = negate(nan);
  var matrix = [
      -inf,
      -hugeP1,
      -huge,
      [-maxFiniteAsDouble, -maxFiniteAsInt],
      -two53p1,
      [-two53, -maxExactIntAsInt, -maxExactIntAsDouble],
      -maxNonInt,
      [-maxNonIntFloorAsDouble, -maxNonIntFloorAsInt],
      [-499.0, -499],
      -minAbove1,
      [-1.0, -1],
      -maxFraction,
      -minNormal,
      -maxDenormal,
      -minNonZero,
      -0.0,
      [0,0, 0],
      minNonZero,
      maxDenormal,
      minNormal,
      maxFraction,
      [1.0, 1],
      minAbove1,
      [499.0, 499],
      [maxNonIntFloorAsDouble, maxNonIntFloorAsInt],
      maxNonInt,
      [two53, maxExactIntAsInt, maxExactIntAsDouble],
      two53p1,
      [maxFiniteAsDouble, maxFiniteAsInt],
      huge,
      hugeP1,
      inf,
      [nan, mnan],
    ];

  check(left, right, expectedResult) {
    if (left is List) {
      for(var x in left) check(x, right, expectedResult);
      return;
    }
    if (right is List) {
      for(var x in right) check(left, x, expectedResult);
      return;
    }
    int actual = left.compareTo(right);
    Expect.equals(expectedResult, actual,
                  "($left).compareTo($right) failed "
                  "(should have been $expectedResult, was $actual");
  }

  for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix.length; j++) {
      var left = matrix[i];
      var right = matrix[j];
      if (left is List) {
        check(left, left, 0);
      }
      check(left, right, i == j ? 0 : (i < j ? -1 : 1));
    }
  }
}
