Home | History | Annotate | Download | only in primitives
      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 Longs}.
     36  *
     37  * @author Kevin Bourrillion
     38  */
     39 @GwtCompatible(emulated = true)
     40 @SuppressWarnings("cast") // redundant casts are intentional and harmless
     41 public class LongsTest extends TestCase {
     42   private static final long[] EMPTY = {};
     43   private static final long[] ARRAY1 = {(long) 1};
     44   private static final long[] ARRAY234
     45       = {(long) 2, (long) 3, (long) 4};
     46 
     47   private static final long LEAST = Long.MIN_VALUE;
     48   private static final long GREATEST = Long.MAX_VALUE;
     49 
     50   private static final long[] VALUES =
     51       { LEAST, (long) -1, (long) 0, (long) 1, GREATEST };
     52 
     53   @GwtIncompatible("Long.hashCode returns different values in GWT.")
     54   public void testHashCode() {
     55     for (long value : VALUES) {
     56       assertEquals("hashCode for " + value,
     57           ((Long) value).hashCode(), Longs.hashCode(value));
     58     }
     59   }
     60 
     61   public void testCompare() {
     62     for (long x : VALUES) {
     63       for (long y : VALUES) {
     64         // note: spec requires only that the sign is the same
     65         assertEquals(x + ", " + y,
     66                      Long.valueOf(x).compareTo(y),
     67                      Longs.compare(x, y));
     68       }
     69     }
     70   }
     71 
     72   public void testContains() {
     73     assertFalse(Longs.contains(EMPTY, (long) 1));
     74     assertFalse(Longs.contains(ARRAY1, (long) 2));
     75     assertFalse(Longs.contains(ARRAY234, (long) 1));
     76     assertTrue(Longs.contains(new long[] {(long) -1}, (long) -1));
     77     assertTrue(Longs.contains(ARRAY234, (long) 2));
     78     assertTrue(Longs.contains(ARRAY234, (long) 3));
     79     assertTrue(Longs.contains(ARRAY234, (long) 4));
     80   }
     81 
     82   public void testIndexOf() {
     83     assertEquals(-1, Longs.indexOf(EMPTY, (long) 1));
     84     assertEquals(-1, Longs.indexOf(ARRAY1, (long) 2));
     85     assertEquals(-1, Longs.indexOf(ARRAY234, (long) 1));
     86     assertEquals(0, Longs.indexOf(
     87         new long[] {(long) -1}, (long) -1));
     88     assertEquals(0, Longs.indexOf(ARRAY234, (long) 2));
     89     assertEquals(1, Longs.indexOf(ARRAY234, (long) 3));
     90     assertEquals(2, Longs.indexOf(ARRAY234, (long) 4));
     91     assertEquals(1, Longs.indexOf(
     92         new long[] { (long) 2, (long) 3, (long) 2, (long) 3 },
     93         (long) 3));
     94   }
     95 
     96   public void testIndexOf_arrayTarget() {
     97     assertEquals(0, Longs.indexOf(EMPTY, EMPTY));
     98     assertEquals(0, Longs.indexOf(ARRAY234, EMPTY));
     99     assertEquals(-1, Longs.indexOf(EMPTY, ARRAY234));
    100     assertEquals(-1, Longs.indexOf(ARRAY234, ARRAY1));
    101     assertEquals(-1, Longs.indexOf(ARRAY1, ARRAY234));
    102     assertEquals(0, Longs.indexOf(ARRAY1, ARRAY1));
    103     assertEquals(0, Longs.indexOf(ARRAY234, ARRAY234));
    104     assertEquals(0, Longs.indexOf(
    105         ARRAY234, new long[] { (long) 2, (long) 3 }));
    106     assertEquals(1, Longs.indexOf(
    107         ARRAY234, new long[] { (long) 3, (long) 4 }));
    108     assertEquals(1, Longs.indexOf(ARRAY234, new long[] { (long) 3 }));
    109     assertEquals(2, Longs.indexOf(ARRAY234, new long[] { (long) 4 }));
    110     assertEquals(1, Longs.indexOf(new long[] { (long) 2, (long) 3,
    111         (long) 3, (long) 3, (long) 3 },
    112         new long[] { (long) 3 }
    113     ));
    114     assertEquals(2, Longs.indexOf(
    115         new long[] { (long) 2, (long) 3, (long) 2,
    116             (long) 3, (long) 4, (long) 2, (long) 3},
    117         new long[] { (long) 2, (long) 3, (long) 4}
    118     ));
    119     assertEquals(1, Longs.indexOf(
    120         new long[] { (long) 2, (long) 2, (long) 3,
    121             (long) 4, (long) 2, (long) 3, (long) 4},
    122         new long[] { (long) 2, (long) 3, (long) 4}
    123     ));
    124     assertEquals(-1, Longs.indexOf(
    125         new long[] { (long) 4, (long) 3, (long) 2},
    126         new long[] { (long) 2, (long) 3, (long) 4}
    127     ));
    128   }
    129 
    130   public void testLastIndexOf() {
    131     assertEquals(-1, Longs.lastIndexOf(EMPTY, (long) 1));
    132     assertEquals(-1, Longs.lastIndexOf(ARRAY1, (long) 2));
    133     assertEquals(-1, Longs.lastIndexOf(ARRAY234, (long) 1));
    134     assertEquals(0, Longs.lastIndexOf(
    135         new long[] {(long) -1}, (long) -1));
    136     assertEquals(0, Longs.lastIndexOf(ARRAY234, (long) 2));
    137     assertEquals(1, Longs.lastIndexOf(ARRAY234, (long) 3));
    138     assertEquals(2, Longs.lastIndexOf(ARRAY234, (long) 4));
    139     assertEquals(3, Longs.lastIndexOf(
    140         new long[] { (long) 2, (long) 3, (long) 2, (long) 3 },
    141         (long) 3));
    142   }
    143 
    144   public void testMax_noArgs() {
    145     try {
    146       Longs.max();
    147       fail();
    148     } catch (IllegalArgumentException expected) {
    149     }
    150   }
    151 
    152   public void testMax() {
    153     assertEquals(LEAST, Longs.max(LEAST));
    154     assertEquals(GREATEST, Longs.max(GREATEST));
    155     assertEquals((long) 9, Longs.max(
    156         (long) 8, (long) 6, (long) 7,
    157         (long) 5, (long) 3, (long) 0, (long) 9));
    158   }
    159 
    160   public void testMin_noArgs() {
    161     try {
    162       Longs.min();
    163       fail();
    164     } catch (IllegalArgumentException expected) {
    165     }
    166   }
    167 
    168   public void testMin() {
    169     assertEquals(LEAST, Longs.min(LEAST));
    170     assertEquals(GREATEST, Longs.min(GREATEST));
    171     assertEquals((long) 0, Longs.min(
    172         (long) 8, (long) 6, (long) 7,
    173         (long) 5, (long) 3, (long) 0, (long) 9));
    174   }
    175 
    176   public void testConcat() {
    177     assertTrue(Arrays.equals(EMPTY, Longs.concat()));
    178     assertTrue(Arrays.equals(EMPTY, Longs.concat(EMPTY)));
    179     assertTrue(Arrays.equals(EMPTY, Longs.concat(EMPTY, EMPTY, EMPTY)));
    180     assertTrue(Arrays.equals(ARRAY1, Longs.concat(ARRAY1)));
    181     assertNotSame(ARRAY1, Longs.concat(ARRAY1));
    182     assertTrue(Arrays.equals(ARRAY1, Longs.concat(EMPTY, ARRAY1, EMPTY)));
    183     assertTrue(Arrays.equals(
    184         new long[] {(long) 1, (long) 1, (long) 1},
    185         Longs.concat(ARRAY1, ARRAY1, ARRAY1)));
    186     assertTrue(Arrays.equals(
    187         new long[] {(long) 1, (long) 2, (long) 3, (long) 4},
    188         Longs.concat(ARRAY1, ARRAY234)));
    189   }
    190 
    191   @GwtIncompatible("Longs.toByteArray")
    192   public void testToByteArray() {
    193     assertTrue(Arrays.equals(
    194         new byte[] {0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19},
    195         Longs.toByteArray(0x1213141516171819L)));
    196     assertTrue(Arrays.equals(
    197         new byte[] {
    198             (byte) 0xFF, (byte) 0xEE, (byte) 0xDD, (byte) 0xCC,
    199             (byte) 0xBB, (byte) 0xAA, (byte) 0x99, (byte) 0x88},
    200         Longs.toByteArray(0xFFEEDDCCBBAA9988L)));
    201   }
    202 
    203   @GwtIncompatible("Longs.fromByteArray")
    204   public void testFromByteArray() {
    205     assertEquals(0x1213141516171819L, Longs.fromByteArray(
    206         new byte[] {0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x33}));
    207     assertEquals(0xFFEEDDCCBBAA9988L, Longs.fromByteArray(
    208         new byte[] {
    209             (byte) 0xFF, (byte) 0xEE, (byte) 0xDD, (byte) 0xCC,
    210             (byte) 0xBB, (byte) 0xAA, (byte) 0x99, (byte) 0x88}));
    211 
    212     try {
    213       Longs.fromByteArray(new byte[Longs.BYTES - 1]);
    214       fail();
    215     } catch (IllegalArgumentException expected) {
    216     }
    217   }
    218 
    219   @GwtIncompatible("Longs.fromBytes")
    220   public void testFromBytes() {
    221     assertEquals(0x1213141516171819L, Longs.fromBytes(
    222         (byte) 0x12, (byte) 0x13, (byte) 0x14, (byte) 0x15,
    223         (byte) 0x16, (byte) 0x17, (byte) 0x18, (byte) 0x19));
    224     assertEquals(0xFFEEDDCCBBAA9988L, Longs.fromBytes(
    225         (byte) 0xFF, (byte) 0xEE, (byte) 0xDD, (byte) 0xCC,
    226         (byte) 0xBB, (byte) 0xAA, (byte) 0x99, (byte) 0x88));
    227   }
    228 
    229   @GwtIncompatible("Longs.fromByteArray, Longs.toByteArray")
    230   public void testByteArrayRoundTrips() {
    231     Random r = new Random(5);
    232     byte[] b = new byte[Longs.BYTES];
    233 
    234     // total overkill, but, it takes 0.1 sec so why not...
    235     for (int i = 0; i < 10000; i++) {
    236       long num = r.nextLong();
    237       assertEquals(num, Longs.fromByteArray(Longs.toByteArray(num)));
    238 
    239       r.nextBytes(b);
    240       long value = Longs.fromByteArray(b);
    241       assertTrue("" + value, Arrays.equals(b, Longs.toByteArray(value)));
    242     }
    243   }
    244 
    245   public void testEnsureCapacity() {
    246     assertSame(EMPTY, Longs.ensureCapacity(EMPTY, 0, 1));
    247     assertSame(ARRAY1, Longs.ensureCapacity(ARRAY1, 0, 1));
    248     assertSame(ARRAY1, Longs.ensureCapacity(ARRAY1, 1, 1));
    249     assertTrue(Arrays.equals(
    250         new long[] {(long) 1, (long) 0, (long) 0},
    251         Longs.ensureCapacity(ARRAY1, 2, 1)));
    252   }
    253 
    254   public void testEnsureCapacity_fail() {
    255     try {
    256       Longs.ensureCapacity(ARRAY1, -1, 1);
    257       fail();
    258     } catch (IllegalArgumentException expected) {
    259     }
    260     try {
    261       // notice that this should even fail when no growth was needed
    262       Longs.ensureCapacity(ARRAY1, 1, -1);
    263       fail();
    264     } catch (IllegalArgumentException expected) {
    265     }
    266   }
    267 
    268   public void testJoin() {
    269     assertEquals("", Longs.join(",", EMPTY));
    270     assertEquals("1", Longs.join(",", ARRAY1));
    271     assertEquals("1,2", Longs.join(",", (long) 1, (long) 2));
    272     assertEquals("123",
    273         Longs.join("", (long) 1, (long) 2, (long) 3));
    274   }
    275 
    276   public void testLexicographicalComparator() {
    277     List<long[]> ordered = Arrays.asList(
    278         new long[] {},
    279         new long[] {LEAST},
    280         new long[] {LEAST, LEAST},
    281         new long[] {LEAST, (long) 1},
    282         new long[] {(long) 1},
    283         new long[] {(long) 1, LEAST},
    284         new long[] {GREATEST, GREATEST - (long) 1},
    285         new long[] {GREATEST, GREATEST},
    286         new long[] {GREATEST, GREATEST, GREATEST});
    287 
    288     Comparator<long[]> comparator = Longs.lexicographicalComparator();
    289     Helpers.testComparator(comparator, ordered);
    290   }
    291 
    292   @GwtIncompatible("SerializableTester")
    293   public void testLexicographicalComparatorSerializable() {
    294     Comparator<long[]> comparator = Longs.lexicographicalComparator();
    295     assertSame(comparator, SerializableTester.reserialize(comparator));
    296   }
    297 
    298   public void testToArray() {
    299     // need explicit type parameter to avoid javac warning!?
    300     List<Long> none = Arrays.<Long>asList();
    301     assertTrue(Arrays.equals(EMPTY, Longs.toArray(none)));
    302 
    303     List<Long> one = Arrays.asList((long) 1);
    304     assertTrue(Arrays.equals(ARRAY1, Longs.toArray(one)));
    305 
    306     long[] array = {(long) 0, (long) 1, 0x0FF1C1AL};
    307 
    308     List<Long> three = Arrays.asList((long) 0, (long) 1, 0x0FF1C1AL);
    309     assertTrue(Arrays.equals(array, Longs.toArray(three)));
    310 
    311     assertTrue(Arrays.equals(array, Longs.toArray(Longs.asList(array))));
    312   }
    313 
    314   public void testToArray_threadSafe() {
    315     for (int delta : new int[] { +1, 0, -1 }) {
    316       for (int i = 0; i < VALUES.length; i++) {
    317         List<Long> list = Longs.asList(VALUES).subList(0, i);
    318         Collection<Long> misleadingSize =
    319             Helpers.misleadingSizeCollection(delta);
    320         misleadingSize.addAll(list);
    321         long[] arr = Longs.toArray(misleadingSize);
    322         assertEquals(i, arr.length);
    323         for (int j = 0; j < i; j++) {
    324           assertEquals(VALUES[j], arr[j]);
    325         }
    326       }
    327     }
    328   }
    329 
    330   public void testToArray_withNull() {
    331     List<Long> list = Arrays.asList((long) 0, (long) 1, null);
    332     try {
    333       Longs.toArray(list);
    334       fail();
    335     } catch (NullPointerException expected) {
    336     }
    337   }
    338 
    339   public void testAsList_isAView() {
    340     long[] array = {(long) 0, (long) 1};
    341     List<Long> list = Longs.asList(array);
    342     list.set(0, (long) 2);
    343     assertTrue(Arrays.equals(new long[] {(long) 2, (long) 1}, array));
    344     array[1] = (long) 3;
    345     assertEquals(Arrays.asList((long) 2, (long) 3), list);
    346   }
    347 
    348   public void testAsList_toArray_roundTrip() {
    349     long[] array = { (long) 0, (long) 1, (long) 2 };
    350     List<Long> list = Longs.asList(array);
    351     long[] newArray = Longs.toArray(list);
    352 
    353     // Make sure it returned a copy
    354     list.set(0, (long) 4);
    355     assertTrue(Arrays.equals(
    356         new long[] { (long) 0, (long) 1, (long) 2 }, newArray));
    357     newArray[1] = (long) 5;
    358     assertEquals((long) 1, (long) list.get(1));
    359   }
    360 
    361   // This test stems from a real bug found by andrewk
    362   public void testAsList_subList_toArray_roundTrip() {
    363     long[] array = { (long) 0, (long) 1, (long) 2, (long) 3 };
    364     List<Long> list = Longs.asList(array);
    365     assertTrue(Arrays.equals(new long[] { (long) 1, (long) 2 },
    366         Longs.toArray(list.subList(1, 3))));
    367     assertTrue(Arrays.equals(new long[] {},
    368         Longs.toArray(list.subList(2, 2))));
    369   }
    370 
    371   public void testAsListEmpty() {
    372     assertSame(Collections.emptyList(), Longs.asList(EMPTY));
    373   }
    374 
    375   @GwtIncompatible("NullPointerTester")
    376   public void testNulls() throws Exception {
    377     NullPointerTester tester = new NullPointerTester();
    378     tester.setDefault(long[].class, new long[0]);
    379     tester.testAllPublicStaticMethods(Longs.class);
    380   }
    381 }
    382