package io.ebean.json; import io.ebean.text.json.EJson; import io.ebeaninternal.server.type.ModifyAwareMap; import io.ebeaninternal.server.type.ModifyAwareOwner; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; import java.nio.file.Files; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import static org.junit.Assert.*; public class EJsonTests { private static final Logger log = LoggerFactory.getLogger(EJsonTests.class); @Test public void test_map_simple() throws IOException { JsonFactory factory = new JsonFactory(); String jsonInput = "{\"name\":\"rob\",\"age\":12}"; JsonParser jsonParser = factory.createParser(jsonInput); Object result = EJson.parse(jsonParser); assertTrue(result instanceof Map); Map<?, ?> map = (Map<?, ?>) result; assertEquals("rob", map.get("name")); assertEquals(12L, map.get("age")); String jsonOutput = EJson.write(result); assertEquals(jsonInput, jsonOutput); } @Test public void write_withWriter_expect_writerNotClosed() throws IOException { File temp = Files.createTempFile("some", ".json").toFile(); FileWriter writer = new FileWriter(temp); Map<String,Object> map = new LinkedHashMap<>(); map.put("foo", "bar"); EJson.write(map, writer); writer.write("The end."); writer.flush(); writer.close(); log.info("write to file {}", temp.getAbsolutePath()); } @Test public void test_parseObject() throws IOException { JsonFactory factory = new JsonFactory(); String jsonInput = "{\"name\":\"rob\",\"age\":12}"; JsonParser jsonParser = factory.createParser(jsonInput); Map<String, Object> map = EJson.parseObject(jsonParser); assertNotNull(map); assertEquals("rob", map.get("name")); assertEquals(12L, map.get("age")); String jsonOutput = EJson.write(map); assertEquals(jsonInput, jsonOutput); } @Test public void test_parseObject_reader() throws IOException { String jsonInput = "{\"name\":\"rob\",\"age\":12}"; StringReader reader = new StringReader(jsonInput); Map<String, Object> map = EJson.parseObject(reader); assertNotNull(map); assertEquals("rob", map.get("name")); assertEquals(12L, map.get("age")); String jsonOutput = EJson.write(map); assertEquals(jsonInput, jsonOutput); } @Test public void test_map_nested() throws IOException { String jsonInput = "{\"name\":\"rob\",\"age\":12,\"org\":{\"name\":\"superorg\",\"rating\":4},\"nums\":[1,2,3]}"; Object result = EJson.parse(jsonInput); assertTrue(result instanceof Map); Map<?, ?> map = (Map<?, ?>) result; assertEquals(4, map.size()); assertEquals("rob", map.get("name")); assertEquals(12L, map.get("age")); Map<?, ?> org = (Map<?, ?>) map.get("org"); assertEquals("superorg", org.get("name")); assertEquals(4L, org.get("rating")); List<?> nums = (List<?>) map.get("nums"); assertEquals(3, nums.size()); assertEquals(1L, nums.get(0)); assertEquals(2L, nums.get(1)); assertEquals(3L, nums.get(2)); String jsonOutput = EJson.write(result); assertEquals(jsonInput, jsonOutput); } @Test public void test_map_withNull() throws IOException { String jsonInput = "{\"name\":\"rob\",\"age\":null}"; Object result = EJson.parse(jsonInput); assertTrue(result instanceof Map); Map<?, ?> map = (Map<?, ?>) result; assertEquals("rob", map.get("name")); assertNull(map.get("age")); String jsonOutput = EJson.write(result); assertEquals(jsonInput, jsonOutput); } @Test public void test_list_simple() throws IOException { String jsonInput = "[\"name\",\"rob\",12,13]"; List<Object> list = EJson.parseList(jsonInput); assertEquals(4, list.size()); assertEquals("name", list.get(0)); assertEquals("rob", list.get(1)); assertEquals(12L, list.get(2)); assertEquals(13L, list.get(3)); String jsonOutput = EJson.write(list); assertEquals(jsonInput, jsonOutput); } @Test public void test_list_reader() throws IOException { String jsonInput = "[\"name\",\"rob\",12,13]"; StringReader reader = new StringReader(jsonInput); List<Object> list = EJson.parseList(reader); assertEquals(4, list.size()); assertEquals("name", list.get(0)); assertEquals("rob", list.get(1)); assertEquals(12L, list.get(2)); assertEquals(13L, list.get(3)); String jsonOutput = EJson.write(list); assertEquals(jsonInput, jsonOutput); } @Test public void test_list_jsonParser() throws IOException { String jsonInput = "[\"name\",\"rob\",12,13]"; JsonFactory jsonFactory = new JsonFactory(); JsonParser parser = jsonFactory.createParser(jsonInput); List<Object> list = EJson.parseList(parser); assertEquals(4, list.size()); assertEquals("name", list.get(0)); assertEquals("rob", list.get(1)); assertEquals(12L, list.get(2)); assertEquals(13L, list.get(3)); String jsonOutput = EJson.write(list); assertEquals(jsonInput, jsonOutput); } @SuppressWarnings("unchecked") @Test public void test_list_ofMaps() throws IOException { String jsonInput = "[{\"name\":\"rob\",\"age\":12},{\"name\":\"mike\",\"age\":13}]"; Object result = EJson.parse(jsonInput); assertTrue(result instanceof List); List<Map<?, ?>> list = (List<Map<?, ?>>) result; assertEquals(2, list.size()); assertEquals("rob", list.get(0).get("name")); assertEquals(12L, list.get(0).get("age")); assertEquals("mike", list.get(1).get("name")); assertEquals(13L, list.get(1).get("age")); String jsonOutput = EJson.write(result); assertEquals(jsonInput, jsonOutput); } @Test public void test_partial_read() throws IOException { String jsonInput = "{\"name\":\"rob\",\"age\":null,\"friend\":{\"name\":\"mike\",\"age\":13}},some more json would follow..."; StringReader reader = new StringReader(jsonInput); Object result = EJson.parse(reader); assertTrue(result instanceof Map); Map<?, ?> map = (Map<?, ?>) result; assertEquals("rob", map.get("name")); assertNull(map.get("age")); Map<?, ?> friend = (Map<?, ?>) map.get("friend"); assertEquals("mike", friend.get("name")); assertEquals(13L, friend.get("age")); } @Test public void test_map_nested_modifyAware() throws IOException { String jsonInput = "{\"name\":\"rob\",\"age\":12,\"org\":{\"name\":\"superorg\",\"rating\":4},\"nums\":[1,2,3]}"; ModifyAwareMap<String, Object> map = (ModifyAwareMap<String, Object>) EJson.parseObject(jsonInput, true); assertFalse(map.isMarkedDirty()); assertEquals(4, map.size()); map.put("name", "jim"); assertTrue(map.isMarkedDirty()); } @SuppressWarnings("unchecked") @Test public void test_map_nested_modifyAwareNestedList() throws IOException { String jsonInput = "{\"name\":\"rob\",\"age\":12,\"org\":{\"name\":\"superorg\",\"rating\":4},\"nums\":[1,2,3]}"; ModifyAwareMap<String, Object> map = (ModifyAwareMap<String, Object>) EJson.parseObject(jsonInput, true); assertFalse(map.isMarkedDirty()); List<Object> nums = (List<Object>) map.get("nums"); nums.add(4); assertTrue(map.isMarkedDirty()); } @SuppressWarnings("unchecked") @Test public void test_map_nested_modifyAwareNestedObject() throws IOException { String jsonInput = "{\"name\":\"rob\",\"age\":12,\"org\":{\"name\":\"superorg\",\"rating\":4},\"nums\":[1,2,3]}"; ModifyAwareMap<String, Object> map = (ModifyAwareMap<String, Object>) EJson.parseObject(jsonInput, true); assertFalse(map.isMarkedDirty()); Map<String, Object> org = (Map<String, Object>) map.get("org"); org.put("extra", "foo"); assertTrue(map.isMarkedDirty()); } @Test public void parse_when_null() throws IOException { Object nothing = EJson.parse((String) null); assertNull(nothing); } @Test public void parseList_when_null() throws IOException { Object nothing = EJson.parseList((String) null); assertNull(nothing); } @Test public void parseSet_when_modifyAware() throws IOException { String jsonInput = "[{\"name\":\"rob\",\"age\":12},{\"name\":\"jim\",\"age\":42}]"; Set set = EJson.parseSet(jsonInput, true); ModifyAwareOwner modAware = (ModifyAwareOwner) set; assertFalse(modAware.isMarkedDirty()); Iterator iterator = set.iterator(); if (iterator.hasNext()) { Map map = (Map) iterator.next(); map.put("name", "stu"); assertTrue(modAware.isMarkedDirty()); } } }