11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.math;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.ALL_DOUBLE_CANDIDATES;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.ALL_ROUNDING_MODES;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.ALL_SAFE_ROUNDING_MODES;
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.math.MathTesting.DOUBLE_CANDIDATES_EXCEPT_NAN;
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.math.MathTesting.FINITE_DOUBLE_CANDIDATES;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.FRACTIONAL_DOUBLE_CANDIDATES;
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.math.MathTesting.INFINITIES;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.INTEGRAL_DOUBLE_CANDIDATES;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.NEGATIVE_INTEGER_CANDIDATES;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.POSITIVE_FINITE_DOUBLE_CANDIDATES;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.CEILING;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.DOWN;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.FLOOR;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.UNNECESSARY;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.UP;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
360888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible;
370888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtIncompatible;
387dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.ImmutableList;
397dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Iterables;
407dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.primitives.Doubles;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigDecimal;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigInteger;
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.RoundingMode;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
497dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.List;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@code DoubleMath}.
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
560888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible(emulated = true)
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class DoubleMathTest extends TestCase {
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final BigDecimal MAX_INT_AS_BIG_DECIMAL = BigDecimal.valueOf(Integer.MAX_VALUE);
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final BigDecimal MIN_INT_AS_BIG_DECIMAL = BigDecimal.valueOf(Integer.MIN_VALUE);
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final BigDecimal MAX_LONG_AS_BIG_DECIMAL = BigDecimal.valueOf(Long.MAX_VALUE);
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final BigDecimal MIN_LONG_AS_BIG_DECIMAL = BigDecimal.valueOf(Long.MIN_VALUE);
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
657dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final double MIN_NORMAL = 2.2250738585072014E-308; // Doubles.MIN_NORMAL from 1.6
667dd252788645e940eada959bdde927426e2531c9Paul Duffin
677dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testConstantsMaxFactorial() {
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    BigInteger maxDoubleValue = BigDecimal.valueOf(Double.MAX_VALUE).toBigInteger();
690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertTrue(BigIntegerMath.factorial(DoubleMath.MAX_FACTORIAL).compareTo(maxDoubleValue) <= 0);
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(
710888a09821a98ac0680fad765217302858e70fa4Paul Duffin        BigIntegerMath.factorial(DoubleMath.MAX_FACTORIAL + 1).compareTo(maxDoubleValue) > 0);
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConstantsEverySixteenthFactorial() {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0, n = 0; n <= DoubleMath.MAX_FACTORIAL; i++, n += 16) {
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(
777dd252788645e940eada959bdde927426e2531c9Paul Duffin          BigIntegerMath.factorial(n).doubleValue(), DoubleMath.everySixteenthFactorial[i]);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
807dd252788645e940eada959bdde927426e2531c9Paul Duffin
810888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)")
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundIntegralDoubleToInt() {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : INTEGRAL_DOUBLE_CANDIDATES) {
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigDecimal expected = new BigDecimal(d).setScale(0, mode);
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean isInBounds = expected.compareTo(MAX_INT_AS_BIG_DECIMAL) <= 0
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            & expected.compareTo(MIN_INT_AS_BIG_DECIMAL) >= 0;
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(expected.intValue(), DoubleMath.roundToInt(d, mode));
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertTrue(isInBounds);
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException e) {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertFalse(isInBounds);
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)")
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundFractionalDoubleToInt() {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : FRACTIONAL_DOUBLE_CANDIDATES) {
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigDecimal expected = new BigDecimal(d).setScale(0, mode);
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean isInBounds = expected.compareTo(MAX_INT_AS_BIG_DECIMAL) <= 0
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            & expected.compareTo(MIN_INT_AS_BIG_DECIMAL) >= 0;
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(expected.intValue(), DoubleMath.roundToInt(d, mode));
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertTrue(isInBounds);
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException e) {
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertFalse(isInBounds);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)")
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundExactIntegralDoubleToInt() {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : INTEGRAL_DOUBLE_CANDIDATES) {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      BigDecimal expected = new BigDecimal(d).setScale(0, UNNECESSARY);
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      boolean isInBounds = expected.compareTo(MAX_INT_AS_BIG_DECIMAL) <= 0
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          & expected.compareTo(MIN_INT_AS_BIG_DECIMAL) >= 0;
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(expected.intValue(), DoubleMath.roundToInt(d, UNNECESSARY));
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(isInBounds);
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException e) {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertFalse(isInBounds);
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)")
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundExactFractionalDoubleToIntFails() {
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : FRACTIONAL_DOUBLE_CANDIDATES) {
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToInt(d, UNNECESSARY);
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)")
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundNaNToIntAlwaysFails() {
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToInt(Double.NaN, mode);
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)")
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundInfiniteToIntAlwaysFails() {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToInt(Double.POSITIVE_INFINITY, mode);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToInt(Double.NEGATIVE_INFINITY, mode);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)")
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundIntegralDoubleToLong() {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : INTEGRAL_DOUBLE_CANDIDATES) {
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigDecimal expected = new BigDecimal(d).setScale(0, mode);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean isInBounds = expected.compareTo(MAX_LONG_AS_BIG_DECIMAL) <= 0
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            & expected.compareTo(MIN_LONG_AS_BIG_DECIMAL) >= 0;
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(expected.longValue(), DoubleMath.roundToLong(d, mode));
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertTrue(isInBounds);
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException e) {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertFalse(isInBounds);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)")
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundFractionalDoubleToLong() {
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : FRACTIONAL_DOUBLE_CANDIDATES) {
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigDecimal expected = new BigDecimal(d).setScale(0, mode);
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean isInBounds = expected.compareTo(MAX_LONG_AS_BIG_DECIMAL) <= 0
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            & expected.compareTo(MIN_LONG_AS_BIG_DECIMAL) >= 0;
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(expected.longValue(), DoubleMath.roundToLong(d, mode));
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertTrue(isInBounds);
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException e) {
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertFalse(isInBounds);
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)")
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundExactIntegralDoubleToLong() {
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : INTEGRAL_DOUBLE_CANDIDATES) {
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // every mode except UNNECESSARY
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      BigDecimal expected = new BigDecimal(d).setScale(0, UNNECESSARY);
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      boolean isInBounds = expected.compareTo(MAX_LONG_AS_BIG_DECIMAL) <= 0
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          & expected.compareTo(MIN_LONG_AS_BIG_DECIMAL) >= 0;
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(expected.longValue(), DoubleMath.roundToLong(d, UNNECESSARY));
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(isInBounds);
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException e) {
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertFalse(isInBounds);
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)")
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundExactFractionalDoubleToLongFails() {
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : FRACTIONAL_DOUBLE_CANDIDATES) {
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToLong(d, UNNECESSARY);
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)")
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundNaNToLongAlwaysFails() {
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToLong(Double.NaN, mode);
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2400888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)")
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundInfiniteToLongAlwaysFails() {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToLong(Double.POSITIVE_INFINITY, mode);
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToLong(Double.NEGATIVE_INFINITY, mode);
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)")
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundIntegralDoubleToBigInteger() {
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : INTEGRAL_DOUBLE_CANDIDATES) {
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigDecimal expected = new BigDecimal(d).setScale(0, mode);
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(expected.toBigInteger(), DoubleMath.roundToBigInteger(d, mode));
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2640888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)")
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundFractionalDoubleToBigInteger() {
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : FRACTIONAL_DOUBLE_CANDIDATES) {
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigDecimal expected = new BigDecimal(d).setScale(0, mode);
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(expected.toBigInteger(), DoubleMath.roundToBigInteger(d, mode));
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2740888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)")
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundExactIntegralDoubleToBigInteger() {
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : INTEGRAL_DOUBLE_CANDIDATES) {
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      BigDecimal expected = new BigDecimal(d).setScale(0, UNNECESSARY);
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expected.toBigInteger(), DoubleMath.roundToBigInteger(d, UNNECESSARY));
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2820888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)")
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundExactFractionalDoubleToBigIntegerFails() {
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : FRACTIONAL_DOUBLE_CANDIDATES) {
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToBigInteger(d, UNNECESSARY);
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2920888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)")
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundNaNToBigIntegerAlwaysFails() {
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToBigInteger(Double.NaN, mode);
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)")
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundInfiniteToBigIntegerAlwaysFails() {
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToBigInteger(Double.POSITIVE_INFINITY, mode);
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.roundToBigInteger(Double.NEGATIVE_INFINITY, mode);
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3160888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)")
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundLog2Floor() {
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) {
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int log2 = DoubleMath.log2(d, FLOOR);
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(StrictMath.pow(2.0, log2) <= d);
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(StrictMath.pow(2.0, log2 + 1) > d);
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3250888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.log2(double, RoundingMode), StrictMath")
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundLog2Ceiling() {
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) {
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int log2 = DoubleMath.log2(d, CEILING);
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(StrictMath.pow(2.0, log2) >= d);
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      double z = StrictMath.pow(2.0, log2 - 1);
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(z < d);
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3350888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.log2(double, RoundingMode), StrictMath")
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundLog2Down() {
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int log2 = DoubleMath.log2(d, DOWN);
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (d >= 1.0) {
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(log2 >= 0);
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(StrictMath.pow(2.0, log2) <= d);
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(StrictMath.pow(2.0, log2 + 1) > d);
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else {
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(log2 <= 0);
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(StrictMath.pow(2.0, log2) >= d);
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(StrictMath.pow(2.0, log2 - 1) < d);
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3510888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.log2(double, RoundingMode), StrictMath")
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundLog2Up() {
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) {
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int log2 = DoubleMath.log2(d, UP);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (d >= 1.0) {
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(log2 >= 0);
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(StrictMath.pow(2.0, log2) >= d);
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(StrictMath.pow(2.0, log2 - 1) < d);
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else {
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(log2 <= 0);
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(StrictMath.pow(2.0, log2) <= d);
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(StrictMath.pow(2.0, log2 + 1) > d);
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3670888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.log2(double, RoundingMode)")
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundLog2ThrowsOnZerosInfinitiesAndNaN() {
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (double d :
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          asList(0.0, -0.0, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN)) {
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          DoubleMath.log2(d, mode);
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail("Expected IllegalArgumentException");
3750888a09821a98ac0680fad765217302858e70fa4Paul Duffin        } catch (IllegalArgumentException expected) {}
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3800888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.log2(double, RoundingMode)")
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRoundLog2ThrowsOnNegative() {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) {
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          DoubleMath.log2(-d, mode);
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail("Expected IllegalArgumentException");
3870888a09821a98ac0680fad765217302858e70fa4Paul Duffin        } catch (IllegalArgumentException expected) {}
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3920888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.isPowerOfTwo, DoubleMath.log2(double, RoundingMode), StrictMath")
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsPowerOfTwoYes() {
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = -1074; i <= 1023; i++) {
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(DoubleMath.isPowerOfTwo(StrictMath.pow(2.0, i)));
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.isPowerOfTwo, DoubleMath.log2(double, RoundingMode), StrictMath")
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsPowerOfTwo() {
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double x : ALL_DOUBLE_CANDIDATES) {
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      boolean expected = x > 0 && !Double.isInfinite(x) && !Double.isNaN(x)
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          && StrictMath.pow(2.0, DoubleMath.log2(x, FLOOR)) == x;
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expected, DoubleMath.isPowerOfTwo(x));
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4087dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testLog2SemiMonotonic() {
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) {
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(DoubleMath.log2(d + 0.01) >= DoubleMath.log2(d));
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4137dd252788645e940eada959bdde927426e2531c9Paul Duffin
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog2Negative() {
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) {
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Double.isNaN(DoubleMath.log2(-d)));
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog2Zero() {
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Double.NEGATIVE_INFINITY, DoubleMath.log2(0.0));
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Double.NEGATIVE_INFINITY, DoubleMath.log2(-0.0));
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog2NaNInfinity() {
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Double.POSITIVE_INFINITY, DoubleMath.log2(Double.POSITIVE_INFINITY));
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Double.isNaN(DoubleMath.log2(Double.NEGATIVE_INFINITY)));
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Double.isNaN(DoubleMath.log2(Double.NaN)));
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4310888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4320888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.isMathematicalInteger")
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsMathematicalIntegerIntegral() {
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : INTEGRAL_DOUBLE_CANDIDATES) {
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(DoubleMath.isMathematicalInteger(d));
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.isMathematicalInteger")
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsMathematicalIntegerFractional() {
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d : FRACTIONAL_DOUBLE_CANDIDATES) {
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(DoubleMath.isMathematicalInteger(d));
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4460888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.isMathematicalInteger")
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsMathematicalIntegerNotFinite() {
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (double d :
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Arrays.asList(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN)) {
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(DoubleMath.isMathematicalInteger(d));
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4540888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("Math.ulp")
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFactorial() {
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i <= DoubleMath.MAX_FACTORIAL; i++) {
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      double actual = BigIntegerMath.factorial(i).doubleValue();
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      double result = DoubleMath.factorial(i);
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(actual, result, Math.ulp(actual));
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFactorialTooHigh() {
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Double.POSITIVE_INFINITY, DoubleMath.factorial(DoubleMath.MAX_FACTORIAL + 1));
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Double.POSITIVE_INFINITY, DoubleMath.factorial(DoubleMath.MAX_FACTORIAL + 20));
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFactorialNegative() {
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int n : NEGATIVE_INTEGER_CANDIDATES) {
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        DoubleMath.factorial(n);
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4767dd252788645e940eada959bdde927426e2531c9Paul Duffin
4777dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final ImmutableList<Double> FINITE_TOLERANCE_CANDIDATES =
4787dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableList.of(-0.0, 0.0, 1.0, 100.0, 10000.0, Double.MAX_VALUE);
4797dd252788645e940eada959bdde927426e2531c9Paul Duffin
4807dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final Iterable<Double> TOLERANCE_CANDIDATES =
4817dd252788645e940eada959bdde927426e2531c9Paul Duffin      Iterables.concat(FINITE_TOLERANCE_CANDIDATES, ImmutableList.of(Double.POSITIVE_INFINITY));
4827dd252788645e940eada959bdde927426e2531c9Paul Duffin
4837dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final List<Double> BAD_TOLERANCE_CANDIDATES =
4847dd252788645e940eada959bdde927426e2531c9Paul Duffin      Doubles.asList(-Double.MIN_VALUE, -MIN_NORMAL, -1, -20, Double.NaN,
4857dd252788645e940eada959bdde927426e2531c9Paul Duffin          Double.NEGATIVE_INFINITY, -0.001);
4867dd252788645e940eada959bdde927426e2531c9Paul Duffin
4877dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyEqualsFinite() {
4887dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double a : FINITE_DOUBLE_CANDIDATES) {
4897dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (double b : FINITE_DOUBLE_CANDIDATES) {
4907dd252788645e940eada959bdde927426e2531c9Paul Duffin        for (double tolerance : FINITE_TOLERANCE_CANDIDATES) {
4917dd252788645e940eada959bdde927426e2531c9Paul Duffin          assertEquals(
4927dd252788645e940eada959bdde927426e2531c9Paul Duffin              Math.abs(a - b) <= tolerance,
4937dd252788645e940eada959bdde927426e2531c9Paul Duffin              DoubleMath.fuzzyEquals(a, b, tolerance));
4947dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
4957dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
4967dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4977dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
4987dd252788645e940eada959bdde927426e2531c9Paul Duffin
4997dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyInfiniteVersusFiniteWithFiniteTolerance() {
5007dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double inf : INFINITIES) {
5017dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (double a : FINITE_DOUBLE_CANDIDATES) {
5027dd252788645e940eada959bdde927426e2531c9Paul Duffin        for (double tolerance : FINITE_TOLERANCE_CANDIDATES) {
5037dd252788645e940eada959bdde927426e2531c9Paul Duffin          assertFalse(DoubleMath.fuzzyEquals(a, inf, tolerance));
5047dd252788645e940eada959bdde927426e2531c9Paul Duffin          assertFalse(DoubleMath.fuzzyEquals(inf, a, tolerance));
5057dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
5067dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5077dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5087dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5097dd252788645e940eada959bdde927426e2531c9Paul Duffin
5107dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyInfiniteVersusInfiniteWithFiniteTolerance() {
5117dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double inf : INFINITIES) {
5127dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (double tolerance : FINITE_TOLERANCE_CANDIDATES) {
5137dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertTrue(DoubleMath.fuzzyEquals(inf, inf, tolerance));
5147dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertFalse(DoubleMath.fuzzyEquals(inf, -inf, tolerance));
5157dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5167dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5177dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5187dd252788645e940eada959bdde927426e2531c9Paul Duffin
5197dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyEqualsInfiniteTolerance() {
5207dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double a : DOUBLE_CANDIDATES_EXCEPT_NAN) {
5217dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (double b : DOUBLE_CANDIDATES_EXCEPT_NAN) {
5227dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertTrue(DoubleMath.fuzzyEquals(a, b, Double.POSITIVE_INFINITY));
5237dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5247dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5257dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5267dd252788645e940eada959bdde927426e2531c9Paul Duffin
5277dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyEqualsOneNaN() {
5287dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double a : DOUBLE_CANDIDATES_EXCEPT_NAN) {
5297dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (double tolerance : TOLERANCE_CANDIDATES) {
5307dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertFalse(DoubleMath.fuzzyEquals(a, Double.NaN, tolerance));
5317dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertFalse(DoubleMath.fuzzyEquals(Double.NaN, a, tolerance));
5327dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5337dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5347dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5357dd252788645e940eada959bdde927426e2531c9Paul Duffin
5367dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyEqualsTwoNaNs() {
5377dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double tolerance : TOLERANCE_CANDIDATES) {
5387dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertTrue(DoubleMath.fuzzyEquals(Double.NaN, Double.NaN, tolerance));
5397dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5407dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5417dd252788645e940eada959bdde927426e2531c9Paul Duffin
5427dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyEqualsZeroTolerance() {
5437dd252788645e940eada959bdde927426e2531c9Paul Duffin    // make sure we test -0 tolerance
5447dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double zero : Doubles.asList(0.0, -0.0)) {
5457dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (double a : ALL_DOUBLE_CANDIDATES) {
5467dd252788645e940eada959bdde927426e2531c9Paul Duffin        for (double b : ALL_DOUBLE_CANDIDATES) {
5477dd252788645e940eada959bdde927426e2531c9Paul Duffin          assertEquals(a == b || (Double.isNaN(a) && Double.isNaN(b)),
5487dd252788645e940eada959bdde927426e2531c9Paul Duffin              DoubleMath.fuzzyEquals(a, b, zero));
5497dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
5507dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5517dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5527dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5537dd252788645e940eada959bdde927426e2531c9Paul Duffin
5547dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyEqualsBadTolerance() {
5557dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double tolerance : BAD_TOLERANCE_CANDIDATES) {
5567dd252788645e940eada959bdde927426e2531c9Paul Duffin      try {
5577dd252788645e940eada959bdde927426e2531c9Paul Duffin        DoubleMath.fuzzyEquals(1, 2, tolerance);
5587dd252788645e940eada959bdde927426e2531c9Paul Duffin        fail("Expected IllegalArgumentException");
5597dd252788645e940eada959bdde927426e2531c9Paul Duffin      } catch (IllegalArgumentException expected) {
5607dd252788645e940eada959bdde927426e2531c9Paul Duffin        // success
5617dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5627dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5637dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5647dd252788645e940eada959bdde927426e2531c9Paul Duffin
5657dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyCompare() {
5667dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double a : ALL_DOUBLE_CANDIDATES) {
5677dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (double b : ALL_DOUBLE_CANDIDATES) {
5687dd252788645e940eada959bdde927426e2531c9Paul Duffin        for (double tolerance : TOLERANCE_CANDIDATES) {
5697dd252788645e940eada959bdde927426e2531c9Paul Duffin          int expected = DoubleMath.fuzzyEquals(a, b, tolerance) ? 0 : Double.compare(a, b);
5707dd252788645e940eada959bdde927426e2531c9Paul Duffin          int actual = DoubleMath.fuzzyCompare(a, b, tolerance);
5717dd252788645e940eada959bdde927426e2531c9Paul Duffin          assertEquals(Integer.signum(expected), Integer.signum(actual));
5727dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
5737dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5747dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5757dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5767dd252788645e940eada959bdde927426e2531c9Paul Duffin
5777dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFuzzyCompareBadTolerance() {
5787dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (double tolerance : BAD_TOLERANCE_CANDIDATES) {
5797dd252788645e940eada959bdde927426e2531c9Paul Duffin      try {
5807dd252788645e940eada959bdde927426e2531c9Paul Duffin        DoubleMath.fuzzyCompare(1, 2, tolerance);
5817dd252788645e940eada959bdde927426e2531c9Paul Duffin        fail("Expected IllegalArgumentException");
5827dd252788645e940eada959bdde927426e2531c9Paul Duffin      } catch (IllegalArgumentException expected) {
5837dd252788645e940eada959bdde927426e2531c9Paul Duffin        // success
5847dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5857dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5867dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5877dd252788645e940eada959bdde927426e2531c9Paul Duffin
5880888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.mean")
5890888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMean_doubleVarargs() {
5900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-1.375, DoubleMath.mean(1.1, -2.2, 4.4, -8.8), 1.0e-10);
5910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(1.1, DoubleMath.mean(1.1), 1.0e-10);
5920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
5930888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean(Double.NaN);
5940888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
5950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
5960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
5980888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean(Double.POSITIVE_INFINITY);
5990888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
6000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
6010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
6020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6030888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6040888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.mean")
6050888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMean_intVarargs() {
6060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-13.75, DoubleMath.mean(11, -22, 44, -88), 1.0e-10);
6070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(11.0, DoubleMath.mean(11), 1.0e-10);
6080888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6090888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6100888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.mean")
6110888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMean_longVarargs() {
6120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-13.75, DoubleMath.mean(11L, -22L, 44L, -88L), 1.0e-10);
6130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(11.0, DoubleMath.mean(11L), 1.0e-10);
6140888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6150888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6160888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.mean")
6170888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMean_emptyVarargs() {
6180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
6190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean();
6200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
6210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
6220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
6230888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6240888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6250888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.mean")
6260888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMean_doubleIterable() {
6270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-1.375, DoubleMath.mean(ImmutableList.of(1.1, -2.2, 4.4, -8.8)), 1.0e-10);
6280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(1.1, DoubleMath.mean(ImmutableList.of(1.1)), 1.0e-10);
6290888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
6300888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean(ImmutableList.<Double>of());
6310888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
6320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
6330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
6340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
6350888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean(ImmutableList.of(Double.NaN));
6360888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
6370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
6380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
6390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
6400888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean(ImmutableList.of(Double.POSITIVE_INFINITY));
6410888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
6420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
6430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
6440888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6450888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6460888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.mean")
6470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMean_intIterable() {
6480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-13.75, DoubleMath.mean(ImmutableList.of(11, -22, 44, -88)), 1.0e-10);
6490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(11, DoubleMath.mean(ImmutableList.of(11)), 1.0e-10);
6500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
6510888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean(ImmutableList.<Integer>of());
6520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
6530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
6540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
6550888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6560888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6570888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.mean")
6580888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMean_longIterable() {
6590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-13.75, DoubleMath.mean(ImmutableList.of(11L, -22L, 44L, -88L)), 1.0e-10);
6600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(11, DoubleMath.mean(ImmutableList.of(11L)), 1.0e-10);
6610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
6620888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean(ImmutableList.<Long>of());
6630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
6640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
6650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
6660888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6670888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6680888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.mean")
6690888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMean_intIterator() {
6700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-13.75, DoubleMath.mean(ImmutableList.of(11, -22, 44, -88).iterator()), 1.0e-10);
6710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(11, DoubleMath.mean(ImmutableList.of(11).iterator()), 1.0e-10);
6720888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
6730888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean(ImmutableList.<Integer>of().iterator());
6740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
6750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
6760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
6770888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6780888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6790888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("DoubleMath.mean")
6800888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMean_longIterator() {
6810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-13.75, DoubleMath.mean(ImmutableList.of(11L, -22L, 44L, -88L).iterator()),
6820888a09821a98ac0680fad765217302858e70fa4Paul Duffin        1.0e-10);
6830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(11, DoubleMath.mean(ImmutableList.of(11L).iterator()), 1.0e-10);
6840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
6850888a09821a98ac0680fad765217302858e70fa4Paul Duffin      DoubleMath.mean(ImmutableList.<Long>of().iterator());
6860888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail("Expected IllegalArgumentException");
6870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
6880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
6890888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
6900888a09821a98ac0680fad765217302858e70fa4Paul Duffin
6910888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("NullPointerTester")
6927dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNullPointers() {
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.setDefault(double.class, 3.0);
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(DoubleMath.class);
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
698