1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package com.google.common.primitives;
16
17 import com.google.common.annotations.GwtCompatible;
18 import com.google.common.annotations.GwtIncompatible;
19 import com.google.common.collect.ImmutableSet;
20 import com.google.common.testing.EqualsTester;
21 import com.google.common.testing.NullPointerTester;
22 import com.google.common.testing.SerializableTester;
23
24 import junit.framework.TestCase;
25
26 import java.math.BigInteger;
27
28
29
30
31
32
33 @GwtCompatible(emulated = true)
34 public class UnsignedIntegerTest extends TestCase {
35 private static final ImmutableSet<Integer> TEST_INTS;
36 private static final ImmutableSet<Long> TEST_LONGS;
37
38 private static int force32(int value) {
39
40 return value & 0xffffffff;
41 }
42
43 static {
44 ImmutableSet.Builder<Integer> testIntsBuilder = ImmutableSet.builder();
45 ImmutableSet.Builder<Long> testLongsBuilder = ImmutableSet.builder();
46 for (int i = -3; i <= 3; i++) {
47 testIntsBuilder
48 .add(i)
49 .add(force32(Integer.MIN_VALUE + i))
50 .add(force32(Integer.MAX_VALUE + i));
51 testLongsBuilder
52 .add((long) i)
53 .add((long) Integer.MIN_VALUE + i)
54 .add((long) Integer.MAX_VALUE + i)
55 .add((1L << 32) + i);
56 }
57 TEST_INTS = testIntsBuilder.build();
58 TEST_LONGS = testLongsBuilder.build();
59 }
60
61 public void testFromIntBitsAndIntValueAreInverses() {
62 for (int value : TEST_INTS) {
63 assertEquals(UnsignedInts.toString(value), value, UnsignedInteger.fromIntBits(value)
64 .intValue());
65 }
66 }
67
68 public void testFromIntBitsLongValue() {
69 for (int value : TEST_INTS) {
70 long expected = value & 0xffffffffL;
71 assertEquals(UnsignedInts.toString(value), expected, UnsignedInteger.fromIntBits(value)
72 .longValue());
73 }
74 }
75
76 public void testValueOfLong() {
77 long min = 0;
78 long max = (1L << 32) - 1;
79 for (long value : TEST_LONGS) {
80 boolean expectSuccess = value >= min && value <= max;
81 try {
82 assertEquals(value, UnsignedInteger.valueOf(value).longValue());
83 assertTrue(expectSuccess);
84 } catch (IllegalArgumentException e) {
85 assertFalse(expectSuccess);
86 }
87 }
88 }
89
90 public void testValueOfBigInteger() {
91 long min = 0;
92 long max = (1L << 32) - 1;
93 for (long value : TEST_LONGS) {
94 boolean expectSuccess = value >= min && value <= max;
95 try {
96 assertEquals(value, UnsignedInteger.valueOf(BigInteger.valueOf(value))
97 .longValue());
98 assertTrue(expectSuccess);
99 } catch (IllegalArgumentException e) {
100 assertFalse(expectSuccess);
101 }
102 }
103 }
104
105 public void testToString() {
106 for (int value : TEST_INTS) {
107 UnsignedInteger unsignedValue = UnsignedInteger.fromIntBits(value);
108 assertEquals(unsignedValue.bigIntegerValue().toString(), unsignedValue.toString());
109 }
110 }
111
112 @GwtIncompatible("too slow")
113 public void testToStringRadix() {
114 for (int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; radix++) {
115 for (int l : TEST_INTS) {
116 UnsignedInteger value = UnsignedInteger.fromIntBits(l);
117 assertEquals(value.bigIntegerValue().toString(radix), value.toString(radix));
118 }
119 }
120 }
121
122 public void testToStringRadixQuick() {
123 int[] radices = {2, 3, 5, 7, 10, 12, 16, 21, 31, 36};
124 for (int radix : radices) {
125 for (int l : TEST_INTS) {
126 UnsignedInteger value = UnsignedInteger.fromIntBits(l);
127 assertEquals(value.bigIntegerValue().toString(radix), value.toString(radix));
128 }
129 }
130 }
131
132 public void testFloatValue() {
133 for (int value : TEST_INTS) {
134 UnsignedInteger unsignedValue = UnsignedInteger.fromIntBits(value);
135 assertEquals(unsignedValue.bigIntegerValue().floatValue(), unsignedValue.floatValue());
136 }
137 }
138
139 public void testDoubleValue() {
140 for (int value : TEST_INTS) {
141 UnsignedInteger unsignedValue = UnsignedInteger.fromIntBits(value);
142 assertEquals(unsignedValue.bigIntegerValue().doubleValue(), unsignedValue.doubleValue());
143 }
144 }
145
146 public void testPlus() {
147 for (int a : TEST_INTS) {
148 for (int b : TEST_INTS) {
149 UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
150 UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
151 int expected = aUnsigned.bigIntegerValue().add(bUnsigned.bigIntegerValue()).intValue();
152 UnsignedInteger unsignedSum = aUnsigned.plus(bUnsigned);
153 assertEquals(expected, unsignedSum.intValue());
154 }
155 }
156 }
157
158 public void testMinus() {
159 for (int a : TEST_INTS) {
160 for (int b : TEST_INTS) {
161 UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
162 UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
163 int expected =
164 force32(aUnsigned.bigIntegerValue().subtract(bUnsigned.bigIntegerValue()).intValue());
165 UnsignedInteger unsignedSub = aUnsigned.minus(bUnsigned);
166 assertEquals(expected, unsignedSub.intValue());
167 }
168 }
169 }
170
171 @GwtIncompatible("multiply")
172 public void testTimes() {
173 for (int a : TEST_INTS) {
174 for (int b : TEST_INTS) {
175 UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
176 UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
177 int expected =
178 force32(aUnsigned.bigIntegerValue().multiply(bUnsigned.bigIntegerValue()).intValue());
179 UnsignedInteger unsignedMul = aUnsigned.times(bUnsigned);
180 assertEquals(aUnsigned + " * " + bUnsigned, expected, unsignedMul.intValue());
181 }
182 }
183 }
184
185 public void testDividedBy() {
186 for (int a : TEST_INTS) {
187 for (int b : TEST_INTS) {
188 if (b != 0) {
189 UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
190 UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
191 int expected =
192 aUnsigned.bigIntegerValue().divide(bUnsigned.bigIntegerValue()).intValue();
193 UnsignedInteger unsignedDiv = aUnsigned.dividedBy(bUnsigned);
194 assertEquals(expected, unsignedDiv.intValue());
195 }
196 }
197 }
198 }
199
200 public void testDivideByZeroThrows() {
201 for (int a : TEST_INTS) {
202 try {
203 UnsignedInteger ignored =
204 UnsignedInteger.fromIntBits(a).dividedBy(UnsignedInteger.ZERO);
205 fail("Expected ArithmeticException");
206 } catch (ArithmeticException expected) {}
207 }
208 }
209
210 public void testMod() {
211 for (int a : TEST_INTS) {
212 for (int b : TEST_INTS) {
213 if (b != 0) {
214 UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
215 UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
216 int expected =
217 aUnsigned.bigIntegerValue().mod(bUnsigned.bigIntegerValue()).intValue();
218 UnsignedInteger unsignedRem = aUnsigned.mod(bUnsigned);
219 assertEquals(expected, unsignedRem.intValue());
220 }
221 }
222 }
223 }
224
225 @SuppressWarnings("ReturnValueIgnored")
226 public void testModByZero() {
227 for (int a : TEST_INTS) {
228 try {
229 UnsignedInteger.fromIntBits(a).mod(UnsignedInteger.ZERO);
230 fail("Expected ArithmeticException");
231 } catch (ArithmeticException expected) {}
232 }
233 }
234
235 public void testCompare() {
236 for (int a : TEST_INTS) {
237 for (int b : TEST_INTS) {
238 UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
239 UnsignedInteger bUnsigned = UnsignedInteger.fromIntBits(b);
240 assertEquals(aUnsigned.bigIntegerValue().compareTo(bUnsigned.bigIntegerValue()),
241 aUnsigned.compareTo(bUnsigned));
242 }
243 }
244 }
245
246 @GwtIncompatible("too slow")
247 public void testEquals() {
248 EqualsTester equalsTester = new EqualsTester();
249 for (int a : TEST_INTS) {
250 long value = a & 0xffffffffL;
251 equalsTester.addEqualityGroup(UnsignedInteger.fromIntBits(a), UnsignedInteger.valueOf(value),
252 UnsignedInteger.valueOf(Long.toString(value)),
253 UnsignedInteger.valueOf(Long.toString(value, 16), 16));
254 }
255 equalsTester.testEquals();
256 }
257
258 public void testIntValue() {
259 for (int a : TEST_INTS) {
260 UnsignedInteger aUnsigned = UnsignedInteger.fromIntBits(a);
261 int intValue = aUnsigned.bigIntegerValue().intValue();
262 assertEquals(intValue, aUnsigned.intValue());
263 }
264 }
265
266 @GwtIncompatible("serialization")
267 public void testSerialization() {
268 for (int a : TEST_INTS) {
269 SerializableTester.reserializeAndAssert(UnsignedInteger.fromIntBits(a));
270 }
271 }
272
273 @GwtIncompatible("NullPointerTester")
274 public void testNulls() {
275 new NullPointerTester().testAllPublicStaticMethods(UnsignedInteger.class);
276 }
277 }