• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 junit.framework.TestCase;
18 
19 import com.google.common.annotations.GwtCompatible;
20 import com.google.common.annotations.GwtIncompatible;
21 import com.google.common.collect.ImmutableSet;
22 import com.google.common.testing.EqualsTester;
23 import com.google.common.testing.NullPointerTester;
24 import com.google.common.testing.SerializableTester;
25 
26 /**
27  * Tests for {@code UnsignedInteger}.
28  *
29  * @author Louis Wasserman
30  */
31 @GwtCompatible(emulated = true)
32 public class UnsignedIntegerTest extends TestCase {
33   private static final ImmutableSet<Integer> TEST_INTS;
34 
force32(int value)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 
testAsUnsignedAndIntValueAreInverses()49   public void testAsUnsignedAndIntValueAreInverses() {
50     for (int value : TEST_INTS) {
51       assertEquals(UnsignedInts.toString(value), value, UnsignedInteger.asUnsigned(value)
52           .intValue());
53     }
54   }
55 
testAsUnsignedLongValue()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 
testToString()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")
testToStringRadix()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 
testToStringRadixQuick()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 
testFloatValue()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 
testDoubleValue()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 
testAdd()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 
testSubtract()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")
testMultiply()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 
testDivide()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 
testDivideByZeroThrows()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 
testRemainder()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 
testRemainderByZero()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 
testCompare()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")
testEqualsAndValueOf()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 
testIntValue()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")
testSerialization()224   public void testSerialization() {
225     for (int a : TEST_INTS) {
226       SerializableTester.reserializeAndAssert(UnsignedInteger.asUnsigned(a));
227     }
228   }
229 
230   @GwtIncompatible("NullPointerTester")
testNulls()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