package spoon.test.pkg; import org.junit.Assert; import org.junit.Test; import spoon.Launcher; import spoon.OutputType; import spoon.SpoonModelBuilder; import spoon.compiler.Environment; import spoon.compiler.SpoonResourceHelper; import spoon.reflect.code.CtComment; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtPackage; import spoon.reflect.factory.Factory; import spoon.test.pkg.name.PackageTestClass; import spoon.testing.utils.ModelUtils; import java.io.File; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static spoon.testing.Assert.assertThat; import static spoon.testing.utils.ModelUtils.canBeBuilt; public class PackageTest { @Test public void testPackage() throws Exception { final String classFilePath = "./src/test/java/spoon/test/pkg/name/PackageTestClass.java"; final String packageInfoFilePath = "./src/test/java/spoon/test/pkg/package-info.java"; final File packageInfoFile = new File(packageInfoFilePath); Launcher spoon = new Launcher(); Factory factory = spoon.createFactory(); factory.getEnvironment().setCommentEnabled(true); spoon.createCompiler(factory, SpoonResourceHelper.resources(classFilePath, packageInfoFilePath)).build(); CtClass<?> clazz = factory.Class().get(PackageTestClass.class); Assert.assertEquals(PackageTestClass.class, clazz.getActualClass()); CtPackage ctPackage = clazz.getPackage(); Assert.assertEquals("spoon.test.pkg.name", ctPackage.getQualifiedName()); Assert.assertNull(ctPackage.getDocComment()); assertTrue(CtPackage.class.isAssignableFrom(ctPackage.getParent().getClass())); ctPackage = (CtPackage) ctPackage.getParent(); Assert.assertEquals("spoon.test.pkg", ctPackage.getQualifiedName()); Assert.assertNotNull(ctPackage.getPosition()); Assert.assertEquals(packageInfoFile.getCanonicalPath(), ctPackage.getPosition().getFile().getCanonicalPath()); Assert.assertEquals(1, ctPackage.getPosition().getLine()); Assert.assertEquals(1, ctPackage.getAnnotations().size()); Assert.assertEquals("This is test\nJavaDoc.", ctPackage.getComments().get(0).getContent()); CtAnnotation<?> annotation = ctPackage.getAnnotations().get(0); Assert.assertEquals(Deprecated.class, annotation.getAnnotationType().getActualClass()); Assert.assertEquals(packageInfoFile.getCanonicalPath(), annotation.getPosition().getFile().getCanonicalPath()); Assert.assertEquals(5, annotation.getPosition().getLine()); assertTrue(CtPackage.class.isAssignableFrom(ctPackage.getParent().getClass())); ctPackage = (CtPackage) ctPackage.getParent(); Assert.assertEquals("spoon.test", ctPackage.getQualifiedName()); Assert.assertNull(ctPackage.getDocComment()); } @Test public void testAnnotationOnPackage() throws Exception { Launcher launcher = new Launcher(); Factory factory = launcher.createFactory(); factory.getEnvironment().setDefaultFileGenerator(launcher.createOutputWriter(new File("./target/spooned/"), factory.getEnvironment())); factory.getEnvironment().setAutoImports(false); SpoonModelBuilder compiler = launcher.createCompiler(factory); compiler.addInputSource(new File("./src/test/java/spoon/test/pkg/testclasses/")); compiler.setSourceOutputDirectory(new File("./target/spooned/")); compiler.build(); compiler.generateProcessedSourceFiles(OutputType.CLASSES); final SpoonModelBuilder newCompiler = launcher.createCompiler(launcher.createFactory()); newCompiler.addInputSource(new File("./target/spooned/spoon/test/pkg/testclasses/")); try { assertTrue(newCompiler.build()); } catch (Exception ignore) { fail(); } } @Test public void testPrintPackageInfoWhenNothingInPackage() throws Exception { final Launcher launcher = new Launcher(); launcher.addInputResource("./src/test/java/spoon/test/pkg/testclasses/internal"); launcher.setSourceOutputDirectory("./target/spooned/package"); launcher.getEnvironment().setCommentEnabled(true); launcher.run(); final CtPackage aPackage = launcher.getFactory().Package().get("spoon.test.pkg.testclasses.internal"); assertEquals(1, aPackage.getAnnotations().size()); assertEquals(3, aPackage.getComments().size()); assertEquals(CtComment.CommentType.JAVADOC, aPackage.getComments().get(0).getCommentType()); assertEquals(CtComment.CommentType.BLOCK, aPackage.getComments().get(1).getCommentType()); assertEquals(CtComment.CommentType.INLINE, aPackage.getComments().get(2).getCommentType()); assertThat(aPackage).isEqualTo(ModelUtils.build(new File("./target/spooned/package/spoon/test/pkg/testclasses/internal")).Package().get("spoon.test.pkg.testclasses.internal")); } @Test public void testAnnotationInPackageInfoWhenTemplatesCompiled() throws Exception { final Launcher launcher = new Launcher(); Environment environment = launcher.getEnvironment(); environment.setAutoImports(true); environment.setCommentEnabled(true); launcher.addInputResource("./src/test/java/spoon/test/pkg/package-info.java"); launcher.setSourceOutputDirectory("./target/spooned/packageAndTemplate"); // SpoonResourceHelper.resources("./src/test/java/spoon/test/pkg/test_templates").forEach(r->launcher.addTemplateResource(r)); launcher.addTemplateResource(SpoonResourceHelper.createResource(new File("./src/test/java/spoon/test/pkg/test_templates/FakeTemplate.java"))); launcher.buildModel(); launcher.prettyprint(); canBeBuilt("./target/spooned/packageAndTemplate/spoon/test/pkg/package-info.java", 8); } }