package org.simpleflatmapper.reflect.test;
import org.junit.Test;
import org.simpleflatmapper.reflect.ObjectSetterFactory;
import org.simpleflatmapper.reflect.Setter;
import org.simpleflatmapper.reflect.asm.AsmFactory;
import org.simpleflatmapper.reflect.getter.FieldSetter;
import org.simpleflatmapper.reflect.setter.MethodSetter;
import org.simpleflatmapper.reflect.primitive.BooleanFieldSetter;
import org.simpleflatmapper.reflect.primitive.BooleanMethodSetter;
import org.simpleflatmapper.reflect.primitive.ByteFieldSetter;
import org.simpleflatmapper.reflect.primitive.ByteMethodSetter;
import org.simpleflatmapper.reflect.primitive.CharacterFieldSetter;
import org.simpleflatmapper.reflect.primitive.CharacterMethodSetter;
import org.simpleflatmapper.reflect.primitive.DoubleFieldSetter;
import org.simpleflatmapper.reflect.primitive.DoubleMethodSetter;
import org.simpleflatmapper.reflect.primitive.FloatFieldSetter;
import org.simpleflatmapper.reflect.primitive.FloatMethodSetter;
import org.simpleflatmapper.reflect.primitive.IntFieldSetter;
import org.simpleflatmapper.reflect.primitive.IntMethodSetter;
import org.simpleflatmapper.reflect.primitive.LongFieldSetter;
import org.simpleflatmapper.reflect.primitive.LongMethodSetter;
import org.simpleflatmapper.reflect.primitive.ShortFieldSetter;
import org.simpleflatmapper.reflect.primitive.ShortMethodSetter;
import org.simpleflatmapper.test.beans.DbPrimitiveObject;
import org.simpleflatmapper.test.beans.DbPrimitiveObjectWithSetter;
import org.simpleflatmapper.test.beans.Foo;
import org.simpleflatmapper.test.beans.FooField;
import java.lang.reflect.Method;
import static org.junit.Assert.*;
public class ObjectSetterFactoryTest {
ObjectSetterFactory nonAsmFactory = new ObjectSetterFactory(null);
ObjectSetterFactory asmFactory = new ObjectSetterFactory(new AsmFactory(Thread.currentThread().getContextClassLoader()));
@Test
public void testFailFallBackToMethod() throws Exception {
Setter<Foo, String> setter = new ObjectSetterFactory(new AsmFactory(Thread.currentThread().getContextClassLoader()){
@Override
public <T, P> Setter<T, P> createSetter(Method m) throws Exception {
throw new UnsupportedOperationException();
}
}).getSetter(Foo.class, "foo");
assertTrue(setter instanceof MethodSetter);
SetterHelperTest.validateFooSetter(setter);
}
@Test
public void testMethodToAsm() throws Exception {
Setter<Foo, String> setter = asmFactory.getSetter(Foo.class, "foo");
assertFalse(setter instanceof MethodSetter);
assertFalse(setter instanceof FieldSetter);
SetterHelperTest.validateFooSetter(setter);
}
@Test
public void testDefaultToMethod() throws Exception {
Setter<Foo, String> setter = nonAsmFactory.getSetter(Foo.class, "foo");
assertTrue(setter instanceof MethodSetter);
SetterHelperTest.validateFooSetter(setter);
}
@Test
public void testMatchFullMethodName() throws Exception {
Setter<Foo, String> setter = nonAsmFactory.getSetter(Foo.class, "setFoo");
assertFalse(setter instanceof FieldSetter);
SetterHelperTest.validateFooSetter(setter);
}
@Test
public void testFallBackToField() throws Exception {
Setter<FallBackBar, String> setter = nonAsmFactory.getSetter(FallBackBar.class, "bar");
assertTrue(setter instanceof FieldSetter);
FallBackBar b = new FallBackBar();
assertNull(b.getBar());
setter.set(b, "bar");
assertEquals("bar", b.getBar());
}
public class FallBackBar {
private String bar;
public String getBar() {
return bar;
}
}
@Test
public void testReturnNullIfNotFound() throws Exception {
Setter<Foo, String> setter = nonAsmFactory.getSetter(Foo.class, "xxbar");
assertNull(setter);
}
@Test
public void testPublicFieldAreAsm() throws Exception {
Setter<FooField, String> setter = asmFactory.getSetter(FooField.class, "bar");
assertFalse(setter instanceof FieldSetter);
FooField ff = new FooField();
setter.set(ff, "bar1");
assertEquals("bar1", ff.bar);
}
@Test
public void testToBooleanSetter() throws Exception {
assertTrue(ObjectSetterFactory.toBooleanSetter(nonAsmFactory.getSetter(DbPrimitiveObject.class, "pBoolean")) instanceof BooleanFieldSetter);
assertTrue(ObjectSetterFactory.toBooleanSetter(nonAsmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pBoolean")) instanceof BooleanMethodSetter);
Setter<DbPrimitiveObjectWithSetter, Object> setter = asmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pBoolean");
assertSame(setter, ObjectSetterFactory.toBooleanSetter(setter));
assertNull(ObjectSetterFactory.toBooleanSetter(null));
try {
ObjectSetterFactory.toBooleanSetter(new Setter<DbPrimitiveObject, Boolean>() {
@Override
public void set(DbPrimitiveObject target, Boolean value) throws Exception {
}
});
fail("Should fail");
} catch (Exception e) {
}
}
@Test
public void testToByteSetter() throws Exception {
assertTrue(ObjectSetterFactory.toByteSetter(nonAsmFactory.getSetter(DbPrimitiveObject.class, "pByte")) instanceof ByteFieldSetter);
assertTrue(ObjectSetterFactory.toByteSetter(nonAsmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pByte")) instanceof ByteMethodSetter);
Setter<DbPrimitiveObjectWithSetter, Object> setter = asmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pByte");
assertSame(setter, ObjectSetterFactory.toByteSetter(setter));
assertNull(ObjectSetterFactory.toByteSetter(null));
try {
ObjectSetterFactory.toByteSetter(new Setter<DbPrimitiveObject, Byte>() {
@Override
public void set(DbPrimitiveObject target, Byte value) throws Exception {
}
});
fail("Should fail");
} catch (Exception e) {
}
}
@Test
public void testToCharacterSetter() throws Exception {
assertTrue(ObjectSetterFactory.toCharacterSetter(nonAsmFactory.getSetter(DbPrimitiveObject.class, "pCharacter")) instanceof CharacterFieldSetter);
assertTrue(ObjectSetterFactory.toCharacterSetter(nonAsmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pCharacter")) instanceof CharacterMethodSetter);
Setter<DbPrimitiveObjectWithSetter, Object> setter = asmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pCharacter");
assertSame(setter, ObjectSetterFactory.toCharacterSetter(setter));
assertNull(ObjectSetterFactory.toCharacterSetter(null));
try {
ObjectSetterFactory.toCharacterSetter(new Setter<DbPrimitiveObject, Character>() {
@Override
public void set(DbPrimitiveObject target, Character value) throws Exception {
}
});
fail("Should fail");
} catch (Exception e) {
}
}
@Test
public void testToShortSetter() throws Exception {
assertTrue(ObjectSetterFactory.toShortSetter(nonAsmFactory.getSetter(DbPrimitiveObject.class, "pShort")) instanceof ShortFieldSetter);
assertTrue(ObjectSetterFactory.toShortSetter(nonAsmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pShort")) instanceof ShortMethodSetter);
Setter<DbPrimitiveObjectWithSetter, Object> setter = asmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pShort");
assertSame(setter, ObjectSetterFactory.toShortSetter(setter));
assertNull(ObjectSetterFactory.toShortSetter(null));
try {
ObjectSetterFactory.toShortSetter(new Setter<DbPrimitiveObject, Short>() {
@Override
public void set(DbPrimitiveObject target, Short value) throws Exception {
}
});
fail("Should fail");
} catch (Exception e) {
}
}
@Test
public void testToIntSetter() throws Exception {
assertTrue(ObjectSetterFactory.toIntSetter(nonAsmFactory.getSetter(DbPrimitiveObject.class, "pInt")) instanceof IntFieldSetter);
assertTrue(ObjectSetterFactory.toIntSetter(nonAsmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pInt")) instanceof IntMethodSetter);
Setter<DbPrimitiveObjectWithSetter, Object> setter = asmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pInt");
assertSame(setter, ObjectSetterFactory.toIntSetter(setter));
assertNull(ObjectSetterFactory.toIntSetter(null));
try {
ObjectSetterFactory.toIntSetter(new Setter<DbPrimitiveObject, Integer>() {
@Override
public void set(DbPrimitiveObject target, Integer value) throws Exception {
}
});
fail("Should fail");
} catch (Exception e) {
}
}
@Test
public void testToLongSetter() throws Exception {
assertTrue(ObjectSetterFactory.toLongSetter(nonAsmFactory.getSetter(DbPrimitiveObject.class, "pLong")) instanceof LongFieldSetter);
assertTrue(ObjectSetterFactory.toLongSetter(nonAsmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pLong")) instanceof LongMethodSetter);
Setter<DbPrimitiveObjectWithSetter, Object> setter = asmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pLong");
assertSame(setter, ObjectSetterFactory.toLongSetter(setter));
assertNull(ObjectSetterFactory.toLongSetter(null));
try {
ObjectSetterFactory.toLongSetter(new Setter<DbPrimitiveObject, Long>() {
@Override
public void set(DbPrimitiveObject target, Long value) throws Exception {
}
});
fail("Should fail");
} catch (Exception e) {
}
}
@Test
public void testToFloatSetter() throws Exception {
assertTrue(ObjectSetterFactory.toFloatSetter(nonAsmFactory.getSetter(DbPrimitiveObject.class, "pFloat")) instanceof FloatFieldSetter);
assertTrue(ObjectSetterFactory.toFloatSetter(nonAsmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pFloat")) instanceof FloatMethodSetter);
Setter<DbPrimitiveObjectWithSetter, Object> setter = asmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pFloat");
assertSame(setter, ObjectSetterFactory.toFloatSetter(setter));
assertNull(ObjectSetterFactory.toFloatSetter(null));
try {
ObjectSetterFactory.toFloatSetter(new Setter<DbPrimitiveObject, Float>() {
@Override
public void set(DbPrimitiveObject target, Float value) throws Exception {
}
});
fail("Should fail");
} catch (Exception e) {
}
}
@Test
public void testToDoubleSetter() throws Exception {
assertTrue(ObjectSetterFactory.toDoubleSetter(nonAsmFactory.getSetter(DbPrimitiveObject.class, "pDouble")) instanceof DoubleFieldSetter);
assertTrue(ObjectSetterFactory.toDoubleSetter(nonAsmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pDouble")) instanceof DoubleMethodSetter);
Setter<DbPrimitiveObjectWithSetter, Object> setter = asmFactory.getSetter(DbPrimitiveObjectWithSetter.class, "pDouble");
assertSame(setter, ObjectSetterFactory.toDoubleSetter(setter));
assertNull(ObjectSetterFactory.toDoubleSetter(null));
try {
ObjectSetterFactory.toDoubleSetter(new Setter<DbPrimitiveObject, Double>() {
@Override
public void set(DbPrimitiveObject target, Double value) throws Exception {
}
});
fail("Should fail");
} catch (Exception e) {
}
}
}