package org.netbeans.gradle.project.java.query;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import org.junit.ClassRule;
import org.junit.Test;
import org.netbeans.api.java.queries.BinaryForSourceQuery;
import org.netbeans.gradle.model.java.JavaOutputDirs;
import org.netbeans.gradle.model.java.JavaSourceGroup;
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.BinaryForSourceQueryImplementation;
import org.openide.util.Utilities;
import static org.junit.Assert.*;
import static org.netbeans.gradle.project.query.TestSourceQueryUtils.*;
public class GradleBinaryForSourceQueryTest {
@ClassRule
public static final SafeTmpFolder TMP_DIR_ROOT = new SafeTmpFolder();
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 verifyAllSourceDirsHaveClassesDir(BinaryForSourceQueryImplementation query, NbJavaModule module) throws IOException {
for (JavaSourceSet sourceSet: module.getSources()) {
try {
verifyAllSourceDirsHaveClassesDir(query, sourceSet);
} catch (Throwable ex) {
throw new AssertionError("Test failed for source set: " + sourceSet.getName(), ex);
}
}
}
private void verifyAllSourceDirsHaveClassesDir(final BinaryForSourceQueryImplementation query, JavaSourceSet sourceSet) throws IOException {
final JavaOutputDirs expectedOutput = sourceSet.getOutputDirs();
for (JavaSourceGroup sourceGroup: sourceSet.getSourceGroups()) {
for (File sourceRoot: sourceGroup.getSourceRoots()) {
verifyBinaryRoots(query, sourceRoot, expectedOutput);
if (sourceRoot.isDirectory()) {
Files.walkFileTree(sourceRoot.toPath(), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
verifyBinaryRoots(query, file.toFile(), expectedOutput);
return FileVisitResult.CONTINUE;
}
});
}
}
}
}
private void verifyBinaryRoots(
BinaryForSourceQueryImplementation query,
File sourcePath,
JavaOutputDirs expectedOutput) throws IOException {
URL sourceUrl = Utilities.toURI(sourcePath).toURL();
BinaryForSourceQuery.Result result = query.findBinaryRoots(sourceUrl);
if (result == null) {
throw new AssertionError("Missing result for " + sourcePath);
}
assertEquals("classes dir", expectedOutput.getClassesDir(), expectedSingleFile(result));
}
@Test
public void testOutputOfSourceFiles() throws IOException {
File rootDir = TMP_DIR_ROOT.newFolder();
NbSupplier<NbJavaModule> moduleRef = testModule(rootDir);
NbJavaModule module = moduleRef.get();
GradleBinaryForSourceQuery query = new GradleBinaryForSourceQuery(moduleRef);
verifyAllSourceDirsHaveClassesDir(query, module);
}
private void verifyDoesNotHaveBinaryRoot(
BinaryForSourceQueryImplementation query,
File dir) throws IOException {
URL dirUrl = Utilities.toURI(dir).toURL();
BinaryForSourceQuery.Result queryResult = query.findBinaryRoots(dirUrl);
assertNull("result of binary query", queryResult);
}
@Test
public void verifyDoesNotHaveBinaryRoot() throws IOException {
File rootDir = TMP_DIR_ROOT.newFolder();
NbSupplier<NbJavaModule> moduleRef = testModule(rootDir);
NbJavaModule module = moduleRef.get();
GradleBinaryForSourceQuery query = new GradleBinaryForSourceQuery(moduleRef);
verifyDoesNotHaveBinaryRoot(query, module.getModuleDir());
}
}