org.apache.maven.shared.dependency.analyzer.asm.DependencyVisitorTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.maven.shared.dependency.analyzer.asm.DependencyVisitorTest.java

Source

package org.apache.maven.shared.dependency.analyzer.asm;

/*
 * 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.
 */

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import junit.framework.TestCase;

import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;

/**
 * Tests <code>DependencyVisitor</code>.
 * 
 * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
 * @version $Id: DependencyVisitorTest.java 661727 2008-05-30 14:21:49Z bentmann $
 * @see DependencyVisitor
 */
public class DependencyVisitorTest extends TestCase {
    // TODO: finish tests

    // fields -----------------------------------------------------------------

    private DependencyVisitor visitor;

    // TestCase methods -------------------------------------------------------

    /*
     * @see junit.framework.TestCase#setUp()
     */
    protected void setUp() throws Exception {
        visitor = new DependencyVisitor();
    }

    // visit tests ------------------------------------------------------------

    public void testVisitWithDefaultSuperclass() {
        // class a.b.c
        visitor.visit(50, 0, "a/b/c", null, "java/lang/Object", null);

        assertClasses("java.lang.Object");
    }

    public void testVisitWithSuperclass() {
        // class a.b.c
        visitor.visit(50, 0, "a/b/c", null, "x/y/z", null);

        assertClasses("x.y.z");
    }

    public void testVisitWithInterface() {
        // class a.b.c implements x.y.z
        visitor.visit(50, 0, "a/b/c", null, "java/lang/Object", new String[] { "x/y/z" });

        assertClasses("java.lang.Object", "x.y.z");
    }

    public void testVisitWithInterfaces() {
        // class a.b.c implements p.q.r, x.y.z
        visitor.visit(50, 0, "a/b/c", null, "java/lang/Object", new String[] { "p/q/r", "x/y/z" });

        assertClasses("java.lang.Object", "p.q.r", "x.y.z");
    }

    public void testVisitWithUnboundedClassTypeParameter() {
        // class a.b.c<T>
        String signature = "<T:Ljava/lang/Object;>Ljava/lang/Object;";

        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", null);

        assertClasses("java.lang.Object");
    }

    public void testVisitWithBoundedClassTypeParameter() {
        // class a.b.c<T extends x.y.z>
        String signature = "<T:Lx/y/z;>Ljava/lang/Object;";

        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", null);

        assertClasses("java.lang.Object", "x.y.z");
    }

    public void testVisitWithBoundedClassTypeParameters() {
        // class a.b.c<K extends p.q.r, V extends x.y.z>
        String signature = "<K:Lp/q/r;V:Lx/y/z;>Ljava/lang/Object;";

        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", null);

        assertClasses("java.lang.Object", "p.q.r", "x.y.z");
    }

    public void testVisitWithGenericInterface() {
        // class a.b.c implements p.q.r<x.y.z>
        String signature = "Ljava/lang/Object;Lp/q/r<Lx/y/z;>;";

        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", new String[] { "p.q.r" });

        assertClasses("java.lang.Object", "p.q.r", "x.y.z");
    }

    public void testVisitWithInterfaceBound() {
        // class a.b.c<T> implements x.y.z<T>
        String signature = "<T:Ljava/lang/Object;>Ljava/lang/Object;Lx/y/z<TT;>;";

        visitor.visit(50, 0, "a/b/c", signature, "java/lang/Object", new String[] { "x.y.z" });

        assertClasses("java.lang.Object", "x.y.z");
    }

    // visitSource tests ------------------------------------------------------

    public void testVisitSource() {
        visitor.visitSource(null, null);

        assertNoClasses();
    }

    // visitOuterClass tests --------------------------------------------------

    public void testVisitOuterClass() {
        // class a.b.c
        // {
        //     class ...
        //     {
        //     }
        // }
        visitor.visitOuterClass("a/b/c", null, null);

        assertNoClasses();
    }

    public void testVisitOuterClassInMethod() {
        // class a.b.c
        // {
        //     x.y.z x(p.q.r p)
        //     {
        //         class ...
        //         {
        //         }
        //     }
        // }
        visitor.visitOuterClass("a/b/c", "x", "(Lp/q/r;)Lx/y/z;");

        assertNoClasses();
    }

    // visitAnnotation tests --------------------------------------------------

    public void testVisitAnnotation() {
        assertVisitor(visitor.visitAnnotation("La/b/c;", false));

        assertClasses("a.b.c");
    }

