Files
paradigms/clojure/cljtest/linear/LinearTest.java
2026-04-13 20:12:01 +03:00

74 lines
2.1 KiB
Java

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
* <a href="https://www.kgeorgiy.info/courses/paradigms/homeworks.html#clojure-linear">Linear Clojure</a>
* homework of <a href="https://www.kgeorgiy.info/courses/paradigms">Programming Paradigms</a> 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<TestCounter> v(final Function<TestCounter, LinearTester> variant) {
return counter -> variant.apply(counter).test();
}
/* package-private*/ static Consumer<TestCounter> variant(final List<Item.Fun> functions, final Consumer<Test> 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<Item.Fun> functions,
int args
) {
public void test(final Supplier<Item> generator) {
test.test(args, functions, Item.same(generator));
}
public void test(final IntFunction<List<Item>> 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);
}
}