| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal; |
| |
| import java.lang.annotation.Annotation; |
| |
| import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.AnnotationPlayback; |
| import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.types.AnnotationAnnotation; |
| import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.types.ArrayAnnotation; |
| import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.types.EnumAnnotation; |
| import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.types.InnerAnnotation; |
| import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.types.Mode; |
| import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.types.SimpleTypes; |
| import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.types.Support; |
| import org.mockito.Mock; |
| |
| import static org.mockito.Matchers.anyBoolean; |
| import static org.mockito.Matchers.anyString; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.verify; |
| import static org.mockito.Mockito.when; |
| |
| import org.mockito.MockitoAnnotations; |
| import org.objectweb.asm.AnnotationVisitor; |
| import org.objectweb.asm.ClassVisitor; |
| import org.objectweb.asm.Type; |
| |
| import junit.framework.TestCase; |
| |
| /** |
| * User: guillaume |
| * Date: 08/07/13 |
| * Time: 17:25 |
| */ |
| |
| public class AnnotationPlaybackTestCase extends TestCase { |
| |
| @Mock |
| private ClassVisitor visitor; |
| |
| @Mock |
| private AnnotationVisitor annotationVisitor; |
| |
| @Mock |
| private AnnotationVisitor arrayVisitor; |
| |
| @Mock |
| private AnnotationVisitor innerAnnotationVisitor; |
| |
| @Override |
| public void setUp() throws Exception { |
| MockitoAnnotations.initMocks(this); |
| } |
| |
| public void testSimpleValuesPlayback() throws Exception { |
| |
| when(visitor.visitAnnotation(anyString(), anyBoolean())).thenReturn(annotationVisitor); |
| |
| AnnotationPlayback playback = new AnnotationPlayback(find(SimpleTypes.class)); |
| playback.accept(visitor); |
| |
| verify(visitor).visitAnnotation(Type.getType(SimpleTypes.class).getDescriptor(), |
| true); |
| verify(annotationVisitor).visitEnd(); |
| |
| // Verify simple mono-valued attributes |
| verify(annotationVisitor).visit("aByte", Byte.valueOf((byte) 42)); |
| verify(annotationVisitor).visit("aBoolean", Boolean.TRUE); |
| verify(annotationVisitor).visit("anInt", Integer.valueOf(42)); |
| verify(annotationVisitor).visit("aLong", Long.valueOf(42)); |
| verify(annotationVisitor).visit("aShort", Short.valueOf((short) 42)); |
| verify(annotationVisitor).visit("aFloat", Float.valueOf(42)); |
| verify(annotationVisitor).visit("aDouble", Double.valueOf(42)); |
| verify(annotationVisitor).visit("aChar", Character.valueOf('a')); |
| |
| // Verify String & Class |
| verify(annotationVisitor).visit("aString", "42"); |
| verify(annotationVisitor).visit("aClass", Type.getType(String.class)); |
| |
| // Verify array os simple types |
| verify(annotationVisitor).visit("arrayOfByte", new byte[] {(byte) 42}); |
| verify(annotationVisitor).visit("arrayOfBoolean", new boolean[] {true, true}); |
| verify(annotationVisitor).visit("arrayOfInt", new int[] {42}); |
| verify(annotationVisitor).visit("arrayOfLong", new long[] {42}); |
| verify(annotationVisitor).visit("arrayOfShort", new short[] {42}); |
| verify(annotationVisitor).visit("arrayOfFloat", new float[] {42}); |
| verify(annotationVisitor).visit("arrayOfDouble", new double[] {}); |
| verify(annotationVisitor).visit("arrayOfChar", new char[] {'a', 'b', 'c'}); |
| |
| } |
| |
| public void testEnumValuesPlayback() throws Exception { |
| |
| when(visitor.visitAnnotation(anyString(), anyBoolean())).thenReturn(annotationVisitor); |
| |
| AnnotationPlayback playback = new AnnotationPlayback(find(EnumAnnotation.class)); |
| playback.accept(visitor); |
| |
| verify(visitor).visitAnnotation(Type.getType(EnumAnnotation.class).getDescriptor(), |
| true); |
| verify(annotationVisitor).visitEnd(); |
| |
| String desc = Type.getType(Mode.class).getDescriptor(); |
| verify(annotationVisitor).visitEnum("noDefault", desc, "IN"); |
| verify(annotationVisitor).visitEnum("withDefault", desc, "IN"); |
| verify(annotationVisitor).visitEnum("withDefaultOverridden", desc, "IN"); |
| } |
| |
| public void testArrayValuesPlayback() throws Exception { |
| |
| AnnotationVisitor arrayOfString = mock(AnnotationVisitor.class); |
| AnnotationVisitor arrayOfEnum = mock(AnnotationVisitor.class); |
| AnnotationVisitor arrayOfClass = mock(AnnotationVisitor.class); |
| AnnotationVisitor arrayOfAnnotation = mock(AnnotationVisitor.class); |
| AnnotationVisitor emptyArray = mock(AnnotationVisitor.class); |
| |
| when(visitor.visitAnnotation(anyString(), anyBoolean())).thenReturn(annotationVisitor); |
| when(annotationVisitor.visitArray("arrayOfString")).thenReturn(arrayOfString); |
| when(annotationVisitor.visitArray("arrayOfEnum")).thenReturn(arrayOfEnum); |
| when(annotationVisitor.visitArray("arrayOfClass")).thenReturn(arrayOfClass); |
| when(annotationVisitor.visitArray("arrayOfAnnotation")).thenReturn(arrayOfAnnotation); |
| when(annotationVisitor.visitArray("emptyArray")).thenReturn(emptyArray); |
| |
| AnnotationPlayback playback = new AnnotationPlayback(find(ArrayAnnotation.class)); |
| playback.accept(visitor); |
| |
| verify(visitor).visitAnnotation(Type.getType(ArrayAnnotation.class).getDescriptor(), |
| true); |
| verify(annotationVisitor).visitEnd(); |
| |
| String desc = Type.getType(Mode.class).getDescriptor(); |
| |
| verify(arrayOfString).visit(null, "42"); |
| verify(arrayOfString).visit(null, "43"); |
| verify(arrayOfString).visitEnd(); |
| |
| verify(arrayOfEnum).visitEnum(null, desc, "IN"); |
| verify(arrayOfEnum).visitEnd(); |
| |
| verify(arrayOfClass).visit(null, Type.getType(Object.class)); |
| verify(arrayOfClass).visitEnd(); |
| |
| verify(arrayOfAnnotation).visitAnnotation(null, Type.getType(InnerAnnotation.class).getDescriptor()); |
| verify(arrayOfAnnotation).visitEnd(); |
| |
| verify(emptyArray).visitEnd(); |
| |
| } |
| |
| |
| public void testAnnotationValuesPlayback() throws Exception { |
| |
| when(visitor.visitAnnotation(anyString(), anyBoolean())).thenReturn(annotationVisitor); |
| when(annotationVisitor.visitAnnotation("value", Type.getType(InnerAnnotation.class).getDescriptor())) |
| .thenReturn(innerAnnotationVisitor); |
| when(innerAnnotationVisitor.visitArray("arrayOfClass")) |
| .thenReturn(arrayVisitor); |
| |
| AnnotationPlayback playback = new AnnotationPlayback(find(AnnotationAnnotation.class)); |
| playback.accept(visitor); |
| |
| verify(visitor).visitAnnotation(Type.getType(AnnotationAnnotation.class).getDescriptor(), |
| true); |
| verify(annotationVisitor).visitEnd(); |
| |
| String desc = Type.getType(Mode.class).getDescriptor(); |
| verify(innerAnnotationVisitor).visit("aString", "42"); |
| verify(innerAnnotationVisitor).visitEnum("modeEnum", desc, "IN"); |
| verify(innerAnnotationVisitor).visitEnd(); |
| |
| verify(arrayVisitor).visit(null, Type.getType(Object.class)); |
| verify(arrayVisitor).visitEnd(); |
| |
| } |
| private Annotation find(final Class<? extends Annotation> type) { |
| return Support.class.getAnnotation(type); |
| } |
| |
| } |