package kr.debop4j.core.reflect;
import com.carrotsearch.junitbenchmarks.BenchmarkOptions;
import kr.debop4j.core.AbstractTest;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
/**
* kr.debop4j.core.reflect.MethodAccessTest
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* @since 13. 1. 21
*/
@Slf4j
public class MethodAccessTest extends AbstractTest {
@BenchmarkOptions(benchmarkRounds = 100, warmupRounds = 1)
@Test
public void invokeMethods() {
MethodAccess access = MethodAccess.get(SomeClass.class);
SomeClass someObject = new SomeClass();
Object value;
value = access.invoke(someObject, "getName");
assertEquals(null, value);
value = access.invoke(someObject, "setName", "sweet");
assertEquals(null, value);
value = access.invoke(someObject, "getName");
assertEquals("sweet", value);
value = access.invoke(someObject, "setName", (Object) null);
assertEquals(null, value);
value = access.invoke(someObject, "getName");
assertEquals(null, value);
value = access.invoke(someObject, "getIntValue");
assertEquals(0, value);
value = access.invoke(someObject, "setIntValue", 1234);
assertEquals(null, value);
value = access.invoke(someObject, "getIntValue");
assertEquals(1234, value);
value = access.invoke(someObject, "methodWithManyArguments", 1, 2f, 3, 4.2f, null, null, null);
assertEquals("test", value);
int index = access.getIndex("methodWithManyArguments", int.class, float.class, Integer.class, Float.class, SomeClass.class,
SomeClass.class, SomeClass.class);
assertEquals(access.getIndex("methodWithManyArguments"), index);
}
@BenchmarkOptions(benchmarkRounds = 100, warmupRounds = 1)
@Test
public void invokeWithEmptyClass() {
MethodAccess access = MethodAccess.get(EmptyClass.class);
try {
access.getIndex("name");
fail();
} catch (IllegalArgumentException expected) {
// expected.printStackTrace();
}
try {
access.getIndex("name", String.class);
fail();
} catch (IllegalArgumentException expected) {
// expected.printStackTrace();
}
try {
access.invoke(new EmptyClass(), "meow", "moo");
fail();
} catch (IllegalArgumentException expected) {
// expected.printStackTrace();
}
try {
access.invoke(new EmptyClass(), 0);
fail();
} catch (IllegalArgumentException expected) {
// expected.printStackTrace();
}
try {
access.invoke(new EmptyClass(), 0, "moo");
fail();
} catch (IllegalArgumentException expected) {
// expected.printStackTrace();
}
}
static public class EmptyClass { }
static public class SomeClass {
private String name;
private int intValue;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public String methodWithManyArguments(int i, float f, Integer I, Float F, SomeClass c, SomeClass c1, SomeClass c2) {
return "test";
}
}
}