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_INTEGER_CANDIDATES;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.ALL_ROUNDING_MODES;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.ALL_SAFE_ROUNDING_MODES;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.EXPONENTS;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.NEGATIVE_INTEGER_CANDIDATES;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.NONZERO_INTEGER_CANDIDATES;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.POSITIVE_INTEGER_CANDIDATES;
267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.math.TestPlatform.intsCanGoOutOfRange;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.BigInteger.valueOf;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.FLOOR;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.UNNECESSARY;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
350888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
360888a09821a98ac0680fad765217302858e70fa4Paul Duffin
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigDecimal;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigInteger;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.RoundingMode;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link IntMath}.
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class IntMathTest extends TestCase {
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("BigIntegerMath") // TODO(cpovirk): GWT-enable BigIntegerMath
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConstantMaxPowerOfSqrt2Unsigned() {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigIntegerMath.sqrt(BigInteger.ZERO.setBit(2 * Integer.SIZE - 1), FLOOR).intValue(),
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.MAX_POWER_OF_SQRT2_UNSIGNED);
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("pow()")
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConstantsPowersOf10() {
577dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int i = 0; i < IntMath.powersOf10.length - 1; i++) {
587dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEquals(IntMath.pow(10, i), IntMath.powersOf10[i]);
597dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
607dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
617dd252788645e940eada959bdde927426e2531c9Paul Duffin
627dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("BigIntegerMath") // TODO(cpovirk): GWT-enable BigIntegerMath
637dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testMaxLog10ForLeadingZeros() {
647dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int i = 0; i < Integer.SIZE; i++) {
657dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEquals(
667dd252788645e940eada959bdde927426e2531c9Paul Duffin          BigIntegerMath.log10(BigInteger.ONE.shiftLeft(Integer.SIZE - i), FLOOR),
677dd252788645e940eada959bdde927426e2531c9Paul Duffin          IntMath.maxLog10ForLeadingZeros[i]);
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("BigIntegerMath") // TODO(cpovirk): GWT-enable BigIntegerMath
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConstantsHalfPowersOf10() {
737dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int i = 0; i < IntMath.halfPowersOf10.length; i++) {
747dd252788645e940eada959bdde927426e2531c9Paul Duffin      assert IntMath.halfPowersOf10[i]
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          == Math.min(Integer.MAX_VALUE,
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              BigIntegerMath.sqrt(BigInteger.TEN.pow(2 * i + 1), FLOOR).longValue());
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("BigIntegerMath") // TODO(cpovirk): GWT-enable BigIntegerMath
817dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testConstantsBiggestBinomials() {
827dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int k = 0; k < IntMath.biggestBinomials.length; k++) {
837dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertTrue(fitsInInt(BigIntegerMath.binomial(IntMath.biggestBinomials[k], k)));
847dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertTrue(IntMath.biggestBinomials[k] == Integer.MAX_VALUE
857dd252788645e940eada959bdde927426e2531c9Paul Duffin          || !fitsInInt(BigIntegerMath.binomial(IntMath.biggestBinomials[k] + 1, k)));
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // In the first case, any int is valid; in the second, we want to test that the next-bigger
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // int overflows.
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fitsInInt(BigIntegerMath.binomial(
917dd252788645e940eada959bdde927426e2531c9Paul Duffin            2 * IntMath.biggestBinomials.length, IntMath.biggestBinomials.length)));
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
937dd252788645e940eada959bdde927426e2531c9Paul Duffin
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("sqrt")
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPowersSqrtMaxInt() {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(IntMath.sqrt(Integer.MAX_VALUE, FLOOR), IntMath.FLOOR_SQRT_MAX_INT);
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testLessThanBranchFree() {
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int x : ALL_INTEGER_CANDIDATES) {
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin      for (int y : ALL_INTEGER_CANDIDATES) {
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (LongMath.fitsInInt((long) x - y)) {
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin          int expected = (x < y) ? 1 : 0;
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin          int actual = IntMath.lessThanBranchFree(x, y);
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin          assertEquals(expected, actual);
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("java.math.BigInteger")
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsPowerOfTwo() {
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : ALL_INTEGER_CANDIDATES) {
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Checks for a single bit set.
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin      BigInteger bigX = BigInteger.valueOf(x);
1167dd252788645e940eada959bdde927426e2531c9Paul Duffin      boolean expected = (bigX.signum() > 0) && (bigX.bitCount() == 1);
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expected, IntMath.isPowerOfTwo(x));
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog2ZeroAlwaysThrows() {
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.log2(0, mode);
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog2NegativeAlwaysThrows() {
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : NEGATIVE_INTEGER_CANDIDATES) {
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_ROUNDING_MODES) {
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          IntMath.log2(x, mode);
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail("Expected IllegalArgumentException");
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (IllegalArgumentException expected) {}
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Relies on the correctness of BigIntegrerMath.log2 for all modes except UNNECESSARY.
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog2MatchesBigInteger() {
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : POSITIVE_INTEGER_CANDIDATES) {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(BigIntegerMath.log2(valueOf(x), mode), IntMath.log2(x, mode));
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Relies on the correctness of isPowerOfTwo(int).
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog2Exact() {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : POSITIVE_INTEGER_CANDIDATES) {
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // We only expect an exception if x was not a power of 2.
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      boolean isPowerOf2 = IntMath.isPowerOfTwo(x);
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(x, 1 << IntMath.log2(x, UNNECESSARY));
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(isPowerOf2);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException e) {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertFalse(isPowerOf2);
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("log10")
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog10ZeroAlwaysThrows() {
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.log10(0, mode);
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("log10")
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog10NegativeAlwaysThrows() {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : NEGATIVE_INTEGER_CANDIDATES) {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_ROUNDING_MODES) {
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          IntMath.log10(x, mode);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail("Expected IllegalArgumentException");
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (IllegalArgumentException expected) {}
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Relies on the correctness of BigIntegerMath.log10 for all modes except UNNECESSARY.
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("BigIntegerMath") // TODO(cpovirk): GWT-enable BigIntegerMath
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog10MatchesBigInteger() {
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : POSITIVE_INTEGER_CANDIDATES) {
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // The BigInteger implementation is tested separately, use it as the reference.
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(BigIntegerMath.log10(valueOf(x), mode), IntMath.log10(x, mode));
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Relies on the correctness of log10(int, FLOOR) and of pow(int, int).
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("pow()")
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog10Exact() {
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : POSITIVE_INTEGER_CANDIDATES) {
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int floor = IntMath.log10(x, FLOOR);
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      boolean expectSuccess = IntMath.pow(10, floor) == x;
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(floor, IntMath.log10(x, UNNECESSARY));
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(expectSuccess);
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException e) {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertFalse(expectSuccess);
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("log10")
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLog10TrivialOnPowerOfTen() {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int x = 1000000;
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(6, IntMath.log10(x, mode));
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Simple test to cover sqrt(0) for all types and all modes.
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("sqrt")
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSqrtZeroAlwaysZero() {
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (RoundingMode mode : ALL_ROUNDING_MODES) {
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(0, IntMath.sqrt(0, mode));
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("sqrt")
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSqrtNegativeAlwaysThrows() {
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : NEGATIVE_INTEGER_CANDIDATES) {
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : RoundingMode.values()) {
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          IntMath.sqrt(x, mode);
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail("Expected IllegalArgumentException");
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (IllegalArgumentException expected) {}
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* Relies on the correctness of BigIntegerMath.sqrt for all modes except UNNECESSARY. */
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("BigIntegerMath") // TODO(cpovirk): GWT-enable BigIntegerMath
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSqrtMatchesBigInteger() {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : POSITIVE_INTEGER_CANDIDATES) {
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // The BigInteger implementation is tested separately, use it as the reference.
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // Promote the int value (rather than using intValue() on the expected value) to avoid
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // any risk of truncation which could lead to a false positive.
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(BigIntegerMath.sqrt(valueOf(x), mode), valueOf(IntMath.sqrt(x, mode)));
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* Relies on the correctness of sqrt(int, FLOOR). */
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("sqrt")
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSqrtExactMatchesFloorOrThrows() {
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : POSITIVE_INTEGER_CANDIDATES) {
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int floor = IntMath.sqrt(x, FLOOR);
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // We only expect an exception if x was not a perfect square.
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      boolean isPerfectSquare = (floor * floor == x);
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(floor, IntMath.sqrt(x, UNNECESSARY));
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(isPerfectSquare);
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException e) {
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertFalse(isPerfectSquare);
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("2147483646^2 expected=4")
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPow() {
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i : ALL_INTEGER_CANDIDATES) {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int pow : EXPONENTS) {
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(i + "^" + pow, BigInteger.valueOf(i).pow(pow).intValue(), IntMath.pow(i, pow));
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testDivNonZero() {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int p : NONZERO_INTEGER_CANDIDATES) {
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int q : NONZERO_INTEGER_CANDIDATES) {
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) {
2827dd252788645e940eada959bdde927426e2531c9Paul Duffin          // Skip some tests that fail due to GWT's non-compliant int implementation.
2837dd252788645e940eada959bdde927426e2531c9Paul Duffin          // TODO(cpovirk): does this test fail for only some rounding modes or for all?
2847dd252788645e940eada959bdde927426e2531c9Paul Duffin          if (p == -2147483648 && q == -1 && intsCanGoOutOfRange()) {
2857dd252788645e940eada959bdde927426e2531c9Paul Duffin            continue;
2867dd252788645e940eada959bdde927426e2531c9Paul Duffin          }
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          int expected =
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              new BigDecimal(valueOf(p)).divide(new BigDecimal(valueOf(q)), 0, mode).intValue();
2897dd252788645e940eada959bdde927426e2531c9Paul Duffin          assertEquals(p + "/" + q, force32(expected), IntMath.divide(p, q, mode));
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testDivNonZeroExact() {
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int p : NONZERO_INTEGER_CANDIDATES) {
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int q : NONZERO_INTEGER_CANDIDATES) {
2987dd252788645e940eada959bdde927426e2531c9Paul Duffin        // Skip some tests that fail due to GWT's non-compliant int implementation.
2997dd252788645e940eada959bdde927426e2531c9Paul Duffin        if (p == -2147483648 && q == -1 && intsCanGoOutOfRange()) {
3007dd252788645e940eada959bdde927426e2531c9Paul Duffin          continue;
3017dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean dividesEvenly = (p % q) == 0;
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(p + "/" + q, p, IntMath.divide(p, q, UNNECESSARY) * q);
3057dd252788645e940eada959bdde927426e2531c9Paul Duffin          assertTrue(p + "/" + q + " not expected to divide evenly", dividesEvenly);
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException e) {
3077dd252788645e940eada959bdde927426e2531c9Paul Duffin          assertFalse(p + "/" + q + " expected to divide evenly", dividesEvenly);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testZeroDivIsAlwaysZero() {
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int q : NONZERO_INTEGER_CANDIDATES) {
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_ROUNDING_MODES) {
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(0, IntMath.divide(0, q, mode));
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testDivByZeroAlwaysFails() {
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int p : ALL_INTEGER_CANDIDATES) {
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (RoundingMode mode : ALL_ROUNDING_MODES) {
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          IntMath.divide(p, 0, mode);
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail("Expected ArithmeticException");
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException expected) {}
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMod() {
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : ALL_INTEGER_CANDIDATES) {
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int m : POSITIVE_INTEGER_CANDIDATES) {
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(valueOf(x).mod(valueOf(m)).intValue(), IntMath.mod(x, m));
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testModNegativeModulusFails() {
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : POSITIVE_INTEGER_CANDIDATES) {
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int m : NEGATIVE_INTEGER_CANDIDATES) {
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          IntMath.mod(x, m);
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail("Expected ArithmeticException");
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException expected) {}
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testModZeroModulusFails() {
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int x : ALL_INTEGER_CANDIDATES) {
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.mod(x, 0);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGCD() {
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : POSITIVE_INTEGER_CANDIDATES) {
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : POSITIVE_INTEGER_CANDIDATES) {
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(valueOf(a).gcd(valueOf(b)), valueOf(IntMath.gcd(a, b)));
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGCDZero() {
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : POSITIVE_INTEGER_CANDIDATES) {
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(a, IntMath.gcd(a, 0));
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(a, IntMath.gcd(0, a));
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, IntMath.gcd(0, 0));
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGCDNegativePositiveThrows() {
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : NEGATIVE_INTEGER_CANDIDATES) {
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.gcd(a, 3);
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.gcd(3, a);
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGCDNegativeZeroThrows() {
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : NEGATIVE_INTEGER_CANDIDATES) {
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.gcd(a, 0);
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.gcd(0, a);
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCheckedAdd() {
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : ALL_INTEGER_CANDIDATES) {
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : ALL_INTEGER_CANDIDATES) {
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigInteger expectedResult = valueOf(a).add(valueOf(b));
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean expectedSuccess = fitsInInt(expectedResult);
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(a + b, IntMath.checkedAdd(a, b));
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertTrue(expectedSuccess);
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException e) {
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertFalse(expectedSuccess);
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCheckedSubtract() {
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : ALL_INTEGER_CANDIDATES) {
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : ALL_INTEGER_CANDIDATES) {
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigInteger expectedResult = valueOf(a).subtract(valueOf(b));
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean expectedSuccess = fitsInInt(expectedResult);
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(a - b, IntMath.checkedSubtract(a, b));
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertTrue(expectedSuccess);
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException e) {
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertFalse(expectedSuccess);
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCheckedMultiply() {
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : ALL_INTEGER_CANDIDATES) {
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : ALL_INTEGER_CANDIDATES) {
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigInteger expectedResult = valueOf(a).multiply(valueOf(b));
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean expectedSuccess = fitsInInt(expectedResult);
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(a * b, IntMath.checkedMultiply(a, b));
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertTrue(expectedSuccess);
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException e) {
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertFalse(expectedSuccess);
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCheckedPow() {
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int b : ALL_INTEGER_CANDIDATES) {
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int k : EXPONENTS) {
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigInteger expectedResult = valueOf(b).pow(k);
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean expectedSuccess = fitsInInt(expectedResult);
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
4537dd252788645e940eada959bdde927426e2531c9Paul Duffin          assertEquals(b + "^" + k, force32(expectedResult.intValue()), IntMath.checkedPow(b, k));
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertTrue(b + "^" + k + " should have succeeded", expectedSuccess);
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (ArithmeticException e) {
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertFalse(b + "^" + k + " should have failed", expectedSuccess);
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Depends on the correctness of BigIntegerMath.factorial.
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFactorial() {
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int n = 0; n <= 50; n++) {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      BigInteger expectedBig = BigIntegerMath.factorial(n);
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int expectedInt = fitsInInt(expectedBig) ? expectedBig.intValue() : Integer.MAX_VALUE;
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expectedInt, IntMath.factorial(n));
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFactorialNegative() {
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int n : NEGATIVE_INTEGER_CANDIDATES) {
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.factorial(n);
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Depends on the correctness of BigIntegerMath.binomial.
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("BigIntegerMath") // TODO(cpovirk): GWT-enable BigIntegerMath
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBinomial() {
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int n = 0; n <= 50; n++) {
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int k = 0; k <= n; k++) {
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        BigInteger expectedBig = BigIntegerMath.binomial(n, k);
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        int expectedInt = fitsInInt(expectedBig) ? expectedBig.intValue() : Integer.MAX_VALUE;
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(expectedInt, IntMath.binomial(n, k));
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("binomial")
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBinomialOutside() {
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int n = 0; n <= 50; n++) {
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.binomial(n, -1);
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.binomial(n, n + 1);
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("binomial")
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBinomialNegative() {
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int n : NEGATIVE_INTEGER_CANDIDATES) {
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IntMath.binomial(n, 0);
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected IllegalArgumentException");
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {}
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5167dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("java.math.BigInteger")
5177dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testMean() {
5187dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Odd-sized ranges have an obvious mean
5197dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(2, 1, 3);
5207dd252788645e940eada959bdde927426e2531c9Paul Duffin
5217dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(-2, -3, -1);
5227dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(0, -1, 1);
5237dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(1, -1, 3);
5247dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean((1 << 30) - 1, -1, Integer.MAX_VALUE);
5257dd252788645e940eada959bdde927426e2531c9Paul Duffin
5267dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Even-sized ranges should prefer the lower mean
5277dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(2, 1, 4);
5287dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(-3, -4, -1);
5297dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(0, -1, 2);
5307dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(0, Integer.MIN_VALUE + 2, Integer.MAX_VALUE);
5317dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(0, 0, 1);
5327dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(-1, -1, 0);
5337dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(-1, Integer.MIN_VALUE, Integer.MAX_VALUE);
5347dd252788645e940eada959bdde927426e2531c9Paul Duffin
5357dd252788645e940eada959bdde927426e2531c9Paul Duffin    // x == y == mean
5367dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(1, 1, 1);
5377dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(0, 0, 0);
5387dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(-1, -1, -1);
5397dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE);
5407dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
5417dd252788645e940eada959bdde927426e2531c9Paul Duffin
5427dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Exhaustive checks
5437dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int x : ALL_INTEGER_CANDIDATES) {
5447dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (int y : ALL_INTEGER_CANDIDATES) {
5457dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertMean(x, y);
5467dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
5477dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
5487dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5497dd252788645e940eada959bdde927426e2531c9Paul Duffin
5507dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
5517dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Helper method that asserts the arithmetic mean of x and y is equal
5527dd252788645e940eada959bdde927426e2531c9Paul Duffin   * to the expectedMean.
5537dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
5547dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static void assertMean(int expectedMean, int x, int y) {
5557dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals("The expectedMean should be the same as computeMeanSafely",
5567dd252788645e940eada959bdde927426e2531c9Paul Duffin        expectedMean, computeMeanSafely(x, y));
5577dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertMean(x, y);
5587dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5597dd252788645e940eada959bdde927426e2531c9Paul Duffin
5607dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
5617dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Helper method that asserts the arithmetic mean of x and y is equal
5627dd252788645e940eada959bdde927426e2531c9Paul Duffin   * to the result of computeMeanSafely.
5637dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
5647dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static void assertMean(int x, int y) {
5657dd252788645e940eada959bdde927426e2531c9Paul Duffin    int expectedMean = computeMeanSafely(x, y);
5667dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(expectedMean, IntMath.mean(x, y));
5677dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals("The mean of x and y should equal the mean of y and x",
5687dd252788645e940eada959bdde927426e2531c9Paul Duffin        expectedMean, IntMath.mean(y, x));
5697dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5707dd252788645e940eada959bdde927426e2531c9Paul Duffin
5717dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
5727dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Computes the mean in a way that is obvious and resilient to
5737dd252788645e940eada959bdde927426e2531c9Paul Duffin   * overflow by using BigInteger arithmetic.
5747dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
5757dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static int computeMeanSafely(int x, int y) {
5767dd252788645e940eada959bdde927426e2531c9Paul Duffin    BigInteger bigX = BigInteger.valueOf(x);
5777dd252788645e940eada959bdde927426e2531c9Paul Duffin    BigInteger bigY = BigInteger.valueOf(y);
5787dd252788645e940eada959bdde927426e2531c9Paul Duffin    BigDecimal bigMean = new BigDecimal(bigX.add(bigY))
5797dd252788645e940eada959bdde927426e2531c9Paul Duffin        .divide(BigDecimal.valueOf(2), BigDecimal.ROUND_FLOOR);
5807dd252788645e940eada959bdde927426e2531c9Paul Duffin    // parseInt blows up on overflow as opposed to intValue() which does not.
5817dd252788645e940eada959bdde927426e2531c9Paul Duffin    return Integer.parseInt(bigMean.toString());
5827dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5837dd252788645e940eada959bdde927426e2531c9Paul Duffin
5847dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static boolean fitsInInt(BigInteger big) {
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return big.bitLength() <= 31;
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5877dd252788645e940eada959bdde927426e2531c9Paul Duffin
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
5897dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNullPointers() {
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.setDefault(int.class, 1);
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(IntMath.class);
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5947dd252788645e940eada959bdde927426e2531c9Paul Duffin
5957dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static int force32(int value) {
5967dd252788645e940eada959bdde927426e2531c9Paul Duffin    // GWT doesn't consistently overflow values to make them 32-bit, so we need to force it.
5977dd252788645e940eada959bdde927426e2531c9Paul Duffin    return value & 0xffffffff;
5987dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
600