View Javadoc
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  
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   * Tests for {@code UnsignedInteger}.
30   *
31   * @author Louis Wasserman
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      // GWT doesn't consistently overflow values to make them 32-bit, so we need to force it.
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 }