package net.karneim.pojobuilder.analysis.with; import net.karneim.pojobuilder.analysis.*; import net.karneim.pojobuilder.testenv.ProcessingEnvironmentRunner; import org.junit.Before; import org.junit.runner.RunWith; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.util.ElementFilter; import javax.lang.model.util.Elements; import java.util.List; /** * Holds common pattern around analysis test cases allowing them to focus on more literate tests */ @RunWith(ProcessingEnvironmentRunner.class) public abstract class AnalysisTestSupport { protected ProcessingEnvironment env; protected Elements elements; protected InputFactory inputFactory; protected JavaModelAnalyzer underTest; @Before public void init() { env = ProcessingEnvironmentRunner.getProcessingEnvironment(); elements = env.getElementUtils(); JavaModelAnalyzerUtil javaModelAnalyzerUtil = new JavaModelAnalyzerUtil(env.getElementUtils(), env.getTypeUtils()); inputFactory = new InputFactory(env.getTypeUtils(), new DirectivesFactory(env.getElementUtils(), env.getTypeUtils(), javaModelAnalyzerUtil)); underTest = new JavaModelAnalyzer(env.getElementUtils(), env.getTypeUtils(), new JavaModelAnalyzerUtil( env.getElementUtils(), env.getTypeUtils())); } /** * Pojobuilder Input for a given annotated pojo */ protected Input inputFor(Class<?> pojo) { String pojoClassname = pojo.getCanonicalName(); TypeElement pojoType = elements.getTypeElement(pojoClassname); return inputFactory.getInput(pojoType); } /** * Pojobuilder Input for a given annotated factory method */ protected Input inputFor(Class<?> factory, String methodName) { String factoryClassname = factory.getCanonicalName(); TypeElement factoryType = elements.getTypeElement(factoryClassname); List<ExecutableElement> methods = ElementFilter.methodsIn(elements.getAllMembers(factoryType)); ExecutableElement methodEl = getFirstMethodByName(methodName, methods); return inputFactory.getInput(methodEl); } private static ExecutableElement getFirstMethodByName(String name, List<ExecutableElement> methods) { for (ExecutableElement e : methods) { if (name.equals(e.getSimpleName().toString())) { return e; } } return null; } }