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