package com.brightgenerous.commons;
import static org.junit.Assert.*;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import org.junit.Test;
public class EqualsUtilsTest {
/*
* must exist commons lang3 EqualsBuilder in Class Path.
*/
@Test
public void equalsAlt() throws Exception {
Object obj1 = new TestBeanA(0, null, null);
Object obj2 = new TestBeanA(0, null, "bar");
Object obj3 = new TestBeanA(10, "foo", null);
Object obj4 = new TestBeanA(10, "foo", "bar");
Object obj5 = new TestBeanB(10, "foo", "bar");
Object obj6 = new TestBeanAA(10, "foo", "bar");
assertEquals(obj1, obj1);
assertEquals(obj1, obj2);
assertNotEquals(obj1, obj3);
assertEquals(obj3, obj3);
assertEquals(obj3, obj4);
assertNotEquals(obj4, obj5);
assertNotEquals(obj5, obj4);
assertEquals(obj4, obj6);
assertEquals(obj6, obj4);
}
static class TestBeanA {
private static final MethodHandle equals;
static {
try {
equals = MethodHandles.lookup().findSpecial(Object.class, "equals",
MethodType.methodType(Boolean.TYPE, Object.class), TestBeanA.class);
} catch (NoSuchMethodException | IllegalAccessException e) {
throw new InternalError(e.getMessage());
}
}
int field1;
String field2;
String field3;
TestBeanA(int field1, String field2, String field3) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
return EqualsUtils.equalsAlt(equals, this, obj, "field3");
}
@Override
public String toString() {
return ToStringUtils.toStringAlt(this);
}
}
static class TestBeanAA extends TestBeanA {
TestBeanAA(int field1, String field2, String field3) {
super(field1, field2, field3);
}
}
static class TestBeanB {
private static final MethodHandle equals;
static {
try {
equals = MethodHandles.lookup().findSpecial(Object.class, "equals",
MethodType.methodType(Boolean.TYPE, Object.class), TestBeanB.class);
} catch (NoSuchMethodException | IllegalAccessException e) {
throw new InternalError(e.getMessage());
}
}
int field1;
String field2;
String field3;
TestBeanB(int field1, String field2, String field3) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
return EqualsUtils.equalsAlt(equals, this, obj, "field3");
}
@Override
public String toString() {
return ToStringUtils.toStringAlt(this);
}
}
}