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 com.google.common.annotations.GwtCompatible;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableMap;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Maps;
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.testing.ClassSanityTester;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.EqualsTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
280888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link Functions}.
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Vlad Patryshev
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class FunctionsTest extends TestCase {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIdentity_same() {
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, String> identity = Functions.identity();
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(identity.apply(null));
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame("foo", identity.apply("foo"));
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIdentity_notSame() {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Long, Long> identity = Functions.identity();
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNotSame(new Long(135135L), identity.apply(new Long(135135L)));
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIdentitySerializable() {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkCanReserializeSingleton(Functions.identity());
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToStringFunction_apply() {
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("3", Functions.toStringFunction().apply(3));
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("hiya", Functions.toStringFunction().apply("hiya"));
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("I'm a string",
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.toStringFunction().apply(
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            new Object() {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @Override public String toString() {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                return "I'm a string";
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }));
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Functions.toStringFunction().apply(null);
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // expected
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToStringFunctionSerializable() {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkCanReserializeSingleton(Functions.toStringFunction());
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
827dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNullPointerExceptions() {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(Functions.class);
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForMapWithoutDefault() {
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map = Maps.newHashMap();
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("One", 1);
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("Three", 3);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("Null", null);
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, Integer> function = Functions.forMap(map);
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, function.apply("One").intValue());
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, function.apply("Three").intValue());
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(function.apply("Null"));
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      function.apply("Two");
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(function, Functions.forMap(map))
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forMap(map, 42))
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForMapWithoutDefaultSerializable() {
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkCanReserialize(Functions.forMap(ImmutableMap.of(1, 2)));
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForMapWithDefault() {
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map = Maps.newHashMap();
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("One", 1);
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("Three", 3);
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("Null", null);
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, Integer> function = Functions.forMap(map, 42);
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, function.apply("One").intValue());
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(42, function.apply("Two").intValue());
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, function.apply("Three").intValue());
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(function.apply("Null"));
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(function, Functions.forMap(map, 42))
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forMap(map))
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forMap(map, null))
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forMap(map, 43))
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForMapWithDefault_includeSerializable() {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map = Maps.newHashMap();
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("One", 1);
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("Three", 3);
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, Integer> function = Functions.forMap(map, 42);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, function.apply("One").intValue());
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(42, function.apply("Two").intValue());
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, function.apply("Three").intValue());
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            function,
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Functions.forMap(map, 42),
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SerializableTester.reserialize(function))
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forMap(map))
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forMap(map, null))
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forMap(map, 43))
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForMapWithDefaultSerializable() {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkCanReserialize(Functions.forMap(ImmutableMap.of(1, 2), 3));
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForMapWithDefault_null() {
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMap<String, Integer> map = ImmutableMap.of("One", 1);
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, Integer> function = Functions.forMap(map, null);
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Integer) 1, function.apply("One"));
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(function.apply("Two"));
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // check basic sanity of equals and hashCode
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(function)
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forMap(map, 1))
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForMapWithDefault_null_compareWithSerializable() {
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMap<String, Integer> map = ImmutableMap.of("One", 1);
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, Integer> function = Functions.forMap(map, null);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Integer) 1, function.apply("One"));
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(function.apply("Two"));
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // check basic sanity of equals and hashCode
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(function, SerializableTester.reserialize(function))
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forMap(map, 1))
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForMapWildCardWithDefault() {
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map = Maps.newHashMap();
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("One", 1);
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("Three", 3);
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Number number = Double.valueOf(42);
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, Number> function = Functions.forMap(map, number);
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, function.apply("One").intValue());
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(number, function.apply("Two"));
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3L, function.apply("Three").longValue());
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testComposition() {
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> mJapaneseToInteger = Maps.newHashMap();
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mJapaneseToInteger.put("Ichi", 1);
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mJapaneseToInteger.put("Ni", 2);
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mJapaneseToInteger.put("San", 3);
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, Integer> japaneseToInteger =
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.forMap(mJapaneseToInteger);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Integer, String> mIntegerToSpanish = Maps.newHashMap();
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mIntegerToSpanish.put(1, "Uno");
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mIntegerToSpanish.put(3, "Tres");
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mIntegerToSpanish.put(4, "Cuatro");
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Integer, String> integerToSpanish =
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.forMap(mIntegerToSpanish);
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, String> japaneseToSpanish =
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.compose(integerToSpanish, japaneseToInteger);
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("Uno", japaneseToSpanish.apply("Ichi"));
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      japaneseToSpanish.apply("Ni");
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException e) {
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("Tres", japaneseToSpanish.apply("San"));
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      japaneseToSpanish.apply("Shi");
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException e) {
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            japaneseToSpanish,
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Functions.compose(integerToSpanish, japaneseToInteger))
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(japaneseToInteger)
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(integerToSpanish)
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Functions.compose(japaneseToInteger, integerToSpanish))
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testComposition_includeReserializabled() {
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> mJapaneseToInteger = Maps.newHashMap();
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mJapaneseToInteger.put("Ichi", 1);
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mJapaneseToInteger.put("Ni", 2);
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mJapaneseToInteger.put("San", 3);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, Integer> japaneseToInteger =
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.forMap(mJapaneseToInteger);
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Integer, String> mIntegerToSpanish = Maps.newHashMap();
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mIntegerToSpanish.put(1, "Uno");
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mIntegerToSpanish.put(3, "Tres");
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    mIntegerToSpanish.put(4, "Cuatro");
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Integer, String> integerToSpanish =
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.forMap(mIntegerToSpanish);
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, String> japaneseToSpanish =
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.compose(integerToSpanish, japaneseToInteger);
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            japaneseToSpanish,
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Functions.compose(integerToSpanish, japaneseToInteger),
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SerializableTester.reserialize(japaneseToSpanish))
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(japaneseToInteger)
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(integerToSpanish)
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Functions.compose(japaneseToInteger, integerToSpanish))
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCompositionWildcard() {
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> mapJapaneseToInteger = Maps.newHashMap();
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, Integer> japaneseToInteger =
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.forMap(mapJapaneseToInteger);
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Object, String> numberToSpanish = Functions.constant("Yo no se");
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<String, String> japaneseToSpanish =
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.compose(numberToSpanish, japaneseToInteger);
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class HashCodeFunction implements Function<Object, Integer> {
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Integer apply(Object o) {
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (o == null) ? 0 : o.hashCode();
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testComposeOfFunctionsIsAssociative() {
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Float, String> m = ImmutableMap.of(
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        4.0f, "A", 3.0f, "B", 2.0f, "C", 1.0f, "D");
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<? super Integer, Boolean> h = Functions.constant(Boolean.TRUE);
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<? super String, Integer> g = new HashCodeFunction();
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Float, String> f = Functions.forMap(m, "F");
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Float, Boolean> c1 = Functions.compose(Functions.compose(h, g), f);
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Float, Boolean> c2 = Functions.compose(h, Functions.compose(g, f));
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Might be nice (eventually) to have:
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     assertEquals(c1, c2);
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // But for now, settle for this:
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c1.hashCode(), c2.hashCode());
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c1.apply(1.0f), c2.apply(1.0f));
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c1.apply(5.0f), c2.apply(5.0f));
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testComposeOfPredicateAndFunctionIsAssociative() {
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Float, String> m = ImmutableMap.of(
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        4.0f, "A", 3.0f, "B", 2.0f, "C", 1.0f, "D");
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<? super Integer> h = Predicates.equalTo(42);
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<? super String, Integer> g = new HashCodeFunction();
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Float, String> f = Functions.forMap(m, "F");
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Float> p1 = Predicates.compose(Predicates.compose(h, g), f);
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<Float> p2 = Predicates.compose(h, Functions.compose(g, f));
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Might be nice (eventually) to have:
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    //     assertEquals(p1, p2);
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // But for now, settle for this:
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(p1.hashCode(), p2.hashCode());
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(p1.apply(1.0f), p2.apply(1.0f));
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(p1.apply(5.0f), p2.apply(5.0f));
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForPredicate() {
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Object, Boolean> alwaysTrue =
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.forPredicate(Predicates.alwaysTrue());
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Object, Boolean> alwaysFalse =
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Functions.forPredicate(Predicates.alwaysFalse());
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(alwaysTrue.apply(0));
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(alwaysFalse.apply(0));
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            alwaysTrue, Functions.forPredicate(Predicates.alwaysTrue()))
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(alwaysFalse)
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.identity())
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForPredicateSerializable() {
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkCanReserialize(Functions.forPredicate(Predicates.equalTo(5)));
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConstant() {
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Object, Object> f = Functions.<Object>constant("correct");
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("correct", f.apply(new Object()));
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("correct", f.apply(null));
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Object, String> g = Functions.constant(null);
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(null, g.apply(2));
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(null, g.apply(null));
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(f, Functions.constant("correct"))
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.constant("incorrect"))
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.toStringFunction())
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(g)
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(g, Functions.constant(null))
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.constant("incorrect"))
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.toStringFunction())
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(f)
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConstantSerializable() {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkCanReserialize(Functions.constant(5));
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class CountingSupplier
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements Supplier<Integer>, Serializable {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 0;
3897dd252788645e940eada959bdde927426e2531c9Paul Duffin
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private int value;
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Integer get() {
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ++value;
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3967dd252788645e940eada959bdde927426e2531c9Paul Duffin
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public boolean equals(Object obj) {
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (obj instanceof CountingSupplier) {
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return this.value == ((CountingSupplier) obj).value;
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4047dd252788645e940eada959bdde927426e2531c9Paul Duffin
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public int hashCode() {
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return value;
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForSupplier() {
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Supplier<Integer> supplier = new CountingSupplier();
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<Object, Integer> function = Functions.forSupplier(supplier);
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) function.apply(null));
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, (int) function.apply("foo"));
4177dd252788645e940eada959bdde927426e2531c9Paul Duffin
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(function, Functions.forSupplier(supplier))
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forSupplier(new CountingSupplier()))
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.forSupplier(Suppliers.ofInstance(12)))
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(Functions.toStringFunction())
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForSupplierSerializable() {
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkCanReserialize(Functions.forSupplier(new CountingSupplier()));
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4317dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("reflection")
4327dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNulls() throws Exception {
4337dd252788645e940eada959bdde927426e2531c9Paul Duffin    new ClassSanityTester().forAllPublicStaticMethods(Functions.class).testNulls();
4347dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
4357dd252788645e940eada959bdde927426e2531c9Paul Duffin
4367dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("reflection")
4377dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testEqualsAndSerializable() throws Exception {
4387dd252788645e940eada959bdde927426e2531c9Paul Duffin    new ClassSanityTester().forAllPublicStaticMethods(Functions.class).testEqualsAndSerializable();
4397dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
4407dd252788645e940eada959bdde927426e2531c9Paul Duffin
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4427dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static <Y> void checkCanReserialize(Function<? super Integer, Y> f) {
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<? super Integer, Y> g = SerializableTester.reserializeAndAssert(f);
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 1; i < 5; i++) {
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // convoluted way to check that the same result happens from each
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Y expected = null;
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        expected = f.apply(i);
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException e) {
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          g.apply(i);
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail();
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (IllegalArgumentException ok) {
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          continue;
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expected, g.apply(i));
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4627dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static <Y> void checkCanReserializeSingleton(Function<? super String, Y> f) {
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Function<? super String, Y> g = SerializableTester.reserializeAndAssert(f);
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(f, g);
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Integer i = 1; i < 5; i++) {
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(f.apply(i.toString()), g.apply(i.toString()));
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
471