package org.testory.common; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.testory.common.Classes.canAssign; import org.junit.Before; import org.junit.Test; public class TestClassesCanAssign { private Boolean aBool; private Character aChar; private Byte aByte; private Short aShort; private Integer aInt; private Long aLong; private Float aFloat; private Double aDouble; @Before public void before() { aBool = false; aChar = 0; aByte = 0; aShort = 0; aInt = 0; aLong = 0L; aFloat = 0f; aDouble = 0.0; } @Test public void can_assign_to_same_class() { class Klass {} assertTrue(canAssign(new Klass(), Klass.class)); } @Test public void can_assign_to_superclass() { class Superclass {} class MyClass extends Superclass {} assertTrue(canAssign(new MyClass(), Superclass.class)); } @Test public void cannot_assign_to_subclass() { class MyClass {} class Subclass extends MyClass {} assertFalse(canAssign(new MyClass(), Subclass.class)); } @Test public void can_assign_to_object() { class MyClass {} assertTrue(canAssign(new MyClass(), Object.class)); } @Test public void can_convert_primitives() { assertTrue(canAssign(aByte, byte.class)); assertTrue(canAssign(aByte, short.class)); assertTrue(canAssign(aByte, int.class)); assertTrue(canAssign(aByte, long.class)); assertFalse(canAssign(aShort, byte.class)); assertTrue(canAssign(aShort, short.class)); assertTrue(canAssign(aShort, int.class)); assertTrue(canAssign(aShort, long.class)); assertFalse(canAssign(aInt, byte.class)); assertFalse(canAssign(aInt, short.class)); assertTrue(canAssign(aInt, int.class)); assertTrue(canAssign(aInt, long.class)); assertFalse(canAssign(aLong, byte.class)); assertFalse(canAssign(aLong, short.class)); assertFalse(canAssign(aLong, int.class)); assertTrue(canAssign(aLong, long.class)); assertTrue(canAssign(aFloat, float.class)); assertTrue(canAssign(aFloat, double.class)); assertFalse(canAssign(aDouble, float.class)); assertTrue(canAssign(aDouble, double.class)); for (Object value : asList(aByte, aShort, aInt, aLong)) { for (Class<?> type : asList(float.class, double.class)) { assertTrue(formatMessage(value, type), canAssign(value, type)); } } for (Object value : asList(aFloat, aDouble)) { for (Class<?> type : asList(byte.class, short.class, int.class, long.class)) { assertFalse(formatMessage(value, type), canAssign(value, type)); } } assertTrue(canAssign(aChar, char.class)); assertFalse(canAssign(aByte, char.class)); assertFalse(canAssign(aShort, char.class)); assertFalse(canAssign(aInt, char.class)); assertFalse(canAssign(aLong, char.class)); assertFalse(canAssign(aFloat, char.class)); assertFalse(canAssign(aDouble, char.class)); assertFalse(canAssign(aChar, byte.class)); assertFalse(canAssign(aChar, short.class)); assertTrue(canAssign(aChar, int.class)); assertTrue(canAssign(aChar, long.class)); assertTrue(canAssign(aChar, float.class)); assertTrue(canAssign(aChar, double.class)); assertTrue(canAssign(aBool, boolean.class)); assertFalse(canAssign(aChar, boolean.class)); assertFalse(canAssign(aByte, boolean.class)); assertFalse(canAssign(aShort, boolean.class)); assertFalse(canAssign(aInt, boolean.class)); assertFalse(canAssign(aLong, boolean.class)); assertFalse(canAssign(aFloat, boolean.class)); assertFalse(canAssign(aDouble, boolean.class)); assertFalse(canAssign(aBool, char.class)); assertFalse(canAssign(aBool, byte.class)); assertFalse(canAssign(aBool, short.class)); assertFalse(canAssign(aBool, int.class)); assertFalse(canAssign(aBool, long.class)); assertFalse(canAssign(aBool, float.class)); assertFalse(canAssign(aBool, double.class)); } @Test public void cannot_convert_wrappers() { for (Object value : asList(aBool, aChar, aByte, aShort, aInt, aLong, aFloat, aDouble)) { for (Class<?> type : asList(Boolean.class, Character.class, Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class)) { assertEquals(formatMessage(value, type), value.getClass() == type, canAssign(value, type)); } } } @Test public void cannot_assign_null_to_primitive() { assertFalse(canAssign(null, boolean.class)); assertFalse(canAssign(null, char.class)); assertFalse(canAssign(null, byte.class)); assertFalse(canAssign(null, short.class)); assertFalse(canAssign(null, int.class)); assertFalse(canAssign(null, long.class)); assertFalse(canAssign(null, float.class)); assertFalse(canAssign(null, double.class)); } @Test public void can_assign_null_to_wrapper() { assertTrue(canAssign(null, Boolean.class)); assertTrue(canAssign(null, Character.class)); assertTrue(canAssign(null, Byte.class)); assertTrue(canAssign(null, Short.class)); assertTrue(canAssign(null, Integer.class)); assertTrue(canAssign(null, Long.class)); assertTrue(canAssign(null, Float.class)); assertTrue(canAssign(null, Double.class)); } @Test public void can_assign_only_null_to_only_wrapper_void() { assertTrue(canAssign(null, Void.class)); assertFalse(canAssign(null, void.class)); assertFalse(canAssign(new Object(), Void.class)); assertFalse(canAssign(new Object(), void.class)); assertFalse(canAssign(aInt, Void.class)); assertFalse(canAssign(aInt, void.class)); } private static String formatMessage(Object value, Class<?> type) { return "can assign " + value.getClass().getName() + " to type " + type.getName(); } }