package spoon.test.compilationunit; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import spoon.Launcher; import spoon.SpoonModelBuilder; import spoon.reflect.cu.CompilationUnit; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; import static org.junit.Assert.*; /** * Tests {@link CompilationUnit#getBinaryFiles()}. */ public class GetBinaryFilesTest { @Rule public TemporaryFolder tmpFolder = new TemporaryFolder(); @Test public void testSingleBinary() { final String input = "./src/test/resources/compilation/compilation-tests/IBar.java"; final Launcher launcher = new Launcher(); launcher.addInputResource(input); launcher.setBinaryOutputDirectory(tmpFolder.getRoot()); launcher.buildModel(); launcher.getModelBuilder().compile(SpoonModelBuilder.InputType.FILES); final Map<String, CompilationUnit> cus = launcher.getFactory().CompilationUnit().getMap(); assertEquals(1, cus.size()); final List<File> binaries = cus.values().iterator().next().getBinaryFiles(); assertEquals(1, binaries.size()); assertEquals("IBar.class", binaries.get(0).getName()); assertTrue(binaries.get(0).isFile()); } @Test public void testExistingButNotBuiltBinary() throws IOException { tmpFolder.newFolder("compilation"); tmpFolder.newFile("compilation/IBar$Test.class"); final String input = "./src/test/resources/compilation/compilation-tests/IBar.java"; final Launcher launcher = new Launcher(); launcher.addInputResource(input); launcher.setBinaryOutputDirectory(tmpFolder.getRoot()); launcher.buildModel(); launcher.getModelBuilder().compile(SpoonModelBuilder.InputType.FILES); final Map<String, CompilationUnit> cus = launcher.getFactory().CompilationUnit().getMap(); assertEquals(1, cus.size()); final List<File> binaries = cus.values().iterator().next().getBinaryFiles(); assertEquals(1, binaries.size()); assertEquals("IBar.class", binaries.get(0).getName()); assertTrue(binaries.get(0).isFile()); final File[] files = binaries.get(0).getParentFile().listFiles(); assertNotNull(files); assertEquals(2, files.length); assertTrue(files[0].getName().equals("IBar$Test.class") || files[1].getName().equals("IBar$Test.class")); } @Test public void testMultiClassInSingleFile() throws IOException { final String input = "./src/test/resources/compilation/compilation-tests/"; final Launcher launcher = new Launcher(); launcher.addInputResource(input); launcher.setBinaryOutputDirectory(tmpFolder.getRoot()); launcher.buildModel(); launcher.getModelBuilder().compile(SpoonModelBuilder.InputType.FILES); final Map<String, CompilationUnit> cus = launcher.getFactory().CompilationUnit().getMap(); assertEquals(2, cus.size()); final List<File> ibarBinaries = cus.get(new File(input, "IBar.java").getCanonicalFile().getAbsolutePath()).getBinaryFiles(); assertEquals(1, ibarBinaries.size()); assertEquals("IBar.class", ibarBinaries.get(0).getName()); assertTrue(ibarBinaries.get(0).isFile()); final List<File> barBinaries = cus.get(new File(input, "Bar.java").getCanonicalFile().getAbsolutePath()).getBinaryFiles(); assertEquals(2, barBinaries.size()); assertEquals("Bar.class", barBinaries.get(0).getName()); assertEquals("FooEx.class", barBinaries.get(1).getName()); assertTrue(barBinaries.get(0).isFile()); assertTrue(barBinaries.get(1).isFile()); } @Test public void testNestedTypes() throws IOException { final String input = "./src/test/java/spoon/test/imports/testclasses/internal/PublicInterface2.java"; final Launcher launcher = new Launcher(); launcher.addInputResource(input); launcher.setBinaryOutputDirectory(tmpFolder.getRoot()); launcher.buildModel(); launcher.getModelBuilder().compile(SpoonModelBuilder.InputType.FILES); final Map<String, CompilationUnit> cus = launcher.getFactory().CompilationUnit().getMap(); assertEquals(1, cus.size()); final List<File> binaries = cus.get(new File(input).getCanonicalFile().getAbsolutePath()).getBinaryFiles(); assertEquals(3, binaries.size()); assertEquals("PublicInterface2.class", binaries.get(0).getName()); assertEquals("PublicInterface2$NestedInterface.class", binaries.get(1).getName()); assertEquals("PublicInterface2$NestedClass.class", binaries.get(2).getName()); assertTrue(binaries.get(0).isFile()); assertTrue(binaries.get(1).isFile()); assertTrue(binaries.get(2).isFile()); } @Test public void testAnonymousClasses() throws IOException { final String input = "./src/test/java/spoon/test/secondaryclasses/AnonymousClass.java"; final Launcher launcher = new Launcher(); launcher.addInputResource(input); launcher.setBinaryOutputDirectory(tmpFolder.getRoot()); launcher.buildModel(); launcher.getModelBuilder().compile(SpoonModelBuilder.InputType.FILES); final Map<String, CompilationUnit> cus = launcher.getFactory().CompilationUnit().getMap(); assertEquals(1, cus.size()); final List<File> binaries = cus.get(new File(input).getCanonicalFile().getAbsolutePath()).getBinaryFiles(); assertEquals(4, binaries.size()); assertEquals("AnonymousClass.class", binaries.get(0).getName()); assertEquals("AnonymousClass$I.class", binaries.get(1).getName()); assertEquals("AnonymousClass$1.class", binaries.get(2).getName()); assertEquals("AnonymousClass$2.class", binaries.get(3).getName()); assertTrue(binaries.get(0).isFile()); assertTrue(binaries.get(1).isFile()); assertTrue(binaries.get(2).isFile()); assertTrue(binaries.get(3).isFile()); } }