package cljtest.linear; import base.ExtendedRandom; import base.Selector; import base.TestCounter; import java.util.List; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.IntFunction; import java.util.function.Supplier; /** * Tests for * Linear Clojure * homework of Programming Paradigms course. * * @author Georgiy Korneev (kgeorgiy@kgeorgiy.info) */ public final class LinearTest { // === Selector public static final Selector SELECTOR = new Selector(LinearTester.class, "easy", "hard") .variant("Base", v(LinearTester::new)) ; private LinearTest() { } /* package-private*/ static Consumer v(final Function variant) { return counter -> variant.apply(counter).test(); } /* package-private*/ static Consumer variant(final List functions, final Consumer variant) { return v(counter -> new LinearTester(counter) { @Override protected void test(final int args) { variant.accept(new Test(this, functions, args)); } }); } /* package-private */ record Test( LinearTester test, List functions, int args ) { public void test(final Supplier generator) { test.test(args, functions, Item.same(generator)); } public void test(final IntFunction> generator) { test.test(args, functions, generator); } public boolean isHard() { return test.isHard(); } public void expectException(final int[] okDims, final int[][] failDims) { test.expectException(functions, okDims, failDims); } public ExtendedRandom random() { return test.random(); } } public static void main(final String... args) { SELECTOR.main(args); } }