package org.sculptor.framework.domain;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.sculptor.framework.domain.AbstractDomainObject;
import org.slf4j.LoggerFactory;
public class EqualsTest {
@Test
public void shouldBeReflexive() {
A a = new A(17);
assertTrue(a.equals(a));
}
@Test
public void shouldBeSymetric() {
A a1 = new A(17);
A a2 = new A(17);
assertTrue(a1.equals(a2));
assertTrue(a2.equals(a1));
}
@Test
public void performance() {
long t0 = System.currentTimeMillis();
int count = 0;
A a1 = new A(17);
B b = new B(17);
A a3 = new A(-1);
for (int i = 0; i < 10000000; i++) {
if (a1.equals(b)) {
count++;
}
if (!a1.equals(a3)) {
count--;
}
}
long duration = System.currentTimeMillis() - t0;
assertEquals(0, count);
LoggerFactory.getLogger(getClass()).info("Performance test took {} ms", duration);
}
@Test
public void shouldConsiderDifferentClassHierarchiesNotEqual() {
A a = new A(17);
D d = new D(17);
assertFalse(a.equals(d));
}
@Test
public void shouldConsiderNonDomainObjectNotEqual() {
A a = new A(17);
Object x = new Object();
assertFalse(a.equals(x));
}
@Test
public void shouldBeSymetricForSubclass() {
A a = new A(17);
B b = new B(17);
assertTrue(a.equals(b));
assertTrue(b.equals(a));
}
@Test
public void shouldBeTransitive() {
A a = new A(17);
B b = new B(17);
C c = new C(17);
assertTrue(b.equals(a));
assertTrue(a.equals(c));
assertTrue(b.equals(c));
}
private static class A extends AbstractDomainObject {
private static final long serialVersionUID = 1L;
private final Integer key;
public A(Integer key) {
this.key = key;
}
@Override
protected Object getKey() {
return key;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((key == null) ? 0 : key.hashCode());
return result;
}
}
private static class B extends A {
private static final long serialVersionUID = 1L;
public B(Integer key) {
super(key);
}
}
private static class C extends A {
private static final long serialVersionUID = 1L;
public C(Integer key) {
super(key);
}
}
private static class D extends AbstractDomainObject {
private static final long serialVersionUID = 1L;
private final Integer key;
public D(Integer key) {
this.key = key;
}
@Override
protected Object getKey() {
return key;
}
}
}