ClassResolutionTest.java

package com.thoughtworks.qdox;

import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaMethod;
import com.thoughtworks.qdox.model.JavaParameter;
import com.thoughtworks.qdox.model.JavaType;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.io.StringReader;

public class ClassResolutionTest {

    @Test
    public void testNestedClassesResolvedAcrossPackageBoundaries()
    {

        // input sources
        String source1 =
            "" + "package package1;" + "public class Class1 {" + " public static final class NestedClass {}" + "}";

        String source2 =
            "" + "package package2;" + "import package1.Class1;" + "public class Class2 {"
                + " public void doStuff(Class1.NestedClass arg) {}" + "}";

        // parse
        JavaProjectBuilder builder = new JavaProjectBuilder();
        builder.addSource( new StringReader( source1 ) );
        builder.addSource( new StringReader( source2 ) );

        // find the parameter
        JavaClass class2 = builder.getClassByName( "package2.Class2" );
        JavaMethod method = class2.getMethods().get( 0 );
        JavaParameter parameter = method.getParameters().get( 0 );
        JavaType type = parameter.getType();

        // verify
        Assertions.assertEquals("package1.Class1$NestedClass", type.getBinaryName(), "Should include fully qualified name");
        Assertions.assertEquals("package1.Class1.NestedClass", type.getFullyQualifiedName(), "Should include fully qualified name");
    }

    @Test
    public void testSurvivesStaticImports()
    {

        // input sources
        String source =
            "" + "package package2;" + "import static package1.Class1.VALUE;" + "public class Class2 {"
                + " public void doStuff(String arg) {}" + "}";

        // parse
        JavaProjectBuilder builder = new JavaProjectBuilder();
        builder.addSource( new StringReader( source ) );

        // find the parameter
        JavaClass class2 = builder.getClassByName( "package2.Class2" );
        Assertions.assertNotNull(class2);
    }

    @Test
    public void testAnonymousClass()
    {
        JavaProjectBuilder builder = new JavaProjectBuilder();

        String source =
            "" + "public class AnimatedAlgorithm {\n"
                + "    private SelectionListener mySelectionListener = new SelectionListenerAdapter() {\n"
                + "        public void selectionEvent() {\n"
                + "            for (int i = 0; i < recalcers.size(); i++) {\n" + "              int something = 5;"
                + "            }\n" + "        }\n" + "    };\n" + "}";

        builder.addSource( new StringReader( source ) );
    }

    // from QDOX-86
    @Test
    public void testInnerClassInMethod()
    {
        JavaProjectBuilder builder = new JavaProjectBuilder();
        String source =
            "package some.pack;\n" + "class Test {\n" + "void some(Inner.Inner2 a) {}\n" + "static interface Inner {\n"
                + "static interface Inner2 { }\n" + "}\n" + "}";
        builder.addSource( new StringReader( source ) );
        JavaMethod method = builder.getClassByName( "some.pack.Test" ).getMethods().get( 0 );
        JavaParameter parameter = method.getParameters().get( 0 );
        Assertions.assertEquals("some.pack.Test$Inner$Inner2", parameter.getJavaClass().getBinaryName());
        Assertions.assertEquals("some.pack.Test$Inner$Inner2", parameter.getType().getBinaryName());
        Assertions.assertEquals("some.pack.Test$Inner$Inner2", parameter.getBinaryName());
        Assertions.assertEquals("some.pack.Test.Inner.Inner2", parameter.getJavaClass().getFullyQualifiedName());
        Assertions.assertEquals("some.pack.Test.Inner.Inner2", parameter.getType().getFullyQualifiedName());
        Assertions.assertEquals("some.pack.Test.Inner.Inner2", parameter.getFullyQualifiedName());
    }

    @Test
    public void testIsAWithPrimitives()
    {
        JavaProjectBuilder builder = new JavaProjectBuilder();
        String source = "class Foo { public byte[] bar() { return null; } }";
        builder.addSource( new StringReader( source ) );
        JavaMethod method = builder.getClassByName("Foo").getMethods().get(0);
        JavaClass returns = method.getReturns();
        Assertions.assertFalse(returns.isA(builder.getClassByName("java.lang.Object")));
    }
}