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