package com.spotify.heroic.grammar; import org.mockito.Mockito; import java.util.function.BiFunction; import java.util.function.Function; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; public abstract class ExpressionTests { static <E extends Expression> void biFuncTest( Function<Context, E> a, Function<Context, E> b, Function<Context, E> e, BiFunction<E, E, E> op ) { final Context r = Mockito.mock(Context.class); final Context ac = Mockito.mock(Context.class); final Context bc = Mockito.mock(Context.class); doReturn(r).when(ac).join(bc); final E expected = e.apply(r); final E result = op.apply(a.apply(ac), b.apply(bc)); assertEquals(expected, result); verify(ac).join(bc); assertEquals(r, expected.getContext()); } static <E extends Expression> void uniFuncTest( Function<Context, E> a, Function<Context, E> e, Function<E, E> op ) { final Context c = Mockito.mock(Context.class); final E expected = e.apply(c); final E result = op.apply(a.apply(c)); assertEquals(expected, result); assertEquals(c, expected.getContext()); } static <E extends Expression> void visitorTest( E expr, BiFunction<Expression.Visitor<Void>, E, Void> verify ) { final Expression.Visitor<Void> visitor = Mockito.mock(Expression.Visitor.class); expr.visit(visitor); verify.apply(verify(visitor), expr); } }