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