UnsignedIntegerTest.java revision 1d580d0f6ee4f21eb309ba7b509d2c6d671c4044
1/*
2 * Copyright (C) 2011 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11 * express or implied. See the License for the specific language governing permissions and
12 * limitations under the License.
13 */
14
15package com.google.common.primitives;
16
17import junit.framework.TestCase;
18
19import com.google.common.annotations.GwtCompatible;
20import com.google.common.annotations.GwtIncompatible;
21import com.google.common.collect.ImmutableSet;
22import com.google.common.testing.EqualsTester;
23import com.google.common.testing.NullPointerTester;
24import com.google.common.testing.SerializableTester;
25
26/**
27 * Tests for {@code UnsignedInteger}.
28 *
29 * @author Louis Wasserman
30 */
31@GwtCompatible(emulated = true)
32public class UnsignedIntegerTest extends TestCase {
33  private static final ImmutableSet<Integer> TEST_INTS;
34
35  private static int force32(int value) {
36    // GWT doesn't overflow values to make them 32-bit, so we need to force it.
37    return value & 0xffffffff;
38  }
39
40  static {
41    ImmutableSet.Builder<Integer> testIntsBuilder = ImmutableSet.builder();
42    for (int i = -3; i <= 3; i++) {
43      testIntsBuilder.add(i).add(-i).add(force32(Integer.MIN_VALUE + i))
44          .add(force32(Integer.MAX_VALUE + i));
45    }
46    TEST_INTS = testIntsBuilder.build();
47  }
48
49  public void testAsUnsignedAndIntValueAreInverses() {
50    for (int value : TEST_INTS) {
51      assertEquals(UnsignedInts.toString(value), value, UnsignedInteger.asUnsigned(value)
52          .intValue());
53    }
54  }
55
56  public void testAsUnsignedLongValue() {
57    for (int value : TEST_INTS) {
58      long expected = value & 0xffffffffL;
59      assertEquals(UnsignedInts.toString(value), expected, UnsignedInteger.asUnsigned(value)
60          .longValue());
61    }
62  }
63
64  public void testToString() {
65    for (int value : TEST_INTS) {
66      UnsignedInteger unsignedValue = UnsignedInteger.asUnsigned(value);
67      assertEquals(unsignedValue.bigIntegerValue().toString(), unsignedValue.toString());
68    }
69  }
70
71  @GwtIncompatible("too slow")
72  public void testToStringRadix() {
73    for (int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; radix++) {
74      for (int l : TEST_INTS) {
75        UnsignedInteger value = UnsignedInteger.asUnsigned(l);
76        assertEquals(value.bigIntegerValue().toString(radix), value.toString(radix));
77      }
78    }
79  }
80
81  public void testToStringRadixQuick() {
82    int[] radices = {2, 3, 5, 7, 10, 12, 16, 21, 31, 36};
83    for (int radix : radices) {
84      for (int l : TEST_INTS) {
85        UnsignedInteger value = UnsignedInteger.asUnsigned(l);
86        assertEquals(value.bigIntegerValue().toString(radix), value.toString(radix));
87      }
88    }
89  }
90
91  public void testFloatValue() {
92    for (int value : TEST_INTS) {
93      UnsignedInteger unsignedValue = UnsignedInteger.asUnsigned(value);
94      assertEquals(unsignedValue.bigIntegerValue().floatValue(), unsignedValue.floatValue());
95    }
96  }
97
98  public void testDoubleValue() {
99    for (int value : TEST_INTS) {
100      UnsignedInteger unsignedValue = UnsignedInteger.asUnsigned(value);
101      assertEquals(unsignedValue.bigIntegerValue().doubleValue(), unsignedValue.doubleValue());
102    }
103  }
104
105  public void testAdd() {
106    for (int a : TEST_INTS) {
107      for (int b : TEST_INTS) {
108        UnsignedInteger aUnsigned = UnsignedInteger.asUnsigned(a);
109        UnsignedInteger bUnsigned = UnsignedInteger.asUnsigned(b);
110        int expected = aUnsigned.bigIntegerValue().add(bUnsigned.bigIntegerValue()).intValue();
111        UnsignedInteger unsignedSum = aUnsigned.add(bUnsigned);
112        assertEquals(expected, unsignedSum.intValue());
113      }
114    }
115  }
116
117  public void testSubtract() {
118    for (int a : TEST_INTS) {
119      for (int b : TEST_INTS) {
120        UnsignedInteger aUnsigned = UnsignedInteger.asUnsigned(a);
121        UnsignedInteger bUnsigned = UnsignedInteger.asUnsigned(b);
122        int expected =
123            force32(aUnsigned.bigIntegerValue().subtract(bUnsigned.bigIntegerValue()).intValue());
124        UnsignedInteger unsignedSub = aUnsigned.subtract(bUnsigned);
125        assertEquals(expected, unsignedSub.intValue());
126      }
127    }
128  }
129
130  @GwtIncompatible("multiply")
131  public void testMultiply() {
132    for (int a : TEST_INTS) {
133      for (int b : TEST_INTS) {
134        UnsignedInteger aUnsigned = UnsignedInteger.asUnsigned(a);
135        UnsignedInteger bUnsigned = UnsignedInteger.asUnsigned(b);
136        int expected =
137            force32(aUnsigned.bigIntegerValue().multiply(bUnsigned.bigIntegerValue()).intValue());
138        UnsignedInteger unsignedMul = aUnsigned.multiply(bUnsigned);
139        assertEquals(aUnsigned + " * " + bUnsigned, expected, unsignedMul.intValue());
140      }
141    }
142  }
143
144  public void testDivide() {
145    for (int a : TEST_INTS) {
146      for (int b : TEST_INTS) {
147        if (b != 0) {
148          UnsignedInteger aUnsigned = UnsignedInteger.asUnsigned(a);
149          UnsignedInteger bUnsigned = UnsignedInteger.asUnsigned(b);
150          int expected =
151              aUnsigned.bigIntegerValue().divide(bUnsigned.bigIntegerValue()).intValue();
152          UnsignedInteger unsignedDiv = aUnsigned.divide(bUnsigned);
153          assertEquals(expected, unsignedDiv.intValue());
154        }
155      }
156    }
157  }
158
159  public void testDivideByZeroThrows() {
160    for (int a : TEST_INTS) {
161      try {
162        UnsignedInteger.asUnsigned(a).divide(UnsignedInteger.ZERO);
163        fail("Expected ArithmeticException");
164      } catch (ArithmeticException expected) {}
165    }
166  }
167
168  public void testRemainder() {
169    for (int a : TEST_INTS) {
170      for (int b : TEST_INTS) {
171        if (b != 0) {
172          UnsignedInteger aUnsigned = UnsignedInteger.asUnsigned(a);
173          UnsignedInteger bUnsigned = UnsignedInteger.asUnsigned(b);
174          int expected =
175              aUnsigned.bigIntegerValue().remainder(bUnsigned.bigIntegerValue()).intValue();
176          UnsignedInteger unsignedRem = aUnsigned.remainder(bUnsigned);
177          assertEquals(expected, unsignedRem.intValue());
178        }
179      }
180    }
181  }
182
183  public void testRemainderByZero() {
184    for (int a : TEST_INTS) {
185      try {
186        UnsignedInteger.asUnsigned(a).remainder(UnsignedInteger.ZERO);
187        fail("Expected ArithmeticException");
188      } catch (ArithmeticException expected) {}
189    }
190  }
191
192  public void testCompare() {
193    for (int a : TEST_INTS) {
194      for (int b : TEST_INTS) {
195        UnsignedInteger aUnsigned = UnsignedInteger.asUnsigned(a);
196        UnsignedInteger bUnsigned = UnsignedInteger.asUnsigned(b);
197        assertEquals(aUnsigned.bigIntegerValue().compareTo(bUnsigned.bigIntegerValue()),
198            aUnsigned.compareTo(bUnsigned));
199      }
200    }
201  }
202
203  @GwtIncompatible("too slow")
204  public void testEqualsAndValueOf() {
205    EqualsTester equalsTester = new EqualsTester();
206    for (int a : TEST_INTS) {
207      long value = a & 0xffffffffL;
208      equalsTester.addEqualityGroup(UnsignedInteger.asUnsigned(a), UnsignedInteger.valueOf(value),
209          UnsignedInteger.valueOf(Long.toString(value)),
210          UnsignedInteger.valueOf(Long.toString(value, 16), 16));
211    }
212    equalsTester.testEquals();
213  }
214
215  public void testIntValue() {
216    for (int a : TEST_INTS) {
217      UnsignedInteger aUnsigned = UnsignedInteger.asUnsigned(a);
218      int intValue = aUnsigned.bigIntegerValue().intValue();
219      assertEquals(intValue, aUnsigned.intValue());
220    }
221  }
222
223  @GwtIncompatible("serialization")
224  public void testSerialization() {
225    for (int a : TEST_INTS) {
226      SerializableTester.reserializeAndAssert(UnsignedInteger.asUnsigned(a));
227    }
228  }
229
230  @GwtIncompatible("NullPointerTester")
231  public void testNulls() throws Exception {
232    NullPointerTester tester = new NullPointerTester();
233    tester.setDefault(UnsignedInteger.class, UnsignedInteger.ONE);
234    tester.testAllPublicStaticMethods(UnsignedInteger.class);
235  }
236}
237