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