package org.trimou.gson.resolver; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import org.junit.Test; import org.trimou.AbstractTest; import org.trimou.Mustache; import org.trimou.MustacheExceptionAssert; import org.trimou.engine.MustacheEngine; import org.trimou.engine.MustacheEngineBuilder; import org.trimou.engine.interpolation.ThrowingExceptionMissingValueHandler; import org.trimou.engine.resolver.DummyResolutionContext; import org.trimou.engine.resolver.MapResolver; import org.trimou.engine.resolver.Placeholder; import org.trimou.engine.resolver.ReflectionResolver; import org.trimou.engine.resolver.ResolutionContext; import org.trimou.engine.resolver.ThisResolver; import org.trimou.exception.MustacheProblem; import org.trimou.gson.converter.GsonValueConverter; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonIOException; import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSyntaxException; /** * * @author Martin Kouba */ public class JsonElementResolverTest extends AbstractTest { @Test public void testResolution() { JsonElementResolver resolver = new JsonElementResolver(); ResolutionContext ctx = new DummyResolutionContext(); // Init the resolver MustacheEngineBuilder.newBuilder() .omitServiceLoaderConfigurationExtensions() .setProperty(JsonElementResolver.UNWRAP_JSON_PRIMITIVE_KEY, true) .setProperty(GsonValueConverter.ENABLED_KEY, false) .addResolver(resolver).build(); assertNull(resolver.resolve(null, "foo", ctx)); assertNull(resolver.resolve("bar", "foo", ctx)); assertEquals(Boolean.TRUE, resolver.resolve(new JsonPrimitive(true), "unwrapThis", ctx)); assertNull(resolver.resolve(new JsonPrimitive(true), "whatever", ctx)); assertEquals(Placeholder.NULL, resolver.resolve(JsonNull.INSTANCE, "unwrapThis", ctx)); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("foo", "bar"); jsonObject.addProperty("baz", true); assertEquals("bar", resolver.resolve(jsonObject, "foo", ctx)); assertEquals(Boolean.TRUE, resolver.resolve(jsonObject, "baz", ctx)); JsonArray jsonArray = new JsonArray(); jsonArray.add(new JsonPrimitive(true)); jsonArray.add(new JsonPrimitive(1)); assertEquals(true, resolver.resolve(jsonArray, "0", ctx)); assertEquals(1, resolver.resolve(jsonArray, "1", ctx)); } @Test public void testInterpolation() throws JsonIOException, JsonSyntaxException, FileNotFoundException { Mustache mustache = getEngine().compileMustache("json_element_test", "{{lastName}}|{{address.street}}|{{#phoneNumbers}}{{type}}{{#iterHasNext}},{{/iterHasNext}}{{/phoneNumbers}}|{{phoneNumbers.0.type}}"); assertEquals("Novy|Nova|home,mobile|home", mustache.render(loadJsonData())); } @Test public void testUnwrapJsonPrimitiveSetToFalse() throws JsonIOException, JsonSyntaxException, FileNotFoundException { MustacheEngine engine = MustacheEngineBuilder.newBuilder() .omitServiceLoaderConfigurationExtensions() .addResolver(new JsonElementResolver()) .addResolver(new ReflectionResolver()) .setProperty(JsonElementResolver.UNWRAP_JSON_PRIMITIVE_KEY, false) .setProperty(GsonValueConverter.ENABLED_KEY, false) .build(); Mustache mustache = engine.compileMustache( "json_element_unwrap_primitive_disabled_test", "{{firstName.asString.length}}|{{phoneNumbers.1.type.asString.toUpperCase}}"); assertEquals("3|MOBILE", mustache.render(loadJsonData())); // Test together with converter engine = MustacheEngineBuilder.newBuilder() .omitServiceLoaderConfigurationExtensions() .addResolver(new ReflectionResolver()) .addResolver(new JsonElementResolver()) .addValueConverter(new GsonValueConverter()) .setProperty(JsonElementResolver.UNWRAP_JSON_PRIMITIVE_KEY, false) .setProperty(GsonValueConverter.ENABLED_KEY, true).build(); mustache = engine.compileMustache( "json_element_unwrap_primitive_disabled_test2", "{{firstName}}|{{phoneNumbers.1.type}}|{{phoneNumbers.1.type.getAsString.toUpperCase}}"); assertEquals("Jan|mobile|MOBILE", mustache.render(loadJsonData())); } @Test public void testUnwrapJsonArrayElementAtIndex() throws JsonIOException, JsonSyntaxException, FileNotFoundException { // https://github.com/trimou/trimou/issues/26 String json = "{\"users\": [\"izeye\", \"always19\"]}"; String template = "One of users is {{users.0}}."; JsonElement jsonElement = new JsonParser().parse(json); MustacheEngine engine = getEngine(); Mustache mustache = engine.compileMustache("unwrap_array_index", template); assertEquals("One of users is izeye.", mustache.render(jsonElement)); } @Test public void testOutOfBoundIndexException() throws JsonIOException, JsonSyntaxException, FileNotFoundException { // https://github.com/trimou/trimou/issues/73 String json = "{\"numbers\": [1,2]}"; String template = "One of users is {{numbers.2}}."; final JsonElement jsonElement = new JsonParser().parse(json); MustacheEngine engine = MustacheEngineBuilder.newBuilder() .setMissingValueHandler( new ThrowingExceptionMissingValueHandler()) .omitServiceLoaderConfigurationExtensions() .setProperty(JsonElementResolver.UNWRAP_JSON_PRIMITIVE_KEY, true) .setProperty(GsonValueConverter.ENABLED_KEY, false) .addResolver(new ThisResolver()).addResolver(new MapResolver()) .addResolver(new JsonElementResolver()).build(); final Mustache mustache = engine.compileMustache("unwrap_array_index", template); MustacheExceptionAssert.expect(MustacheProblem.RENDER_NO_VALUE) .check(() -> mustache.render(jsonElement)); } @Test public void testUnwrapJsonArray() throws JsonIOException, JsonSyntaxException, FileNotFoundException { MustacheEngine engine = getEngine(); assertEquals("Jim,true,5", engine.compileMustache("json_unwrap_array_element_test", "{{#aliases}}{{unwrapThis}}{{#iterHasNext}},{{/iterHasNext}}{{/aliases}}") .render(loadJsonData())); assertEquals("Jim,true,5", engine.compileMustache("json_unwrap_array_element_test2", "{{#this}}{{unwrapThis}}{{#iterHasNext}},{{/iterHasNext}}{{/this}}") .render(loadJsonData("data_array.json"))); } @Test public void testUnwrapJsonNull() throws JsonIOException, JsonSyntaxException, FileNotFoundException { MustacheEngine engine = getEngine(); assertEquals("Jimtrue", engine.compileMustache("json_unwrap_null_test1", "{{#this}}{{unwrapThis}}{{/this}}") .render(loadJsonData("data_array_with_null.json"))); assertEquals("", engine.compileMustache("json_unwrap_null_test2", "{{firstName}}") .render(loadJsonData("data_array_with_null.json"))); } private MustacheEngine getEngine() { return MustacheEngineBuilder.newBuilder() .omitServiceLoaderConfigurationExtensions() .setProperty(JsonElementResolver.UNWRAP_JSON_PRIMITIVE_KEY, true) .setProperty(GsonValueConverter.ENABLED_KEY, false) .addResolver(new ThisResolver()).addResolver(new MapResolver()) .addResolver(new JsonElementResolver()).build(); } private JsonElement loadJsonData() throws JsonIOException, JsonSyntaxException, FileNotFoundException { return loadJsonData("data.json"); } private JsonElement loadJsonData(String fileName) throws JsonIOException, JsonSyntaxException, FileNotFoundException { return new JsonParser().parse( new FileReader(new File("src/test/resources/" + fileName))); } }