package jstest.example;
import base.Asserts;
import base.Selector;
import base.TestCounter;
import common.EngineException;
import jstest.JSEngine;
import java.nio.file.Path;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* Tests for Example JavaScript
* homework of Programming Paradigms course.
*
* @author Georgiy Korneev (kgeorgiy@kgeorgiy.info)
*/
public final class ExampleTest {
public static final Selector SELECTOR = new Selector(ExampleTest.class, "easy", "hard")
.variant("base", counter -> {
final Tester tester = new Tester(counter);
counter.scope("add", () -> IntStream.range(0, 10).forEachOrdered(i ->
IntStream.range(0, 10).forEachOrdered(j ->
tester.test("add(%d, %d)".formatted(i, j), Number.class, i + j)
)
));
counter.scope("hello", () -> Stream.of("from JS", "world").forEachOrdered(name ->
tester.test("hello(\"%s\")".formatted(name), String.class, "Hello, " + name + "!")
));
counter.scope("strict", () -> {
try {
tester.eval("checkStrict()", Void.class);
Asserts.assertTrue("Error expected", false);
} catch (EngineException e) {
System.err.println("Error message: " + e.getMessage());
final String expected = "ReferenceError: UNDEFINED is not defined";
Asserts.assertTrue("Error message", e.getMessage().contains(expected));
}
System.err.flush();
System.out.flush();
});
IntStream.rangeClosed(2016, 2025).forEachOrdered(year -> tester.check("check" + year));
});
private static final class Tester {
private final JSEngine engine;
private final TestCounter counter;
private Tester(final TestCounter counter) {
engine = new JSEngine(Path.of("example.js"));
this.counter = counter;
}
public void test(final String code, final Class type, final T expected) {
counter.test(() -> Asserts.assertEquals(code, expected, eval(code, type)));
}
public T eval(final String code, final Class type) {
return engine.eval(code, code, type).value();
}
private void check(final String function) {
counter.scope(function, () -> test(function + "()", Boolean.class, true));
}
}
private ExampleTest() {
}
public static void main(final String... args) {
SELECTOR.main(args);
}
}