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