From 42649e316017420ff9871744883b0596fc479510 Mon Sep 17 00:00:00 2001 From: JFronny Date: Fri, 20 Jan 2023 21:36:59 +0100 Subject: [PATCH] Fizzbuzz sample for closures --- .../jfronny/muscript/test/ClosureTest.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/ClosureTest.java b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/ClosureTest.java index 06f0fa4..ec42793 100644 --- a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/ClosureTest.java +++ b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/ClosureTest.java @@ -1,15 +1,21 @@ package io.gitlab.jfronny.muscript.test; import io.gitlab.jfronny.muscript.compiler.Parser; -import org.junit.jupiter.api.*; +import io.gitlab.jfronny.muscript.data.Scope; +import io.gitlab.jfronny.muscript.data.dynamic.DFinal; +import org.junit.jupiter.api.Test; -import static io.gitlab.jfronny.muscript.test.util.MuTestUtil.*; -import static org.junit.jupiter.api.Assertions.*; +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()); + assertEquals(8, Parser.parseScript("function(2, 1) function(2, 2) function(2, 3)") + .run(makeArgs()) + .asNumber() + .getValue()); } @Test @@ -20,4 +26,23 @@ class ClosureTest { 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()); + } }