11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2005 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.base;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.CharMatcher.WHITESPACE;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableSet;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.EqualsTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.regex.Pattern;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link Predicates}.
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class PredicatesTest extends TestCase {
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Predicate<Integer> TRUE = Predicates.alwaysTrue();
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Predicate<Integer> FALSE = Predicates.alwaysFalse();
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Predicate<Integer> NEVER_REACHED =
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new Predicate<Integer>() {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public boolean apply(Integer i) {
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("This predicate should never have been evaluated");
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  };
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** Instantiable predicate with reasonable hashCode() and equals() methods. */
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static class IsOdd implements Predicate<Integer>, Serializable {
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 0x150ddL;
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public boolean apply(Integer i) {
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (i.intValue() & 1) == 1;
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public int hashCode() {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 0x150dd;
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(Object obj) {
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return obj instanceof IsOdd;
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public String toString() {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "IsOdd";
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Generates a new Predicate per call.
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Creating a new Predicate each time helps catch cases where code is
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * using {@code x == y} instead of {@code x.equals(y)}.
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static IsOdd isOdd() {
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new IsOdd();
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests for Predicates.alwaysTrue().
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAlwaysTrue_apply() {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(Predicates.alwaysTrue());
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAlwaysTrue_equality() throws Exception {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(TRUE, Predicates.alwaysTrue())
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(isOdd())
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.alwaysFalse())
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAlwaysTrue_serialization() {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.alwaysTrue());
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests for Predicates.alwaysFalse().
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAlwaysFalse_apply() throws Exception {
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(Predicates.alwaysFalse());
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAlwaysFalse_equality() throws Exception {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(FALSE, Predicates.alwaysFalse())
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(isOdd())
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.alwaysTrue())
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAlwaysFalse_serialization() {
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.alwaysFalse());
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests for Predicates.not(predicate).
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNot_apply() {
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(Predicates.not(FALSE));
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(Predicates.not(TRUE));
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.not(Predicates.not(isOdd())));
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNot_equality() {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.not(isOdd()), Predicates.not(isOdd()))
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.not(TRUE))
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(isOdd())
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNot_equalityForNotOfKnownValues() {
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(TRUE, Predicates.alwaysTrue())
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(FALSE)
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.not(TRUE))
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(FALSE, Predicates.alwaysFalse())
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(TRUE)
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.not(FALSE))
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.isNull(), Predicates.isNull())
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.notNull())
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.not(Predicates.isNull()))
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.notNull(), Predicates.notNull())
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.isNull())
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.not(Predicates.notNull()))
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNot_serialization() {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.not(isOdd()));
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests for all the different flavors of Predicates.and().
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_applyNoArgs() {
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(Predicates.and());
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_equalityNoArgs() {
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(), Predicates.and())
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(FALSE))
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or())
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_serializationNoArgs() {
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.and());
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_applyOneArg() {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.and(isOdd()));
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_equalityOneArg() {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object[] notEqualObjects = {Predicates.and(NEVER_REACHED, FALSE)};
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.and(NEVER_REACHED), Predicates.and(NEVER_REACHED))
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(notEqualObjects)
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(isOdd()))
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and())
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(NEVER_REACHED))
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_serializationOneArg() {
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.and(isOdd()));
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_applyBinary() {
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.and(isOdd(), TRUE));
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.and(TRUE, isOdd()));
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(Predicates.and(FALSE, NEVER_REACHED));
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_equalityBinary() {
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.and(TRUE, NEVER_REACHED),
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.and(TRUE, NEVER_REACHED))
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(NEVER_REACHED, TRUE))
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(TRUE))
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(TRUE, NEVER_REACHED))
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_serializationBinary() {
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.and(TRUE, isOdd()));
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_applyTernary() {
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.and(isOdd(), TRUE, TRUE));
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.and(TRUE, isOdd(), TRUE));
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.and(TRUE, TRUE, isOdd()));
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(Predicates.and(TRUE, FALSE, NEVER_REACHED));
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_equalityTernary() {
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.and(TRUE, isOdd(), NEVER_REACHED),
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.and(TRUE, isOdd(), NEVER_REACHED))
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(isOdd(), NEVER_REACHED, TRUE))
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(TRUE))
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(TRUE, isOdd(), NEVER_REACHED))
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_serializationTernary() {
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.and(TRUE, isOdd(), FALSE));
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_applyIterable() {
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Predicate<Integer>> empty = Arrays.asList();
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(Predicates.and(empty));
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.and(Arrays.asList(isOdd())));
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.and(Arrays.asList(TRUE, isOdd())));
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(Predicates.and(Arrays.asList(FALSE, NEVER_REACHED)));
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_equalityIterable() {
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.and(Arrays.asList(TRUE, NEVER_REACHED)),
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.and(Arrays.asList(TRUE, NEVER_REACHED)),
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.and(TRUE, NEVER_REACHED))
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(FALSE, NEVER_REACHED))
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(TRUE, NEVER_REACHED))
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_serializationIterable() {
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.and(Arrays.asList(TRUE, FALSE)));
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_arrayDefensivelyCopied() {
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate[] array = {Predicates.alwaysFalse()};
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> predicate = Predicates.and(array);
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[0] = Predicates.alwaysTrue();
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_listDefensivelyCopied() {
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List list = new ArrayList<Predicate>();
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> predicate = Predicates.and(list);
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(predicate.apply(1));
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add(Predicates.alwaysFalse());
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(predicate.apply(1));
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnd_iterableDefensivelyCopied() {
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final List list = new ArrayList<Predicate>();
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable iterable = new Iterable<Predicate>() {
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<Predicate> iterator() {
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return list.iterator();
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> predicate = Predicates.and(iterable);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(predicate.apply(1));
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add(Predicates.alwaysFalse());
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(predicate.apply(1));
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests for all the different flavors of Predicates.or().
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_applyNoArgs() {
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(Predicates.or());
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_equalityNoArgs() {
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(), Predicates.or())
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(TRUE))
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and())
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_serializationNoArgs() {
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.or());
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_applyOneArg() {
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(Predicates.or(TRUE));
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(Predicates.or(FALSE));
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_equalityOneArg() {
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.or(NEVER_REACHED), Predicates.or(NEVER_REACHED))
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(NEVER_REACHED, TRUE))
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(TRUE))
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or())
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(NEVER_REACHED))
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_serializationOneArg() {
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.or(isOdd()));
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_applyBinary() {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> falseOrFalse = Predicates.or(FALSE, FALSE);
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> falseOrTrue = Predicates.or(FALSE, TRUE);
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> trueOrAnything = Predicates.or(TRUE, NEVER_REACHED);
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(falseOrFalse);
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(falseOrTrue);
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(trueOrAnything);
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_equalityBinary() {
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.or(FALSE, NEVER_REACHED),
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.or(FALSE, NEVER_REACHED))
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(NEVER_REACHED, FALSE))
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(TRUE))
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(FALSE, NEVER_REACHED))
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_serializationBinary() {
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.or(isOdd(), TRUE));
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_applyTernary() {
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.or(isOdd(), FALSE, FALSE));
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.or(FALSE, isOdd(), FALSE));
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLikeOdd(Predicates.or(FALSE, FALSE, isOdd()));
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(Predicates.or(FALSE, TRUE, NEVER_REACHED));
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_equalityTernary() {
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.or(FALSE, NEVER_REACHED, TRUE),
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.or(FALSE, NEVER_REACHED, TRUE))
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(TRUE, NEVER_REACHED, FALSE))
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(TRUE))
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(FALSE, NEVER_REACHED, TRUE))
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_serializationTernary() {
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.or(FALSE, isOdd(), TRUE));
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_applyIterable() {
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> vacuouslyFalse =
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.or(Collections.<Predicate<Integer>>emptyList());
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> troo = Predicates.or(Collections.singletonList(TRUE));
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /*
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * newLinkedList() takes varargs. TRUE and FALSE are both instances of
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Predicate<Integer>, so the call is safe.
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> trueAndFalse = Predicates.or(Arrays.asList(TRUE, FALSE));
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(vacuouslyFalse);
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(troo);
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToTrue(trueAndFalse);
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_equalityIterable() {
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.or(Arrays.asList(FALSE, NEVER_REACHED)),
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.or(Arrays.asList(FALSE, NEVER_REACHED)),
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.or(FALSE, NEVER_REACHED))
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.or(TRUE, NEVER_REACHED))
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.and(FALSE, NEVER_REACHED))
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_serializationIterable() {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> pre = Predicates.or(Arrays.asList(TRUE, FALSE));
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> post = SerializableTester.reserializeAndAssert(pre);
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(pre.apply(0), post.apply(0));
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_arrayDefensivelyCopied() {
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate[] array = {Predicates.alwaysFalse()};
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> predicate = Predicates.or(array);
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[0] = Predicates.alwaysTrue();
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_listDefensivelyCopied() {
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List list = new ArrayList<Predicate>();
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> predicate = Predicates.or(list);
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add(Predicates.alwaysTrue());
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOr_iterableDefensivelyCopied() {
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final List list = new ArrayList<Predicate>();
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable iterable = new Iterable<Predicate>() {
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<Predicate> iterator() {
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return list.iterator();
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> predicate = Predicates.or(iterable);
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add(Predicates.alwaysTrue());
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests for Predicates.equalTo(x).
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEqualTo_apply() {
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> isOne = Predicates.equalTo(1);
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isOne.apply(1));
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isOne.apply(2));
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isOne.apply(null));
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEqualTo_equality() {
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.equalTo(1), Predicates.equalTo(1))
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.equalTo(2))
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.equalTo(null))
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEqualTo_serialization() {
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.equalTo(1));
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEqualToNull_apply() {
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> isNull = Predicates.equalTo(null);
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isNull.apply(null));
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isNull.apply(1));
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEqualToNull_equality() {
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.equalTo(null), Predicates.equalTo(null))
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.equalTo(1))
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.equalTo("null"))
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEqualToNull_serialization() {
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.equalTo(null));
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests for Predicates.instanceOf(x).
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * TODO: Fix the comment style after fixing annotation stripper to remove
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * comments properly.  Currently, all tests before the comments are removed
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * as well.
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.instanceOf")
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsInstanceOf_apply() {
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> isInteger = Predicates.instanceOf(Integer.class);
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isInteger.apply(1));
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isInteger.apply(2.0f));
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isInteger.apply(""));
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isInteger.apply(null));
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.instanceOf")
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsInstanceOf_subclass() {
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> isNumber = Predicates.instanceOf(Number.class);
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isNumber.apply(1));
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isNumber.apply(2.0f));
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isNumber.apply(""));
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isNumber.apply(null));
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.instanceOf")
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsInstanceOf_interface() {
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> isComparable = Predicates.instanceOf(Comparable.class);
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isComparable.apply(1));
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isComparable.apply(2.0f));
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isComparable.apply(""));
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isComparable.apply(null));
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.instanceOf")
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsInstanceOf_equality() {
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.instanceOf(Integer.class),
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.instanceOf(Integer.class))
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.instanceOf(Number.class))
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.instanceOf(Float.class))
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.instanceOf, SerializableTester")
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsInstanceOf_serialization() {
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.instanceOf(Integer.class));
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.assignableFrom")
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsAssignableFrom_apply() {
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Class<?>> isInteger = Predicates.assignableFrom(Integer.class);
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isInteger.apply(Integer.class));
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isInteger.apply(Float.class));
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      isInteger.apply(null);
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch(NullPointerException expected) {}
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.assignableFrom")
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsAssignableFrom_subclass() {
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Class<?>> isNumber = Predicates.assignableFrom(Number.class);
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isNumber.apply(Integer.class));
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isNumber.apply(Float.class));
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.assignableFrom")
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsAssignableFrom_interface() {
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Class<?>> isComparable =
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.assignableFrom(Comparable.class);
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isComparable.apply(Integer.class));
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isComparable.apply(Float.class));
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.assignableFrom")
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsAssignableFrom_equality() {
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.assignableFrom(Integer.class),
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.assignableFrom(Integer.class))
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.assignableFrom(Number.class))
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.assignableFrom(Float.class))
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.assignableFrom, SerializableTester")
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsAssignableFrom_serialization() {
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Class<?>> predicate =
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.assignableFrom(Integer.class);
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Class<?>> reserialized =
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SerializableTester.reserializeAndAssert(predicate);
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLike(predicate, reserialized, Integer.class);
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLike(predicate, reserialized, Float.class);
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLike(predicate, reserialized, null);
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests for Predicates.isNull()
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsNull_apply() {
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> isNull = Predicates.isNull();
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isNull.apply(null));
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isNull.apply(1));
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsNull_equality() {
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.isNull(), Predicates.isNull())
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.notNull())
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsNull_serialization() {
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> pre = Predicates.isNull();
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> post = SerializableTester.reserializeAndAssert(pre);
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(pre.apply("foo"), post.apply("foo"));
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(pre.apply(null), post.apply(null));
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNotNull_apply() {
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> notNull = Predicates.notNull();
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(notNull.apply(null));
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(notNull.apply(1));
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNotNull_equality() {
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.notNull(), Predicates.notNull())
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.isNull())
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNotNull_serialization() {
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.notNull());
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIn_apply() {
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> nums = Arrays.asList(1, 5);
6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> isOneOrFive = Predicates.in(nums);
6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isOneOrFive.apply(1));
7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isOneOrFive.apply(5));
7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isOneOrFive.apply(3));
7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isOneOrFive.apply(null));
7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIn_equality() {
7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> nums = ImmutableSet.of(1, 5);
7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> sameOrder = ImmutableSet.of(1, 5);
7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> differentOrder = ImmutableSet.of(5, 1);
7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> differentNums = ImmutableSet.of(1, 3, 5);
7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.in(nums), Predicates.in(nums),
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.in(sameOrder), Predicates.in(differentOrder))
7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.in(differentNums))
7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIn_serialization() {
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSerialization(Predicates.in(Arrays.asList(1, 2, 3, null)));
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIn_handlesNullPointerException() {
7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    class CollectionThatThrowsNPE<T> extends ArrayList<T> {
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private static final long serialVersionUID = 1L;
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public boolean contains(Object element) {
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Preconditions.checkNotNull(element);
7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return super.contains(element);
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> nums = new CollectionThatThrowsNPE<Integer>();
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> isFalse = Predicates.in(nums);
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isFalse.apply(null));
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIn_handlesClassCastException() {
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    class CollectionThatThrowsCCE<T> extends ArrayList<T> {
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private static final long serialVersionUID = 1L;
7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public boolean contains(Object element) {
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        throw new ClassCastException("");
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> nums = new CollectionThatThrowsCCE<Integer>();
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    nums.add(3);
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> isThree = Predicates.in(nums);
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isThree.apply(3));
7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests that compilation will work when applying explicit types.
7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unused")
7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIn_compilesWithExplicitSupertype() {
7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Number> nums = ImmutableSet.of();
7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Number> p1 = Predicates.in(nums);
7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Object> p2 = Predicates.<Object>in(nums);
7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // The next two lines are not expected to compile.
7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Predicate<Integer> p3 = Predicates.in(nums);
7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Predicate<Integer> p4 = Predicates.<Integer>in(nums);
7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointerExceptions() throws Exception {
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(Predicates.class);
7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializbleTester")
7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCascadingSerialization() throws Exception {
7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Eclipse says Predicate<Integer>; javac says Predicate<Object>.
7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<? super Integer> nasty = Predicates.not(Predicates.and(
7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.or(
7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.equalTo((Object) 1), Predicates.equalTo(null),
7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.alwaysFalse(), Predicates.alwaysTrue(),
7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.isNull(), Predicates.notNull(),
7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.in(Arrays.asList(1)))));
7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(nasty);
7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<? super Integer> stillNasty =
7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SerializableTester.reserializeAndAssert(nasty);
7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsToFalse(stillNasty);
7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // enum singleton pattern
7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private enum TrimStringFunction implements Function<String, String> {
7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    INSTANCE;
7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public String apply(String string) {
7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return WHITESPACE.trimFrom(string);
7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCompose() {
8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, String> trim = TrimStringFunction.INSTANCE;
8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> equalsFoo = Predicates.equalTo("Foo");
8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> equalsBar = Predicates.equalTo("Bar");
8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> trimEqualsFoo = Predicates.compose(equalsFoo, trim);
8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, String> identity = Functions.identity();
8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(trimEqualsFoo.apply("Foo"));
8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(trimEqualsFoo.apply("   Foo   "));
8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(trimEqualsFoo.apply("Foo-b-que"));
8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(trimEqualsFoo, Predicates.compose(equalsFoo, trim))
8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(equalsFoo)
8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(trim)
8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.compose(equalsFoo, identity))
8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Predicates.compose(equalsBar, trim))
8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testComposeSerialization() {
8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, String> trim = TrimStringFunction.INSTANCE;
8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> equalsFoo = Predicates.equalTo("Foo");
8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> trimEqualsFoo = Predicates.compose(equalsFoo, trim);
8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(trimEqualsFoo);
8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Tests for Predicates.contains(Pattern) and .containsPattern(String).
8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * We assume the regex level works, so there are only trivial tests of that
8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * aspect.
8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * TODO: Fix comment style once annotation stripper is fixed.
8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.containsPattern")
8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsPattern_apply() {
8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<CharSequence> isFoobar =
8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.containsPattern("^Fo.*o.*bar$");
8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isFoobar.apply("Foxyzoabcbar"));
8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isFoobar.apply("Foobarx"));
8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Predicates.containsPattern")
8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContains_apply() {
8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<CharSequence> isFoobar =
8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.contains(Pattern.compile("^Fo.*o.*bar$"));
8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(isFoobar.apply("Foxyzoabcbar"));
8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(isFoobar.apply("Foobarx"));
8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsPattern_nulls() throws Exception {
8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<CharSequence> isWooString = Predicates.containsPattern("Woo");
8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(isWooString);
8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContains_nulls() throws Exception {
8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<CharSequence> isWooPattern =
8631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.contains(Pattern.compile("Woo"));
8641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(isWooPattern);
8661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
8691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsPattern_serialization() {
8701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<CharSequence> pre = Predicates.containsPattern("foo");
8711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<CharSequence> post = SerializableTester.reserializeAndAssert(pre);
8721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(pre.apply("foo"), post.apply("foo"));
8731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("java.util.regex.Pattern")
8761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContains_equals() {
8771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
8781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
8791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.contains(Pattern.compile("foo")),
8801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.containsPattern("foo"))
8811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
8821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.contains(
8831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                Pattern.compile("foo", Pattern.CASE_INSENSITIVE)))
8841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
8851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Predicates.containsPattern("bar"))
8861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
8871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
8881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void assertEqualHashCode(
8901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Predicate<? super Integer> expected, Predicate<? super Integer> actual) {
8911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(actual.toString() + " should hash like " + expected.toString(),
8921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        expected.hashCode(), actual.hashCode());
8931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHashCodeForBooleanOperations() {
8961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> p1 = Predicates.isNull();
8971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Integer> p2 = isOdd();
8981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Make sure that hash codes are not computed per-instance.
9001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEqualHashCode(
9011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.not(p1),
9021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.not(p1));
9031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEqualHashCode(
9051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.and(p1, p2),
9061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.and(p1, p2));
9071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEqualHashCode(
9091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.or(p1, p2),
9101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.or(p1, p2));
9111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // While not a contractual requirement, we'd like the hash codes for ands
9131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // & ors of the same predicates to not collide.
9141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Predicates.and(p1, p2).hashCode() != Predicates.or(p1, p2).hashCode());
9151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertEvalsToTrue(Predicate<? super Integer> predicate) {
9181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(predicate.apply(0));
9191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(predicate.apply(1));
9201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(predicate.apply(null));
9211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertEvalsToFalse(Predicate<? super Integer> predicate) {
9241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(0));
9251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(1));
9261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(predicate.apply(null));
9271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertEvalsLikeOdd(Predicate<? super Integer> predicate) {
9301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLike(isOdd(), predicate);
9311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertEvalsLike(
9341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Predicate<? super Integer> expected,
9351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Predicate<? super Integer> actual) {
9361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLike(expected, actual, 0);
9371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLike(expected, actual, 1);
9381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLike(expected, actual, null);
9391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <T> void assertEvalsLike(
9421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Predicate<? super T> expected,
9431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Predicate<? super T> actual,
9441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      T input) {
9451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Boolean expectedResult = null;
9461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RuntimeException expectedRuntimeException = null;
9471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
9481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      expectedResult = expected.apply(input);
9491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (RuntimeException e) {
9501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      expectedRuntimeException = e;
9511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Boolean actualResult = null;
9541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RuntimeException actualRuntimeException = null;
9551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
9561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      actualResult = actual.apply(input);
9571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (RuntimeException e) {
9581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      actualRuntimeException = e;
9591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expectedResult, actualResult);
9621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (expectedRuntimeException != null) {
9631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertNotNull(actualRuntimeException);
9641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(
9651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          expectedRuntimeException.getClass(),
9661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          actualRuntimeException.getClass());
9671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
9711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void checkSerialization(Predicate<? super Integer> predicate) {
9721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<? super Integer> reserialized =
9731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SerializableTester.reserializeAndAssert(predicate);
9741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEvalsLike(predicate, reserialized);
9751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
977