package org.simpleflatmapper.reflect.test.asm;
import org.junit.Test;
import org.simpleflatmapper.reflect.Getter;
import org.simpleflatmapper.reflect.asm.InjectedParam;
import org.simpleflatmapper.reflect.asm.InstantiatorKey;
import org.simpleflatmapper.reflect.primitive.IntGetter;
import org.simpleflatmapper.test.beans.DbFinalObject;
import org.simpleflatmapper.test.beans.DbObject;
import java.io.InputStream;
import java.util.Date;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class InstantiatorKeyTest {
@Test
public void testEqualsOnSameKey() throws NoSuchMethodException {
InstantiatorKey<Date> k = new InstantiatorKey<Date>(DbObject.class, Date.class);
assertTrue(k.equals(k));
}
@Test
public void testEqualsOnSameSourceAndTargetValues() throws NoSuchMethodException {
InstantiatorKey<Date> k1 = new InstantiatorKey<Date>(DbObject.class, Date.class);
InstantiatorKey<Date> k2 = new InstantiatorKey<Date>(DbObject.class, Date.class);
assertTrue(k1.equals(k2));
}
@Test
public void testEqualsOnSameSourceAndTargetAndInjectParamValues() throws NoSuchMethodException {
final InjectedParam[] injectedParameters = createInjectedParameters("param", Getter.class);
InstantiatorKey<Date> k1 = new InstantiatorKey<Date>(DbObject.class.getConstructor(), injectedParameters, Date.class);
InstantiatorKey<Date> k2 = new InstantiatorKey<Date>(DbObject.class.getConstructor(), injectedParameters, Date.class);
assertTrue(k1.equals(k2));
}
private InjectedParam[] createInjectedParameters(String param) {
return createInjectedParameters(param, Getter.class);
}
private InjectedParam[] createInjectedParameters(String param, Class<?> getterClass) {
return new InjectedParam[] {new InjectedParam(param, getterClass)};
}
@Test
public void testNotEqualsOnDiffSourceAndSameTargetValues() throws NoSuchMethodException {
InstantiatorKey<Date> k1 = new InstantiatorKey<Date>(DbObject.class, Date.class);
InstantiatorKey<InputStream> k2 = new InstantiatorKey<InputStream>(DbObject.class, InputStream.class);
InstantiatorKey<Object> k3 = new InstantiatorKey<Object>(DbObject.class, null);
assertFalse(k1.equals(k2));
assertFalse(k1.equals(k3));
assertFalse(k3.equals(k1));
}
@Test
public void testNotEqualsOnSameSourceAndTargetAndDiffInjectParamValues() throws NoSuchMethodException {
InstantiatorKey<Date> k1 = new InstantiatorKey<Date>(DbObject.class.getConstructor(), createInjectedParameters("param"), Date.class);
InstantiatorKey<Date> k2 = new InstantiatorKey<Date>(DbObject.class.getConstructor(), createInjectedParameters("param2"), Date.class);
InstantiatorKey<Date> k3 = new InstantiatorKey<Date>(DbObject.class.getConstructor(), null, Date.class);
InstantiatorKey<Date> k4 = new InstantiatorKey<Date>(DbObject.class.getConstructor(), createInjectedParameters("param", IntGetter.class), Date.class);
assertFalse(k1.equals(k2));
assertFalse(k1.equals(k3));
assertFalse(k3.equals(k1));
assertFalse(k4.equals(k1));
}
@Test
public void testNotEqualsDiffConstructor() throws NoSuchMethodException {
InstantiatorKey<Date> k1 = new InstantiatorKey<Date>(DbObject.class.getConstructor(), createInjectedParameters("param"), Date.class);
InstantiatorKey<Date> k2 = new InstantiatorKey<Date>(DbFinalObject.class.getDeclaredConstructors()[0], createInjectedParameters("param"), Date.class);
InstantiatorKey<Date> k3 = new InstantiatorKey<Date>(null, createInjectedParameters( "param"), Date.class);
assertFalse(k1.equals(k2));
assertFalse(k1.equals(k3));
assertFalse(k3.equals(k1));
}
@Test
public void testNotEqualsOnNull() throws NoSuchMethodException {
InstantiatorKey<Date> k1 = new InstantiatorKey<Date>(DbObject.class, Date.class);
assertFalse(k1.equals(null));
}
@Test
public void testNotEqualsOnDiffClass() throws NoSuchMethodException {
InstantiatorKey<Date> k1 = new InstantiatorKey<Date>(DbObject.class, Date.class);
assertFalse(k1.equals(new Object()));
}
}