package org.sql2o.reflect;
import junit.framework.TestCase;
import org.sql2o.reflection.MethodSetterFactory;
import org.sql2o.reflection.Setter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* User: dimzon
* Date: 4/9/14
* Time: 10:18 PM
*/
public abstract class AbstractMethodSetterFactoryTest extends TestCase {
public static class POJO1{
public void set_boolean(boolean _boolean) {
this._boolean = _boolean;
}
public void set_byte(byte _byte) {
this._byte = _byte;
}
public void set_short(short _short) {
this._short = _short;
}
public void set_int(int _int) {
this._int = _int;
}
public void set_long(long _long) {
this._long = _long;
}
public void set_float(float _float) {
this._float = _float;
}
public void set_double(double _double) {
this._double = _double;
}
public void set_char(char _char) {
this._char = _char;
}
public void set_obj(Object _obj) {
this._obj = _obj;
}
boolean _boolean;
byte _byte;
short _short;
int _int;
long _long;
float _float;
double _double;
char _char;
Object _obj;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
POJO1 pojo1 = (POJO1) o;
if (_boolean != pojo1._boolean) return false;
if (_byte != pojo1._byte) return false;
if (_char != pojo1._char) return false;
if (Double.compare(pojo1._double, _double) != 0) return false;
if (Float.compare(pojo1._float, _float) != 0) return false;
if (_int != pojo1._int) return false;
if (_long != pojo1._long) return false;
if (_short != pojo1._short) return false;
if (_obj != null ? !_obj.equals(pojo1._obj) : pojo1._obj != null) return false;
return true;
}
}
public void testAllTypes() throws IllegalAccessException, NoSuchFieldException {
POJO1 pojo1 = new POJO1();
pojo1._boolean = true;
pojo1._byte = 17;
pojo1._short=87;
pojo1._int= Integer.MIN_VALUE;
pojo1._long= 1337;
pojo1._char='a';
pojo1._double=Math.PI;
pojo1._float= (float) Math.log(93);
pojo1._obj = pojo1;
POJO1 pojo2 = new POJO1();
assertFalse(pojo1.equals(pojo2));
Method[] methods = pojo1.getClass().getDeclaredMethods();
for (Method method : methods) {
if(!method.getName().startsWith("set_")) continue;
Field field = pojo1.getClass()
.getDeclaredField(method.getName().substring(3));
Setter setter = msf.newSetter(method);
assertSame(field.getType(),setter.getType());
Object val1 = field.get(pojo1);
Object val2 = field.get(pojo2);
assertFalse(val1.equals(val2));
setter.setProperty(pojo2,val1);
Object val3 = field.get(pojo2);
assertEquals(val1,val3);
}
assertEquals(pojo1,pojo2);
// let's reset all values to NULL
// primitive fields will not be affected
for (Method method : methods) {
if(!method.getName().startsWith("set_")) continue;
Field field = pojo1.getClass()
.getDeclaredField(method.getName().substring(3));
Setter setter = msf.newSetter(method);
Object val1 = field.get(pojo1);
assertNotNull(val1);
setter.setProperty(pojo1,null);
Object val2 = field.get(pojo1);
if(!setter.getType().isPrimitive()){
assertNull(val2);
continue;
}
assertNotNull(val2);
// not affected
assertEquals(val1,val2);
}
pojo2._obj = null;
assertEquals(pojo2,pojo1);
}
public final MethodSetterFactory msf;
public AbstractMethodSetterFactoryTest(MethodSetterFactory msf) {
this.msf = msf;
}
}