258 lines
8.3 KiB
Java
258 lines
8.3 KiB
Java
/*
|
|
* Copyright (C) 2011 The Guava Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.google.common.testing;
|
|
|
|
import static com.google.common.base.Preconditions.checkState;
|
|
import static com.google.common.truth.Truth.assertThat;
|
|
|
|
import com.google.common.annotations.GwtCompatible;
|
|
import com.google.common.base.Equivalence;
|
|
import com.google.common.base.MoreObjects;
|
|
import com.google.common.collect.ImmutableMap;
|
|
import com.google.common.collect.ImmutableTable;
|
|
import junit.framework.AssertionFailedError;
|
|
import junit.framework.TestCase;
|
|
|
|
/**
|
|
* Tests for {@link EquivalenceTester}.
|
|
*
|
|
* @author Gregory Kick
|
|
*/
|
|
@GwtCompatible
|
|
public class EquivalenceTesterTest extends TestCase {
|
|
private EquivalenceTester<Object> tester;
|
|
private MockEquivalence equivalenceMock;
|
|
|
|
@Override
|
|
public void setUp() throws Exception {
|
|
super.setUp();
|
|
this.equivalenceMock = new MockEquivalence();
|
|
this.tester = EquivalenceTester.of(equivalenceMock);
|
|
}
|
|
|
|
/** Test null reference yields error */
|
|
public void testOf_NullPointerException() {
|
|
try {
|
|
EquivalenceTester.of(null);
|
|
fail("Should fail on null reference");
|
|
} catch (NullPointerException expected) {
|
|
}
|
|
}
|
|
|
|
public void testTest_NoData() {
|
|
tester.test();
|
|
}
|
|
|
|
public void testTest() {
|
|
Object group1Item1 = new TestObject(1, 1);
|
|
Object group1Item2 = new TestObject(1, 2);
|
|
Object group2Item1 = new TestObject(2, 1);
|
|
Object group2Item2 = new TestObject(2, 2);
|
|
|
|
equivalenceMock.expectEquivalent(group1Item1, group1Item2);
|
|
equivalenceMock.expectDistinct(group1Item1, group2Item1);
|
|
equivalenceMock.expectDistinct(group1Item1, group2Item2);
|
|
equivalenceMock.expectEquivalent(group1Item2, group1Item1);
|
|
equivalenceMock.expectDistinct(group1Item2, group2Item1);
|
|
equivalenceMock.expectDistinct(group1Item2, group2Item2);
|
|
equivalenceMock.expectDistinct(group2Item1, group1Item1);
|
|
equivalenceMock.expectDistinct(group2Item1, group1Item2);
|
|
equivalenceMock.expectEquivalent(group2Item1, group2Item2);
|
|
equivalenceMock.expectDistinct(group2Item2, group1Item1);
|
|
equivalenceMock.expectDistinct(group2Item2, group1Item2);
|
|
equivalenceMock.expectEquivalent(group2Item2, group2Item1);
|
|
|
|
equivalenceMock.expectHash(group1Item1, 1);
|
|
equivalenceMock.expectHash(group1Item2, 1);
|
|
equivalenceMock.expectHash(group2Item1, 2);
|
|
equivalenceMock.expectHash(group2Item2, 2);
|
|
|
|
equivalenceMock.replay();
|
|
|
|
tester
|
|
.addEquivalenceGroup(group1Item1, group1Item2)
|
|
.addEquivalenceGroup(group2Item1, group2Item2)
|
|
.test();
|
|
}
|
|
|
|
public void testTest_symmetric() {
|
|
Object group1Item1 = new TestObject(1, 1);
|
|
Object group1Item2 = new TestObject(1, 2);
|
|
|
|
equivalenceMock.expectEquivalent(group1Item1, group1Item2);
|
|
equivalenceMock.expectDistinct(group1Item2, group1Item1);
|
|
|
|
equivalenceMock.expectHash(group1Item1, 1);
|
|
equivalenceMock.expectHash(group1Item2, 1);
|
|
|
|
equivalenceMock.replay();
|
|
|
|
try {
|
|
tester.addEquivalenceGroup(group1Item1, group1Item2).test();
|
|
} catch (AssertionFailedError expected) {
|
|
assertThat(expected.getMessage())
|
|
.contains(
|
|
"TestObject{group=1, item=2} [group 1, item 2] must be equivalent to "
|
|
+ "TestObject{group=1, item=1} [group 1, item 1]");
|
|
return;
|
|
}
|
|
fail();
|
|
}
|
|
|
|
public void testTest_trasitive() {
|
|
Object group1Item1 = new TestObject(1, 1);
|
|
Object group1Item2 = new TestObject(1, 2);
|
|
Object group1Item3 = new TestObject(1, 3);
|
|
|
|
equivalenceMock.expectEquivalent(group1Item1, group1Item2);
|
|
equivalenceMock.expectEquivalent(group1Item1, group1Item3);
|
|
equivalenceMock.expectEquivalent(group1Item2, group1Item1);
|
|
equivalenceMock.expectDistinct(group1Item2, group1Item3);
|
|
equivalenceMock.expectEquivalent(group1Item3, group1Item1);
|
|
equivalenceMock.expectEquivalent(group1Item3, group1Item2);
|
|
|
|
equivalenceMock.expectHash(group1Item1, 1);
|
|
equivalenceMock.expectHash(group1Item2, 1);
|
|
equivalenceMock.expectHash(group1Item3, 1);
|
|
|
|
equivalenceMock.replay();
|
|
|
|
try {
|
|
tester.addEquivalenceGroup(group1Item1, group1Item2, group1Item3).test();
|
|
} catch (AssertionFailedError expected) {
|
|
assertThat(expected.getMessage())
|
|
.contains(
|
|
"TestObject{group=1, item=2} [group 1, item 2] must be equivalent to "
|
|
+ "TestObject{group=1, item=3} [group 1, item 3]");
|
|
return;
|
|
}
|
|
fail();
|
|
}
|
|
|
|
public void testTest_inequivalence() {
|
|
Object group1Item1 = new TestObject(1, 1);
|
|
Object group2Item1 = new TestObject(2, 1);
|
|
|
|
equivalenceMock.expectEquivalent(group1Item1, group2Item1);
|
|
equivalenceMock.expectDistinct(group2Item1, group1Item1);
|
|
|
|
equivalenceMock.expectHash(group1Item1, 1);
|
|
equivalenceMock.expectHash(group2Item1, 2);
|
|
|
|
equivalenceMock.replay();
|
|
|
|
try {
|
|
tester.addEquivalenceGroup(group1Item1).addEquivalenceGroup(group2Item1).test();
|
|
} catch (AssertionFailedError expected) {
|
|
assertThat(expected.getMessage())
|
|
.contains(
|
|
"TestObject{group=1, item=1} [group 1, item 1] must not be equivalent to "
|
|
+ "TestObject{group=2, item=1} [group 2, item 1]");
|
|
return;
|
|
}
|
|
fail();
|
|
}
|
|
|
|
public void testTest_hash() {
|
|
Object group1Item1 = new TestObject(1, 1);
|
|
Object group1Item2 = new TestObject(1, 2);
|
|
|
|
equivalenceMock.expectEquivalent(group1Item1, group1Item2);
|
|
equivalenceMock.expectEquivalent(group1Item2, group1Item1);
|
|
|
|
equivalenceMock.expectHash(group1Item1, 1);
|
|
equivalenceMock.expectHash(group1Item2, 2);
|
|
|
|
equivalenceMock.replay();
|
|
|
|
try {
|
|
tester.addEquivalenceGroup(group1Item1, group1Item2).test();
|
|
} catch (AssertionFailedError expected) {
|
|
String expectedMessage =
|
|
"the hash (1) of TestObject{group=1, item=1} [group 1, item 1] must be "
|
|
+ "equal to the hash (2) of TestObject{group=1, item=2} [group 1, item 2]";
|
|
if (!expected.getMessage().contains(expectedMessage)) {
|
|
fail("<" + expected.getMessage() + "> expected to contain <" + expectedMessage + ">");
|
|
}
|
|
return;
|
|
}
|
|
fail();
|
|
}
|
|
|
|
/** An object with a friendly {@link #toString()}. */
|
|
private static final class TestObject {
|
|
final int group;
|
|
final int item;
|
|
|
|
TestObject(int group, int item) {
|
|
this.group = group;
|
|
this.item = item;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return MoreObjects.toStringHelper("TestObject")
|
|
.add("group", group)
|
|
.add("item", item)
|
|
.toString();
|
|
}
|
|
}
|
|
|
|
private static final class MockEquivalence extends Equivalence<Object> {
|
|
final ImmutableTable.Builder<Object, Object, Boolean> equivalentExpectationsBuilder =
|
|
ImmutableTable.builder();
|
|
final ImmutableMap.Builder<Object, Integer> hashExpectationsBuilder = ImmutableMap.builder();
|
|
ImmutableTable<Object, Object, Boolean> equivalentExpectations;
|
|
ImmutableMap<Object, Integer> hashExpectations;
|
|
|
|
void expectEquivalent(Object a, Object b) {
|
|
checkRecording();
|
|
equivalentExpectationsBuilder.put(a, b, true);
|
|
}
|
|
|
|
void expectDistinct(Object a, Object b) {
|
|
checkRecording();
|
|
equivalentExpectationsBuilder.put(a, b, false);
|
|
}
|
|
|
|
void expectHash(Object object, int hash) {
|
|
checkRecording();
|
|
hashExpectationsBuilder.put(object, hash);
|
|
}
|
|
|
|
void replay() {
|
|
checkRecording();
|
|
equivalentExpectations = equivalentExpectationsBuilder.build();
|
|
hashExpectations = hashExpectationsBuilder.build();
|
|
}
|
|
|
|
@Override
|
|
protected boolean doEquivalent(Object a, Object b) {
|
|
return equivalentExpectations.get(a, b);
|
|
}
|
|
|
|
@Override
|
|
protected int doHash(Object object) {
|
|
return hashExpectations.get(object);
|
|
}
|
|
|
|
void checkRecording() {
|
|
checkState(equivalentExpectations == null && hashExpectations == null);
|
|
}
|
|
}
|
|
}
|