package expression.parser; import base.ExtendedRandom; import base.TestCounter; import base.Tester; import base.Unit; import expression.ToMiniString; import expression.common.*; import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; import java.util.function.LongBinaryOperator; import java.util.function.LongToIntFunction; /** * @author Georgiy Korneev (kgeorgiy@kgeorgiy.info) */ public class ParserTester extends Tester { /* package-private */ final TestGeneratorBuilder generator; /* package-private */ final Renderer.Builder renderer; private final List> kinds = new ArrayList<>(); /* package-private */ final List parens = new ArrayList<>(List.of(NodeRenderer.paren("(", ")"))); public ParserTester(final TestCounter counter) { super(counter); renderer = Renderer.builder(c -> vars -> c); final ExtendedRandom random = counter.random(); generator = new TestGeneratorBuilder<>(random, random::nextInt, ParserTestSet.CONSTS, true); } public void unary(final String name, final int priority, final BiFunction op) { generator.unary(name, priority); renderer.unary(name, (unit, a) -> vars -> cast(op.apply(a.evaluate(vars), this::cast))); } public void unary(final String left, final String right, final BiFunction op) { generator.unary(left, right); renderer.unary(left, (unit, a) -> vars -> cast(op.apply(a.evaluate(vars), this::cast))); } public void binary(final String name, final int priority, final LongBinaryOperator op) { generator.binary(name, priority); renderer.binary(name, (unit, a, b) -> vars -> cast(op.applyAsLong(a.evaluate(vars), b.evaluate(vars)))); } void kind(final ExpressionKind kind, final ParserTestSet.Parser parser) { kinds.add(new ParserTestSet.ParsedKind<>(kind, parser)); } @Override public void test() { for (final ParserTestSet.ParsedKind kind : kinds) { counter.scope(kind.toString(), () -> test(kind)); } } protected void test(final ParserTestSet.ParsedKind kind) { new ParserTestSet<>(this, kind).test(); } public TestCounter getCounter() { return counter; } protected int cast(final long value) { return (int) value; } public void parens(final String... parens) { assert parens.length % 2 == 0 : "Parens should come in pairs"; for (int i = 0; i < parens.length; i += 2) { this.parens.add(NodeRenderer.paren(parens[i], parens[i + 1])); } } }