SourceFolderLibraryTest.java

package com.thoughtworks.qdox.library;

import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaModule;
import com.thoughtworks.qdox.model.JavaModuleDescriptor;
import com.thoughtworks.qdox.model.JavaModuleDescriptor.*;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.StringReader;
import java.util.Iterator;

public class SourceFolderLibraryTest
{
    private SourceFolderLibrary library = new SourceFolderLibrary( null );

    @Test
    public void testClassisFolder() {
        JavaModule directModule = library.addSourceFolder( new File("src/test/resources/qdox-140") ); 
        Assertions.assertEquals(null, directModule);
    }
    
    @Test
    public void testModuleInfo()
    {
        library.addSource( new StringReader("package V;\n"
                        + "public interface W {}") );
        library.addSource( new StringReader("package X;\n"
                        + "public interface Y {}") );
        library.addSource( new StringReader("package Z1;\n"
                        + "public class Z2 implements X.Y {}") );
        library.addSource( new StringReader("package Z3;\n"
                        + "public class Z4 implements X.Y {}") );
        
        JavaModule directModule = library.addSourceFolder( new File("src/test/resources/jigsaw/example1") );
        Assertions.assertEquals("M.N", directModule.getName());
        
        JavaModule module = library.getJavaModules().iterator().next();
        Assertions.assertEquals("M.N", module.getName());
        JavaModuleDescriptor descriptor = module.getDescriptor();
        Assertions.assertEquals(4, descriptor.getRequires().size());
        Iterator<JavaRequires> requiresIter = descriptor.getRequires().iterator();
        JavaRequires req = requiresIter.next();
        Assertions.assertEquals("A.B", req.getModule().getName());
        Assertions.assertEquals(false, req.isTransitive());
        Assertions.assertEquals(false, req.isStatic());
        req = requiresIter.next();
        Assertions.assertEquals("C.D", req.getModule().getName());
        Assertions.assertEquals(true, req.isTransitive());
        Assertions.assertEquals(false, req.isStatic());
        req = requiresIter.next();
        Assertions.assertEquals("E.F", req.getModule().getName());
        Assertions.assertEquals(false, req.isTransitive());
        Assertions.assertEquals(true, req.isStatic());
        req = requiresIter.next();
        Assertions.assertEquals("G.H", req.getModule().getName());
        Assertions.assertEquals(true, req.isTransitive());
        Assertions.assertEquals(true, req.isStatic());
        
        Assertions.assertEquals(2, module.getDescriptor().getExports().size());
        Iterator<JavaExports> exportsIter = descriptor.getExports().iterator();
        JavaExports exp = exportsIter.next();
        Assertions.assertEquals("P.Q", exp.getSource().getName());
        Assertions.assertArrayEquals(new String[0], exp.getTargets().toArray( new String[0] ));
        exp = exportsIter.next();
        Assertions.assertEquals("R.S", exp.getSource().getName());
        Assertions.assertEquals(2, exp.getTargets().size());
        Iterator<JavaModule> moduleIter = exp.getTargets().iterator();
        JavaModule mdl = moduleIter.next();
        Assertions.assertEquals("T1.U1", mdl.getName());
        mdl = moduleIter.next();
        Assertions.assertEquals("T2.U2", mdl.getName());
        
        Assertions.assertEquals(2, module.getDescriptor().getOpens().size());
        Iterator<JavaOpens> opensIter = descriptor.getOpens().iterator();
        JavaOpens opn = opensIter.next();
        Assertions.assertEquals("P.Q", opn.getSource().getName());
        Assertions.assertArrayEquals(new String[0], opn.getTargets().toArray( new String[0] ));
        opn = opensIter.next();
        Assertions.assertEquals("R.S", opn.getSource().getName());
        Assertions.assertEquals(2, opn.getTargets().size());
        moduleIter = opn.getTargets().iterator();
        mdl = moduleIter.next();
        Assertions.assertEquals("T1.U1", mdl.getName());
        mdl = moduleIter.next();
        Assertions.assertEquals("T2.U2", mdl.getName());
        
        Assertions.assertEquals(1, module.getDescriptor().getUses().size());
        Iterator<JavaUses> usesIter = descriptor.getUses().iterator();
        JavaUses uses = usesIter.next();
        Assertions.assertEquals("V.W", uses.getService().getFullyQualifiedName());
        
        Assertions.assertEquals(1, module.getDescriptor().getProvides().size());
        Iterator<JavaProvides> providesIter = descriptor.getProvides().iterator();
        JavaProvides provides = providesIter.next();
        Assertions.assertEquals("X.Y", provides.getService().getFullyQualifiedName());
        Iterator<JavaClass> classIter = provides.getProviders().iterator(); 
        JavaClass cls = classIter.next();
        Assertions.assertEquals("Z1.Z2", cls.getFullyQualifiedName());
        cls = classIter.next();
        Assertions.assertEquals("Z3.Z4", cls.getFullyQualifiedName());
    }

    @Test
    public void testHasClassReference() {
        library.addSourceFolder( new File("src/test/resources") );
        Assertions.assertFalse(library.hasClassReference( "Integer" ));
        Assertions.assertTrue(library.hasClassReference( "com.thoughtworks.qdox.testdata.DefaultCtor" ));
        // the following (non-existing) FQCN is called e.g. from TypeResolver
        Assertions.assertFalse(library.hasClassReference( "com.thoughtworks.qdox.testdata.DefaultCtor$Integer" ));
    }
}