1/*
2 * Copyright (C) 2010 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * diOBJECTibuted under the License is diOBJECTibuted on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.common.base;
18
19import com.google.common.annotations.GwtCompatible;
20import com.google.common.annotations.GwtIncompatible;
21import com.google.common.collect.ImmutableList;
22import com.google.common.testing.EqualsTester;
23import com.google.common.testing.EquivalenceTester;
24import com.google.common.testing.SerializableTester;
25
26import junit.framework.TestCase;
27
28/**
29 * Unit test for {@link Equivalence}.
30 *
31 * @author Jige Yu
32 */
33@GwtCompatible(emulated = true)
34public class EquivalenceTest extends TestCase {
35
36  @SuppressWarnings("unchecked") // Iterable<String>...
37  public void testPairwiseEquivalent() {
38    EquivalenceTester.of(Equivalences.equals().<String>pairwise())
39        .addEquivalenceGroup(ImmutableList.<String>of())
40        .addEquivalenceGroup(ImmutableList.of("a"))
41        .addEquivalenceGroup(ImmutableList.of("b"))
42        .addEquivalenceGroup(ImmutableList.of("a", "b"), ImmutableList.of("a", "b"))
43        .test();
44  }
45
46  public void testPairwiseEquivalent_equals() {
47    new EqualsTester()
48        .addEqualityGroup(Equivalences.equals().pairwise(), Equivalences.equals().pairwise())
49        .addEqualityGroup(Equivalences.identity().pairwise())
50        .testEquals();
51  }
52
53  private enum LengthFunction implements Function<String, Integer> {
54    INSTANCE;
55
56    @Override public Integer apply(String input) {
57      return input.length();
58    }
59  }
60
61  private static final Equivalence<String> LENGTH_EQUIVALENCE = Equivalences.equals()
62      .onResultOf(LengthFunction.INSTANCE);
63
64  public void testWrap() {
65    new EqualsTester()
66        .addEqualityGroup(
67            LENGTH_EQUIVALENCE.wrap("hello"),
68            LENGTH_EQUIVALENCE.wrap("hello"),
69            LENGTH_EQUIVALENCE.wrap("world"))
70        .addEqualityGroup(
71            LENGTH_EQUIVALENCE.wrap("hi"),
72            LENGTH_EQUIVALENCE.wrap("yo"))
73        .addEqualityGroup(
74            LENGTH_EQUIVALENCE.wrap(null),
75            LENGTH_EQUIVALENCE.wrap(null))
76        .addEqualityGroup(Equivalences.equals().wrap("hello"))
77        .addEqualityGroup(Equivalences.equals().wrap(null))
78        .testEquals();
79  }
80
81  @GwtIncompatible("SerializableTester")
82  public void testWrapSerialization() {
83    SerializableTester.reserializeAndAssert(LENGTH_EQUIVALENCE.wrap("hello"));
84  }
85
86  private static class IntValue {
87    private final int value;
88
89    IntValue(int value) {
90      this.value = value;
91    }
92
93    @Override public String toString() {
94      return "value = " + value;
95    }
96  }
97
98  public void testOnResultOf() {
99    EquivalenceTester.of(Equivalences.equals().onResultOf(Functions.toStringFunction()))
100        .addEquivalenceGroup(new IntValue(1), new IntValue(1))
101        .addEquivalenceGroup(new IntValue(2))
102        .test();
103  }
104
105  public void testOnResultOf_equals() {
106    new EqualsTester()
107        .addEqualityGroup(
108            Equivalences.identity().onResultOf(Functions.toStringFunction()),
109            Equivalences.identity().onResultOf(Functions.toStringFunction()))
110        .addEqualityGroup(Equivalences.equals().onResultOf(Functions.toStringFunction()))
111        .addEqualityGroup(Equivalences.identity().onResultOf(Functions.identity()))
112        .testEquals();
113  }
114
115  public void testEquivalentTo() {
116    Predicate<Object> equalTo1 = Equivalences.equals().equivalentTo("1");
117    assertTrue(equalTo1.apply("1"));
118    assertFalse(equalTo1.apply("2"));
119    assertFalse(equalTo1.apply(null));
120    Predicate<Object> isNull = Equivalences.equals().equivalentTo(null);
121    assertFalse(isNull.apply("1"));
122    assertFalse(isNull.apply("2"));
123    assertTrue(isNull.apply(null));
124
125    new EqualsTester()
126        .addEqualityGroup(equalTo1, Equivalences.equals().equivalentTo("1"))
127        .addEqualityGroup(isNull)
128        .addEqualityGroup(Equivalences.identity().equivalentTo("1"))
129        .testEquals();
130  }
131}
132