package knorxx.framework.generator.dependency; import com.google.common.base.Optional; import com.google.common.collect.Sets; import java.util.Set; import knorxx.framework.generator.BaseGeneratorTestWithMultipleClassLoader; import knorxx.framework.generator.MemorySourceJavaFile; import static org.junit.Assert.assertEquals; import org.junit.Test; /** * * @author sj */ public class JavaSourceDependencyCollectorTest extends BaseGeneratorTestWithMultipleClassLoader { public JavaSourceDependencyCollectorTest(ClassLoader currentClassLoader) { super(currentClassLoader); } @Test public void otherPackageExplicitImport() { test("dummy", Optional.of("java.awt.BorderLayout"), "BorderLayout.EAST", false, Sets.newHashSet("java.awt.BorderLayout")); } @Test public void samePackageImplicitImport() { test("java.awt", Optional.<String>absent(), "CardLayout.EAST", false, Sets.newHashSet("java.awt.CardLayout")); } @Test public void samePackageImplicitImportWithStaticInnerClass() { test("java.awt", Optional.<String>absent(), "CardLayout.EAST", true, Sets.newHashSet("java.awt.CardLayout")); } @Test public void fullNameReference() { test("dummy", Optional.<String>absent(), "java.awt.CardLayout.EAST", false, Sets.newHashSet("java.awt.CardLayout")); } @Test public void staticImport() { test("dummy", Optional.of("static java.awt.BorderLayout.*"), "EAST", false, Sets.newHashSet("java.awt.BorderLayout")); } @Test public void staticImportWithStaticInnerClass() { test("dummy", Optional.of("static java.awt.BorderLayout.*"), "EAST", true, Sets.newHashSet("java.awt.BorderLayout")); } @Test public void asteriskImport() { test("dummy", Optional.of("java.awt.*"), "BorderLayout.EAST", false, Sets.newHashSet("java.awt.BorderLayout")); } private void test(final String packageName, final Optional<String> importedClass, final String variableReference, boolean variableReferenceInStaticInnerClass, Set<String> expectedDependencies) { JavaSourceDependencyCollector dependencyCollector = new JavaSourceDependencyCollector(); String javaClassStart = "package " + packageName + ";\n" + (importedClass.isPresent() ? "import " + importedClass.get() + ";\n" : "") + "public class Dummy {\n"; String javaMethod = " public void test() {\n" + " System.out.println(" + variableReference + ");\n" + " }\n"; String javaClassEnd = "}"; String javaSource = javaClassStart + (variableReferenceInStaticInnerClass ? "public static class InnerDummy {\n" : "") + javaMethod + (variableReferenceInStaticInnerClass ? "}\n" : "") + javaClassEnd; Set<String> dependencies = dependencyCollector.collect(new MemorySourceJavaFile(javaSource), getCurrentClassLoader()); assertEquals(expectedDependencies, dependencies); } }