    public void testVisitAnnotationWithRuntimeVisibility() {
        assertVisitor(visitor.visitAnnotation("La/b/c;", true));

        assertClasses("a.b.c");
    }

    // visitAttribute tests ---------------------------------------------------

    public void testVisitAttribute() {
        visitor.visitAttribute(new MockAttribute("a"));

        assertNoClasses();
    }

    // visitInnerClass tests --------------------------------------------------

    public void testVisitInnerClass() {
        // TODO: ensure innerName is correct

        // class a.b.c { class x.y.z { } }
        visitor.visitInnerClass("x/y/z", "a/b/c", "z", 0);

        assertNoClasses();
    }

    public void testVisitInnerClassAnonymous() {
        // class a.b.c { new class x.y.z { } }
        visitor.visitInnerClass("x/y/z$1", "a/b/c", null, 0);

        assertNoClasses();
    }

    // visitField tests -------------------------------------------------------

    public void testVisitField() {
        // a.b.c a
        assertVisitor(visitor.visitField(0, "a", "La/b/c;", null, null));

        assertClasses("a.b.c");
    }

    // TODO: determine actual use of default values
    // public void testVisitFieldWithValue()
    // {
    // }

    public void testVisitFieldArray() {
        // a.b.c[] a
        assertVisitor(visitor.visitField(0, "a", "[La/b/c;", null, null));

        assertClasses("a.b.c");
    }

    public void testVisitFieldGeneric() {
        // a.b.c<x.y.z> a
        assertVisitor(visitor.visitField(0, "a", "La/b/c;", "La/b/c<Lx/y/z;>;", null));

        assertClasses("a.b.c", "x.y.z");
    }

    // visitMethod tests ------------------------------------------------------

    public void testVisitMethod() {
        // void a()
        assertVisitor(visitor.visitMethod(0, "a", "()V", null, null));

        assertNoClasses();
    }

    public void testVisitMethodWithPrimitiveArgument() {
        // void a(int)
        assertVisitor(visitor.visitMethod(0, "a", "(I)V", null, null));

        assertNoClasses();
    }

    public void testVisitMethodWithPrimitiveArrayArgument() {
        // void a(int[])
        assertVisitor(visitor.visitMethod(0, "a", "([I)V", null, null));

        assertNoClasses();
    }

    public void testVisitMethodWithObjectArgument() {
        // void a(a.b.c)
        assertVisitor(visitor.visitMethod(0, "a", "(La/b/c;)V", null, null));

        assertClasses("a.b.c");
    }

    public void testVisitMethodWithObjectArguments() {
        // void a(a.b.c, x.y.z)
        assertVisitor(visitor.visitMethod(0, "a", "(La/b/c;Lx/y/z;)V", null, null));

        assertClasses("a.b.c", "x.y.z");
    }

    public void testVisitMethodWithObjectArrayArgument() {
        // void a(a.b.c[])
        assertVisitor(visitor.visitMethod(0, "a", "([La/b/c;)V", null, null));

        assertClasses("a.b.c");
    }

    public void testVisitMethodWithGenericArgument() {
        // void a(a.b.c<x.y.z>)
        assertVisitor(visitor.visitMethod(0, "a", "(La/b/c;)V", "(La/b/c<Lx/y/z;>;)V", null));

        assertClasses("a.b.c", "x.y.z");
    }

    public void testVisitMethodWithPrimitiveReturnType() {
        // int a()
        assertVisitor(visitor.visitMethod(0, "a", "()I", null, null));

        assertNoClasses();
    }

    public void testVisitMethodWithPrimitiveArrayReturnType() {
        // int[] a()
        assertVisitor(visitor.visitMethod(0, "a", "()[I", null, null));

        assertNoClasses();
    }

    public void testVisitMethodWithObjectReturnType() {
        // a.b.c a()
        assertVisitor(visitor.visitMethod(0, "a", "()La/b/c;", null, null));

        assertClasses("a.b.c");
    }

    public void testVisitMethodWithObjectArrayReturnType() {
        // a.b.c[] a()
        assertVisitor(visitor.visitMethod(0, "a", "()[La/b/c;", null, null));

        assertClasses("a.b.c");
    }

    public void testVisitMethodWithException() {
        // void a() throws a.b.c
        assertVisitor(visitor.visitMethod(0, "a", "()V", null, new String[] { "a/b/c" }));

        assertClasses("a.b.c");
    }

