package org.marketcetera.util.misc;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.lang.ArrayUtils;
import org.junit.Test;
import org.marketcetera.util.except.I18NInterruptedRuntimeException;
import org.marketcetera.util.test.TestCaseBase;
import static org.junit.Assert.*;
import static org.marketcetera.util.test.CollectionAssert.*;
/**
* @author tlerios@marketcetera.com
* @since 0.6.0
* @version $Id: ReflectUtilsTest.java 16154 2012-07-14 16:34:05Z colin $
*/
/* $License$ */
public class ReflectUtilsTest
extends TestCaseBase
{
private static final String OBJECT_NAME=
Object.class.getName();
private static final String EMPTY_NAME=
Empty.class.getName();
private static final String SIMPLE_NAME=
Simple.class.getName();
private static final String DERIVED_NAME=
Derived.class.getName();
private static final String IFACE_NAME=
IFace.class.getName();
private static final String COMPLEX_BASE_NAME=
ComplexBase.class.getName();
private static final String COMPLEX_DERIVED_NAME=
ComplexDerived.class.getName();
private static final String SIMPLE_FIELD=
"mSimple";
private static final String DERIVED_FIELD=
"mDerived";
private static final String IFACE_FIELD=
"mIFace";
private static final String COMPLEX_BASE_FIELD=
"mComplexBase";
private static final String COMPLEX_DERIVED_FIELD=
"mComplexDerived";
private static class Empty {}
private static class Simple
{
int mSimple;
}
private static class Derived
extends Simple
{
int mDerived;
}
private static interface IFace
{
int mIFace=0;
}
private static class ComplexBase
extends Simple
implements IFace
{
int mComplexBase;
}
private static class ComplexDerived
extends ComplexBase
implements IFace
{
int mComplexDerived;
}
private static class IntObject
{
private int mValue;
public IntObject
(int value)
{
if (value==0) {
throw new I18NInterruptedRuntimeException();
}
mValue=value;
}
public int getValue()
{
return mValue;
}
}
private static void assertNamesMatch
(String[] expectedNames,
Field[] fields)
{
String[] actualNames=new String[fields.length];
for (int i=0;i<fields.length;i++) {
actualNames[i]=fields[i].getName();
}
assertArrayPermutation(expectedNames,actualNames);
}
private static void assertNamesMatch
(String[] expectedNames,
Class<?>[] classes)
{
String[] actualNames=new String[classes.length];
for (int i=0;i<classes.length;i++) {
actualNames[i]=classes[i].getName();
}
assertArrayPermutation(expectedNames,actualNames);
}
@Test
public void classes()
{
assertNamesMatch
(new String[] {
OBJECT_NAME,
EMPTY_NAME
},ReflectUtils.getAllClasses(Empty.class));
assertNamesMatch
(new String[] {
OBJECT_NAME,
SIMPLE_NAME
},ReflectUtils.getAllClasses(Simple.class));
assertNamesMatch
(new String[] {
OBJECT_NAME,
SIMPLE_NAME,
DERIVED_NAME
},ReflectUtils.getAllClasses(Derived.class));
assertNamesMatch
(new String[] {
IFACE_NAME
},ReflectUtils.getAllClasses(IFace.class));
assertNamesMatch
(new String[] {
OBJECT_NAME,
SIMPLE_NAME,
IFACE_NAME,
COMPLEX_BASE_NAME
},ReflectUtils.getAllClasses(ComplexBase.class));
assertNamesMatch
(new String[] {
OBJECT_NAME,
SIMPLE_NAME,
IFACE_NAME,
COMPLEX_BASE_NAME,
COMPLEX_DERIVED_NAME
},ReflectUtils.getAllClasses(ComplexDerived.class));
}
@Test
public void fields()
{
assertNamesMatch
(ArrayUtils.EMPTY_STRING_ARRAY,
ReflectUtils.getAllFields(Empty.class));
assertNamesMatch
(new String[] {
SIMPLE_FIELD
},ReflectUtils.getAllFields(Simple.class));
assertNamesMatch
(new String[] {
SIMPLE_FIELD,
DERIVED_FIELD
},ReflectUtils.getAllFields(Derived.class));
assertNamesMatch
(new String[] {
IFACE_FIELD
},ReflectUtils.getAllFields(IFace.class));
assertNamesMatch
(new String[] {
SIMPLE_FIELD,
IFACE_FIELD,
COMPLEX_BASE_FIELD
},ReflectUtils.getAllFields(ComplexBase.class));
assertNamesMatch
(new String[] {
SIMPLE_FIELD,
IFACE_FIELD,
COMPLEX_BASE_FIELD,
COMPLEX_DERIVED_FIELD
},ReflectUtils.getAllFields(ComplexDerived.class));
}
@Test
public void instance()
throws Exception
{
assertEquals(1,((IntObject)
(ReflectUtils.getInstance
(IntObject.class.getName(),
new Class[] {Integer.TYPE},
new Object[] {new Integer(1)}))).getValue());
try {
ReflectUtils.getInstance("NonExistent",null,null);
fail();
} catch (ClassNotFoundException ex) {
assertFalse(Thread.interrupted());
}
try {
ReflectUtils.getInstance(IntObject.class.getName(),
new Class[] {Integer.TYPE},
new Object[] {new Integer(0)});
fail();
} catch (InvocationTargetException ex) {
assertTrue(Thread.interrupted());
assertEquals(I18NInterruptedRuntimeException.class,
ex.getCause().getClass());
}
}
}