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);
}
}