    public void testVisitMethodWithExceptions() {
        // void a() throws a.b.c, x.y.z
        assertVisitor(visitor.visitMethod(0, "a", "()V", null, new String[] { "a/b/c", "x/y/z" }));

        assertClasses("a.b.c", "x.y.z");
    }

    // visitAnnotationDefault tests -------------------------------------------

    public void testVisitAnnotationDefault() {
        assertVisitor(visitor.visitAnnotationDefault());
        assertNoClasses();
    }

    // visitParameterAnnotation tests -------------------------------------------

    public void testVisitParameterAnnotation() {
        // @a.b.c
        assertVisitor(visitor.visitParameterAnnotation(0, "La/b/c;", false));

        assertClasses("a.b.c");
    }

    // visitCode tests --------------------------------------------------------

    public void testVisitCode() {
        visitor.visitCode();

        assertNoClasses();
    }

    // visitFrame tests -------------------------------------------------------

    public void testVisitFrame() {
        visitor.visitFrame(Opcodes.F_NEW, 0, new Object[0], 0, new Object[0]);

        assertNoClasses();
    }

    // visitInsn tests --------------------------------------------------------

    public void testVisitInsn() {
        visitor.visitInsn(Opcodes.NOP);

        assertNoClasses();
    }

    // visitIntInsn tests -----------------------------------------------------

    public void testVisitIntInsn() {
        visitor.visitIntInsn(Opcodes.BIPUSH, 0);

        assertNoClasses();
    }

    // visitVarInsn tests -----------------------------------------------------

    public void testVisitVarInsn() {
        visitor.visitVarInsn(Opcodes.ILOAD, 0);

        assertNoClasses();
    }

    // visitTypeInsn tests ----------------------------------------------------

    public void testVisitTypeInsn() {
        visitor.visitTypeInsn(Opcodes.NEW, "a/b/c");

        assertClasses("a.b.c");
    }

    // visitFieldInsn tests ---------------------------------------------------

    public void testVisitFieldInsnWithPrimitive() {
        visitor.visitFieldInsn(Opcodes.GETFIELD, "a/b/c", "x", "I");

        assertClasses("a.b.c");
    }

    public void testVisitFieldInsnWithObject() {
        visitor.visitFieldInsn(Opcodes.GETFIELD, "a/b/c", "x", "Lx/y/z;");

        assertClasses("a.b.c", "x.y.z");
    }

    // visitMethodInsn tests --------------------------------------------------

    public void testVisitMethodInsn() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()V");

