package net.bytebuddy.implementation.attribute;
import net.bytebuddy.description.annotation.AnnotationList;
import net.bytebuddy.description.type.TypeList;
import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import org.junit.Test;
import org.objectweb.asm.Type;
import org.objectweb.asm.TypeReference;
import static org.mockito.Mockito.*;
public class TypeAttributeAppenderForInstrumentedTypeTest extends AbstractTypeAttributeAppenderTest {
@Test
public void testAnnotationNoRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Qux.Instance()));
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verifyZeroInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testAnnotationByteCodeRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Baz.Instance()));
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verify(classVisitor).visitAnnotation(Type.getDescriptor(Baz.class), true);
verifyZeroInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testAnnotationClassFileRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new QuxBaz.Instance()));
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verify(classVisitor).visitAnnotation(Type.getDescriptor(QuxBaz.class), false);
verifyZeroInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testSuperClassTypeAnnotationNoRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Empty());
when(simpleAnnotatedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Qux.Instance()));
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.Empty());
when(instrumentedType.getSuperClass()).thenReturn(simpleAnnotatedType);
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verifyZeroInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testSuperClassTypeAnnotationByteCodeRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Empty());
when(simpleAnnotatedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Baz.Instance()));
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.Empty());
when(instrumentedType.getSuperClass()).thenReturn(simpleAnnotatedType);
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verify(classVisitor).visitTypeAnnotation(TypeReference.newSuperTypeReference(-1).getValue(), null, Type.getDescriptor(Baz.class), true);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testSuperClassTypeAnnotationClassFileRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Empty());
when(simpleAnnotatedType.getDeclaredAnnotations())
.thenReturn(new AnnotationList.ForLoadedAnnotations(new QuxBaz.Instance()));
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.Empty());
when(instrumentedType.getSuperClass()).thenReturn(simpleAnnotatedType);
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verify(classVisitor).visitTypeAnnotation(TypeReference.newSuperTypeReference(-1).getValue(), null, Type.getDescriptor(QuxBaz.class), false);
verifyNoMoreInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testInterfaceTypeAnnotationNoRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Explicit(simpleAnnotatedType));
when(simpleAnnotatedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Qux.Instance()));
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.Empty());
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verifyZeroInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testInterfaceTypeAnnotationRuntimeRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Explicit(simpleAnnotatedType));
when(simpleAnnotatedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Baz.Instance()));
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.Empty());
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verify(classVisitor).visitTypeAnnotation(TypeReference.newSuperTypeReference(0).getValue(), null, Type.getDescriptor(Baz.class), true);
verifyNoMoreInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testInterfaceTypeAnnotations() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Explicit(simpleAnnotatedType));
when(simpleAnnotatedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new QuxBaz.Instance()));
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.Empty());
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verify(classVisitor).visitTypeAnnotation(TypeReference.newSuperTypeReference(0).getValue(), null, Type.getDescriptor(QuxBaz.class), false);
verifyNoMoreInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testTypeVariableTypeAnnotationNoRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Explicit(annotatedTypeVariable));
when(annotatedTypeVariable.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Qux.Instance()));
when(annotatedTypeVariableBound.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Qux.Instance()));
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.Empty());
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verifyZeroInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testTypeVariableTypeAnnotationRuntimeRetention() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Explicit(annotatedTypeVariable));
when(annotatedTypeVariable.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Baz.Instance()));
when(annotatedTypeVariableBound.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new Baz.Instance()));
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.Empty());
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verify(classVisitor).visitTypeAnnotation(TypeReference.newTypeParameterReference(TypeReference.CLASS_TYPE_PARAMETER, 0).getValue(),
null,
Type.getDescriptor(Baz.class),
true);
verify(classVisitor).visitTypeAnnotation(TypeReference.newTypeParameterBoundReference(TypeReference.CLASS_TYPE_PARAMETER_BOUND, 0, 0).getValue(),
null,
Type.getDescriptor(Baz.class),
true);
verifyNoMoreInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testTypeVariableTypeAnnotations() throws Exception {
when(instrumentedType.getTypeVariables()).thenReturn(new TypeList.Generic.Explicit(annotatedTypeVariable));
when(annotatedTypeVariable.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new QuxBaz.Instance()));
when(annotatedTypeVariableBound.getDeclaredAnnotations()).thenReturn(new AnnotationList.ForLoadedAnnotations(new QuxBaz.Instance()));
when(instrumentedType.getInterfaces()).thenReturn(new TypeList.Generic.Empty());
when(instrumentedType.getDeclaredAnnotations()).thenReturn(new AnnotationList.Empty());
TypeAttributeAppender.ForInstrumentedType.INSTANCE.apply(classVisitor, instrumentedType, annotationValueFilter);
verify(classVisitor).visitTypeAnnotation(TypeReference.newTypeParameterReference(TypeReference.CLASS_TYPE_PARAMETER, 0).getValue(),
null,
Type.getDescriptor(QuxBaz.class),
false);
verify(classVisitor).visitTypeAnnotation(TypeReference.newTypeParameterBoundReference(TypeReference.CLASS_TYPE_PARAMETER_BOUND, 0, 0).getValue(),
null,
Type.getDescriptor(QuxBaz.class),
false);
verifyNoMoreInteractions(classVisitor);
verify(instrumentedType).getDeclaredAnnotations();
verify(instrumentedType).getSuperClass();
verify(instrumentedType).getInterfaces();
verify(instrumentedType).getTypeVariables();
verifyNoMoreInteractions(instrumentedType);
}
@Test
public void testObjectProperties() throws Exception {
ObjectPropertyAssertion.of(TypeAttributeAppender.ForInstrumentedType.class).apply();
}
}