package io.vertx.test.codegen; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.TypeElement; import javax.tools.DiagnosticCollector; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.Charset; import java.nio.file.Files; import java.util.Collections; import java.util.HashSet; import java.util.Locale; import java.util.Set; import java.util.function.BiConsumer; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * @author <a href="mailto:julien@julienviet.com">Julien Viet</a> */ public class Utils { static File assertMkDirs(File f) { assertTrue(f.mkdirs()); return f; } static void assertFile(String expected, File f) throws IOException { assertTrue(f.exists()); assertTrue(f.isFile()); String s = new String(Files.readAllBytes(f.toPath())); assertEquals(expected, s); } static <E> HashSet<E> set(E... elements) { HashSet<E> set = new HashSet<>(); Collections.addAll(set, elements); return set; } static void assertProcess(BiConsumer<ProcessingEnvironment, RoundEnvironment> test) { File f = null; try { f = Files.createTempFile("test", ".java").toFile(); try (PrintWriter writer = new PrintWriter(f)) { writer.print("class Empty {}"); } } catch (IOException e) { throw new AssertionError(e); } JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, Locale.getDefault(), Charset.defaultCharset()); JavaCompiler.CompilationTask task = compiler.getTask(new PrintWriter(System.out), fileManager, diagnostics, Collections.singletonList("-proc:only"), Collections.emptyList(), fileManager.getJavaFileObjectsFromFiles(Collections.singletonList(f))); task.setLocale(Locale.getDefault()); task.setProcessors(Collections.singleton(new AbstractProcessor() { @Override public Set<String> getSupportedAnnotationTypes() { return Collections.singleton("*"); } @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { test.accept(processingEnv, roundEnv); return true; } })); assertTrue(task.call()); } }