package jiff; import java.util.List; import org.junit.Test; import org.junit.Assert; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.node.*; public class JsonDiffTest { public static String esc(String s) { return s.replaceAll("\'", "\""); } @Test public void basicEq() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3]}"), esc("{'b':'x','a':1,'c':[2,3,1]}")); Assert.assertEquals(0, list.size()); } @Test public void missingFldExclusion() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); diff.setFilter(new ExcludeFieldsFilter("x")); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'x':1}"), esc("{'b':'x','a':1,'c':[2,3,1]}")); Assert.assertEquals(0, list.size()); list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3]}"), esc("{'b':'x','a':1,'c':[2,3,1],'x':1}")); Assert.assertEquals(0, list.size()); } @Test public void basicEq_orderSignificant_w_parents() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_SIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_PARENT_DIFFS); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3]}"), esc("{'b':'x','a':1,'c':[2,3,1]}")); Assert.assertEquals(5, list.size()); // 3 array elems, array, and the root } @Test public void basicDiff() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3]}"), esc("{'b':'y','a':1,'c':[2,3,1]}")); Assert.assertEquals(1, list.size()); Assert.assertEquals("b", list.get(0).getField()); } @Test public void basicDiff_order_insignificant_w_parents() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_PARENT_DIFFS); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3]}"), esc("{'b':'y','a':1,'c':[2,3,1]}")); Assert.assertEquals(2, list.size()); // b and the root } @Test public void moreFields() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3]}"), esc("{'b':'x','a':1,'c':[2,3,1],'d':1}")); Assert.assertEquals(1, list.size()); Assert.assertEquals("d", list.get(0).getField()); } @Test public void objectCmp() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':{'a':1,'b':2}}"), esc("{'b':'x','a':1,'c':[2,3,1],'d':{'a':1,'b':2}}")); Assert.assertEquals(0, list.size()); } @Test public void objectCmpArrOrder() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_SIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':{'a':1,'b':2}}"), esc("{'b':'x','a':1,'c':[2,3,1],'d':{'a':1,'b':2}}")); Assert.assertEquals(3, list.size()); } @Test public void arrCmp() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':[ {'a':1},{'b':2} ] }"), esc("{'b':'x','a':1,'c':[2,3,1],'d':[ {'b':2}, {'a':1} ] }")); Assert.assertEquals(0, list.size()); } @Test public void arrCmpOrder() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_SIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':[ {'a':1},{'b':2} ] }"), esc("{'b':'x','a':1,'c':[2,3,1],'d':[ {'b':2}, {'a':1} ] }")); Assert.assertEquals(7, list.size()); } @Test public void arrCmp_order_insignificant_w_parents() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_PARENT_DIFFS); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':[ {'a':1},{'b':2} ] }"), esc("{'b':'x','a':1,'c':[2,3,1],'d':[ {'b':3}, {'a':1} ] }")); Assert.assertEquals(4, list.size()); // d.0.b, d.0, d, root } @Test public void arrCmp_moreElems1() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':[ {'a':1},{'b':2},{'a':1} ] }"), esc("{'b':'x','a':1,'c':[2,3,1],'d':[ {'b':2}, {'a':1} ] }")); Assert.assertEquals(1, list.size()); } @Test public void arrCmp_moreElems1wnull() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); String s1 = esc("{'a':1,'b':'x','c':[1,2,3],'d':[ {'a':1},{'b':2},{'a':1} ] }"); String s2 = esc("{'b':null,'a':1,'c':[2,3,1],'d':[ {'b':2}, {'a':1} ] }"); List<JsonDelta> list = diff.computeDiff(s1, s2); System.out.println(s1); System.out.println(s2); System.out.println(list); Assert.assertEquals(2, list.size()); } @Test public void arrCmp_moreElems2() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':[ {'a':1},{'b':2} ] }"), esc("{'b':'x','a':1,'c':[2,3,1],'d':[ {'b':2}, {'a':1},{'a':1} ] }")); Assert.assertEquals(1, list.size()); } @Test public void arrCmp_moreElems2wnull() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':null,'c':[1,2,3],'d':[ {'a':1},{'b':2} ] }"), esc("{'b':'x','a':1,'c':[2,3,1],'d':[ {'b':2}, {'a':1},{'a':1} ] }")); Assert.assertEquals(2, list.size()); } @Test public void arrCmp_arrnull() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':null }"), esc("{'b':'x','a':1,'c':[2,3,1],'d':[ {'b':2}, {'a':1},{'a':1} ] }")); Assert.assertEquals(1, list.size()); } @Test public void arrCmp_2null() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':null }"), esc("{'b':'x','a':1,'c':[2,3,1],'d':null }")); Assert.assertEquals(0, list.size()); } @Test public void numericStringCmpTest() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'a':1 }"), esc("{'a':'1'}")); Assert.assertEquals(1, list.size()); } @Test public void intLongCmpTest() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); ObjectNode node1 = JsonNodeFactory.instance.objectNode(); node1.set("a", JsonNodeFactory.instance.numberNode(1)); ObjectNode node2 = JsonNodeFactory.instance.objectNode(); node2.set("a", JsonNodeFactory.instance.numberNode(1l)); List<JsonDelta> list = diff.computeDiff(node1, node2); Assert.assertEquals(0, list.size()); } @Test public void cmpWithFilter() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); diff.setFilter(new ExcludeFieldsFilter("d.*.c")); List<JsonDelta> list = diff.computeDiff(esc("{'a':1,'b':'x','c':[1,2,3],'d':[ {'b':2}, {'a':1}] }"), esc("{'b':'x','a':1,'c':[2,3,1],'d':[ {'b':2}, {'a':1,'c':3} ] }")); Assert.assertEquals(0, list.size()); } @Test public void cmpArraysOfObjectsOutput() throws Exception { JsonDiff diff = new JsonDiff(); diff.setOption(JsonDiff.Option.ARRAY_ORDER_INSIGNIFICANT); diff.setOption(JsonDiff.Option.RETURN_LEAVES_ONLY); List<JsonDelta> list = diff.computeDiff(esc("{'array': [{'a': 1, 'b': {'c': 1}}]}'"), esc("{'array': [{'a': 1, 'b': {'c': 2}}]}'")); Assert.assertEquals(2, list.size()); Assert.assertEquals("array.0({\"a\":1,\"b\":{\"c\":1}} != null)", list.get(0).toString()); Assert.assertEquals("array.0(null != {\"a\":1,\"b\":{\"c\":2}})", list.get(1).toString()); } }