• 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 java.math.BigInteger;
18 
19 import junit.framework.TestCase;
20 
21 import com.google.common.annotations.GwtCompatible;
22 import com.google.common.annotations.GwtIncompatible;
23 import com.google.common.collect.ImmutableSet;
24 import com.google.common.testing.EqualsTester;
25 import com.google.common.testing.NullPointerTester;
26 import com.google.common.testing.SerializableTester;
27 
28 /**
29  * Tests for {@code UnsignedLong}.
30  *
31  * @author Louis Wasserman
32  */
33 @GwtCompatible(emulated = true)
34 public class UnsignedLongTest extends TestCase {
35   private static final ImmutableSet<Long> TEST_LONGS;
36 
37   static {
38     ImmutableSet.Builder<Long> testLongsBuilder = ImmutableSet.builder();
39     for (long i = -3; i <= 3; i++) {
40       testLongsBuilder
41           .add(i)
42           .add(Long.MAX_VALUE + i)
43           .add(Long.MIN_VALUE + i)
44           .add(Integer.MIN_VALUE + i)
45           .add(Integer.MAX_VALUE + i);
46     }
47     TEST_LONGS = testLongsBuilder.build();
48   }
49 
testAsUnsignedAndLongValueAreInverses()50   public void testAsUnsignedAndLongValueAreInverses() {
51     for (long value : TEST_LONGS) {
52       assertEquals(
53           UnsignedLongs.toString(value), value, UnsignedLong.asUnsigned(value).longValue());
54     }
55   }
56 
testAsUnsignedBigIntegerValue()57   public void testAsUnsignedBigIntegerValue() {
58     for (long value : TEST_LONGS) {
59       BigInteger expected = (value >= 0)
60           ? BigInteger.valueOf(value)
61           : BigInteger.valueOf(value).add(BigInteger.ZERO.setBit(64));
62       assertEquals(UnsignedLongs.toString(value), expected,
63           UnsignedLong.asUnsigned(value).bigIntegerValue());
64     }
65   }
66 
testToString()67   public void testToString() {
68     for (long value : TEST_LONGS) {
69       UnsignedLong unsignedValue = UnsignedLong.asUnsigned(value);
70       assertEquals(unsignedValue.bigIntegerValue().toString(), unsignedValue.toString());
71     }
72   }
73 
74   @GwtIncompatible("too slow")
testToStringRadix()75   public void testToStringRadix() {
76     for (int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; radix++) {
77       for (long l : TEST_LONGS) {
78         UnsignedLong value = UnsignedLong.asUnsigned(l);
79         assertEquals(value.bigIntegerValue().toString(radix), value.toString(radix));
80       }
81     }
82   }
83 
testToStringRadixQuick()84   public void testToStringRadixQuick() {
85     int[] radices = {2, 3, 5, 7, 10, 12, 16, 21, 31, 36};
86     for (int radix : radices) {
87       for (long l : TEST_LONGS) {
88         UnsignedLong value = UnsignedLong.asUnsigned(l);
89         assertEquals(value.bigIntegerValue().toString(radix), value.toString(radix));
90       }
91     }
92   }
93 
testFloatValue()94   public void testFloatValue() {
95     for (long value : TEST_LONGS) {
96       UnsignedLong unsignedValue = UnsignedLong.asUnsigned(value);
97       assertEquals(unsignedValue.bigIntegerValue().floatValue(), unsignedValue.floatValue());
98     }
99   }
100 
testDoubleValue()101   public void testDoubleValue() {
102     for (long value : TEST_LONGS) {
103       UnsignedLong unsignedValue = UnsignedLong.asUnsigned(value);
104       assertEquals(unsignedValue.bigIntegerValue().doubleValue(), unsignedValue.doubleValue());
105     }
106   }
107 
testAdd()108   public void testAdd() {
109     for (long a : TEST_LONGS) {
110       for (long b : TEST_LONGS) {
111         UnsignedLong aUnsigned = UnsignedLong.asUnsigned(a);
112         UnsignedLong bUnsigned = UnsignedLong.asUnsigned(b);
113         long expected = aUnsigned
114             .bigIntegerValue()
115             .add(bUnsigned.bigIntegerValue())
116             .longValue();
117         UnsignedLong unsignedSum = aUnsigned.add(bUnsigned);
118         assertEquals(expected, unsignedSum.longValue());
119       }
120     }
121   }
122 
testSubtract()123   public void testSubtract() {
124     for (long a : TEST_LONGS) {
125       for (long b : TEST_LONGS) {
126         UnsignedLong aUnsigned = UnsignedLong.asUnsigned(a);
127         UnsignedLong bUnsigned = UnsignedLong.asUnsigned(b);
128         long expected = aUnsigned
129             .bigIntegerValue()
130             .subtract(bUnsigned.bigIntegerValue())
131             .longValue();
132         UnsignedLong unsignedSub = aUnsigned.subtract(bUnsigned);
133         assertEquals(expected, unsignedSub.longValue());
134       }
135     }
136   }
137 
testMultiply()138   public void testMultiply() {
139     for (long a : TEST_LONGS) {
140       for (long b : TEST_LONGS) {
141         UnsignedLong aUnsigned = UnsignedLong.asUnsigned(a);
142         UnsignedLong bUnsigned = UnsignedLong.asUnsigned(b);
143         long expected = aUnsigned
144             .bigIntegerValue()
145             .multiply(bUnsigned.bigIntegerValue())
146             .longValue();
147         UnsignedLong unsignedMul = aUnsigned.multiply(bUnsigned);
148         assertEquals(expected, unsignedMul.longValue());
149       }
150     }
151   }
152 
testDivide()153   public void testDivide() {
154     for (long a : TEST_LONGS) {
155       for (long b : TEST_LONGS) {
156         if (b != 0) {
157           UnsignedLong aUnsigned = UnsignedLong.asUnsigned(a);
158           UnsignedLong bUnsigned = UnsignedLong.asUnsigned(b);
159           long expected = aUnsigned
160               .bigIntegerValue()
161               .divide(bUnsigned.bigIntegerValue())
162               .longValue();
163           UnsignedLong unsignedDiv = aUnsigned.divide(bUnsigned);
164           assertEquals(expected, unsignedDiv.longValue());
165         }
166       }
167     }
168   }
169 
testDivideByZeroThrows()170   public void testDivideByZeroThrows() {
171     for (long a : TEST_LONGS) {
172       try {
173         UnsignedLong.asUnsigned(a).divide(UnsignedLong.ZERO);
174         fail("Expected ArithmeticException");
175       } catch (ArithmeticException expected) {}
176     }
177   }
178 
testRemainder()179   public void testRemainder() {
180     for (long a : TEST_LONGS) {
181       for (long b : TEST_LONGS) {
182         if (b != 0) {
183           UnsignedLong aUnsigned = UnsignedLong.asUnsigned(a);
184           UnsignedLong bUnsigned = UnsignedLong.asUnsigned(b);
185           long expected = aUnsigned
186               .bigIntegerValue()
187               .remainder(bUnsigned.bigIntegerValue())
188               .longValue();
189           UnsignedLong unsignedRem = aUnsigned.remainder(bUnsigned);
190           assertEquals(expected, unsignedRem.longValue());
191         }
192       }
193     }
194   }
195 
testRemainderByZero()196   public void testRemainderByZero() {
197     for (long a : TEST_LONGS) {
198       try {
199         UnsignedLong.asUnsigned(a).remainder(UnsignedLong.ZERO);
200         fail("Expected ArithmeticException");
201       } catch (ArithmeticException expected) {}
202     }
203   }
204 
testCompare()205   public void testCompare() {
206     for (long a : TEST_LONGS) {
207       for (long b : TEST_LONGS) {
208         UnsignedLong aUnsigned = UnsignedLong.asUnsigned(a);
209         UnsignedLong bUnsigned = UnsignedLong.asUnsigned(b);
210         assertEquals(aUnsigned.bigIntegerValue().compareTo(bUnsigned.bigIntegerValue()),
211             aUnsigned.compareTo(bUnsigned));
212       }
213     }
214   }
215 
216   @GwtIncompatible("too slow")
testEqualsAndValueOf()217   public void testEqualsAndValueOf() {
218     EqualsTester equalsTester = new EqualsTester();
219     for (long a : TEST_LONGS) {
220       BigInteger big =
221           (a >= 0) ? BigInteger.valueOf(a) : BigInteger.valueOf(a).add(BigInteger.ZERO.setBit(64));
222       equalsTester.addEqualityGroup(UnsignedLong.asUnsigned(a), UnsignedLong.valueOf(big),
223           UnsignedLong.valueOf(big.toString()), UnsignedLong.valueOf(big.toString(16), 16));
224     }
225     equalsTester.testEquals();
226   }
227 
testIntValue()228   public void testIntValue() {
229     for (long a : TEST_LONGS) {
230       UnsignedLong aUnsigned = UnsignedLong.asUnsigned(a);
231       int intValue = aUnsigned.bigIntegerValue().intValue();
232       assertEquals(intValue, aUnsigned.intValue());
233     }
234   }
235 
236   @GwtIncompatible("serialization")
testSerialization()237   public void testSerialization() {
238     for (long a : TEST_LONGS) {
239       SerializableTester.reserializeAndAssert(UnsignedLong.asUnsigned(a));
240     }
241   }
242 
243   @GwtIncompatible("NullPointerTester")
testNulls()244   public void testNulls() throws Exception {
245     NullPointerTester tester = new NullPointerTester();
246     tester.setDefault(UnsignedLong.class, UnsignedLong.ONE);
247     tester.testAllPublicStaticMethods(UnsignedLong.class);
248   }
249 }
250