package org.netbeans.gradle.project.java.query; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.HashSet; import java.util.Set; import org.junit.ClassRule; import org.junit.Test; import org.netbeans.api.java.queries.SourceForBinaryQuery; import org.netbeans.gradle.model.java.JavaSourceSet; import org.netbeans.gradle.project.java.model.NbJavaModule; import org.netbeans.gradle.project.util.JavaModelTestUtils; import org.netbeans.gradle.project.util.NbSupplier; import org.netbeans.gradle.project.util.SafeTmpFolder; import org.netbeans.spi.java.queries.SourceForBinaryQueryImplementation2; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.util.Utilities; import static org.junit.Assert.*; public class GradleSourceForBinaryQueryTest { @ClassRule public static final SafeTmpFolder TMP_DIR_ROOT = new SafeTmpFolder(); public GradleSourceForBinaryQueryTest() { } private NbSupplier<NbJavaModule> testModule(File rootDir) throws IOException { final NbJavaModule module = JavaModelTestUtils.createModule(rootDir); return new NbSupplier<NbJavaModule>() { @Override public NbJavaModule get() { return module; } }; } private void verifyAllClassesDirHaveSources(SourceForBinaryQueryImplementation2 query, NbJavaModule module) throws IOException { for (JavaSourceSet sourceSet: module.getSources()) { try { verifyAllClassesDirHaveSources(query, sourceSet); } catch (Throwable ex) { throw new AssertionError("Test failed for source set: " + sourceSet.getName(), ex); } } } private static Set<File> toFiles(FileObject[] objs) { Set<File> result = new HashSet<>(); for (FileObject obj: objs) { File file = FileUtil.toFile(obj); if (file == null) { throw new AssertionError(obj.getPath() + " does not exist"); } result.add(file); } return result; } private void verifyAllClassesDirHaveSources(SourceForBinaryQueryImplementation2 query, JavaSourceSet sourceSet) throws IOException { Set<File> expectedSourceRoots = JavaModelTestUtils.getAllSourceDirs(sourceSet); File classesDir = sourceSet.getOutputDirs().getClassesDir(); verifySourceRoots(query, classesDir, expectedSourceRoots); verifySourceRoots(query, new File(classesDir, "subdir"), expectedSourceRoots); } private void verifySourceRoots( SourceForBinaryQueryImplementation2 query, File binaryDir, Set<File> expectedSourceRoots) throws IOException { URL binaryDirUrl = Utilities.toURI(binaryDir).toURL(); SourceForBinaryQuery.Result queryResult = query.findSourceRoots(binaryDirUrl); assertNotNull("result for classes dir", queryResult); assertEquals("srcDirs", expectedSourceRoots, toFiles(queryResult.getRoots())); SourceForBinaryQueryImplementation2.Result queryResult2 = query.findSourceRoots2(binaryDirUrl); assertNotNull("result2 for classes dir", queryResult2); assertEquals("srcDirs", expectedSourceRoots, toFiles(queryResult2.getRoots())); assertTrue("prefer sources", queryResult2.preferSources()); } @Test public void testSourcesForClassesDirs() throws IOException { File rootDir = TMP_DIR_ROOT.newFolder(); NbSupplier<NbJavaModule> moduleRef = testModule(rootDir); NbJavaModule module = moduleRef.get(); GradleSourceForBinaryQuery query = new GradleSourceForBinaryQuery(moduleRef); verifyAllClassesDirHaveSources(query, module); } private void verifyDoesNotHaveSourceRoot( SourceForBinaryQueryImplementation2 query, File dir) throws IOException { URL dirUrl = Utilities.toURI(dir).toURL(); SourceForBinaryQuery.Result queryResult = query.findSourceRoots(dirUrl); assertNull("result for classes dir", queryResult); SourceForBinaryQueryImplementation2.Result queryResult2 = query.findSourceRoots2(dirUrl); assertNull("result2 for classes dir", queryResult2); } @Test public void verifyDoesNotHaveSourceRoot() throws IOException { File rootDir = TMP_DIR_ROOT.newFolder(); NbSupplier<NbJavaModule> moduleRef = testModule(rootDir); NbJavaModule module = moduleRef.get(); GradleSourceForBinaryQuery query = new GradleSourceForBinaryQuery(moduleRef); verifyDoesNotHaveSourceRoot(query, module.getModuleDir()); } }