Home | History | Annotate | Download | only in base
      1 /*
      2  * Copyright (C) 2005 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.base;
     18 
     19 import static com.google.common.base.CharMatcher.WHITESPACE;
     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 import junit.framework.TestCase;
     29 
     30 import java.io.Serializable;
     31 import java.util.ArrayList;
     32 import java.util.Arrays;
     33 import java.util.Collection;
     34 import java.util.Collections;
     35 import java.util.Iterator;
     36 import java.util.List;
     37 import java.util.regex.Pattern;
     38 
     39 /**
     40  * Unit test for {@link Predicates}.
     41  *
     42  * @author Kevin Bourrillion
     43  */
     44 @GwtCompatible(emulated = true)
     45 public class PredicatesTest extends TestCase {
     46   private static final Predicate<Integer> TRUE = Predicates.alwaysTrue();
     47   private static final Predicate<Integer> FALSE = Predicates.alwaysFalse();
     48   private static final Predicate<Integer> NEVER_REACHED =
     49       new Predicate<Integer>() {
     50     @Override
     51     public boolean apply(Integer i) {
     52       fail("This predicate should never have been evaluated");
     53       return false;
     54     }
     55   };
     56 
     57   /** Instantiable predicate with reasonable hashCode() and equals() methods. */
     58   static class IsOdd implements Predicate<Integer>, Serializable {
     59     private static final long serialVersionUID = 0x150ddL;
     60     @Override
     61     public boolean apply(Integer i) {
     62       return (i.intValue() & 1) == 1;
     63     }
     64     @Override public int hashCode() {
     65       return 0x150dd;
     66     }
     67     @Override public boolean equals(Object obj) {
     68       return obj instanceof IsOdd;
     69     }
     70     @Override public String toString() {
     71       return "IsOdd";
     72     }
     73   }
     74 
     75   /**
     76    * Generates a new Predicate per call.
     77    *
     78    * <p>Creating a new Predicate each time helps catch cases where code is
     79    * using {@code x == y} instead of {@code x.equals(y)}.
     80    */
     81   private static IsOdd isOdd() {
     82     return new IsOdd();
     83   }
     84 
     85   /*
     86    * Tests for Predicates.alwaysTrue().
     87    */
     88 
     89   public void testAlwaysTrue_apply() {
     90     assertEvalsToTrue(Predicates.alwaysTrue());
     91   }
     92 
     93   public void testAlwaysTrue_equality() throws Exception {
     94     new EqualsTester()
     95         .addEqualityGroup(TRUE, Predicates.alwaysTrue())
     96         .addEqualityGroup(isOdd())
     97         .addEqualityGroup(Predicates.alwaysFalse())
     98         .testEquals();
     99   }
    100 
    101   @GwtIncompatible("SerializableTester")
    102   public void testAlwaysTrue_serialization() {
    103     checkSerialization(Predicates.alwaysTrue());
    104   }
    105 
    106   /*
    107    * Tests for Predicates.alwaysFalse().
    108    */
    109 
    110   public void testAlwaysFalse_apply() throws Exception {
    111     assertEvalsToFalse(Predicates.alwaysFalse());
    112   }
    113 
    114   public void testAlwaysFalse_equality() throws Exception {
    115     new EqualsTester()
    116         .addEqualityGroup(FALSE, Predicates.alwaysFalse())
    117         .addEqualityGroup(isOdd())
    118         .addEqualityGroup(Predicates.alwaysTrue())
    119         .testEquals();
    120   }
    121 
    122   @GwtIncompatible("SerializableTester")
    123   public void testAlwaysFalse_serialization() {
    124     checkSerialization(Predicates.alwaysFalse());
    125   }
    126 
    127   /*
    128    * Tests for Predicates.not(predicate).
    129    */
    130 
    131   public void testNot_apply() {
    132     assertEvalsToTrue(Predicates.not(FALSE));
    133     assertEvalsToFalse(Predicates.not(TRUE));
    134     assertEvalsLikeOdd(Predicates.not(Predicates.not(isOdd())));
    135   }
    136 
    137   public void testNot_equality() {
    138     new EqualsTester()
    139         .addEqualityGroup(Predicates.not(isOdd()), Predicates.not(isOdd()))
    140         .addEqualityGroup(Predicates.not(TRUE))
    141         .addEqualityGroup(isOdd())
    142         .testEquals();
    143   }
    144 
    145   public void testNot_equalityForNotOfKnownValues() {
    146     new EqualsTester()
    147         .addEqualityGroup(TRUE, Predicates.alwaysTrue())
    148         .addEqualityGroup(FALSE)
    149         .addEqualityGroup(Predicates.not(TRUE))
    150         .testEquals();
    151 
    152     new EqualsTester()
    153         .addEqualityGroup(FALSE, Predicates.alwaysFalse())
    154         .addEqualityGroup(TRUE)
    155         .addEqualityGroup(Predicates.not(FALSE))
    156         .testEquals();
    157 
    158     new EqualsTester()
    159         .addEqualityGroup(Predicates.isNull(), Predicates.isNull())
    160         .addEqualityGroup(Predicates.notNull())
    161         .addEqualityGroup(Predicates.not(Predicates.isNull()))
    162         .testEquals();
    163 
    164     new EqualsTester()
    165         .addEqualityGroup(Predicates.notNull(), Predicates.notNull())
    166         .addEqualityGroup(Predicates.isNull())
    167         .addEqualityGroup(Predicates.not(Predicates.notNull()))
    168         .testEquals();
    169   }
    170 
    171   @GwtIncompatible("SerializableTester")
    172   public void testNot_serialization() {
    173     checkSerialization(Predicates.not(isOdd()));
    174   }
    175 
    176   /*
    177    * Tests for all the different flavors of Predicates.and().
    178    */
    179 
    180   @SuppressWarnings("unchecked")
    181   public void testAnd_applyNoArgs() {
    182     assertEvalsToTrue(Predicates.and());
    183   }
    184 
    185   @SuppressWarnings("unchecked")
    186   public void testAnd_equalityNoArgs() {
    187     new EqualsTester()
    188         .addEqualityGroup(Predicates.and(), Predicates.and())
    189         .addEqualityGroup(Predicates.and(FALSE))
    190         .addEqualityGroup(Predicates.or())
    191         .testEquals();
    192   }
    193 
    194   @GwtIncompatible("SerializableTester")
    195   @SuppressWarnings("unchecked")
    196   public void testAnd_serializationNoArgs() {
    197     checkSerialization(Predicates.and());
    198   }
    199 
    200   @SuppressWarnings("unchecked")
    201   public void testAnd_applyOneArg() {
    202     assertEvalsLikeOdd(Predicates.and(isOdd()));
    203   }
    204 
    205   @SuppressWarnings("unchecked")
    206   public void testAnd_equalityOneArg() {
    207     Object[] notEqualObjects = {Predicates.and(NEVER_REACHED, FALSE)};
    208     new EqualsTester()
    209         .addEqualityGroup(
    210             Predicates.and(NEVER_REACHED), Predicates.and(NEVER_REACHED))
    211         .addEqualityGroup(notEqualObjects)
    212         .addEqualityGroup(Predicates.and(isOdd()))
    213         .addEqualityGroup(Predicates.and())
    214         .addEqualityGroup(Predicates.or(NEVER_REACHED))
    215         .testEquals();
    216   }
    217 
    218   @GwtIncompatible("SerializableTester")
    219   @SuppressWarnings("unchecked")
    220   public void testAnd_serializationOneArg() {
    221     checkSerialization(Predicates.and(isOdd()));
    222   }
    223 
    224   public void testAnd_applyBinary() {
    225     assertEvalsLikeOdd(Predicates.and(isOdd(), TRUE));
    226     assertEvalsLikeOdd(Predicates.and(TRUE, isOdd()));
    227     assertEvalsToFalse(Predicates.and(FALSE, NEVER_REACHED));
    228   }
    229 
    230   @SuppressWarnings("unchecked")
    231   public void testAnd_equalityBinary() {
    232     new EqualsTester()
    233         .addEqualityGroup(
    234             Predicates.and(TRUE, NEVER_REACHED),
    235             Predicates.and(TRUE, NEVER_REACHED))
    236         .addEqualityGroup(Predicates.and(NEVER_REACHED, TRUE))
    237         .addEqualityGroup(Predicates.and(TRUE))
    238         .addEqualityGroup(Predicates.or(TRUE, NEVER_REACHED))
    239         .testEquals();
    240   }
    241 
    242   @GwtIncompatible("SerializableTester")
    243   public void testAnd_serializationBinary() {
    244     checkSerialization(Predicates.and(TRUE, isOdd()));
    245   }
    246 
    247   @SuppressWarnings("unchecked")
    248   public void testAnd_applyTernary() {
    249     assertEvalsLikeOdd(Predicates.and(isOdd(), TRUE, TRUE));
    250     assertEvalsLikeOdd(Predicates.and(TRUE, isOdd(), TRUE));
    251     assertEvalsLikeOdd(Predicates.and(TRUE, TRUE, isOdd()));
    252     assertEvalsToFalse(Predicates.and(TRUE, FALSE, NEVER_REACHED));
    253   }
    254 
    255   @SuppressWarnings("unchecked")
    256   public void testAnd_equalityTernary() {
    257     new EqualsTester()
    258         .addEqualityGroup(
    259             Predicates.and(TRUE, isOdd(), NEVER_REACHED),
    260             Predicates.and(TRUE, isOdd(), NEVER_REACHED))
    261         .addEqualityGroup(Predicates.and(isOdd(), NEVER_REACHED, TRUE))
    262         .addEqualityGroup(Predicates.and(TRUE))
    263         .addEqualityGroup(Predicates.or(TRUE, isOdd(), NEVER_REACHED))
    264         .testEquals();
    265   }
    266 
    267   @GwtIncompatible("SerializableTester")
    268   @SuppressWarnings("unchecked")
    269   public void testAnd_serializationTernary() {
    270     checkSerialization(Predicates.and(TRUE, isOdd(), FALSE));
    271   }
    272 
    273   @SuppressWarnings("unchecked")
    274   public void testAnd_applyIterable() {
    275     Collection<Predicate<Integer>> empty = Arrays.asList();
    276     assertEvalsToTrue(Predicates.and(empty));
    277     assertEvalsLikeOdd(Predicates.and(Arrays.asList(isOdd())));
    278     assertEvalsLikeOdd(Predicates.and(Arrays.asList(TRUE, isOdd())));
    279     assertEvalsToFalse(Predicates.and(Arrays.asList(FALSE, NEVER_REACHED)));
    280   }
    281 
    282   @SuppressWarnings("unchecked")
    283   public void testAnd_equalityIterable() {
    284     new EqualsTester()
    285         .addEqualityGroup(
    286             Predicates.and(Arrays.asList(TRUE, NEVER_REACHED)),
    287             Predicates.and(Arrays.asList(TRUE, NEVER_REACHED)),
    288             Predicates.and(TRUE, NEVER_REACHED))
    289         .addEqualityGroup(Predicates.and(FALSE, NEVER_REACHED))
    290         .addEqualityGroup(Predicates.or(TRUE, NEVER_REACHED))
    291         .testEquals();
    292   }
    293 
    294   @GwtIncompatible("SerializableTester")
    295   @SuppressWarnings("unchecked")
    296   public void testAnd_serializationIterable() {
    297     checkSerialization(Predicates.and(Arrays.asList(TRUE, FALSE)));
    298   }
    299 
    300   @SuppressWarnings("unchecked")
    301   public void testAnd_arrayDefensivelyCopied() {
    302     Predicate[] array = {Predicates.alwaysFalse()};
    303     Predicate<Object> predicate = Predicates.and(array);
    304     assertFalse(predicate.apply(1));
    305     array[0] = Predicates.alwaysTrue();
    306     assertFalse(predicate.apply(1));
    307   }
    308 
    309   @SuppressWarnings("unchecked")
    310   public void testAnd_listDefensivelyCopied() {
    311     List list = new ArrayList<Predicate>();
    312     Predicate<Object> predicate = Predicates.and(list);
    313     assertTrue(predicate.apply(1));
    314     list.add(Predicates.alwaysFalse());
    315     assertTrue(predicate.apply(1));
    316   }
    317 
    318   @SuppressWarnings("unchecked")
    319   public void testAnd_iterableDefensivelyCopied() {
    320     final List list = new ArrayList<Predicate>();
    321     Iterable iterable = new Iterable<Predicate>() {
    322       @Override
    323       public Iterator<Predicate> iterator() {
    324         return list.iterator();
    325       }
    326     };
    327     Predicate<Object> predicate = Predicates.and(iterable);
    328     assertTrue(predicate.apply(1));
    329     list.add(Predicates.alwaysFalse());
    330     assertTrue(predicate.apply(1));
    331   }
    332 
    333   /*
    334    * Tests for all the different flavors of Predicates.or().
    335    */
    336 
    337   @SuppressWarnings("unchecked")
    338   public void testOr_applyNoArgs() {
    339     assertEvalsToFalse(Predicates.or());
    340   }
    341 
    342   @SuppressWarnings("unchecked")
    343   public void testOr_equalityNoArgs() {
    344     new EqualsTester()
    345         .addEqualityGroup(Predicates.or(), Predicates.or())
    346         .addEqualityGroup(Predicates.or(TRUE))
    347         .addEqualityGroup(Predicates.and())
    348         .testEquals();
    349   }
    350 
    351   @GwtIncompatible("SerializableTester")
    352   @SuppressWarnings("unchecked")
    353   public void testOr_serializationNoArgs() {
    354     checkSerialization(Predicates.or());
    355   }
    356 
    357   @SuppressWarnings("unchecked")
    358   public void testOr_applyOneArg() {
    359     assertEvalsToTrue(Predicates.or(TRUE));
    360     assertEvalsToFalse(Predicates.or(FALSE));
    361   }
    362 
    363   @SuppressWarnings("unchecked")
    364   public void testOr_equalityOneArg() {
    365     new EqualsTester()
    366         .addEqualityGroup(
    367             Predicates.or(NEVER_REACHED), Predicates.or(NEVER_REACHED))
    368         .addEqualityGroup(Predicates.or(NEVER_REACHED, TRUE))
    369         .addEqualityGroup(Predicates.or(TRUE))
    370         .addEqualityGroup(Predicates.or())
    371         .addEqualityGroup(Predicates.and(NEVER_REACHED))
    372         .testEquals();
    373   }
    374 
    375   @GwtIncompatible("SerializableTester")
    376   @SuppressWarnings("unchecked")
    377   public void testOr_serializationOneArg() {
    378     checkSerialization(Predicates.or(isOdd()));
    379   }
    380 
    381   public void testOr_applyBinary() {
    382     Predicate<Integer> falseOrFalse = Predicates.or(FALSE, FALSE);
    383     Predicate<Integer> falseOrTrue = Predicates.or(FALSE, TRUE);
    384     Predicate<Integer> trueOrAnything = Predicates.or(TRUE, NEVER_REACHED);
    385 
    386     assertEvalsToFalse(falseOrFalse);
    387     assertEvalsToTrue(falseOrTrue);
    388     assertEvalsToTrue(trueOrAnything);
    389   }
    390 
    391   @SuppressWarnings("unchecked")
    392   public void testOr_equalityBinary() {
    393     new EqualsTester()
    394         .addEqualityGroup(
    395             Predicates.or(FALSE, NEVER_REACHED),
    396             Predicates.or(FALSE, NEVER_REACHED))
    397         .addEqualityGroup(Predicates.or(NEVER_REACHED, FALSE))
    398         .addEqualityGroup(Predicates.or(TRUE))
    399         .addEqualityGroup(Predicates.and(FALSE, NEVER_REACHED))
    400         .testEquals();
    401   }
    402 
    403   @GwtIncompatible("SerializableTester")
    404   public void testOr_serializationBinary() {
    405     checkSerialization(Predicates.or(isOdd(), TRUE));
    406   }
    407 
    408   @SuppressWarnings("unchecked")
    409   public void testOr_applyTernary() {
    410     assertEvalsLikeOdd(Predicates.or(isOdd(), FALSE, FALSE));
    411     assertEvalsLikeOdd(Predicates.or(FALSE, isOdd(), FALSE));
    412     assertEvalsLikeOdd(Predicates.or(FALSE, FALSE, isOdd()));
    413     assertEvalsToTrue(Predicates.or(FALSE, TRUE, NEVER_REACHED));
    414   }
    415 
    416   @SuppressWarnings("unchecked")
    417   public void testOr_equalityTernary() {
    418     new EqualsTester()
    419         .addEqualityGroup(
    420             Predicates.or(FALSE, NEVER_REACHED, TRUE),
    421             Predicates.or(FALSE, NEVER_REACHED, TRUE))
    422         .addEqualityGroup(Predicates.or(TRUE, NEVER_REACHED, FALSE))
    423         .addEqualityGroup(Predicates.or(TRUE))
    424         .addEqualityGroup(Predicates.and(FALSE, NEVER_REACHED, TRUE))
    425         .testEquals();
    426   }
    427 
    428   @GwtIncompatible("SerializableTester")
    429   @SuppressWarnings("unchecked")
    430   public void testOr_serializationTernary() {
    431     checkSerialization(Predicates.or(FALSE, isOdd(), TRUE));
    432   }
    433 
    434   @SuppressWarnings("unchecked")
    435   public void testOr_applyIterable() {
    436     Predicate<Integer> vacuouslyFalse =
    437         Predicates.or(Collections.<Predicate<Integer>>emptyList());
    438     Predicate<Integer> troo = Predicates.or(Collections.singletonList(TRUE));
    439     /*
    440      * newLinkedList() takes varargs. TRUE and FALSE are both instances of
    441      * Predicate<Integer>, so the call is safe.
    442      */
    443     Predicate<Integer> trueAndFalse = Predicates.or(Arrays.asList(TRUE, FALSE));
    444 
    445     assertEvalsToFalse(vacuouslyFalse);
    446     assertEvalsToTrue(troo);
    447     assertEvalsToTrue(trueAndFalse);
    448   }
    449 
    450   @SuppressWarnings("unchecked")
    451   public void testOr_equalityIterable() {
    452     new EqualsTester()
    453         .addEqualityGroup(
    454             Predicates.or(Arrays.asList(FALSE, NEVER_REACHED)),
    455             Predicates.or(Arrays.asList(FALSE, NEVER_REACHED)),
    456             Predicates.or(FALSE, NEVER_REACHED))
    457         .addEqualityGroup(Predicates.or(TRUE, NEVER_REACHED))
    458         .addEqualityGroup(Predicates.and(FALSE, NEVER_REACHED))
    459         .testEquals();
    460   }
    461 
    462   @GwtIncompatible("SerializableTester")
    463   @SuppressWarnings("unchecked")
    464   public void testOr_serializationIterable() {
    465     Predicate<Integer> pre = Predicates.or(Arrays.asList(TRUE, FALSE));
    466     Predicate<Integer> post = SerializableTester.reserializeAndAssert(pre);
    467     assertEquals(pre.apply(0), post.apply(0));
    468   }
    469 
    470   @SuppressWarnings("unchecked")
    471   public void testOr_arrayDefensivelyCopied() {
    472     Predicate[] array = {Predicates.alwaysFalse()};
    473     Predicate<Object> predicate = Predicates.or(array);
    474     assertFalse(predicate.apply(1));
    475     array[0] = Predicates.alwaysTrue();
    476     assertFalse(predicate.apply(1));
    477   }
    478 
    479   @SuppressWarnings("unchecked")
    480   public void testOr_listDefensivelyCopied() {
    481     List list = new ArrayList<Predicate>();
    482     Predicate<Object> predicate = Predicates.or(list);
    483     assertFalse(predicate.apply(1));
    484     list.add(Predicates.alwaysTrue());
    485     assertFalse(predicate.apply(1));
    486   }
    487 
    488   @SuppressWarnings("unchecked")
    489   public void testOr_iterableDefensivelyCopied() {
    490     final List list = new ArrayList<Predicate>();
    491     Iterable iterable = new Iterable<Predicate>() {
    492       @Override
    493       public Iterator<Predicate> iterator() {
    494         return list.iterator();
    495       }
    496     };
    497     Predicate<Object> predicate = Predicates.or(iterable);
    498     assertFalse(predicate.apply(1));
    499     list.add(Predicates.alwaysTrue());
    500     assertFalse(predicate.apply(1));
    501   }
    502 
    503   /*
    504    * Tests for Predicates.equalTo(x).
    505    */
    506 
    507   public void testIsEqualTo_apply() {
    508     Predicate<Integer> isOne = Predicates.equalTo(1);
    509 
    510     assertTrue(isOne.apply(1));
    511     assertFalse(isOne.apply(2));
    512     assertFalse(isOne.apply(null));
    513   }
    514 
    515   public void testIsEqualTo_equality() {
    516     new EqualsTester()
    517         .addEqualityGroup(Predicates.equalTo(1), Predicates.equalTo(1))
    518         .addEqualityGroup(Predicates.equalTo(2))
    519         .addEqualityGroup(Predicates.equalTo(null))
    520         .testEquals();
    521   }
    522 
    523   @GwtIncompatible("SerializableTester")
    524   public void testIsEqualTo_serialization() {
    525     checkSerialization(Predicates.equalTo(1));
    526   }
    527 
    528   public void testIsEqualToNull_apply() {
    529     Predicate<Integer> isNull = Predicates.equalTo(null);
    530     assertTrue(isNull.apply(null));
    531     assertFalse(isNull.apply(1));
    532   }
    533 
    534   public void testIsEqualToNull_equality() {
    535     new EqualsTester()
    536         .addEqualityGroup(Predicates.equalTo(null), Predicates.equalTo(null))
    537         .addEqualityGroup(Predicates.equalTo(1))
    538         .addEqualityGroup(Predicates.equalTo("null"))
    539         .testEquals();
    540   }
    541 
    542   @GwtIncompatible("SerializableTester")
    543   public void testIsEqualToNull_serialization() {
    544     checkSerialization(Predicates.equalTo(null));
    545   }
    546 
    547   /**
    548    * Tests for Predicates.instanceOf(x).
    549    * TODO: Fix the comment style after fixing annotation stripper to remove
    550    * comments properly.  Currently, all tests before the comments are removed
    551    * as well.
    552    */
    553 
    554   @GwtIncompatible("Predicates.instanceOf")
    555   public void testIsInstanceOf_apply() {
    556     Predicate<Object> isInteger = Predicates.instanceOf(Integer.class);
    557 
    558     assertTrue(isInteger.apply(1));
    559     assertFalse(isInteger.apply(2.0f));
    560     assertFalse(isInteger.apply(""));
    561     assertFalse(isInteger.apply(null));
    562   }
    563 
    564   @GwtIncompatible("Predicates.instanceOf")
    565   public void testIsInstanceOf_subclass() {
    566     Predicate<Object> isNumber = Predicates.instanceOf(Number.class);
    567 
    568     assertTrue(isNumber.apply(1));
    569     assertTrue(isNumber.apply(2.0f));
    570     assertFalse(isNumber.apply(""));
    571     assertFalse(isNumber.apply(null));
    572   }
    573 
    574   @GwtIncompatible("Predicates.instanceOf")
    575   public void testIsInstanceOf_interface() {
    576     Predicate<Object> isComparable = Predicates.instanceOf(Comparable.class);
    577 
    578     assertTrue(isComparable.apply(1));
    579     assertTrue(isComparable.apply(2.0f));
    580     assertTrue(isComparable.apply(""));
    581     assertFalse(isComparable.apply(null));
    582   }
    583 
    584   @GwtIncompatible("Predicates.instanceOf")
    585   public void testIsInstanceOf_equality() {
    586     new EqualsTester()
    587         .addEqualityGroup(
    588             Predicates.instanceOf(Integer.class),
    589             Predicates.instanceOf(Integer.class))
    590         .addEqualityGroup(Predicates.instanceOf(Number.class))
    591         .addEqualityGroup(Predicates.instanceOf(Float.class))
    592         .testEquals();
    593   }
    594 
    595   @GwtIncompatible("Predicates.instanceOf, SerializableTester")
    596   public void testIsInstanceOf_serialization() {
    597     checkSerialization(Predicates.instanceOf(Integer.class));
    598   }
    599 
    600   @GwtIncompatible("Predicates.assignableFrom")
    601   public void testIsAssignableFrom_apply() {
    602     Predicate<Class<?>> isInteger = Predicates.assignableFrom(Integer.class);
    603 
    604     assertTrue(isInteger.apply(Integer.class));
    605     assertFalse(isInteger.apply(Float.class));
    606 
    607     try {
    608       isInteger.apply(null);
    609       fail();
    610     } catch(NullPointerException expected) {}
    611   }
    612 
    613   @GwtIncompatible("Predicates.assignableFrom")
    614   public void testIsAssignableFrom_subclass() {
    615     Predicate<Class<?>> isNumber = Predicates.assignableFrom(Number.class);
    616 
    617     assertTrue(isNumber.apply(Integer.class));
    618     assertTrue(isNumber.apply(Float.class));
    619   }
    620 
    621   @GwtIncompatible("Predicates.assignableFrom")
    622   public void testIsAssignableFrom_interface() {
    623     Predicate<Class<?>> isComparable =
    624         Predicates.assignableFrom(Comparable.class);
    625 
    626     assertTrue(isComparable.apply(Integer.class));
    627     assertTrue(isComparable.apply(Float.class));
    628   }
    629 
    630   @GwtIncompatible("Predicates.assignableFrom")
    631   public void testIsAssignableFrom_equality() {
    632     new EqualsTester()
    633         .addEqualityGroup(
    634             Predicates.assignableFrom(Integer.class),
    635             Predicates.assignableFrom(Integer.class))
    636         .addEqualityGroup(Predicates.assignableFrom(Number.class))
    637         .addEqualityGroup(Predicates.assignableFrom(Float.class))
    638         .testEquals();
    639   }
    640 
    641   @GwtIncompatible("Predicates.assignableFrom, SerializableTester")
    642   public void testIsAssignableFrom_serialization() {
    643     Predicate<Class<?>> predicate =
    644         Predicates.assignableFrom(Integer.class);
    645     Predicate<Class<?>> reserialized =
    646         SerializableTester.reserializeAndAssert(predicate);
    647 
    648     assertEvalsLike(predicate, reserialized, Integer.class);
    649     assertEvalsLike(predicate, reserialized, Float.class);
    650     assertEvalsLike(predicate, reserialized, null);
    651   }
    652 
    653   /*
    654    * Tests for Predicates.isNull()
    655    */
    656 
    657   public void testIsNull_apply() {
    658     Predicate<Integer> isNull = Predicates.isNull();
    659     assertTrue(isNull.apply(null));
    660     assertFalse(isNull.apply(1));
    661   }
    662 
    663   public void testIsNull_equality() {
    664     new EqualsTester()
    665         .addEqualityGroup(Predicates.isNull(), Predicates.isNull())
    666         .addEqualityGroup(Predicates.notNull())
    667         .testEquals();
    668   }
    669 
    670   @GwtIncompatible("SerializableTester")
    671   public void testIsNull_serialization() {
    672     Predicate<String> pre = Predicates.isNull();
    673     Predicate<String> post = SerializableTester.reserializeAndAssert(pre);
    674     assertEquals(pre.apply("foo"), post.apply("foo"));
    675     assertEquals(pre.apply(null), post.apply(null));
    676   }
    677 
    678   public void testNotNull_apply() {
    679     Predicate<Integer> notNull = Predicates.notNull();
    680     assertFalse(notNull.apply(null));
    681     assertTrue(notNull.apply(1));
    682   }
    683 
    684   public void testNotNull_equality() {
    685     new EqualsTester()
    686         .addEqualityGroup(Predicates.notNull(), Predicates.notNull())
    687         .addEqualityGroup(Predicates.isNull())
    688         .testEquals();
    689   }
    690 
    691   @GwtIncompatible("SerializableTester")
    692   public void testNotNull_serialization() {
    693     checkSerialization(Predicates.notNull());
    694   }
    695 
    696   public void testIn_apply() {
    697     Collection<Integer> nums = Arrays.asList(1, 5);
    698     Predicate<Integer> isOneOrFive = Predicates.in(nums);
    699 
    700     assertTrue(isOneOrFive.apply(1));
    701     assertTrue(isOneOrFive.apply(5));
    702     assertFalse(isOneOrFive.apply(3));
    703     assertFalse(isOneOrFive.apply(null));
    704   }
    705 
    706   public void testIn_equality() {
    707     Collection<Integer> nums = ImmutableSet.of(1, 5);
    708     Collection<Integer> sameOrder = ImmutableSet.of(1, 5);
    709     Collection<Integer> differentOrder = ImmutableSet.of(5, 1);
    710     Collection<Integer> differentNums = ImmutableSet.of(1, 3, 5);
    711 
    712     new EqualsTester()
    713         .addEqualityGroup(Predicates.in(nums), Predicates.in(nums),
    714             Predicates.in(sameOrder), Predicates.in(differentOrder))
    715         .addEqualityGroup(Predicates.in(differentNums))
    716         .testEquals();
    717   }
    718 
    719   @GwtIncompatible("SerializableTester")
    720   public void testIn_serialization() {
    721     checkSerialization(Predicates.in(Arrays.asList(1, 2, 3, null)));
    722   }
    723 
    724   public void testIn_handlesNullPointerException() {
    725     class CollectionThatThrowsNPE<T> extends ArrayList<T> {
    726       private static final long serialVersionUID = 1L;
    727 
    728       @Override public boolean contains(Object element) {
    729         Preconditions.checkNotNull(element);
    730         return super.contains(element);
    731       }
    732     }
    733     Collection<Integer> nums = new CollectionThatThrowsNPE<Integer>();
    734     Predicate<Integer> isFalse = Predicates.in(nums);
    735     assertFalse(isFalse.apply(null));
    736   }
    737 
    738   public void testIn_handlesClassCastException() {
    739     class CollectionThatThrowsCCE<T> extends ArrayList<T> {
    740       private static final long serialVersionUID = 1L;
    741 
    742       @Override public boolean contains(Object element) {
    743         throw new ClassCastException("");
    744       }
    745     }
    746     Collection<Integer> nums = new CollectionThatThrowsCCE<Integer>();
    747     nums.add(3);
    748     Predicate<Integer> isThree = Predicates.in(nums);
    749     assertFalse(isThree.apply(3));
    750   }
    751 
    752   /*
    753    * Tests that compilation will work when applying explicit types.
    754    */
    755   @SuppressWarnings("unused")
    756   public void testIn_compilesWithExplicitSupertype() {
    757     Collection<Number> nums = ImmutableSet.of();
    758     Predicate<Number> p1 = Predicates.in(nums);
    759     Predicate<Object> p2 = Predicates.<Object>in(nums);
    760     // The next two lines are not expected to compile.
    761     // Predicate<Integer> p3 = Predicates.in(nums);
    762     // Predicate<Integer> p4 = Predicates.<Integer>in(nums);
    763   }
    764 
    765   @GwtIncompatible("NullPointerTester")
    766   public void testNullPointerExceptions() throws Exception {
    767     NullPointerTester tester = new NullPointerTester();
    768     tester.testAllPublicStaticMethods(Predicates.class);
    769   }
    770 
    771   @SuppressWarnings("unchecked") // varargs
    772   @GwtIncompatible("SerializbleTester")
    773   public void testCascadingSerialization() throws Exception {
    774     // Eclipse says Predicate<Integer>; javac says Predicate<Object>.
    775     Predicate<? super Integer> nasty = Predicates.not(Predicates.and(
    776         Predicates.or(
    777             Predicates.equalTo((Object) 1), Predicates.equalTo(null),
    778             Predicates.alwaysFalse(), Predicates.alwaysTrue(),
    779             Predicates.isNull(), Predicates.notNull(),
    780             Predicates.in(Arrays.asList(1)))));
    781     assertEvalsToFalse(nasty);
    782 
    783     Predicate<? super Integer> stillNasty =
    784         SerializableTester.reserializeAndAssert(nasty);
    785 
    786     assertEvalsToFalse(stillNasty);
    787   }
    788 
    789   // enum singleton pattern
    790   private enum TrimStringFunction implements Function<String, String> {
    791     INSTANCE;
    792 
    793     @Override
    794     public String apply(String string) {
    795       return WHITESPACE.trimFrom(string);
    796     }
    797   }
    798 
    799   public void testCompose() {
    800     Function<String, String> trim = TrimStringFunction.INSTANCE;
    801     Predicate<String> equalsFoo = Predicates.equalTo("Foo");
    802     Predicate<String> equalsBar = Predicates.equalTo("Bar");
    803     Predicate<String> trimEqualsFoo = Predicates.compose(equalsFoo, trim);
    804     Function<String, String> identity = Functions.identity();
    805 
    806     assertTrue(trimEqualsFoo.apply("Foo"));
    807     assertTrue(trimEqualsFoo.apply("   Foo   "));
    808     assertFalse(trimEqualsFoo.apply("Foo-b-que"));
    809 
    810     new EqualsTester()
    811         .addEqualityGroup(trimEqualsFoo, Predicates.compose(equalsFoo, trim))
    812         .addEqualityGroup(equalsFoo)
    813         .addEqualityGroup(trim)
    814         .addEqualityGroup(Predicates.compose(equalsFoo, identity))
    815         .addEqualityGroup(Predicates.compose(equalsBar, trim))
    816         .testEquals();
    817   }
    818 
    819   @GwtIncompatible("SerializableTester")
    820   public void testComposeSerialization() {
    821     Function<String, String> trim = TrimStringFunction.INSTANCE;
    822     Predicate<String> equalsFoo = Predicates.equalTo("Foo");
    823     Predicate<String> trimEqualsFoo = Predicates.compose(equalsFoo, trim);
    824     SerializableTester.reserializeAndAssert(trimEqualsFoo);
    825   }
    826 
    827   /**
    828    * Tests for Predicates.contains(Pattern) and .containsPattern(String).
    829    * We assume the regex level works, so there are only trivial tests of that
    830    * aspect.
    831    * TODO: Fix comment style once annotation stripper is fixed.
    832    */
    833 
    834   @GwtIncompatible("Predicates.containsPattern")
    835   public void testContainsPattern_apply() {
    836     Predicate<CharSequence> isFoobar =
    837         Predicates.containsPattern("^Fo.*o.*bar$");
    838     assertTrue(isFoobar.apply("Foxyzoabcbar"));
    839     assertFalse(isFoobar.apply("Foobarx"));
    840   }
    841 
    842   @GwtIncompatible("Predicates.containsPattern")
    843   public void testContains_apply() {
    844     Predicate<CharSequence> isFoobar =
    845         Predicates.contains(Pattern.compile("^Fo.*o.*bar$"));
    846 
    847     assertTrue(isFoobar.apply("Foxyzoabcbar"));
    848     assertFalse(isFoobar.apply("Foobarx"));
    849   }
    850 
    851   @GwtIncompatible("NullPointerTester")
    852   public void testContainsPattern_nulls() throws Exception {
    853     NullPointerTester tester = new NullPointerTester();
    854     Predicate<CharSequence> isWooString = Predicates.containsPattern("Woo");
    855 
    856     tester.testAllPublicInstanceMethods(isWooString);
    857   }
    858 
    859   @GwtIncompatible("NullPointerTester")
    860   public void testContains_nulls() throws Exception {
    861     NullPointerTester tester = new NullPointerTester();
    862     Predicate<CharSequence> isWooPattern =
    863         Predicates.contains(Pattern.compile("Woo"));
    864 
    865     tester.testAllPublicInstanceMethods(isWooPattern);
    866   }
    867 
    868   @GwtIncompatible("SerializableTester")
    869   public void testContainsPattern_serialization() {
    870     Predicate<CharSequence> pre = Predicates.containsPattern("foo");
    871     Predicate<CharSequence> post = SerializableTester.reserializeAndAssert(pre);
    872     assertEquals(pre.apply("foo"), post.apply("foo"));
    873   }
    874 
    875   @GwtIncompatible("java.util.regex.Pattern")
    876   public void testContains_equals() {
    877     new EqualsTester()
    878         .addEqualityGroup(
    879             Predicates.contains(Pattern.compile("foo")),
    880             Predicates.containsPattern("foo"))
    881         .addEqualityGroup(
    882             Predicates.contains(
    883                 Pattern.compile("foo", Pattern.CASE_INSENSITIVE)))
    884         .addEqualityGroup(
    885             Predicates.containsPattern("bar"))
    886         .testEquals();
    887       }
    888 
    889   public void assertEqualHashCode(
    890       Predicate<? super Integer> expected, Predicate<? super Integer> actual) {
    891     assertEquals(actual.toString() + " should hash like " + expected.toString(),
    892         expected.hashCode(), actual.hashCode());
    893   }
    894 
    895   public void testHashCodeForBooleanOperations() {
    896     Predicate<Integer> p1 = Predicates.isNull();
    897     Predicate<Integer> p2 = isOdd();
    898 
    899     // Make sure that hash codes are not computed per-instance.
    900     assertEqualHashCode(
    901         Predicates.not(p1),
    902         Predicates.not(p1));
    903 
    904     assertEqualHashCode(
    905         Predicates.and(p1, p2),
    906         Predicates.and(p1, p2));
    907 
    908     assertEqualHashCode(
    909         Predicates.or(p1, p2),
    910         Predicates.or(p1, p2));
    911 
    912     // While not a contractual requirement, we'd like the hash codes for ands
    913     // & ors of the same predicates to not collide.
    914     assertTrue(Predicates.and(p1, p2).hashCode() != Predicates.or(p1, p2).hashCode());
    915   }
    916 
    917   private static void assertEvalsToTrue(Predicate<? super Integer> predicate) {
    918     assertTrue(predicate.apply(0));
    919     assertTrue(predicate.apply(1));
    920     assertTrue(predicate.apply(null));
    921   }
    922 
    923   private static void assertEvalsToFalse(Predicate<? super Integer> predicate) {
    924     assertFalse(predicate.apply(0));
    925     assertFalse(predicate.apply(1));
    926     assertFalse(predicate.apply(null));
    927   }
    928 
    929   private static void assertEvalsLikeOdd(Predicate<? super Integer> predicate) {
    930     assertEvalsLike(isOdd(), predicate);
    931   }
    932 
    933   private static void assertEvalsLike(
    934       Predicate<? super Integer> expected,
    935       Predicate<? super Integer> actual) {
    936     assertEvalsLike(expected, actual, 0);
    937     assertEvalsLike(expected, actual, 1);
    938     assertEvalsLike(expected, actual, null);
    939   }
    940 
    941   private static <T> void assertEvalsLike(
    942       Predicate<? super T> expected,
    943       Predicate<? super T> actual,
    944       T input) {
    945     Boolean expectedResult = null;
    946     RuntimeException expectedRuntimeException = null;
    947     try {
    948       expectedResult = expected.apply(input);
    949     } catch (RuntimeException e) {
    950       expectedRuntimeException = e;
    951     }
    952 
    953     Boolean actualResult = null;
    954     RuntimeException actualRuntimeException = null;
    955     try {
    956       actualResult = actual.apply(input);
    957     } catch (RuntimeException e) {
    958       actualRuntimeException = e;
    959     }
    960 
    961     assertEquals(expectedResult, actualResult);
    962     if (expectedRuntimeException != null) {
    963       assertNotNull(actualRuntimeException);
    964       assertEquals(
    965           expectedRuntimeException.getClass(),
    966           actualRuntimeException.getClass());
    967     }
    968   }
    969 
    970   @GwtIncompatible("SerializableTester")
    971   private static void checkSerialization(Predicate<? super Integer> predicate) {
    972     Predicate<? super Integer> reserialized =
    973         SerializableTester.reserializeAndAssert(predicate);
    974     assertEvalsLike(predicate, reserialized);
    975   }
    976 }
    977