1 /* 2 * Copyright (C) 2008 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.primitives; 18 19 import com.google.common.annotations.GwtCompatible; 20 import com.google.common.annotations.GwtIncompatible; 21 import com.google.common.collect.testing.Helpers; 22 import com.google.common.testing.NullPointerTester; 23 import com.google.common.testing.SerializableTester; 24 25 import junit.framework.TestCase; 26 27 import java.util.Arrays; 28 import java.util.Collection; 29 import java.util.Collections; 30 import java.util.Comparator; 31 import java.util.List; 32 import java.util.Random; 33 34 /** 35 * Unit test for {@link Ints}. 36 * 37 * @author Kevin Bourrillion 38 */ 39 @GwtCompatible(emulated = true) 40 @SuppressWarnings("cast") // redundant casts are intentional and harmless 41 public class IntsTest extends TestCase { 42 private static final int[] EMPTY = {}; 43 private static final int[] ARRAY1 = {(int) 1}; 44 private static final int[] ARRAY234 45 = {(int) 2, (int) 3, (int) 4}; 46 47 private static final int LEAST = Integer.MIN_VALUE; 48 private static final int GREATEST = Integer.MAX_VALUE; 49 50 private static final int[] VALUES = 51 { LEAST, (int) -1, (int) 0, (int) 1, GREATEST }; 52 53 public void testHashCode() { 54 for (int value : VALUES) { 55 assertEquals(((Integer) value).hashCode(), Ints.hashCode(value)); 56 } 57 } 58 59 public void testCheckedCast() { 60 for (int value : VALUES) { 61 assertEquals(value, Ints.checkedCast((long) value)); 62 } 63 assertCastFails(GREATEST + 1L); 64 assertCastFails(LEAST - 1L); 65 assertCastFails(Long.MAX_VALUE); 66 assertCastFails(Long.MIN_VALUE); 67 } 68 69 public void testSaturatedCast() { 70 for (int value : VALUES) { 71 assertEquals(value, Ints.saturatedCast((long) value)); 72 } 73 assertEquals(GREATEST, Ints.saturatedCast(GREATEST + 1L)); 74 assertEquals(LEAST, Ints.saturatedCast(LEAST - 1L)); 75 assertEquals(GREATEST, Ints.saturatedCast(Long.MAX_VALUE)); 76 assertEquals(LEAST, Ints.saturatedCast(Long.MIN_VALUE)); 77 } 78 79 private void assertCastFails(long value) { 80 try { 81 Ints.checkedCast(value); 82 fail("Cast to int should have failed: " + value); 83 } catch (IllegalArgumentException ex) { 84 assertTrue(value + " not found in exception text: " + ex.getMessage(), 85 ex.getMessage().contains(String.valueOf(value))); 86 } 87 } 88 89 public void testCompare() { 90 for (int x : VALUES) { 91 for (int y : VALUES) { 92 // note: spec requires only that the sign is the same 93 assertEquals(x + ", " + y, 94 Integer.valueOf(x).compareTo(y), 95 Ints.compare(x, y)); 96 } 97 } 98 } 99 100 public void testContains() { 101 assertFalse(Ints.contains(EMPTY, (int) 1)); 102 assertFalse(Ints.contains(ARRAY1, (int) 2)); 103 assertFalse(Ints.contains(ARRAY234, (int) 1)); 104 assertTrue(Ints.contains(new int[] {(int) -1}, (int) -1)); 105 assertTrue(Ints.contains(ARRAY234, (int) 2)); 106 assertTrue(Ints.contains(ARRAY234, (int) 3)); 107 assertTrue(Ints.contains(ARRAY234, (int) 4)); 108 } 109 110 public void testIndexOf() { 111 assertEquals(-1, Ints.indexOf(EMPTY, (int) 1)); 112 assertEquals(-1, Ints.indexOf(ARRAY1, (int) 2)); 113 assertEquals(-1, Ints.indexOf(ARRAY234, (int) 1)); 114 assertEquals(0, Ints.indexOf( 115 new int[] {(int) -1}, (int) -1)); 116 assertEquals(0, Ints.indexOf(ARRAY234, (int) 2)); 117 assertEquals(1, Ints.indexOf(ARRAY234, (int) 3)); 118 assertEquals(2, Ints.indexOf(ARRAY234, (int) 4)); 119 assertEquals(1, Ints.indexOf( 120 new int[] { (int) 2, (int) 3, (int) 2, (int) 3 }, 121 (int) 3)); 122 } 123 124 public void testIndexOf_arrayTarget() { 125 assertEquals(0, Ints.indexOf(EMPTY, EMPTY)); 126 assertEquals(0, Ints.indexOf(ARRAY234, EMPTY)); 127 assertEquals(-1, Ints.indexOf(EMPTY, ARRAY234)); 128 assertEquals(-1, Ints.indexOf(ARRAY234, ARRAY1)); 129 assertEquals(-1, Ints.indexOf(ARRAY1, ARRAY234)); 130 assertEquals(0, Ints.indexOf(ARRAY1, ARRAY1)); 131 assertEquals(0, Ints.indexOf(ARRAY234, ARRAY234)); 132 assertEquals(0, Ints.indexOf( 133 ARRAY234, new int[] { (int) 2, (int) 3 })); 134 assertEquals(1, Ints.indexOf( 135 ARRAY234, new int[] { (int) 3, (int) 4 })); 136 assertEquals(1, Ints.indexOf(ARRAY234, new int[] { (int) 3 })); 137 assertEquals(2, Ints.indexOf(ARRAY234, new int[] { (int) 4 })); 138 assertEquals(1, Ints.indexOf(new int[] { (int) 2, (int) 3, 139 (int) 3, (int) 3, (int) 3 }, 140 new int[] { (int) 3 } 141 )); 142 assertEquals(2, Ints.indexOf( 143 new int[] { (int) 2, (int) 3, (int) 2, 144 (int) 3, (int) 4, (int) 2, (int) 3}, 145 new int[] { (int) 2, (int) 3, (int) 4} 146 )); 147 assertEquals(1, Ints.indexOf( 148 new int[] { (int) 2, (int) 2, (int) 3, 149 (int) 4, (int) 2, (int) 3, (int) 4}, 150 new int[] { (int) 2, (int) 3, (int) 4} 151 )); 152 assertEquals(-1, Ints.indexOf( 153 new int[] { (int) 4, (int) 3, (int) 2}, 154 new int[] { (int) 2, (int) 3, (int) 4} 155 )); 156 } 157 158 public void testLastIndexOf() { 159 assertEquals(-1, Ints.lastIndexOf(EMPTY, (int) 1)); 160 assertEquals(-1, Ints.lastIndexOf(ARRAY1, (int) 2)); 161 assertEquals(-1, Ints.lastIndexOf(ARRAY234, (int) 1)); 162 assertEquals(0, Ints.lastIndexOf( 163 new int[] {(int) -1}, (int) -1)); 164 assertEquals(0, Ints.lastIndexOf(ARRAY234, (int) 2)); 165 assertEquals(1, Ints.lastIndexOf(ARRAY234, (int) 3)); 166 assertEquals(2, Ints.lastIndexOf(ARRAY234, (int) 4)); 167 assertEquals(3, Ints.lastIndexOf( 168 new int[] { (int) 2, (int) 3, (int) 2, (int) 3 }, 169 (int) 3)); 170 } 171 172 public void testMax_noArgs() { 173 try { 174 Ints.max(); 175 fail(); 176 } catch (IllegalArgumentException expected) { 177 } 178 } 179 180 public void testMax() { 181 assertEquals(LEAST, Ints.max(LEAST)); 182 assertEquals(GREATEST, Ints.max(GREATEST)); 183 assertEquals((int) 9, Ints.max( 184 (int) 8, (int) 6, (int) 7, 185 (int) 5, (int) 3, (int) 0, (int) 9)); 186 } 187 188 public void testMin_noArgs() { 189 try { 190 Ints.min(); 191 fail(); 192 } catch (IllegalArgumentException expected) { 193 } 194 } 195 196 public void testMin() { 197 assertEquals(LEAST, Ints.min(LEAST)); 198 assertEquals(GREATEST, Ints.min(GREATEST)); 199 assertEquals((int) 0, Ints.min( 200 (int) 8, (int) 6, (int) 7, 201 (int) 5, (int) 3, (int) 0, (int) 9)); 202 } 203 204 public void testConcat() { 205 assertTrue(Arrays.equals(EMPTY, Ints.concat())); 206 assertTrue(Arrays.equals(EMPTY, Ints.concat(EMPTY))); 207 assertTrue(Arrays.equals(EMPTY, Ints.concat(EMPTY, EMPTY, EMPTY))); 208 assertTrue(Arrays.equals(ARRAY1, Ints.concat(ARRAY1))); 209 assertNotSame(ARRAY1, Ints.concat(ARRAY1)); 210 assertTrue(Arrays.equals(ARRAY1, Ints.concat(EMPTY, ARRAY1, EMPTY))); 211 assertTrue(Arrays.equals( 212 new int[] {(int) 1, (int) 1, (int) 1}, 213 Ints.concat(ARRAY1, ARRAY1, ARRAY1))); 214 assertTrue(Arrays.equals( 215 new int[] {(int) 1, (int) 2, (int) 3, (int) 4}, 216 Ints.concat(ARRAY1, ARRAY234))); 217 } 218 219 @GwtIncompatible("Ints.toByteArray") 220 public void testToByteArray() { 221 assertTrue(Arrays.equals( 222 new byte[] {0x12, 0x13, 0x14, 0x15}, Ints.toByteArray(0x12131415))); 223 assertTrue(Arrays.equals( 224 new byte[] {(byte) 0xFF, (byte) 0xEE, (byte) 0xDD, (byte) 0xCC}, 225 Ints.toByteArray(0xFFEEDDCC))); 226 } 227 228 @GwtIncompatible("Ints.fromByteArray") 229 public void testFromByteArray() { 230 assertEquals(0x12131415, 231 Ints.fromByteArray(new byte[] {0x12, 0x13, 0x14, 0x15, 0x33})); 232 assertEquals(0xFFEEDDCC, Ints.fromByteArray( 233 new byte[] {(byte) 0xFF, (byte) 0xEE, (byte) 0xDD, (byte) 0xCC})); 234 235 try { 236 Ints.fromByteArray(new byte[Ints.BYTES - 1]); 237 fail(); 238 } catch (IllegalArgumentException expected) { 239 } 240 } 241 242 @GwtIncompatible("Ints.fromBytes") 243 public void testFromBytes() { 244 assertEquals(0x12131415, Ints.fromBytes( 245 (byte) 0x12, (byte) 0x13, (byte) 0x14, (byte) 0x15)); 246 assertEquals(0xFFEEDDCC, Ints.fromBytes( 247 (byte) 0xFF, (byte) 0xEE, (byte) 0xDD, (byte) 0xCC)); 248 } 249 250 @GwtIncompatible("Ints.fromByteArray, Ints.toByteArray") 251 public void testByteArrayRoundTrips() { 252 Random r = new Random(5); 253 byte[] b = new byte[Ints.BYTES]; 254 255 // total overkill, but, it takes 0.1 sec so why not... 256 for (int i = 0; i < 10000; i++) { 257 int num = r.nextInt(); 258 assertEquals(num, Ints.fromByteArray(Ints.toByteArray(num))); 259 260 r.nextBytes(b); 261 assertTrue(Arrays.equals(b, Ints.toByteArray(Ints.fromByteArray(b)))); 262 } 263 } 264 265 public void testEnsureCapacity() { 266 assertSame(EMPTY, Ints.ensureCapacity(EMPTY, 0, 1)); 267 assertSame(ARRAY1, Ints.ensureCapacity(ARRAY1, 0, 1)); 268 assertSame(ARRAY1, Ints.ensureCapacity(ARRAY1, 1, 1)); 269 assertTrue(Arrays.equals( 270 new int[] {(int) 1, (int) 0, (int) 0}, 271 Ints.ensureCapacity(ARRAY1, 2, 1))); 272 } 273 274 public void testEnsureCapacity_fail() { 275 try { 276 Ints.ensureCapacity(ARRAY1, -1, 1); 277 fail(); 278 } catch (IllegalArgumentException expected) { 279 } 280 try { 281 // notice that this should even fail when no growth was needed 282 Ints.ensureCapacity(ARRAY1, 1, -1); 283 fail(); 284 } catch (IllegalArgumentException expected) { 285 } 286 } 287 288 public void testJoin() { 289 assertEquals("", Ints.join(",", EMPTY)); 290 assertEquals("1", Ints.join(",", ARRAY1)); 291 assertEquals("1,2", Ints.join(",", (int) 1, (int) 2)); 292 assertEquals("123", 293 Ints.join("", (int) 1, (int) 2, (int) 3)); 294 } 295 296 public void testLexicographicalComparator() { 297 List<int[]> ordered = Arrays.asList( 298 new int[] {}, 299 new int[] {LEAST}, 300 new int[] {LEAST, LEAST}, 301 new int[] {LEAST, (int) 1}, 302 new int[] {(int) 1}, 303 new int[] {(int) 1, LEAST}, 304 new int[] {GREATEST, GREATEST - (int) 1}, 305 new int[] {GREATEST, GREATEST}, 306 new int[] {GREATEST, GREATEST, GREATEST}); 307 308 Comparator<int[]> comparator = Ints.lexicographicalComparator(); 309 Helpers.testComparator(comparator, ordered); 310 } 311 312 @GwtIncompatible("SerializableTester") 313 public void testLexicographicalComparatorSerializable() { 314 Comparator<int[]> comparator = Ints.lexicographicalComparator(); 315 assertSame(comparator, SerializableTester.reserialize(comparator)); 316 } 317 318 public void testToArray() { 319 // need explicit type parameter to avoid javac warning!? 320 List<Integer> none = Arrays.<Integer>asList(); 321 assertTrue(Arrays.equals(EMPTY, Ints.toArray(none))); 322 323 List<Integer> one = Arrays.asList((int) 1); 324 assertTrue(Arrays.equals(ARRAY1, Ints.toArray(one))); 325 326 int[] array = {(int) 0, (int) 1, (int) 0xdeadbeef}; 327 328 List<Integer> three = Arrays.asList((int) 0, (int) 1, (int) 0xdeadbeef); 329 assertTrue(Arrays.equals(array, Ints.toArray(three))); 330 331 assertTrue(Arrays.equals(array, Ints.toArray(Ints.asList(array)))); 332 } 333 334 public void testToArray_threadSafe() { 335 for (int delta : new int[] { +1, 0, -1 }) { 336 for (int i = 0; i < VALUES.length; i++) { 337 List<Integer> list = Ints.asList(VALUES).subList(0, i); 338 Collection<Integer> misleadingSize = 339 Helpers.misleadingSizeCollection(delta); 340 misleadingSize.addAll(list); 341 int[] arr = Ints.toArray(misleadingSize); 342 assertEquals(i, arr.length); 343 for (int j = 0; j < i; j++) { 344 assertEquals(VALUES[j], arr[j]); 345 } 346 } 347 } 348 } 349 350 public void testToArray_withNull() { 351 List<Integer> list = Arrays.asList((int) 0, (int) 1, null); 352 try { 353 Ints.toArray(list); 354 fail(); 355 } catch (NullPointerException expected) { 356 } 357 } 358 359 public void testAsList_isAView() { 360 int[] array = {(int) 0, (int) 1}; 361 List<Integer> list = Ints.asList(array); 362 list.set(0, (int) 2); 363 assertTrue(Arrays.equals(new int[] {(int) 2, (int) 1}, array)); 364 array[1] = (int) 3; 365 assertEquals(Arrays.asList((int) 2, (int) 3), list); 366 } 367 368 public void testAsList_toArray_roundTrip() { 369 int[] array = { (int) 0, (int) 1, (int) 2 }; 370 List<Integer> list = Ints.asList(array); 371 int[] newArray = Ints.toArray(list); 372 373 // Make sure it returned a copy 374 list.set(0, (int) 4); 375 assertTrue(Arrays.equals( 376 new int[] { (int) 0, (int) 1, (int) 2 }, newArray)); 377 newArray[1] = (int) 5; 378 assertEquals((int) 1, (int) list.get(1)); 379 } 380 381 // This test stems from a real bug found by andrewk 382 public void testAsList_subList_toArray_roundTrip() { 383 int[] array = { (int) 0, (int) 1, (int) 2, (int) 3 }; 384 List<Integer> list = Ints.asList(array); 385 assertTrue(Arrays.equals(new int[] { (int) 1, (int) 2 }, 386 Ints.toArray(list.subList(1, 3)))); 387 assertTrue(Arrays.equals(new int[] {}, 388 Ints.toArray(list.subList(2, 2)))); 389 } 390 391 public void testAsListEmpty() { 392 assertSame(Collections.emptyList(), Ints.asList(EMPTY)); 393 } 394 395 @GwtIncompatible("NullPointerTester") 396 public void testNulls() throws Exception { 397 NullPointerTester tester = new NullPointerTester(); 398 tester.setDefault(int[].class, new int[0]); 399 tester.testAllPublicStaticMethods(Ints.class); 400 } 401 402 @GwtIncompatible("AndroidInteger") 403 public void testTryParse() { 404 tryParseAndAssertEquals(0, "0"); 405 tryParseAndAssertEquals(0, "-0"); 406 tryParseAndAssertEquals(1, "1"); 407 tryParseAndAssertEquals(-1, "-1"); 408 tryParseAndAssertEquals(8900, "8900"); 409 tryParseAndAssertEquals(-8900, "-8900"); 410 tryParseAndAssertEquals(GREATEST, Integer.toString(GREATEST)); 411 tryParseAndAssertEquals(LEAST, Integer.toString(LEAST)); 412 assertNull(Ints.tryParse("")); 413 assertNull(Ints.tryParse("-")); 414 assertNull(Ints.tryParse("+1")); 415 assertNull(Ints.tryParse("9999999999999999")); 416 assertNull("Max integer + 1", 417 Ints.tryParse(Long.toString(((long) GREATEST) + 1))); 418 assertNull("Min integer - 1", 419 Ints.tryParse(Long.toString(((long) LEAST) - 1))); 420 } 421 422 /** 423 * Applies {@link Ints#tryParse(String)} to the given string and asserts that 424 * the result is as expected. 425 */ 426 @GwtIncompatible("AndroidInteger") 427 private static void tryParseAndAssertEquals(Integer expected, String value) { 428 assertEquals(expected, Ints.tryParse(value)); 429 } 430 } 431