package org.jooby.spec; import static org.junit.Assert.assertFalse; import java.io.File; import java.io.StringReader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import java.util.function.BiConsumer; import java.util.function.Consumer; import org.jooby.internal.spec.Context; import org.jooby.internal.spec.ContextImpl; import org.jooby.internal.spec.SourceResolver; import org.jooby.internal.spec.SourceResolverImpl; import org.jooby.internal.spec.TypeResolverImpl; import org.junit.After; import com.github.javaparser.JavaParser; import com.github.javaparser.ParseException; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.LambdaExpr; import com.github.javaparser.ast.expr.MethodCallExpr; import com.github.javaparser.ast.stmt.BlockStmt; import com.google.common.base.Joiner; public class ASTTest { public static interface Verifier { void verify(); } public static class Itr<K, V> implements Verifier { Iterator<Entry<K, V>> it; public Itr(final List<Entry<K, V>> source) { it = source.iterator(); } public Itr<K, V> script(final BiConsumer<MethodCallExpr, LambdaExpr> callback) { Entry<K, V> next = it.next(); callback.accept((MethodCallExpr) next.getKey(), (LambdaExpr) next.getValue()); return this; } public Itr<K, V> mvc(final BiConsumer<MethodDeclaration, BlockStmt> callback) { Entry<K, V> next = it.next(); callback.accept((MethodDeclaration) next.getKey(), (BlockStmt) next.getValue()); return this; } @Override public void verify() { assertFalse(it.hasNext()); } } public static class ParamItr implements Verifier { Iterator<RouteParam> it; public ParamItr(final List<RouteParam> source) { it = source.iterator(); } public ParamItr next(final Consumer<RouteParam> callback) { callback.accept(it.next()); return this; } @Override public void verify() { assertFalse(it.hasNext()); } } private List<Verifier> itrList = new ArrayList<>(); @After public void checkItr() { itrList.forEach(Verifier::verify); itrList.clear(); } public CompilationUnit source(final String... source) throws ParseException { StringReader reader = new StringReader(Joiner.on("\n").join(source)); return JavaParser.parse(reader, true); } public Expression expr(final String... source) throws ParseException { return JavaParser.parseExpression(Joiner.on("\n").join(source)); } public Context ctx() { SourceResolver sourceResolver = new SourceResolverImpl( new File(System.getProperty("user.dir")).toPath()); return new ContextImpl(new TypeResolverImpl(getClass().getClassLoader()), sourceResolver); } @SuppressWarnings({"rawtypes", "unchecked" }) public Itr<MethodCallExpr, LambdaExpr> routes(final List source) { Itr itr = new Itr<>(source); itrList.add(itr); return itr; } public ParamItr params(final List<RouteParam> source) { ParamItr itr = new ParamItr(source); itrList.add(itr); return itr; } }