java-commons/muscript/src/test/java/io/gitlab/jfronny/muscript/test/ClosureTest.java

49 lines
1.8 KiB
Java

package io.gitlab.jfronny.muscript.test;
import io.gitlab.jfronny.muscript.compiler.Parser;
import io.gitlab.jfronny.muscript.data.Scope;
import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal;
import org.junit.jupiter.api.Test;
import static io.gitlab.jfronny.muscript.test.util.MuTestUtil.makeArgs;
import static io.gitlab.jfronny.muscript.test.util.MuTestUtil.number;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ClosureTest {
@Test
void testScript() {
assertEquals(8, Parser.parseScript("function(2, 1) function(2, 2) function(2, 3)")
.run(makeArgs())
.asNumber()
.getValue());
}
@Test
void testClosure() {
assertEquals(2, number("{->2}()"));
assertEquals(2, number("{n->n}(2)"));
assertEquals(2, number("{n->n()}({->2})"));
assertEquals(2, number("{->num = 2 num = num * 2 num = num - 2}()"));
assertEquals(2, number("{->num = 2; num = num * 2; num = num - 2}()"));
}
@Test
void fizzbuzzInμScriptByEmbeddingADomainSpecificLanguage() {
var fn = Parser.parse("""
{ n ->
test = { b, s, o -> n % b == 0 ? { _ -> s || o('')} : o }
fizz = { o -> test(3, 'Fizz', o) }
buzz = { o -> test(5, 'Buzz', o) }
fizz(buzz({n -> n}))(n)
}
""")
.asDynamicExpr()
.get(new Scope())
.asCallable();
assertEquals("8", fn.call(DFinal.of(8)).asString().getValue());
assertEquals("Buzz", fn.call(DFinal.of(10)).asString().getValue());
assertEquals("Fizz", fn.call(DFinal.of(12)).asString().getValue());
assertEquals("FizzBuzz", fn.call(DFinal.of(15)).asString().getValue());
}
}