        assertClasses("a.b.c");
    }

    public void testVisitMethodInsnWithPrimitiveArgument() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "(I)V");

        assertClasses("a.b.c");
    }

    public void testVisitMethodInsnWithPrimitiveArrayArgument() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "([I)V");

        assertClasses("a.b.c");
    }

    public void testVisitMethodInsnWithObjectArgument() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "(Lx/y/z;)V");

        assertClasses("a.b.c", "x.y.z");
    }

    public void testVisitMethodInsnWithObjectArguments() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "(Lp/q/r;Lx/y/z;)V");

        assertClasses("a.b.c", "p.q.r", "x.y.z");
    }

    public void testVisitMethodInsnWithObjectArrayArgument() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "([Lx/y/z;)V");

        assertClasses("a.b.c", "x.y.z");
    }

    public void testVisitMethodInsnWithPrimitiveReturnType() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()I");

        assertClasses("a.b.c");
    }

    public void testVisitMethodInsnWithPrimitiveArrayReturnType() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()[I");

        assertClasses("a.b.c");
    }

    public void testVisitMethodInsnWithObjectReturnType() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()Lx/y/z;");

        assertClasses("a.b.c", "x.y.z");
    }

    public void testVisitMethodInsnWithObjectArrayReturnType() {
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "a/b/c", "x", "()[Lx/y/z;");

        assertClasses("a.b.c", "x.y.z");
    }

    // visitJumpInsn tests ----------------------------------------------------

    public void testVisitJumpInsn() {
        visitor.visitJumpInsn(Opcodes.IFEQ, new Label());

        assertNoClasses();
    }

    // visitLabel tests -------------------------------------------------------

    public void testVisitLabel() {
        visitor.visitLabel(new Label());

        assertNoClasses();
    }

    // visitLdcInsn tests -----------------------------------------------------

    public void testVisitLdcInsnWithNonType() {
        visitor.visitLdcInsn("a");

        assertNoClasses();
    }

    public void testVisitLdcInsnWithPrimitiveType() {
        visitor.visitLdcInsn(Type.INT_TYPE);

        assertNoClasses();
    }

    public void testVisitLdcInsnWithObjectType() {
        visitor.visitLdcInsn(Type.getType("La/b/c;"));

        assertClasses("a.b.c");
    }

    // visitIincInsn tests ----------------------------------------------------

    public void testVisitIincInsn() {
        visitor.visitIincInsn(0, 1);

        assertNoClasses();
    }

    // visitTableSwitchInsn tests ---------------------------------------------

    public void testVisitTableSwitchInsn() {
        visitor.visitTableSwitchInsn(0, 1, new Label(), new Label[] { new Label() });

        assertNoClasses();
    }

    // visitLookupSwitchInsn tests --------------------------------------------

    public void testVisitLookupSwitchInsn() {
        visitor.visitLookupSwitchInsn(new Label(), new int[] { 0 }, new Label[] { new Label() });

        assertNoClasses();
    }

    // visitMultiANewArrayInsn tests ------------------------------------------

    public void testVisitMultiANewArrayInsnWithPrimitive() {
        visitor.visitMultiANewArrayInsn("I", 2);

        assertNoClasses();
    }

    public void testVisitMultiANewArrayInsnWithObject() {
        visitor.visitMultiANewArrayInsn("La/b/c;", 2);

        assertClasses("a.b.c");
    }

    // visitTryCatchBlock tests -----------------------------------------------

    public void testVisitTryCatchBlock() {
        visitor.visitTryCatchBlock(new Label(), new Label(), new Label(), "a/b/c");

        assertClasses("a.b.c");
    }

    public void testVisitTryCatchBlockForFinally() {
        visitor.visitTryCatchBlock(new Label(), new Label(), new Label(), null);

        assertNoClasses();
    }

    // visitLocalVariable tests -----------------------------------------------

    public void testVisitLocalVariableWithPrimitive() {
        visitor.visitLocalVariable("a", "I", null, new Label(), new Label(), 0);

        assertNoClasses();
    }

    public void testVisitLocalVariableWithPrimitiveArray() {
        visitor.visitLocalVariable("a", "[I", null, new Label(), new Label(), 0);

        assertNoClasses();
    }

    public void testVisitLocalVariableWithObject() {
        visitor.visitLocalVariable("a", "La/b/c;", null, new Label(), new Label(), 0);

        assertClasses("a.b.c");
    }

    public void testVisitLocalVariableWithObjectArray() {
        visitor.visitLocalVariable("a", "[La/b/c;", null, new Label(), new Label(), 0);

        assertClasses("a.b.c");
    }

    public void testVisitLocalVariableWithGenericObject() {
        visitor.visitLocalVariable("a", "La/b/c;", "La/b/c<Lx/y/z;>;", new Label(), new Label(), 0);

        assertClasses("a.b.c", "x.y.z");
    }

    public void testVisitLocalVariableWithGenericObjectArray() {
        visitor.visitLocalVariable("a", "La/b/c;", "[La/b/c<Lx/y/z;>;", new Label(), new Label(), 0);

        assertClasses("a.b.c", "x.y.z");
    }

    // visitLineNumber tests --------------------------------------------------

    public void testVisitLineNumber() {
        visitor.visitLineNumber(0, new Label());

        assertNoClasses();
    }

    // visitMaxs tests --------------------------------------------------------

    public void testVisitMaxs() {
        visitor.visitMaxs(0, 0);

        assertNoClasses();
    }

    // private methods --------------------------------------------------------

    private void assertVisitor(Object actualVisitor) {
        assertEquals(visitor, actualVisitor);
    }

    private void assertNoClasses() {
        assertClasses(Collections.EMPTY_SET);
    }

    private void assertClasses(String element) {
        assertClasses(Collections.singleton(element));
    }

    private void assertClasses(String expectedClass1, String expectedClass2) {
        assertClasses(new String[] { expectedClass1, expectedClass2 });
    }

    private void assertClasses(String expectedClass1, String expectedClass2, String expectedClass3) {
        assertClasses(new String[] { expectedClass1, expectedClass2, expectedClass3 });
    }

    private void assertClasses(String[] expectedClasses) {
        assertClasses(new HashSet(Arrays.asList(expectedClasses)));
    }

    private void assertClasses(Set expectedClasses) {
        assertEquals(expectedClasses, visitor.getClasses());
    }
}