package com.github.jknack.handlebars; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.junit.Test; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.BigIntegerNode; import com.fasterxml.jackson.databind.node.BinaryNode; import com.fasterxml.jackson.databind.node.DecimalNode; import com.fasterxml.jackson.databind.node.LongNode; import com.fasterxml.jackson.databind.node.NullNode; import com.fasterxml.jackson.databind.node.POJONode; import com.github.jknack.handlebars.context.MapValueResolver; public class JsonNodeValueResolverTest { @Test public void resolveValueNode() throws IOException { Handlebars handlebars = new Handlebars(); Map<String, Object> root = new LinkedHashMap<String, Object>(); root.put("string", "abc"); root.put("int", 678); root.put("long", 6789L); root.put("float", 7.13f); root.put("double", 3.14d); root.put("bool", true); assertEquals("abc 678 6789 7.13 3.14 true", handlebars.compileInline("{{string}} {{int}} {{long}} {{float}} {{double}} {{bool}}") .apply(context(root))); } @Test public void nullMustBeResolvedToUnresolved() { assertEquals(ValueResolver.UNRESOLVED, JsonNodeValueResolver.INSTANCE.resolve(null, "nothing")); } @Test public void resolveBinaryNode() { String name = "binary"; byte[] result = new byte[]{1 }; JsonNode node = createMock(JsonNode.class); BinaryNode value = BinaryNode.valueOf(result); expect(node.get(name)).andReturn(value); Object[] mocks = {node }; replay(mocks); assertEquals(result, JsonNodeValueResolver.INSTANCE.resolve(node, name)); verify(mocks); } @Test public void resolveNullNode() { String name = "null"; Object result = ValueResolver.UNRESOLVED; JsonNode node = createMock(JsonNode.class); NullNode value = NullNode.instance; expect(node.get(name)).andReturn(value); Object[] mocks = {node }; replay(mocks); assertEquals(result, JsonNodeValueResolver.INSTANCE.resolve(node, name)); verify(mocks); } @Test public void resolveBigIntegerNode() { String name = "bigInt"; BigInteger result = BigInteger.ONE; JsonNode node = createMock(JsonNode.class); JsonNode value = BigIntegerNode.valueOf(result); expect(node.get(name)).andReturn(value); Object[] mocks = {node }; replay(mocks); assertEquals(result, JsonNodeValueResolver.INSTANCE.resolve(node, name)); verify(mocks); } @Test public void resolveDecimalNode() { String name = "decimal"; BigDecimal result = BigDecimal.TEN; JsonNode node = createMock(JsonNode.class); JsonNode value = DecimalNode.valueOf(result); expect(node.get(name)).andReturn(value); Object[] mocks = {node }; replay(mocks); assertEquals(result, JsonNodeValueResolver.INSTANCE.resolve(node, name)); verify(mocks); } @Test public void resolveLongNode() { String name = "long"; Long result = 678L; JsonNode node = createMock(JsonNode.class); JsonNode value = LongNode.valueOf(result); expect(node.get(name)).andReturn(value); Object[] mocks = {node }; replay(mocks); assertEquals(result, JsonNodeValueResolver.INSTANCE.resolve(node, name)); verify(mocks); } @Test public void resolvePojoNode() { String name = "pojo"; Object result = new Object(); JsonNode node = createMock(JsonNode.class); JsonNode value = new POJONode(result); expect(node.get(name)).andReturn(value); Object[] mocks = {node }; replay(mocks); assertEquals(result, JsonNodeValueResolver.INSTANCE.resolve(node, name)); verify(mocks); } @Test public void propertySet() throws IOException { Map<String, Object> root = new LinkedHashMap<String, Object>(); root.put("string", "abc"); root.put("int", 678); root.put("double", 3.14d); root.put("bool", true); assertEquals(root.entrySet(), JsonNodeValueResolver.INSTANCE.propertySet(node(root))); } @Test public void emptyPropertySet() throws IOException { Set<Entry<String, Object>> propertySet = JsonNodeValueResolver.INSTANCE .propertySet(new Object()); assertNotNull(propertySet); assertEquals(0, propertySet.size()); } @Test public void resolveObjectNode() throws IOException { Handlebars handlebars = new Handlebars(); Object item = new Object() { @SuppressWarnings("unused") public String getKey() { return "pojo"; } }; Map<String, Object> root = new HashMap<String, Object>(); root.put("pojo", item); assertEquals("pojo", handlebars.compileInline("{{pojo.key}}").apply(context(root))); } @Test public void resolveSimpleArrayNode() throws IOException { Handlebars handlebars = new Handlebars(); Map<String, Object> root = new HashMap<String, Object>(); root.put("array", new Object[]{1, 2, 3 }); assertEquals("123", handlebars.compileInline("{{array.[0]}}{{array.[1]}}{{array.[2]}}").apply(context(root))); assertEquals("123", handlebars.compileInline("{{#array}}{{this}}{{/array}}").apply(context(root))); } @Test public void resolveArrayNode() throws IOException { Handlebars handlebars = new Handlebars(); Object item = new Object() { @SuppressWarnings("unused") public String getKey() { return "pojo"; } }; Map<String, Object> root = new HashMap<String, Object>(); root.put("array", new Object[]{item }); assertEquals("pojo", handlebars.compileInline("{{array.[0].key}}").apply(context(root))); assertEquals("pojo", handlebars.compileInline("{{#array}}{{key}}{{/array}}").apply(context(root))); } public static JsonNode node(final Object object) throws IOException { ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readTree(mapper.writeValueAsString(object)); return node; } public static Context context(final Object object) throws IOException { return Context.newBuilder(node(object)) .resolver(MapValueResolver.INSTANCE, JsonNodeValueResolver.INSTANCE).build(); } }