package tc.oc.commons.reflect; import java.util.Set; import com.google.common.collect.ImmutableSet; import com.google.common.reflect.TypeToken; import junit.framework.TestCase; import tc.oc.commons.core.reflect.Types; public class TypeCoercionTest extends TestCase { public void testPrimitives() throws Exception { assertTrue(Types.isConvertibleForInvocation(int.class, int.class)); } public void testPrimitivePromotion() throws Exception { assertTrue(Types.isConvertibleForInvocation(long.class, int.class)); } public void testPrimitiveDemotion() throws Exception { assertFalse(Types.isConvertibleForInvocation(int.class, long.class)); } public void testUnboxing() throws Exception { assertTrue(Types.isConvertibleForInvocation(int.class, Integer.class)); } public void testBoxing() throws Exception { assertTrue(Types.isConvertibleForInvocation(Integer.class, int.class)); } public void testUnboxingPlusPromotion() throws Exception { assertTrue(Types.isConvertibleForInvocation(long.class, Integer.class)); } public void testBoxingPlusPromotion() throws Exception { assertFalse(Types.isConvertibleForInvocation(Long.class, int.class)); } public void testObjects() throws Exception { assertTrue(Types.isConvertibleForInvocation(String.class, String.class)); } public void testUpcasting() throws Exception { assertTrue(Types.isConvertibleForInvocation(Object.class, String.class)); } public void testDowncasting() throws Exception { assertFalse(Types.isConvertibleForInvocation(String.class, Object.class)); } public void testBoxingPlusUpcasting() throws Exception { assertTrue(Types.isConvertibleForInvocation(Number.class, int.class)); } public void testGenerics() throws Exception { // This just delegates directly to TypeToken, so we don't need to test every possible case assertTrue(Types.isConvertibleForInvocation(new TypeToken<Set<? extends Number>>(){}, new TypeToken<ImmutableSet<Integer>>(){})); } public void testVoid() throws Exception { assertTrue(Types.isConvertibleForInvocation(void.class, void.class)); } }