package org.nutz.mapl; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.junit.Test; import org.nutz.json.Abc; import org.nutz.json.Json; import org.nutz.json.JsonFormat; import org.nutz.lang.Lang; import org.nutz.lang.Streams; import org.nutz.mapl.Mapl; /** * MapList测试 * * @author juqkai(juqkai@gmail.com) */ public class MaplTest { /** * 测试MAP提取 */ @Test public void cellTest() { Object dest = Json.fromJson(Streams.fileInr("org/nutz/json/person.txt")); assertEquals("dtri", Mapl.cell(dest, "company.name")); assertEquals("Dao", Mapl.cell(dest, "company.creator.name")); } /** * 测试提取LIST下的值 */ @Test public void cellArrayTest() { Object dest = Json.fromJson(Streams.fileInr("org/nutz/json/mateList.txt")); assertEquals("1", Mapl.cell(dest, "users[0].name")); assertEquals("2", Mapl.cell(dest, "people[1].name")); } /** * 测试提取LIST下的值 */ @Test public void cellArrayTest1() { Object dest = Json.fromJson(Streams.fileInr("org/nutz/json/mateList.txt")); assertEquals("1", Mapl.cell(dest, "users.0.name")); assertEquals("2", Mapl.cell(dest, "people.1.name")); } /** * 测试提取LIST */ @Test public void cellArrayTest2() { Object dest = Json.fromJson(Streams.fileInr("org/nutz/json/mateList.txt")); assertTrue(Mapl.cell(dest, "users") instanceof List); List<?> list = (List<?>) Mapl.cell(dest, "users"); assertEquals(2, list.size()); } /** * 测试根就是LIST的情况 */ @Test public void cellArrayTest3() { Object dest = Json.fromJson(Streams.fileInr("org/nutz/json/mateList.txt")); assertTrue(Mapl.cell(dest, "users") instanceof List); List<?> list = (List<?>) Mapl.cell(dest, "users"); assertEquals("1", Mapl.cell(list, "[0].name")); } /** * 包含过滤测试 */ @Test public void includeFilterConvertTest() { List<String> paths = new ArrayList<String>(); paths.add("users[].name"); Object dest = Json.fromJson(Streams.fileInr("org/nutz/json/mateList.txt")); Object obj = Mapl.includeFilter(dest, paths); assertNull(Mapl.cell(obj, "people")); assertEquals("1", Mapl.cell(obj, "users[0].name")); } /** * 排除过滤测试 */ @Test public void excludeFilterConvertTest() { List<String> paths = new ArrayList<String>(); paths.add("users[].name"); Object dest = Json.fromJson(Streams.fileInr("org/nutz/json/mateList.txt")); Object obj = Mapl.excludeFilter(dest, paths); assertNull(Mapl.cell(obj, "users[0].name")); assertEquals(12, Mapl.cell(obj, "users[0].age")); } /** * 排除过滤测试 */ @Test public void excludeFilterConvertTest2() { List<String> paths = new ArrayList<String>(); paths.add("users"); Object dest = Json.fromJson(Streams.fileInr("org/nutz/json/mateList.txt")); Object obj = Mapl.excludeFilter(dest, paths); assertNull(Mapl.cell(obj, "users")); assertEquals(12, Mapl.cell(obj, "people[0].age")); } /** * 对象转MapList测试 */ @Test public void objCompileTest() { Abc abc = new Abc(); abc.id = 1; abc.name = "jk"; Object obj = Mapl.toMaplist(abc); assertTrue(obj instanceof Map); assertEquals(1, Mapl.cell(obj, "id")); assertEquals("jk", Mapl.cell(obj, "name")); } /** * 对象转MapList测试 */ @Test public void objCompileArrayTest() { Abc abc = new Abc(); abc.id = 1; abc.name = "jk"; Abc b = new Abc(); b.id = 2; b.name = "juqkai"; List<Abc> list = new ArrayList<Abc>(); list.add(abc); list.add(b); Object obj = Mapl.toMaplist(list); assertTrue(obj instanceof List); assertEquals(1, Mapl.cell(obj, "[0].id")); assertEquals("juqkai", Mapl.cell(obj, "1.name")); } /** * 对象转MapList循环引用测试 */ @Test public void objCompileCircularReferenceTest() { A a = new A(); B b = new B(); a.b = b; b.a = a; Object obj = Mapl.toMaplist(a); assertTrue(obj instanceof Map); assertNotNull(Mapl.cell(obj, "b")); assertEquals("b", Mapl.cell(obj, "b.name")); assertEquals("a", Mapl.cell(obj, "b.a.name")); assertEquals(Mapl.cell(obj, "b.a.b"), Mapl.cell(obj, "b")); } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * 结构转换测试 */ /** * 简单转换 */ @Test public void structureConvertSimple() { String json = "{'name':'jk', 'age':12}"; String model = "{'name':'姓名', 'age':'年龄'}"; String dest = "{\"姓名\":\"jk\",\"年龄\":12}"; Object obj = Mapl.convert(Json.fromJson(Lang.inr(json)), Lang.inr(model)); assertEquals("jk", Mapl.cell(obj, "姓名")); assertEquals(12, Mapl.cell(obj, "年龄")); assertEquals(dest, Json.toJson(obj, new JsonFormat())); } /** * 数组转换 */ @Test public void structureConvertSimpleArray() { String json = "{'user':[{'name':'jk', 'age':12},{'name':'nutz', 'age':5}]}"; String model = "{'user':[{'name':'user[].姓名', 'age':'user[].年龄'}]}"; Object obj = Mapl.convert(Json.fromJson(Lang.inr(json)), Lang.inr(model)); assertEquals("jk", Mapl.cell(obj, "user[0].姓名")); assertEquals("nutz", Mapl.cell(obj, "user[1].姓名")); assertEquals(12, Mapl.cell(obj, "user[0].年龄")); assertEquals(5, Mapl.cell(obj, "user[1].年龄")); } /** * 多路径转换 */ @Test public void structureConvertMultiPath() { String json = "{'user':[{'name':'jk', 'age':12},{'name':'nutz', 'age':5}]}"; String model = "{'user':[{'name':['user[].姓名', 'people[].name'], 'age':['user[].年龄', 'people[].age']}]}"; Object obj = Mapl.convert(Json.fromJson(Lang.inr(json)), Lang.inr(model)); assertEquals("jk", Mapl.cell(obj, "user[0].姓名")); assertEquals("nutz", Mapl.cell(obj, "user[1].姓名")); assertEquals("jk", Mapl.cell(obj, "people[0].name")); assertEquals(5, Mapl.cell(obj, "people[1].age")); } /** * 根路径为Array的转换 */ @Test public void structureConvertRoot2Array() { String json = "[{'name':'jk', 'age':12},{'name':'nutz', 'age':5}]"; String model = "[{'name':['user[].姓名', 'people[].name'], 'age':['user[].年龄', 'people[].age']}]"; String dest = "{\"people\":[{\"age\":12,\"name\":\"jk\"}, {\"age\":5,\"name\":\"nutz\"}],\"user\":[{\"姓名\":\"jk\",\"年龄\":12}, {\"姓名\":\"nutz\",\"年龄\":5}]}"; Object obj = Mapl.convert(Json.fromJson(Lang.inr(json)), Lang.inr(model)); assertEquals("jk", Mapl.cell(obj, "user[0].姓名")); assertEquals("nutz", Mapl.cell(obj, "user[1].姓名")); assertEquals("jk", Mapl.cell(obj, "people[0].name")); assertEquals(5, Mapl.cell(obj, "people[1].age")); assertEquals(dest, Json.toJson(obj, new JsonFormat())); } /** * Array转换成根array结构 */ @Test public void structureConvertArray2Root() { String json = "{'user':[{'name':'jk', 'age':12},{'name':'nutz', 'age':5}]}"; String model = "{'user':[{'name':['[].name'], 'age':'[].age'}]}"; String dest = "[{\"age\":12,\"name\":\"jk\"}, {\"age\":5,\"name\":\"nutz\"}]"; Object obj = Mapl.convert(Json.fromJson(Lang.inr(json)), Lang.inr(model)); assertEquals("jk", Mapl.cell(obj, "[0].name")); assertEquals(5, Mapl.cell(obj, "[1].age")); assertEquals(dest, Json.toJson(obj, new JsonFormat())); } /** * 添加元素到mapl中 */ @Test public void addItemTest() { String json = "{'user':[{'name':'jk', 'age':12},{'name':'nutz', 'age':5}]}"; Object obj = Json.fromJson(json); Mapl.put(obj, "user[0].test", "test"); assertEquals("test", Mapl.cell(obj, "user[0].test")); } /** * 删除元素到mapl中 */ @Test public void delItemTest() { String json = "{'user':[{'name':'jk', 'age':12},{'name':'nutz', 'age':5}]}"; Object obj = Json.fromJson(json); Mapl.del(obj, "user[0].age"); assertNull(Mapl.cell(obj, "user[0].age")); assertEquals(1, ((Map<?, ?>) Mapl.cell(obj, "user[0]")).size()); } /** * 修改元素到mapl中 */ @Test public void updateItemTest() { String json = "{'user':[{'name':'jk', 'age':12},{'name':'nutz', 'age':5}]}"; Object obj = Json.fromJson(json); Mapl.update(obj, "user[0].name", "test"); assertEquals("test", Mapl.cell(obj, "user[0].name")); } @Test public void issue243Test() { String json = "{'user':[{'name':'jk', 'age':12},{'name':'nutz', 'age':5}]}"; Object obj = Json.fromJson(json); Object item = Mapl.cell(obj, "user[]"); assertFalse(item instanceof List); assertTrue(item instanceof Map); } @Test public void issue243Test2() { List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); HashMap<String, Object> map = new HashMap<String, Object>(); List<String> items = new LinkedList<String>(); items.add(new String("aa")); items.add(new String("bb")); map.put("id", 0); map.put("items", items); list.add(map); assertEquals(Mapl.cell(list, "[0].items.0"), "aa"); assertTrue(Mapl.cell(list, "[0].items[0]").equals("aa")); assertTrue(Mapl.cell(list, "[0].items[1]").equals("bb")); assertTrue(Mapl.cell(list, "[0].items[]").equals("aa")); assertTrue(Mapl.cell(list, "[0].items").equals(items)); } @Test public void testIssue322() { String json = "{name:'nutz', age:12, address:[{area:1,name:'abc'},{area:2,name:'123'}]}"; Object obj = Json.fromJson(json); Object newobj = Mapl.excludeFilter(obj, Lang.list("age", "address[].area")); JsonFormat jf = new JsonFormat(true); assertEquals("{\"address\":[{\"name\":\"abc\"}, {\"name\":\"123\"}],\"name\":\"nutz\"}", Json.toJson(newobj, jf)); } /** * 排除过滤测试,过滤多个项的内容 */ @Test public void excludeFilterConvertTest_MultiplePath1() { List<String> paths = new ArrayList<String>(); paths.add("users[].name"); paths.add("people[].age"); Object dest = Json.fromJson(Streams.fileInr("org/nutz/json/mateList.txt")); Object obj = Mapl.excludeFilter(dest, paths); assertNotNull(Mapl.cell(obj, "users")); assertEquals(12, Mapl.cell(obj, "users[0].age")); assertEquals("1", Mapl.cell(obj, "people[0].name")); } /** * 排除过滤测试,过滤多个项的内容。这是来自手册上的例子 */ @Test public void excludeFilterConvertTest_MultiplePath2() { String json = "{name:'nutz', age:12, address:[{area:1,name:'abc'},{area:2,name:'123'}]}"; Object obj = Json.fromJson(json); List<String> list = new ArrayList<String>(); list.add("age"); list.add("address[].area"); Object newobj = Mapl.excludeFilter(obj, list); assertNull(Mapl.cell(newobj, "age")); assertEquals("nutz", Mapl.cell(newobj, "name")); assertNull(Mapl.cell(newobj, "address[0].area")); assertEquals("abc", Mapl.cell(newobj, "address[0].name")); } }