Package org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal

Source Code of org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.AnnotationPlaybackTestCase

/*
* 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);
    }

}
TOP

Related Classes of org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.AnnotationPlaybackTestCase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.