LongMathTest.java revision 7dd252788645e940eada959bdde927426e2531c9
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_LONG_CANDIDATES; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.ALL_ROUNDING_MODES; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.ALL_SAFE_ROUNDING_MODES; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.EXPONENTS; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.NEGATIVE_INTEGER_CANDIDATES; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.NEGATIVE_LONG_CANDIDATES; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.NONZERO_LONG_CANDIDATES; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.POSITIVE_INTEGER_CANDIDATES; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.POSITIVE_LONG_CANDIDATES; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.BigInteger.valueOf; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.FLOOR; 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.UNNECESSARY; 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 337dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtCompatible; 347dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtIncompatible; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester; 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigDecimal; 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigInteger; 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.RoundingMode; 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 417dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestCase; 427dd252788645e940eada959bdde927426e2531c9Paul Duffin 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for LongMath. 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 487dd252788645e940eada959bdde927426e2531c9Paul Duffin@GwtCompatible(emulated = true) 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class LongMathTest extends TestCase { 507dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstantMaxPowerOfSqrt2Unsigned() { 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(BigIntegerMath.sqrt(BigInteger.ZERO.setBit(2 * Long.SIZE - 1), FLOOR).longValue(), 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.MAX_POWER_OF_SQRT2_UNSIGNED); 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 567dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("BigIntegerMath") // TODO(cpovirk): GWT-enable BigIntegerMath 577dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testMaxLog10ForLeadingZeros() { 587dd252788645e940eada959bdde927426e2531c9Paul Duffin for (int i = 0; i < Long.SIZE; i++) { 597dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals( 607dd252788645e940eada959bdde927426e2531c9Paul Duffin BigIntegerMath.log10(BigInteger.ONE.shiftLeft(Long.SIZE - i), FLOOR), 617dd252788645e940eada959bdde927426e2531c9Paul Duffin LongMath.maxLog10ForLeadingZeros[i]); 627dd252788645e940eada959bdde927426e2531c9Paul Duffin } 637dd252788645e940eada959bdde927426e2531c9Paul Duffin } 647dd252788645e940eada959bdde927426e2531c9Paul Duffin 657dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstantsPowersOf10() { 677dd252788645e940eada959bdde927426e2531c9Paul Duffin for (int i = 0; i < LongMath.powersOf10.length; i++) { 687dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(LongMath.checkedPow(10, i), LongMath.powersOf10[i]); 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 717dd252788645e940eada959bdde927426e2531c9Paul Duffin LongMath.checkedPow(10, LongMath.powersOf10.length); 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 767dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstantsHalfPowersOf10() { 787dd252788645e940eada959bdde927426e2531c9Paul Duffin for (int i = 0; i < LongMath.halfPowersOf10.length; i++) { 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(BigIntegerMath.sqrt(BigInteger.TEN.pow(2 * i + 1), FLOOR), 807dd252788645e940eada959bdde927426e2531c9Paul Duffin BigInteger.valueOf(LongMath.halfPowersOf10[i])); 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigInteger nextBigger = 837dd252788645e940eada959bdde927426e2531c9Paul Duffin BigIntegerMath.sqrt(BigInteger.TEN.pow(2 * LongMath.halfPowersOf10.length + 1), FLOOR); 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(nextBigger.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0); 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 877dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstantsSqrtMaxLong() { 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(LongMath.sqrt(Long.MAX_VALUE, FLOOR), LongMath.FLOOR_SQRT_MAX_LONG); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 927dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstantsFactorials() { 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long expected = 1; 957dd252788645e940eada959bdde927426e2531c9Paul Duffin for (int i = 0; i < LongMath.factorials.length; i++, expected *= i) { 967dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(expected, LongMath.factorials[i]); 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.checkedMultiply( 1007dd252788645e940eada959bdde927426e2531c9Paul Duffin LongMath.factorials[LongMath.factorials.length - 1], LongMath.factorials.length); 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expect) {} 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1057dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstantsBiggestBinomials() { 1077dd252788645e940eada959bdde927426e2531c9Paul Duffin for (int k = 0; k < LongMath.biggestBinomials.length; k++) { 1087dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(fitsInLong(BigIntegerMath.binomial(LongMath.biggestBinomials[k], k))); 1097dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(LongMath.biggestBinomials[k] == Integer.MAX_VALUE 1107dd252788645e940eada959bdde927426e2531c9Paul Duffin || !fitsInLong(BigIntegerMath.binomial(LongMath.biggestBinomials[k] + 1, k))); 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // In the first case, any long is valid; in the second, we want to test that the next-bigger 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // long overflows. 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1147dd252788645e940eada959bdde927426e2531c9Paul Duffin int k = LongMath.biggestBinomials.length; 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(fitsInLong(BigIntegerMath.binomial(2 * k, k))); 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // 2 * k is the smallest value for which we don't replace k with (n-k). 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1197dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstantsBiggestSimpleBinomials() { 1217dd252788645e940eada959bdde927426e2531c9Paul Duffin for (int k = 0; k < LongMath.biggestSimpleBinomials.length; k++) { 1227dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(LongMath.biggestSimpleBinomials[k] <= LongMath.biggestBinomials[k]); 1237dd252788645e940eada959bdde927426e2531c9Paul Duffin simpleBinomial(LongMath.biggestSimpleBinomials[k], k); // mustn't throw 1247dd252788645e940eada959bdde927426e2531c9Paul Duffin if (LongMath.biggestSimpleBinomials[k] < Integer.MAX_VALUE) { 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // unless all n are fair game with this k 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1277dd252788645e940eada959bdde927426e2531c9Paul Duffin simpleBinomial(LongMath.biggestSimpleBinomials[k] + 1, k); 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1337dd252788645e940eada959bdde927426e2531c9Paul Duffin int k = LongMath.biggestSimpleBinomials.length; 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert simpleBinomial(2 * k, k); 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // 2 * k is the smallest value for which we don't replace k with (n-k). 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Throws an ArithmeticException if "the simple implementation" of binomial coefficients overflows 1417dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private long simpleBinomial(int n, int k) { 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long accum = 1; 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < k; i++) { 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert accum = LongMath.checkedMultiply(accum, n - i); 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert accum /= i + 1; 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return accum; 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1517dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("java.math.BigInteger") 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIsPowerOfTwo() { 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : ALL_LONG_CANDIDATES) { 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Checks for a single bit set. 1557dd252788645e940eada959bdde927426e2531c9Paul Duffin BigInteger bigX = BigInteger.valueOf(x); 1567dd252788645e940eada959bdde927426e2531c9Paul Duffin boolean expected = (bigX.signum() > 0) && (bigX.bitCount() == 1); 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, LongMath.isPowerOfTwo(x)); 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog2ZeroAlwaysThrows() { 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.log2(0L, mode); 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog2NegativeAlwaysThrows() { 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : NEGATIVE_LONG_CANDIDATES) { 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.log2(x, mode); 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* Relies on the correctness of BigIntegerMath.log2 for all modes except UNNECESSARY. */ 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog2MatchesBigInteger() { 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : POSITIVE_LONG_CANDIDATES) { 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // The BigInteger implementation is tested separately, use it as the reference. 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(BigIntegerMath.log2(valueOf(x), mode), LongMath.log2(x, mode)); 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* Relies on the correctness of isPowerOfTwo(long). */ 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog2Exact() { 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : POSITIVE_LONG_CANDIDATES) { 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // We only expect an exception if x was not a power of 2. 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean isPowerOf2 = LongMath.isPowerOfTwo(x); 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(x, 1L << LongMath.log2(x, UNNECESSARY)); 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(isPowerOf2); 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(isPowerOf2); 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2057dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog10ZeroAlwaysThrows() { 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.log10(0L, mode); 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2157dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog10NegativeAlwaysThrows() { 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : NEGATIVE_LONG_CANDIDATES) { 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.log10(x, mode); 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Relies on the correctness of BigIntegerMath.log10 for all modes except UNNECESSARY. 2287dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog10MatchesBigInteger() { 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : POSITIVE_LONG_CANDIDATES) { 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(BigIntegerMath.log10(valueOf(x), mode), LongMath.log10(x, mode)); 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Relies on the correctness of log10(long, FLOOR) and of pow(long, int). 2387dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog10Exact() { 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : POSITIVE_LONG_CANDIDATES) { 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int floor = LongMath.log10(x, FLOOR); 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean expectSuccess = LongMath.pow(10, floor) == x; 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(floor, LongMath.log10(x, UNNECESSARY)); 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(expectSuccess); 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(expectSuccess); 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2527dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog10TrivialOnPowerOf10() { 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long x = 1000000000000L; 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(12, LongMath.log10(x, mode)); 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2607dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSqrtNegativeAlwaysThrows() { 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : NEGATIVE_LONG_CANDIDATES) { 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.sqrt(x, mode); 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Relies on the correctness of BigIntegerMath.sqrt for all modes except UNNECESSARY. 2737dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSqrtMatchesBigInteger() { 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : POSITIVE_LONG_CANDIDATES) { 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Promote the long value (rather than using longValue() on the expected value) to avoid 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // any risk of truncation which could lead to a false positive. 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(BigIntegerMath.sqrt(valueOf(x), mode), valueOf(LongMath.sqrt(x, mode))); 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* Relies on the correctness of sqrt(long, FLOOR). */ 2857dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSqrtExactMatchesFloorOrThrows() { 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : POSITIVE_LONG_CANDIDATES) { 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long logFloor = LongMath.sqrt(x, FLOOR); 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // We only expect an exception if x was not a perfect square. 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean isPerfectSquare = (logFloor * logFloor == x); 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(logFloor, LongMath.sqrt(x, UNNECESSARY)); 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(isPerfectSquare); 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(isPerfectSquare); 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3007dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPow() { 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long i : ALL_LONG_CANDIDATES) { 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int exp : EXPONENTS) { 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(LongMath.pow(i, exp), valueOf(i) 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .pow(exp) 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .longValue()); 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3117dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testDivNonZero() { 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long p : NONZERO_LONG_CANDIDATES) { 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long q : NONZERO_LONG_CANDIDATES) { 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long expected = 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new BigDecimal(valueOf(p)).divide(new BigDecimal(valueOf(q)), 0, mode).longValue(); 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, LongMath.divide(p, q, mode)); 3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3247dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testDivNonZeroExact() { 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long p : NONZERO_LONG_CANDIDATES) { 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long q : NONZERO_LONG_CANDIDATES) { 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean dividesEvenly = (p % q) == 0L; 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(p, LongMath.divide(p, q, UNNECESSARY) * q); 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(dividesEvenly); 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(dividesEvenly); 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3407dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testZeroDivIsAlwaysZero() { 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long q : NONZERO_LONG_CANDIDATES) { 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0L, LongMath.divide(0L, q, mode)); 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3497dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testDivByZeroAlwaysFails() { 3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long p : ALL_LONG_CANDIDATES) { 3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.divide(p, 0L, mode); 3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3617dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIntMod() { 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : ALL_LONG_CANDIDATES) { 3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int m : POSITIVE_INTEGER_CANDIDATES) { 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueOf(x) 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .mod(valueOf(m)) 3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .intValue(), LongMath.mod(x, m)); 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3727dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIntModNegativeModulusFails() { 3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : ALL_LONG_CANDIDATES) { 3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int m : NEGATIVE_INTEGER_CANDIDATES) { 3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.mod(x, m); 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3847dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIntModZeroModulusFails() { 3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : ALL_LONG_CANDIDATES) { 3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.mod(x, 0); 3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected AE"); 3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3947dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testMod() { 3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : ALL_LONG_CANDIDATES) { 3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long m : POSITIVE_LONG_CANDIDATES) { 3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueOf(x) 3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .mod(valueOf(m)) 4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .longValue(), LongMath.mod(x, m)); 4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4057dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testModNegativeModulusFails() { 4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long x : ALL_LONG_CANDIDATES) { 4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long m : NEGATIVE_LONG_CANDIDATES) { 4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.mod(x, m); 4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4177dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testGCDExhaustive() { 4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long a : POSITIVE_LONG_CANDIDATES) { 4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long b : POSITIVE_LONG_CANDIDATES) { 4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueOf(a).gcd(valueOf(b)), valueOf(LongMath.gcd(a, b))); 4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4257dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGCDZero() { 4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long a : POSITIVE_LONG_CANDIDATES) { 4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(a, LongMath.gcd(a, 0)); 4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(a, LongMath.gcd(0, a)); 4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0, LongMath.gcd(0, 0)); 4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4347dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGCDNegativePositiveThrows() { 4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long a : NEGATIVE_LONG_CANDIDATES) { 4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.gcd(a, 3); 4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.gcd(3, a); 4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4487dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGCDNegativeZeroThrows() { 4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long a : NEGATIVE_LONG_CANDIDATES) { 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.gcd(a, 0); 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.gcd(0, a); 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4627dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCheckedAdd() { 4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long a : ALL_INTEGER_CANDIDATES) { 4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long b : ALL_INTEGER_CANDIDATES) { 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigInteger expectedResult = valueOf(a).add(valueOf(b)); 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean expectedSuccess = fitsInLong(expectedResult); 4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(a + b, LongMath.checkedAdd(a, b)); 4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(expectedSuccess); 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(expectedSuccess); 4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4787dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCheckedSubtract() { 4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long a : ALL_INTEGER_CANDIDATES) { 4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long b : ALL_INTEGER_CANDIDATES) { 4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigInteger expectedResult = valueOf(a).subtract(valueOf(b)); 4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean expectedSuccess = fitsInLong(expectedResult); 4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(a - b, LongMath.checkedSubtract(a, b)); 4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(expectedSuccess); 4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(expectedSuccess); 4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4947dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCheckedMultiply() { 4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long a : ALL_INTEGER_CANDIDATES) { 4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long b : ALL_INTEGER_CANDIDATES) { 4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigInteger expectedResult = valueOf(a).multiply(valueOf(b)); 4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean expectedSuccess = fitsInLong(expectedResult); 5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(a * b, LongMath.checkedMultiply(a, b)); 5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(expectedSuccess); 5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(expectedSuccess); 5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5107dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCheckedPow() { 5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long b : ALL_INTEGER_CANDIDATES) { 5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int exp : EXPONENTS) { 5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigInteger expectedResult = valueOf(b).pow(exp); 5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean expectedSuccess = fitsInLong(expectedResult); 5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expectedResult.longValue(), LongMath.checkedPow(b, exp)); 5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(expectedSuccess); 5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(expectedSuccess); 5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Depends on the correctness of BigIntegerMath.factorial. 5277dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFactorial() { 5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int n = 0; n <= 50; n++) { 5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigInteger expectedBig = BigIntegerMath.factorial(n); 5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long expectedLong = fitsInLong(expectedBig) ? expectedBig.longValue() : Long.MAX_VALUE; 5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expectedLong, LongMath.factorial(n)); 5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5367dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("TODO") 5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFactorialNegative() { 5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int n : NEGATIVE_INTEGER_CANDIDATES) { 5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.factorial(n); 5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Depends on the correctness of BigIntegerMath.binomial. 5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBinomial() { 5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int n = 0; n <= 70; n++) { 5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int k = 0; k <= n; k++) { 5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigInteger expectedBig = BigIntegerMath.binomial(n, k); 5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long expectedLong = fitsInLong(expectedBig) ? expectedBig.longValue() : Long.MAX_VALUE; 5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expectedLong, LongMath.binomial(n, k)); 5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5577dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("Slow") 5587dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testBinomial_exhaustiveNotOverflowing() { 5597dd252788645e940eada959bdde927426e2531c9Paul Duffin // Tests all of the inputs to LongMath.binomial that won't cause it to overflow, that weren't 5607dd252788645e940eada959bdde927426e2531c9Paul Duffin // tested in the previous method, for k >= 3. 5617dd252788645e940eada959bdde927426e2531c9Paul Duffin for (int k = 3; k < LongMath.biggestBinomials.length; k++) { 5627dd252788645e940eada959bdde927426e2531c9Paul Duffin for (int n = 70; n <= LongMath.biggestBinomials[k]; n++) { 5637dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(BigIntegerMath.binomial(n, k).longValue(), LongMath.binomial(n, k)); 5647dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5657dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5667dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5677dd252788645e940eada959bdde927426e2531c9Paul Duffin 5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBinomialOutside() { 5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int n = 0; n <= 50; n++) { 5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.binomial(n, -1); 5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.binomial(n, n + 1); 5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBinomialNegative() { 5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int n : NEGATIVE_INTEGER_CANDIDATES) { 5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LongMath.binomial(n, 0); 5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5907dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("java.math.BigInteger") 5917dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testMean() { 5927dd252788645e940eada959bdde927426e2531c9Paul Duffin // Odd-sized ranges have an obvious mean 5937dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(2, 1, 3); 5947dd252788645e940eada959bdde927426e2531c9Paul Duffin 5957dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(-2, -3, -1); 5967dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(0, -1, 1); 5977dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(1, -1, 3); 5987dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean((1L << 62) - 1, -1, Long.MAX_VALUE); 5997dd252788645e940eada959bdde927426e2531c9Paul Duffin 6007dd252788645e940eada959bdde927426e2531c9Paul Duffin // Even-sized ranges should prefer the lower mean 6017dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(2, 1, 4); 6027dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(-3, -4, -1); 6037dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(0, -1, 2); 6047dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(0, Long.MIN_VALUE + 2, Long.MAX_VALUE); 6057dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(0, 0, 1); 6067dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(-1, -1, 0); 6077dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(-1, Long.MIN_VALUE, Long.MAX_VALUE); 6087dd252788645e940eada959bdde927426e2531c9Paul Duffin 6097dd252788645e940eada959bdde927426e2531c9Paul Duffin // x == y == mean 6107dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(1, 1, 1); 6117dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(0, 0, 0); 6127dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(-1, -1, -1); 6137dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(Long.MIN_VALUE, Long.MIN_VALUE, Long.MIN_VALUE); 6147dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(Long.MAX_VALUE, Long.MAX_VALUE, Long.MAX_VALUE); 6157dd252788645e940eada959bdde927426e2531c9Paul Duffin 6167dd252788645e940eada959bdde927426e2531c9Paul Duffin // Exhaustive checks 6177dd252788645e940eada959bdde927426e2531c9Paul Duffin for (long x : ALL_LONG_CANDIDATES) { 6187dd252788645e940eada959bdde927426e2531c9Paul Duffin for (long y : ALL_LONG_CANDIDATES) { 6197dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(x, y); 6207dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6217dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6227dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6237dd252788645e940eada959bdde927426e2531c9Paul Duffin 6247dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 6257dd252788645e940eada959bdde927426e2531c9Paul Duffin * Helper method that asserts the arithmetic mean of x and y is equal 6267dd252788645e940eada959bdde927426e2531c9Paul Duffin * to the expectedMean. 6277dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 6287dd252788645e940eada959bdde927426e2531c9Paul Duffin private static void assertMean(long expectedMean, long x, long y) { 6297dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals("The expectedMean should be the same as computeMeanSafely", 6307dd252788645e940eada959bdde927426e2531c9Paul Duffin expectedMean, computeMeanSafely(x, y)); 6317dd252788645e940eada959bdde927426e2531c9Paul Duffin assertMean(x, y); 6327dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6337dd252788645e940eada959bdde927426e2531c9Paul Duffin 6347dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 6357dd252788645e940eada959bdde927426e2531c9Paul Duffin * Helper method that asserts the arithmetic mean of x and y is equal 6367dd252788645e940eada959bdde927426e2531c9Paul Duffin *to the result of computeMeanSafely. 6377dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 6387dd252788645e940eada959bdde927426e2531c9Paul Duffin private static void assertMean(long x, long y) { 6397dd252788645e940eada959bdde927426e2531c9Paul Duffin long expectedMean = computeMeanSafely(x, y); 6407dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(expectedMean, LongMath.mean(x, y)); 6417dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals("The mean of x and y should equal the mean of y and x", 6427dd252788645e940eada959bdde927426e2531c9Paul Duffin expectedMean, LongMath.mean(y, x)); 6437dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6447dd252788645e940eada959bdde927426e2531c9Paul Duffin 6457dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 6467dd252788645e940eada959bdde927426e2531c9Paul Duffin * Computes the mean in a way that is obvious and resilient to 6477dd252788645e940eada959bdde927426e2531c9Paul Duffin * overflow by using BigInteger arithmetic. 6487dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 6497dd252788645e940eada959bdde927426e2531c9Paul Duffin private static long computeMeanSafely(long x, long y) { 6507dd252788645e940eada959bdde927426e2531c9Paul Duffin BigInteger bigX = BigInteger.valueOf(x); 6517dd252788645e940eada959bdde927426e2531c9Paul Duffin BigInteger bigY = BigInteger.valueOf(y); 6527dd252788645e940eada959bdde927426e2531c9Paul Duffin BigDecimal bigMean = new BigDecimal(bigX.add(bigY)) 6537dd252788645e940eada959bdde927426e2531c9Paul Duffin .divide(BigDecimal.valueOf(2), BigDecimal.ROUND_FLOOR); 6547dd252788645e940eada959bdde927426e2531c9Paul Duffin // parseInt blows up on overflow as opposed to intValue() which does not. 6557dd252788645e940eada959bdde927426e2531c9Paul Duffin return Long.parseLong(bigMean.toString()); 6567dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6577dd252788645e940eada959bdde927426e2531c9Paul Duffin 6587dd252788645e940eada959bdde927426e2531c9Paul Duffin private static boolean fitsInLong(BigInteger big) { 6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return big.bitLength() <= 63; 6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6627dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("NullPointerTester") 6637dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testNullPointers() { 6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert NullPointerTester tester = new NullPointerTester(); 6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.setDefault(int.class, 1); 6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.setDefault(long.class, 1L); 6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicStaticMethods(LongMath.class); 6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 670