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