package io.trygvis.container.compiler; import org.apache.commons.io.IOUtils; import org.testng.annotations.Test; import javax.tools.Diagnostic; import javax.tools.DiagnosticCollector; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; import java.io.IOException; import java.net.URL; import java.nio.charset.Charset; import java.util.Locale; import java.util.Map; import static java.util.Arrays.asList; import static org.fest.assertions.Assertions.assertThat; public class ProcessorTest { Charset UTF_8 = Charset.forName("utf-8"); @Test public void testBasic() throws Exception { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector collector = new DiagnosticCollector<>(); StandardJavaFileManager standardFileManager = compiler.getStandardFileManager(collector, Locale.ENGLISH, UTF_8); InMemoryJavaFileManager fileManager = new InMemoryJavaFileManager(standardFileManager); JavaSourceFromString person = loadCode("io.trygvis.persistence.test.Person"); JavaSourceFromString packageInfo = loadCode("io.trygvis.persistence.test.package-info"); JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, collector, null, null, asList(person, packageInfo)); task.setProcessors(asList(new MyProcessor())); Boolean result = task.call(); assertThat(fileManager.codes.keySet()).containsOnly( "io.trygvis.persistence.test.Daos", "io.trygvis.persistence.test.PersonDao"); for (Map.Entry entry : fileManager.codes.entrySet()) { System.out.println("=== " + entry.getKey()); System.out.println(entry.getValue()); } for (Diagnostic diagnostic : collector.getDiagnostics()) { System.out.println("diagnostic.source = ->" + diagnostic.getSource().getName() + "<-"); System.out.println("diagnostic.message = " + diagnostic.getMessage(Locale.ENGLISH)); } assertThat(collector.getDiagnostics()).isEmpty(); assertThat(result).isTrue(); fileManager.close(); } private JavaSourceFromString loadCode(String className) throws IOException { String path = "/" + className.replace('.', '/') + ".java"; URL resource = getClass().getResource(path); if(resource == null) { throw new RuntimeException("Could not load code for: " + path); } return new JavaSourceFromString(className, IOUtils.toString(resource, UTF_8)); } }