package net.bytebuddy.description.type;
import net.bytebuddy.description.annotation.AnnotationList;
import net.bytebuddy.test.utility.MockitoRule;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.mockito.Mock;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.when;
public class TypeDescriptionGenericLazyProjectionWithLazyNavigationTest {
@Rule
public TestRule mockitoRule = new MockitoRule(this);
@Mock
private TypeDescription typeDescription, rawSuperType;
@Mock
private TypeDescription.Generic superType;
@Before
public void setUp() throws Exception {
when(typeDescription.asErasure()).thenReturn(typeDescription);
when(superType.asErasure()).thenReturn(rawSuperType);
when(superType.asGenericType()).thenReturn(superType);
}
@Test
public void testLazySuperClass() throws Exception {
when(typeDescription.getSuperClass()).thenReturn(superType);
assertThat(new AssertingLazyType(typeDescription).getSuperClass().asErasure(), is(rawSuperType));
}
@Test
public void testUndefinedLazySuperClass() throws Exception {
assertThat(new AssertingLazyType(typeDescription).getSuperClass(), nullValue(TypeDescription.Generic.class));
}
@Test
public void testInterfaceType() throws Exception {
when(typeDescription.getInterfaces()).thenReturn(new TypeList.Generic.Explicit(superType));
assertThat(new AssertingLazyType(typeDescription).getInterfaces().getOnly().asErasure(), is(rawSuperType));
}
@Test(expected = IndexOutOfBoundsException.class)
public void testInterfaceTypeOutOfBounds() throws Exception {
when(typeDescription.getInterfaces()).thenReturn(new TypeList.Generic.Explicit(superType));
new AssertingLazyType(typeDescription).getInterfaces().get(1);
}
private static class AssertingLazyType extends TypeDescription.Generic.LazyProjection.WithLazyNavigation {
private final TypeDescription typeDescription;
private AssertingLazyType(TypeDescription typeDescription) {
this.typeDescription = typeDescription;
}
@Override
public AnnotationList getDeclaredAnnotations() {
throw new AssertionError();
}
@Override
public TypeDescription asErasure() {
return typeDescription;
}
@Override
protected TypeDescription.Generic resolve() {
throw new AssertionError();
}
}
}