package io.gitlab.jfronny.muscript.json.test; import io.gitlab.jfronny.commons.serialize.databind.DatabindSerializer; import io.gitlab.jfronny.commons.serialize.databind.ObjectMapper; import io.gitlab.jfronny.commons.serialize.json.JsonTransport; import io.gitlab.jfronny.muscript.core.MuScriptVersion; import io.gitlab.jfronny.muscript.data.additional.DFinal; import io.gitlab.jfronny.muscript.data.additional.context.Scope; import io.gitlab.jfronny.muscript.data.additional.libs.StandardLib; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; import io.gitlab.jfronny.muscript.json.JsonLib; import io.gitlab.jfronny.muscript.parser.Parser; import org.junit.jupiter.api.Test; import java.io.IOException; import java.util.Arrays; import java.util.Map; import static io.gitlab.jfronny.muscript.ast.context.ExprUtils.asDynamic; import static io.gitlab.jfronny.muscript.data.additional.DFinal.of; import static io.gitlab.jfronny.muscript.runtime.Runtime.evaluate; import static org.junit.jupiter.api.Assertions.assertEquals; class JsonTest { @Test void simpleSerialize() throws IOException { assertEquals("\"Yes\"", serialize(of("Yes"))); assertEquals("{\"key\":3}", serialize(of(Map.of("key", of(3))))); assertEquals("[true,12,7]", serialize(of(of(true), of(12), of(7).asString()))); // string lens ignored } @Test void simpleDeserialize() throws IOException { assertEquals(of("Yes"), deserialize("\"Yes\"", Dynamic.class)); assertEquals(of(Map.of("key", of(3))), deserialize("{\"key\":3}", Dynamic.class)); assertEquals(of(of(true), of(12), of("7")), deserialize("[true,12,\"7\"]", Dynamic.class)); } @Test void muscriptDSL() { assertEquals("{\"key\":\"One\",\"key2\":3}", execute("{key = 'One', key2 = 3}::toJson()").asString().getValue()); assertEquals(of(Map.of("key", of(3), "value", of(false))), execute("args[0]::fromJson()", "{\"key\": 3, \"value\": false}")); } private Scope createScope() { return JsonLib.addTo(StandardLib.createScope(MuScriptVersion.DEFAULT)); } private Dynamic execute(String source, String... args) { return evaluate( asDynamic(Parser.parse(MuScriptVersion.DEFAULT, source)), createScope().set("args", of(Arrays.stream(args).map(DFinal::of).toList())) ); } private DatabindSerializer serializer = new DatabindSerializer(new JsonTransport(), new ObjectMapper()); private String serialize(Object object) throws IOException { return serializer.serialize(object); } private T deserialize(String source, Class klazz) throws IOException { return serializer.deserialize(source, klazz); } }