blob: 9df73e4c4fdb27ae15824c259c1fb3891223a9c3 [file] [log] [blame]
package org.hamcrest.core;
import org.hamcrest.Matcher;
import org.junit.Test;
import static org.hamcrest.AbstractMatcherTest.*;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsEqual.equalToObject;
public final class IsEqualTest {
@Test public void
copesWithNullsAndUnknownTypes() {
Matcher<?> matcher = equalTo("irrelevant");
assertNullSafe(matcher);
assertUnknownTypeSafe(matcher);
}
@Test public void
comparesObjectsUsingEqualsMethod() {
final Matcher<String> matcher1 = equalTo("hi");
assertMatches(matcher1, "hi");
assertDoesNotMatch(matcher1, "bye");
assertDoesNotMatch(matcher1, null);
final Matcher<Integer> matcher2 = equalTo(1);
assertMatches(matcher2, 1);
assertDoesNotMatch(matcher2, 2);
assertDoesNotMatch(matcher2, null);
}
@Test public void
canCompareNullValues() {
final Matcher<Object> matcher = equalTo(null);
assertMatches(matcher, null);
assertDoesNotMatch(matcher, 2);
assertDoesNotMatch(matcher, "hi");
assertDoesNotMatch(matcher, new String[] {"a", "b"});
}
@SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
@Test public void
honoursIsEqualImplementationEvenWithNullValues() {
Object alwaysEqual = new Object() {
@Override
public boolean equals(Object obj) {
return true;
}
};
Object neverEqual = new Object() {
@Override
public boolean equals(Object obj) {
return false;
}
};
Matcher<Object> matcher = equalTo(null);
assertMatches(matcher, alwaysEqual);
assertDoesNotMatch(matcher, neverEqual);
}
@Test public void
comparesTheElementsOfAnObjectArray() {
String[] s1 = {"a", "b"};
String[] s2 = {"a", "b"};
String[] s3 = {"c", "d"};
String[] s4 = {"a", "b", "c", "d"};
final Matcher<String[]> matcher = equalTo(s1);
assertMatches(matcher, s1);
assertMatches(matcher, s2);
assertDoesNotMatch(matcher, s3);
assertDoesNotMatch(matcher, s4);
assertDoesNotMatch(matcher, null);
}
@Test public void
comparesTheElementsOfAnArrayOfPrimitiveTypes() {
int[] i1 = new int[]{1, 2};
int[] i2 = new int[]{1, 2};
int[] i3 = new int[]{3, 4};
int[] i4 = new int[]{1, 2, 3, 4};
final Matcher<int[]> matcher = equalTo(i1);
assertMatches(matcher, i1);
assertMatches(matcher, i2);
assertDoesNotMatch(matcher, i3);
assertDoesNotMatch(matcher, i4);
assertDoesNotMatch(matcher, null);
}
@Test public void
recursivelyTestsElementsOfArrays() {
int[][] i1 = new int[][]{{1, 2}, {3, 4}};
int[][] i2 = new int[][]{{1, 2}, {3, 4}};
int[][] i3 = new int[][]{{5, 6}, {7, 8}};
int[][] i4 = new int[][]{{1, 2, 3, 4}, {3, 4}};
final Matcher<int[][]> matcher = equalTo(i1);
assertMatches(matcher, i1);
assertMatches(matcher, i2);
assertDoesNotMatch(matcher, i3);
assertDoesNotMatch(matcher, i4);
assertDoesNotMatch(matcher, null);
}
@Test public void
hasUntypedVariant() {
Object original = 10;
assertMatches(equalToObject(10), original);
assertDoesNotMatch(equalToObject(0), original);
assertDoesNotMatch(equalToObject("10"), original);
assertDoesNotMatch(equalToObject(10), "10");
}
@Test public void
includesTheResultOfCallingToStringOnItsArgumentInTheDescription() {
final String argumentDescription = "ARGUMENT DESCRIPTION";
Object argument = new Object() {
@Override
public String toString() {
return argumentDescription;
}
};
assertDescription("<" + argumentDescription + ">", equalTo(argument));
}
@Test public void
returnsAnObviousDescriptionIfCreatedWithANestedMatcherByMistake() {
Matcher<? super String> innerMatcher = equalTo("NestedMatcher");
assertDescription("<" + innerMatcher.toString() + ">", equalTo(innerMatcher));
}
@Test public void
returnsGoodDescriptionIfCreatedWithNullReference() {
assertDescription("null", equalTo(null));
}
}