11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at
67dd252788645e940eada959bdde927426e2531c9Paul Duffin *
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
87dd252788645e940eada959bdde927426e2531c9Paul Duffin *
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * express or implied. See the License for the specific language governing permissions and
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.primitives;
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableSet;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.EqualsTester;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestCase;
257dd252788645e940eada959bdde927426e2531c9Paul Duffin
260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.math.BigInteger;
270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@code UnsignedInteger}.
307dd252788645e940eada959bdde927426e2531c9Paul Duffin *
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class UnsignedIntegerTest extends TestCase {
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final ImmutableSet<Integer> TEST_INTS;
367dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final ImmutableSet<Long> TEST_LONGS;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static int force32(int value) {
397dd252788645e940eada959bdde927426e2531c9Paul Duffin    // GWT doesn't consistently overflow values to make them 32-bit, so we need to force it.
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return value & 0xffffffff;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static {
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSet.Builder<Integer> testIntsBuilder = ImmutableSet.builder();
457dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSet.Builder<Long> testLongsBuilder = ImmutableSet.builder();
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = -3; i <= 3; i++) {
477dd252788645e940eada959bdde927426e2531c9Paul Duffin      testIntsBuilder
487dd252788645e940eada959bdde927426e2531c9Paul Duffin        .add(i)
497dd252788645e940eada959bdde927426e2531c9Paul Duffin        .add(force32(Integer.MIN_VALUE + i))
507dd252788645e940eada959bdde927426e2531c9Paul Duffin        .add(force32(Integer.MAX_VALUE + i));
517dd252788645e940eada959bdde927426e2531c9Paul Duffin      testLongsBuilder
527dd252788645e940eada959bdde927426e2531c9Paul Duffin        .add((long) i)
537dd252788645e940eada959bdde927426e2531c9Paul Duffin        .add((long) Integer.MIN_VALUE + i)
547dd252788645e940eada959bdde927426e2531c9Paul Duffin        .add((long) Integer.MAX_VALUE + i)
557dd252788645e940eada959bdde927426e2531c9Paul Duffin        .add((1L << 32) + i);
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TEST_INTS = testIntsBuilder.build();
587dd252788645e940eada959bdde927426e2531c9Paul Duffin    TEST_LONGS = testLongsBuilder.build();
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
617dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFromIntBitsAndIntValueAreInverses() {
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int value : TEST_INTS) {
637dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEquals(UnsignedInts.toString(value), value, UnsignedInteger.fromIntBits(value)
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .intValue());
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
687dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testFromIntBitsLongValue() {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int value : TEST_INTS) {
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      long expected = value & 0xffffffffL;
717dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEquals(UnsignedInts.toString(value), expected, UnsignedInteger.fromIntBits(value)
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .longValue());
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
757dd252788645e940eada959bdde927426e2531c9Paul Duffin
767dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testValueOfLong() {
777dd252788645e940eada959bdde927426e2531c9Paul Duffin    long min = 0;
787dd252788645e940eada959bdde927426e2531c9Paul Duffin    long max = (1L << 32) - 1;
797dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (long value : TEST_LONGS) {
807dd252788645e940eada959bdde927426e2531c9Paul Duffin      boolean expectSuccess = value >= min && value <= max;
817dd252788645e940eada959bdde927426e2531c9Paul Duffin      try {
827dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertEquals(value, UnsignedInteger.valueOf(value).longValue());
837dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertTrue(expectSuccess);
847dd252788645e940eada959bdde927426e2531c9Paul Duffin      } catch (IllegalArgumentException e) {
857dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertFalse(expectSuccess);
867dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
877dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
887dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
897dd252788645e940eada959bdde927426e2531c9Paul Duffin
907dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testValueOfBigInteger() {
917dd252788645e940eada959bdde927426e2531c9Paul Duffin    long min = 0;
927dd252788645e940eada959bdde927426e2531c9Paul Duffin    long max = (1L << 32) - 1;
937dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (long value : TEST_LONGS) {
947dd252788645e940eada959bdde927426e2531c9Paul Duffin      boolean expectSuccess = value >= min && value <= max;
957dd252788645e940eada959bdde927426e2531c9Paul Duffin      try {
967dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertEquals(value, UnsignedInteger.valueOf(BigInteger.valueOf(value))
977dd252788645e940eada959bdde927426e2531c9Paul Duffin            .longValue());
987dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertTrue(expectSuccess);
997dd252788645e940eada959bdde927426e2531c9Paul Duffin      } catch (IllegalArgumentException e) {
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertFalse(expectSuccess);
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1037dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToString() {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int value : TEST_INTS) {
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin      UnsignedInteger unsignedValue = UnsignedInteger.fromIntBits(value);
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(unsignedValue.bigIntegerValue().toString(), unsignedValue.toString());
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("too slow")
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToStringRadix() {
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; radix++) {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int l : TEST_INTS) {
1167dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger value = UnsignedInteger.fromIntBits(l);
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(value.bigIntegerValue().toString(radix), value.toString(radix));
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToStringRadixQuick() {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int[] radices = {2, 3, 5, 7, 10, 12, 16, 21, 31, 36};
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int radix : radices) {
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int l : TEST_INTS) {
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger value = UnsignedInteger.fromIntBits(l);
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(value.bigIntegerValue().toString(radix), value.toString(radix));
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFloatValue() {
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int value : TEST_INTS) {
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin      UnsignedInteger unsignedValue = UnsignedInteger.fromIntBits(value);
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(unsignedValue.bigIntegerValue().floatValue(), unsignedValue.floatValue());
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testDoubleValue() {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int value : TEST_INTS) {
1417dd252788645e940eada959bdde927426e2531c9Paul Duffin      UnsignedInteger unsignedValue = UnsignedInteger.fromIntBits(value);
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(unsignedValue.bigIntegerValue().doubleValue(), unsignedValue.doubleValue());
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1467dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testPlus() {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : TEST_INTS) {
1497dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
1507dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        int expected = aUnsigned.bigIntegerValue().add(bUnsigned.bigIntegerValue()).intValue();
1527dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger unsignedSum = aUnsigned.plus(bUnsigned);
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(expected, unsignedSum.intValue());
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1587dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testMinus() {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : TEST_INTS) {
1617dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
1627dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        int expected =
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            force32(aUnsigned.bigIntegerValue().subtract(bUnsigned.bigIntegerValue()).intValue());
1657dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger unsignedSub = aUnsigned.minus(bUnsigned);
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(expected, unsignedSub.intValue());
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("multiply")
1727dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testTimes() {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : TEST_INTS) {
1757dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
1767dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        int expected =
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            force32(aUnsigned.bigIntegerValue().multiply(bUnsigned.bigIntegerValue()).intValue());
1797dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger unsignedMul = aUnsigned.times(bUnsigned);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(aUnsigned + " * " + bUnsigned, expected, unsignedMul.intValue());
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1857dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testDividedBy() {
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : TEST_INTS) {
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (b != 0) {
1897dd252788645e940eada959bdde927426e2531c9Paul Duffin          UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
1907dd252788645e940eada959bdde927426e2531c9Paul Duffin          UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          int expected =
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              aUnsigned.bigIntegerValue().divide(bUnsigned.bigIntegerValue()).intValue();
1937dd252788645e940eada959bdde927426e2531c9Paul Duffin          UnsignedInteger unsignedDiv = aUnsigned.dividedBy(bUnsigned);
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(expected, unsignedDiv.intValue());
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testDivideByZeroThrows() {
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin        UnsignedInteger ignored =
2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin            UnsignedInteger.fromIntBits(a).dividedBy(UnsignedInteger.ZERO);
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2107dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testMod() {
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : TEST_INTS) {
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (b != 0) {
2147dd252788645e940eada959bdde927426e2531c9Paul Duffin          UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
2157dd252788645e940eada959bdde927426e2531c9Paul Duffin          UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          int expected =
2177dd252788645e940eada959bdde927426e2531c9Paul Duffin              aUnsigned.bigIntegerValue().mod(bUnsigned.bigIntegerValue()).intValue();
2187dd252788645e940eada959bdde927426e2531c9Paul Duffin          UnsignedInteger unsignedRem = aUnsigned.mod(bUnsigned);
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(expected, unsignedRem.intValue());
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2257dd252788645e940eada959bdde927426e2531c9Paul Duffin  @SuppressWarnings("ReturnValueIgnored")
2267dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testModByZero() {
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2297dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger.fromIntBits(a).mod(UnsignedInteger.ZERO);
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Expected ArithmeticException");
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (ArithmeticException expected) {}
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCompare() {
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int b : TEST_INTS) {
2387dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
2397dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(aUnsigned.bigIntegerValue().compareTo(bUnsigned.bigIntegerValue()),
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            aUnsigned.compareTo(bUnsigned));
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("too slow")
2477dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testEquals() {
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EqualsTester equalsTester = new EqualsTester();
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      long value = a & 0xffffffffL;
2517dd252788645e940eada959bdde927426e2531c9Paul Duffin      equalsTester.addEqualityGroup(UnsignedInteger.fromIntBits(a), UnsignedInteger.valueOf(value),
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          UnsignedInteger.valueOf(Long.toString(value)),
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          UnsignedInteger.valueOf(Long.toString(value, 16), 16));
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    equalsTester.testEquals();
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIntValue() {
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
2607dd252788645e940eada959bdde927426e2531c9Paul Duffin      UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int intValue = aUnsigned.bigIntegerValue().intValue();
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(intValue, aUnsigned.intValue());
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("serialization")
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization() {
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int a : TEST_INTS) {
2697dd252788645e940eada959bdde927426e2531c9Paul Duffin      SerializableTester.reserializeAndAssert(UnsignedInteger.fromIntBits(a));
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
2747dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNulls() {
2757dd252788645e940eada959bdde927426e2531c9Paul Duffin    new NullPointerTester().testAllPublicStaticMethods(UnsignedInteger.class);
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
278