package io.takari.maven.plugins.sisu;
import static io.takari.maven.testing.TestResources.assertFileContents;
import static io.takari.maven.testing.TestResources.cp;
import java.io.File;
import java.io.IOException;
import org.apache.maven.project.MavenProject;
import org.junit.Rule;
import org.junit.Test;
import io.takari.incrementalbuild.maven.testing.IncrementalBuildRule;
import io.takari.maven.testing.TestProperties;
import io.takari.maven.testing.TestResources;
public class SisuIndexTest {
@Rule
public final TestResources resources = new TestResources();
@Rule
public final IncrementalBuildRule mojos = new IncrementalBuildRule();
public final TestProperties properties = new TestProperties();
@Test
public void testBasic() throws Exception {
File basedir = resources.getBasedir("sisu-index");
MavenProject project = mojos.readMavenProject(basedir);
addJavaxInjectDependency(project);
mojos.executeMojo(project, "compile");
mojos.executeMojo(project, "sisu-index");
mojos.assertBuildOutputs(basedir, "target/classes/META-INF/sisu/javax.inject.Named");
assertSisuIndex(basedir, "classes", "sisu.Basic");
// no-change rebuild
mojos.executeMojo(project, "compile");
mojos.executeMojo(project, "sisu-index");
mojos.assertCarriedOverOutputs(basedir, "target/classes/META-INF/sisu/javax.inject.Named");
assertSisuIndex(basedir, "classes", "sisu.Basic");
// introduce new type
cp(basedir, "src/main/java/sisu/Another.java-new", "src/main/java/sisu/Another.java");
mojos.executeMojo(project, "compile");
mojos.executeMojo(project, "sisu-index");
mojos.assertBuildOutputs(basedir, "target/classes/META-INF/sisu/javax.inject.Named");
assertSisuIndex(basedir, "classes", "sisu.Another", "sisu.Basic"); // note alphabetical order
// remove annotation from existing type
cp(basedir, "src/main/java/sisu/Basic.java-removed", "src/main/java/sisu/Basic.java");
mojos.executeMojo(project, "compile");
mojos.executeMojo(project, "sisu-index");
mojos.assertBuildOutputs(basedir, "target/classes/META-INF/sisu/javax.inject.Named");
assertSisuIndex(basedir, "classes", "sisu.Another");
}
@Test
public void testTestIndex() throws Exception {
File basedir = resources.getBasedir("sisu-index");
MavenProject project = mojos.readMavenProject(basedir);
addJavaxInjectDependency(project);
mojos.executeMojo(project, "testCompile");
mojos.executeMojo(project, "sisu-test-index");
mojos.assertBuildOutputs(basedir, "target/test-classes/META-INF/sisu/javax.inject.Named");
assertSisuIndex(basedir, "test-classes", "sisu.BasicTest");
}
private void addJavaxInjectDependency(MavenProject project) throws Exception {
mojos.newDependency(new File(properties.get("java-injext-jar"))).addTo(project);
}
private void assertSisuIndex(File basedir, String output, String... types) throws IOException {
StringBuilder expected = new StringBuilder();
for (String type : types) {
expected.append(type).append('\n');
}
assertFileContents(expected.toString(), basedir, "target/" + output + "/" + SisuIndexMojo.PATH_SISU_INDEX);
}
}