package jstest.object; import base.TestCounter; import common.expression.ExprTester; import common.expression.Dialect; import common.expression.Diff; import common.expression.Language; import jstest.JSExpressionEngine; import java.nio.file.Path; /** * Tester for * JavaScript Object Expressions * homework of Programming Paradigms course. * * @author Georgiy Korneev (kgeorgiy@kgeorgiy.info) */ public final class ObjectTester { public static final Dialect OBJECT = new Dialect("new Variable('%s')", "new Const(%s)", "new {op}({args})", ", "); private static final Diff DIFF = new Diff(2, new Dialect( "'%s'", "%s", (name, args) -> "%s.%s(%s)".formatted(args.get(0), name, String.join(", ", args.subList(1, args.size()))) )); private ObjectTester() { } public static ExprTester tester( final TestCounter counter, final Language language, final String toString, final String parse, final ExprTester.Generator spoiler, final ExprTester.Generator corruptor ) { final ExprTester tester = new ExprTester<>( counter, ExprTester.RANDOM_TESTS / TestCounter.DENOMINATOR, new JSExpressionEngine(Path.of("objectExpression.js"), ".evaluate", parse, toString), language, true, ExprTester.STANDARD_SPOILER.combine(spoiler), corruptor ); if (counter.mode() >= 2) { DIFF.diff(tester, true); } if (counter.mode() >= 3) { DIFF.simplify(tester); } return tester; } }