// Copyright © 2011-2013, Esko Luontola <www.orfjackal.net>
// This software is released under the Apache License 2.0.
// The license text is at http://www.apache.org/licenses/LICENSE-2.0
package fi.jumi.core.util;
import org.hamcrest.StringDescription;
import org.junit.Test;
import java.util.Arrays;
import static fi.jumi.core.util.EqualityMatchers.deepEqualTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class EqualityMatchersTest {
@Test
public void basic_types() {
assertThat("foo", deepEqualTo("foo"));
assertThat("foo", not(deepEqualTo("bar")));
assertThat(1, deepEqualTo(1));
assertThat(true, deepEqualTo(true));
assertThat("foo", not(deepEqualTo(null)));
assertThat(null, not(deepEqualTo("foo")));
}
@Test
public void arrays() {
assertThat("same", new Object[]{"foo", 1}, deepEqualTo(new Object[]{"foo", 1}));
assertThat("longer", new Object[]{"foo", 1, 2}, not(deepEqualTo(new Object[]{"foo", 1})));
assertThat("shorter", new Object[]{"foo"}, not(deepEqualTo(new Object[]{"foo", 1})));
assertThat("different order", new Object[]{1, "foo"}, not(deepEqualTo(new Object[]{"foo", 1})));
assertThat("different value", new Object[]{"foo", 2}, not(deepEqualTo(new Object[]{"foo", 1})));
assertThat("same primitive array", new int[]{1, 2}, deepEqualTo(new int[]{1, 2}));
assertThat("different primitive array", new int[]{1, 3}, not(deepEqualTo(new int[]{1, 2})));
}
@Test
public void lists() {
assertThat("same", Arrays.asList(1, 2), deepEqualTo(Arrays.asList(1, 2)));
assertThat("longer", Arrays.asList(1, 2, 3), not(deepEqualTo(Arrays.asList(1, 2))));
assertThat("shorter", Arrays.asList(1), not(deepEqualTo(Arrays.asList(1, 2))));
assertThat("different order", Arrays.asList(2, 1), not(deepEqualTo(Arrays.asList(1, 2))));
assertThat("different value", Arrays.asList(1, 3), not(deepEqualTo(Arrays.asList(1, 2))));
}
@Test
public void classes_that_do_not_implement_equals() {
assertThat("same", new NoEqualsDummy("foo"), deepEqualTo(new NoEqualsDummy("foo")));
assertThat("different", new NoEqualsDummy("foo"), not(deepEqualTo(new NoEqualsDummy("bar"))));
assertThat("same nested", new NoEqualsDummy(new NoEqualsDummy("foo")), deepEqualTo(new NoEqualsDummy(new NoEqualsDummy("foo"))));
assertThat("different nested", new NoEqualsDummy(new NoEqualsDummy("foo")), not(deepEqualTo(new NoEqualsDummy(new NoEqualsDummy("bar")))));
assertThat("array of same", new Object[]{new NoEqualsDummy("foo")}, deepEqualTo(new Object[]{new NoEqualsDummy("foo")}));
assertThat("array of different", new Object[]{new NoEqualsDummy("foo")}, not(deepEqualTo(new Object[]{new NoEqualsDummy("bar")})));
assertThat("list of same", Arrays.asList(new NoEqualsDummy("foo")), deepEqualTo(Arrays.asList(new NoEqualsDummy("foo"))));
assertThat("list of different", Arrays.asList(new NoEqualsDummy("foo")), not(deepEqualTo(Arrays.asList(new NoEqualsDummy("bar")))));
}
@Test
public void failure_description_says_what_field_was_different() {
// array
assertThat(
getMismatchDescription(
new NoEqualsDummy(new Object[]{new NoEqualsDummy("foo")}),
new NoEqualsDummy(new Object[]{new NoEqualsDummy("bar")})),
containsString("\"this.obj[0].obj\""));
assertThat(
getMismatchDescription(
new NoEqualsDummy(new Object[]{new NoEqualsDummy("foo")}),
new NoEqualsDummy(new Object[]{null, null})),
containsString("\"this.obj.length\""));
// list
assertThat(
getMismatchDescription(
new NoEqualsDummy(Arrays.asList(new NoEqualsDummy("foo"))),
new NoEqualsDummy(Arrays.asList(new NoEqualsDummy("bar")))),
containsString("\"this.obj.get(0).obj\""));
assertThat(
getMismatchDescription(
new NoEqualsDummy(Arrays.asList(new NoEqualsDummy("foo"))),
new NoEqualsDummy(Arrays.asList(null, null))),
containsString("\"this.obj.size()\""));
}
private static String getMismatchDescription(Object actual, Object expected) {
StringDescription description = new StringDescription();
deepEqualTo(expected).describeMismatch(actual, description);
return description.toString();
}
private static class NoEqualsDummy {
private final Object obj;
private NoEqualsDummy(Object obj) {
this.obj = obj;
}
}
}