package co.codewizards.cloudstore.core.util;
import static co.codewizards.cloudstore.core.util.ReflectionUtil.*;
import static org.assertj.core.api.Assertions.*;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.UUID;
import org.junit.Test;
public class ResolveActualTypeArgumentsTest {
@Test
public void myGeneric1_1() {
MyGeneric1_1 object = new MyGeneric1_1();
assertThat(object.actualTypeArgument1).isEqualTo(String.class);
}
@Test
public void myGeneric1_1_1() {
MyGeneric1_1_1 object = new MyGeneric1_1_1();
assertThat(object.actualTypeArgument1).isEqualTo(String.class);
}
@Test
public void myGeneric2_1() {
MyGeneric2_1 object = new MyGeneric2_1();
assertThat(object.actualTypeArgumentA).isEqualTo(Long.class);
assertThat(object.actualTypeArgumentB).isEqualTo(Boolean.class);
assertThat(object.actualTypeArgumentC).isEqualTo(String.class);
}
@Test
public void myGeneric2_2_1() {
MyGeneric2_2_1 object = new MyGeneric2_2_1();
assertThat(object.actualTypeArgumentA).isEqualTo(Date.class);
assertThat(object.actualTypeArgumentB).isEqualTo(Boolean.class);
assertThat(object.actualTypeArgumentC).isEqualTo(BigDecimal.class);
}
@Test
public void myGeneric2_3() {
MyGeneric2_3 object = new MyGeneric2_3();
// All of them are unresolved (i.e. no class, but TypeVariable).
assertThat(object.actualTypeArgumentA).isInstanceOf(TypeVariable.class);
assertThat(object.actualTypeArgumentB).isInstanceOf(TypeVariable.class);
assertThat(object.actualTypeArgumentC).isInstanceOf(TypeVariable.class);
assertThat(((TypeVariable<?>) object.actualTypeArgumentA).getName()).isEqualTo("A");
assertThat(((TypeVariable<?>) object.actualTypeArgumentB).getName()).isEqualTo("B");
assertThat(((TypeVariable<?>) object.actualTypeArgumentC).getName()).isEqualTo("C");
}
@Test
public void myGeneric3_1() {
MyGeneric3_1 object = new MyGeneric3_1();
Type[] typeArguments = resolveActualTypeArguments(MyGeneric3.class, object);
assertThat(typeArguments[0]).isEqualTo(Integer.class);
assertThat(typeArguments[1]).isEqualTo(String.class);
assertThat(typeArguments[2]).isEqualTo(UUID.class);
}
@Test
public void nonGenericBaseClass() {
Long object = new Long(44454455566666L);
Type[] typeArguments = resolveActualTypeArguments(Number.class, object);
assertThat(typeArguments).isNotNull();
assertThat(typeArguments.length).isEqualTo(0);
}
}