package permafrost.tundra.data; import com.wm.data.IData; import com.wm.data.IDataCursor; import com.wm.data.IDataFactory; import com.wm.data.IDataUtil; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import permafrost.tundra.io.InputStreamHelper; import permafrost.tundra.lang.Sanitization; import permafrost.tundra.xml.dom.DocumentHelper; import permafrost.tundra.xml.sax.InputSourceHelper; import java.util.regex.Pattern; public class IDataHelperTest { IData document = IDataFactory.create(); @Before public void setUp() throws Exception { IDataCursor cursor = document.getCursor(); IDataUtil.put(cursor, "a", "1"); IDataUtil.put(cursor, "b", "2"); IDataUtil.put(cursor, "c", "3"); cursor.destroy(); } @Test public void testGetAbsoluteXPath() throws Exception { String xmldata = "<test><a>1</a><b>2</b></test>"; IDataMap pipeline = new IDataMap(); pipeline.put("node", DocumentHelper.parse(InputSourceHelper.normalize(InputStreamHelper.normalize(xmldata)))); Object value = IDataHelper.get(pipeline, new IDataMap(), "/node/test/a"); assertEquals("1", value); } @Test public void testGetRelativeXPath() throws Exception { String xmldata = "<test><a>1</a><b>2</b></test>"; IDataMap scope = new IDataMap(); scope.put("node", DocumentHelper.parse(InputSourceHelper.normalize(InputStreamHelper.normalize(xmldata)))); Object value = IDataHelper.get(null, scope, "node/test/a"); assertEquals("1", value); } @Test public void testGetKeys() throws Exception { String[] expected = { "a", "b", "c" }; assertArrayEquals(expected, IDataHelper.getKeys(document)); } @Test public void testGetKeysWithNullIData() throws Exception { String[] expected = new String[0]; assertArrayEquals(expected, IDataHelper.getKeys((IData)null)); } @Test public void testGetKeysWithNullPatternString() throws Exception { String[] expected = { "a", "b" }; String patternString = "[ab]"; assertArrayEquals(expected, IDataHelper.getKeys(document, patternString)); } @Test public void testGetKeysWithPatternString() throws Exception { String[] expected = { "a", "b", "c" }; String patternString = null; assertArrayEquals(expected, IDataHelper.getKeys(document, patternString)); } @Test public void testGetKeysWithPattern() throws Exception { String[] expected = { "a", "b" }; Pattern pattern = Pattern.compile("[ab]"); assertArrayEquals(expected, IDataHelper.getKeys(document, pattern)); } @Test public void testGetKeysWithNullPattern() throws Exception { String[] expected = { "a", "b", "c" }; Pattern pattern = null; assertArrayEquals(expected, IDataHelper.getKeys(document, pattern)); } @Test public void testGetValues() throws Exception { String[] expected = { "1", "2", "3" }; assertArrayEquals(expected, IDataHelper.getValues(document)); } @Test public void testGetValuesWithNullArgument() throws Exception { String[] expected = new String[0]; assertArrayEquals(expected, IDataHelper.getValues(null)); } @Test public void testMergeWithNullArgument() throws Exception { IData merge = IDataHelper.merge((IData)null); assertNotNull(merge); assertEquals(0, IDataHelper.size(merge)); } @Test public void testMergeWithOneArgument() throws Exception { IData merge = IDataHelper.merge(document); assertNotNull(merge); assertEquals(new IDataMap(document), new IDataMap(merge)); } @Test public void testMergeWithTwoArguments() throws Exception { IData secondDocument = IDataFactory.create(); IDataCursor cursor = secondDocument.getCursor(); IDataUtil.put(cursor, "d", "4"); cursor.destroy(); IData merge = IDataHelper.merge(document, secondDocument); assertNotNull(merge); assertEquals(4, IDataHelper.size(merge)); cursor = merge.getCursor(); assertEquals("1", IDataUtil.getString(cursor, "a")); assertEquals("2", IDataUtil.getString(cursor, "b")); assertEquals("3", IDataUtil.getString(cursor, "c")); assertEquals("4", IDataUtil.getString(cursor, "d")); cursor.destroy(); } @Test public void testSizeWithNullArgument() throws Exception { assertEquals(0, IDataHelper.size(null)); } @Test public void testSizeWithEmptyArgument() throws Exception { assertEquals(0, IDataHelper.size(new IDataMap())); } @Test public void testSizeWithIDataContainingOneElement() throws Exception { IDataMap map = new IDataMap(); map.put("1", "a"); assertEquals(1, IDataHelper.size(map)); } @Test public void testSizeWithIDataContainingMultipleElements() throws Exception { IDataMap map = new IDataMap(); map.put("1", "a"); map.put("2", "b"); map.put("3", "c"); map.put("4", "d"); assertEquals(4, IDataHelper.size(map)); } @Test public void testSizeWithMissingKey() throws Exception { IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "a1"); cursor.insertAfter("b", "b1"); cursor.destroy(); assertEquals(0, IDataHelper.size(IDataFactory.create(), "c")); } @Test public void testSizeWithKeyOccursOnce() throws Exception { IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "a1"); cursor.insertAfter("b", "b1"); cursor.destroy(); assertEquals(1, IDataHelper.size(document, "a")); } @Test public void testSizeWithKeyThatOccursMultipleTimes() throws Exception { IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "a1"); cursor.insertAfter("a", "a2"); cursor.insertAfter("a", "a3"); cursor.insertAfter("b", "b1"); cursor.destroy(); assertEquals(3, IDataHelper.size(document, "a")); } @Test public void testSizeWithFullyQualifiedKeyThatOccursMultipleTimes() throws Exception { IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "a1"); cursor.insertAfter("a", "a2"); cursor.insertAfter("a", "a3"); cursor.insertAfter("b", "b1"); cursor.destroy(); IDataMap parent = new IDataMap(); parent.put("d", document); assertEquals(3, IDataHelper.size(parent, "d/a")); } @Test public void testSizeWithFullyQualifiedNthKeyThatOccursMultipleTimes() throws Exception { IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "a1"); cursor.insertAfter("a", "a2"); cursor.insertAfter("a", "a3"); cursor.insertAfter("b", "b1"); cursor.destroy(); IDataMap parent = new IDataMap(); parent.put("d", document); assertEquals(1, IDataHelper.size(parent, "d/a(1)")); } @Test public void testRemoveElementThatDoesNotExist() throws Exception { Object value = IDataHelper.remove(new IDataMap(), "1"); assertTrue(value == null); } @Test public void testRemoveFromNullIData() throws Exception { Object value = IDataHelper.remove((IData)null, "1"); assertTrue(value == null); } @Test public void testRemoveElementThatExists() throws Exception { Object value = IDataHelper.remove(document, "a"); assertEquals("1", value); assertEquals(2, IDataHelper.size(document)); assertEquals(null, IDataHelper.get(document, "a")); } @Test public void testRenameWithNullArgument() throws Exception { IDataHelper.rename(null, "a", "z"); // should not throw exception } @Test public void testRenameElement() throws Exception { IDataHelper.rename(document, "a", "z"); // should not throw exception assertEquals(3, IDataHelper.size(document)); assertEquals("1", IDataHelper.get(document, "z")); assertEquals(null, IDataHelper.get(document, "a")); } @Test public void testCopyWithNullArgument() throws Exception { IDataHelper.copy(null, "a", "z"); // should not throw exception } @Test public void testCopyElement() throws Exception { IDataHelper.copy(document, "a", "z"); assertEquals(4, IDataHelper.size(document)); assertEquals("1", IDataHelper.get(document, "z")); assertEquals("1", IDataHelper.get(document, "a")); } @Test public void testClearWithNullIData() throws Exception { IDataHelper.clear(null); // should not throw exception } @Test public void testClearWithNullIDataAndPreserveKeys() throws Exception { IDataHelper.clear(null, "a"); // should not throw exception } @Test public void testClearWithPreserveKeys() throws Exception { IDataHelper.clear(document, "a", "b"); assertEquals(2, IDataHelper.size(document)); assertEquals("1", IDataHelper.get(document, "a")); assertEquals("2", IDataHelper.get(document, "b")); assertEquals(null, IDataHelper.get(document, "c")); } @Test public void testClearWithPreserveKeyThatDoesNotExist() throws Exception { IDataHelper.clear(document, "a", "z"); assertEquals(1, IDataHelper.size(document)); assertEquals(null, IDataHelper.get(document, "z")); assertEquals("1", IDataHelper.get(document, "a")); } @Test public void testGetWithNullIData() throws Exception { assertEquals(null, IDataHelper.get((IData)null, "a")); } @Test public void testGetWithSimpleKey() throws Exception { assertEquals("1", IDataHelper.get(document, "a")); assertEquals("2", IDataHelper.get(document, "b")); assertEquals("3", IDataHelper.get(document, "c")); } @Test public void testGetKeyWithPath() throws Exception { IDataMap child = new IDataMap(); child.put("b", "2"); IDataMap parent = new IDataMap(); parent.put("a", child); assertEquals("2", IDataHelper.get(parent, "a/b")); } @Test public void testGetKeyWithArrayIndex() throws Exception { String[] array = { "1", "2", "3" }; IDataMap parent = new IDataMap(); parent.put("a", array); assertEquals("1", IDataHelper.get(parent, "a[0]")); assertEquals("2", IDataHelper.get(parent, "a[1]")); assertEquals("3", IDataHelper.get(parent, "a[2]")); assertEquals("3", IDataHelper.get(parent, "a[-1]")); assertEquals("2", IDataHelper.get(parent, "a[-2]")); assertEquals("1", IDataHelper.get(parent, "a[-3]")); } @Test(expected = ArrayIndexOutOfBoundsException.class) public void testGetKeyWithArrayIndexOutOfBounds() throws Exception { String[] array = { "1", "2", "3" }; IDataMap parent = new IDataMap(); parent.put("a", array); Object value = IDataHelper.get(parent, "a[3]"); } @Test(expected = ArrayIndexOutOfBoundsException.class) public void testGetKeyWithNegativeArrayIndexOutOfBounds() throws Exception { String[] array = { "1", "2", "3" }; IDataMap parent = new IDataMap(); parent.put("a", array); Object value = IDataHelper.get(parent, "a[-4]"); } @Test public void testGetKeyWithIndex() throws Exception { IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "1"); cursor.insertAfter("a", "2"); cursor.destroy(); assertEquals("1", IDataHelper.get(document, "a(0)")); assertEquals("2", IDataHelper.get(document, "a(1)")); } @Test public void testGetKeyWithIndexOutOfBounds() throws Exception { IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "1"); cursor.insertAfter("a", "2"); cursor.destroy(); assertEquals(null, IDataHelper.get(document, "a(2)")); } @Test public void testGetKeyWithPathAndArrayIndex() throws Exception { String[] array = { "1", "2", "3" }; IDataMap child = new IDataMap(); child.put("b", array); IDataMap parent = new IDataMap(); parent.put("a", child); assertEquals("1", IDataHelper.get(parent, "a/b[0]")); assertEquals("2", IDataHelper.get(parent, "a/b[1]")); assertEquals("3", IDataHelper.get(parent, "a/b[2]")); assertEquals("3", IDataHelper.get(parent, "a/b[-1]")); assertEquals("2", IDataHelper.get(parent, "a/b[-2]")); assertEquals("1", IDataHelper.get(parent, "a/b[-3]")); } @Test public void testGetKeyWithPathAndIndex() throws Exception { IData child = IDataFactory.create(); IDataCursor cursor = child.getCursor(); cursor.insertAfter("b", "1"); cursor.insertAfter("b", "2"); cursor.insertAfter("b", "3"); cursor.insertAfter("b", "4"); cursor.destroy(); IDataMap parent = new IDataMap(); parent.put("a", child); assertEquals("1", IDataHelper.get(parent, "a/b")); assertEquals("1", IDataHelper.get(parent, "a/b(0)")); assertEquals("2", IDataHelper.get(parent, "a/b(1)")); assertEquals("3", IDataHelper.get(parent, "a/b(2)")); assertEquals("4", IDataHelper.get(parent, "a/b(3)")); } @Test public void testGetKeyWithNoIndexFromPathWithIDataArray() throws Exception { String[] array = { "1", "2", "3" }; String[] expected = { "1", "3" }; IDataMap child1 = new IDataMap(); child1.put("a", "1"); child1.put("b", "1"); IDataMap child2 = new IDataMap(); child2.put("a", "2"); child2.put("b", "2"); IDataMap parent = new IDataMap(); parent.put("c", new IData[] { child1, child2 }); Object value = IDataHelper.get(parent, "c/a"); assertNotNull(value); assertEquals(String[].class, value.getClass()); String[] arrayValue = (String[])value; assertEquals(2, arrayValue.length); assertEquals("1", arrayValue[0]); assertEquals("2", arrayValue[1]); } @Test public void testDropWithNullIData() throws Exception { IDataHelper.drop(null, "a/b(2)"); // should not throw exception } @Test public void testDropWithArrayIndex() throws Exception { String[] array = { "1", "2", "3" }; String[] expected = { "1", "3" }; IDataMap parent = new IDataMap(); parent.put("a", array); IDataHelper.drop(parent, "a[1]"); assertArrayEquals(expected, (String[])IDataHelper.get(parent, "a")); } @Test public void testDropWithSimpleKey() throws Exception { IDataHelper.drop(document, "a"); assertEquals(2, IDataHelper.size(document)); assertEquals(null, IDataHelper.get(document, "a")); } @Test public void testDropKeyWithPathAndIndex() throws Exception { IData child = IDataFactory.create(); IDataCursor cursor = child.getCursor(); cursor.insertAfter("b", "1"); cursor.insertAfter("b", "2"); cursor.insertAfter("b", "3"); cursor.insertAfter("b", "4"); cursor.destroy(); IDataMap parent = new IDataMap(); parent.put("a", child); IDataHelper.drop(parent, "a/b(2)"); assertEquals(3, IDataHelper.size(child)); assertEquals("4", IDataHelper.get(parent, "a/b(2)")); } @Test public void testDropWithPathAndArrayIndex() throws Exception { String[] array = { "1", "2", "3" }; String[] expected = { "1", "3" }; IDataMap child = new IDataMap(); child.put("b", array); IDataMap parent = new IDataMap(); parent.put("a", child); IDataHelper.drop(parent, "a/b[1]"); assertArrayEquals(expected, (String[])IDataHelper.get(parent, "a/b")); } @Test public void testDropOfKeyInIDataArray() throws Exception { String[] array = { "1", "2", "3" }; String[] expected = { "1", "3" }; IDataMap child1 = new IDataMap(); child1.put("a", "1"); child1.put("b", "1"); IDataMap expected1 = new IDataMap(); expected1.put("b", "1"); IDataMap child2 = new IDataMap(); child2.put("a", "2"); child2.put("b", "2"); IDataMap expected2 = new IDataMap(); expected2.put("a", "2"); IDataMap parent = new IDataMap(); parent.put("c", new IData[] { child1, child2 }); IDataHelper.drop(parent, "c/a"); assertEquals(null, child1.get("a")); assertEquals("1", child1.get("b")); assertEquals(null, child2.get("a")); assertEquals("2", child2.get("b")); } @Test(expected = ArrayIndexOutOfBoundsException.class) public void testDropWithArrayIndexOutOfBounds() throws Exception { String[] array = { "1", "2", "3" }; IDataMap parent = new IDataMap(); parent.put("a", array); IDataHelper.drop(parent, "a[3]"); } @Test(expected = ArrayIndexOutOfBoundsException.class) public void testDropWithNegativeArrayIndexOutOfBounds() throws Exception { String[] array = { "1", "2", "3" }; IDataMap parent = new IDataMap(); parent.put("a", array); IDataHelper.drop(parent, "a[-4]"); } @Test public void testDropWithIndexOutOfBounds() throws Exception { IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "1"); cursor.insertAfter("a", "2"); cursor.destroy(); IDataHelper.drop(document, "a(2)"); assertEquals(2, IDataHelper.size(document)); assertEquals("1", IDataHelper.get(document, "a(0)")); assertEquals("1", IDataHelper.get(document, "a")); assertEquals("2", IDataHelper.get(document, "a(1)")); } @Test public void testPutWithNullIData() throws Exception { IData document = IDataHelper.put((IData)null, "a", "1"); assertEquals(1, IDataHelper.size(document)); assertEquals("1", IDataHelper.get(document, "a")); } @Test public void testPutWithSimpleKey() throws Exception { IDataMap map = new IDataMap(); map.put("a", "1"); IData document = IDataHelper.put(map, "b", "2"); assertEquals(2, IDataHelper.size(document)); assertEquals("1", IDataHelper.get(document, "a")); assertEquals("2", IDataHelper.get(document, "b")); } @Test public void testPutWithPath() throws Exception { document = IDataHelper.put(document, "a/b", "1"); assertEquals("1", IDataHelper.get(document, "a/b")); } @Test public void testPutWithArrayIndex() throws Exception { String[] expected = { "1" }; document = IDataHelper.put(document, "z[0]", "1"); assertArrayEquals(expected, (String[])IDataHelper.get(document, "z")); } @Test public void testPutWithPathAndArrayIndex() throws Exception { String[] expected = { "1" }; document = IDataHelper.put(document, "a/b[0]", "1"); assertArrayEquals(expected, (String[])IDataHelper.get(document, "a/b")); } @Test public void testPutWithLiteralKeyThatIncludesPathAndArrayIndex() throws Exception { document = IDataHelper.put(document, "a/b[0]", "1", true); assertEquals("1", (String)IDataHelper.get(document, "a/b[0]", true)); assertEquals("1", (String)IDataHelper.get(document, "a/b[0]", false)); } @Test public void testPutWithIndex() throws Exception { document = IDataHelper.put(document, "a(2)", "4"); assertEquals(5, IDataHelper.size(document)); assertEquals("1", IDataHelper.get(document, "a(0)")); assertEquals(null, IDataHelper.get(document, "a(1)")); assertEquals("4", IDataHelper.get(document, "a(2)")); } @Test public void testPutWithPathAndIndex() throws Exception { document = IDataHelper.put(document, "y/z(2)", "4"); assertEquals(4, IDataHelper.size(document)); assertEquals(null, IDataHelper.get(document, "y/z(0)")); assertEquals(null, IDataHelper.get(document, "y/z(1)")); assertEquals("4", IDataHelper.get(document, "y/z(2)")); } @Test public void testRenameWithNullSource() throws Exception { IDataHelper.rename(document, null, "d"); assertEquals(null, IDataHelper.get(document, null)); assertEquals(null, IDataHelper.get(document, "d")); } @Test public void testRenameWithNullTarget() throws Exception { IDataHelper.rename(document, "c", null); assertEquals("3", IDataHelper.get(document, "c")); assertEquals(null, IDataHelper.get(document, null)); } @Test public void testRenameWithNullSourceAndTarget() throws Exception { IDataHelper.rename(document, null, null); assertEquals(null, IDataHelper.get(document, null)); } @Test public void testRenameWithEqualSourceAndTarget() throws Exception { IDataHelper.rename(document, "c", "c"); assertEquals("3", IDataHelper.get(document, "c")); } @Test public void testRename() throws Exception { assertEquals("3", IDataHelper.get(document, "c")); IDataHelper.rename(document, "c", "d"); assertEquals(null, IDataHelper.get(document, "c")); assertEquals("3", IDataHelper.get(document, "d")); } @Test public void testCopyWithNullSource() throws Exception { IDataHelper.copy(document, null, "d"); assertEquals(null, IDataHelper.get(document, null)); assertEquals(null, IDataHelper.get(document, "d")); } @Test public void testCopyWithNullTarget() throws Exception { IDataHelper.copy(document, "c", null); assertEquals("3", IDataHelper.get(document, "c")); assertEquals(null, IDataHelper.get(document, null)); } @Test public void testCopyWithNullSourceAndTarget() throws Exception { IDataHelper.copy(document, null, null); assertEquals(null, IDataHelper.get(document, null)); } @Test public void testCopyWithEqualSourceAndTarget() throws Exception { IDataHelper.copy(document, "c", "c"); assertEquals("3", IDataHelper.get(document, "c")); } @Test public void testCopy() throws Exception { IDataHelper.copy(document, "c", "d"); assertEquals("3", IDataHelper.get(document, "c")); assertEquals("3", IDataHelper.get(document, "d")); } @Test public void testSortWithMultipleKeys() throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "\n" + "<IDataXMLCoder version=\"1.0\">\n" + " <record javaclass=\"com.wm.data.ISMemDataImpl\">\n" + " <array name=\"array\" type=\"record\" depth=\"1\">\n" + " <record javaclass=\"com.wm.util.Values\">\n" + " <value name=\"string\">a</value>\n" + " <value name=\"integer\">26</value>\n" + " <value name=\"decimal\">43.2</value>\n" + " <value name=\"datetime\">02-03-2015</value>\n" + " <value name=\"duration\">P1Y</value>\n" + " </record>\n" + " <record javaclass=\"com.wm.util.Values\">\n" + " <value name=\"string\">z</value>\n" + " <value name=\"integer\">99</value>\n" + " <value name=\"decimal\">99.9</value>\n" + " <value name=\"datetime\">01-01-2014</value>\n" + " <value name=\"duration\">P1D</value>\n" + " </record>\n" + " <record javaclass=\"com.wm.util.Values\">\n" + " <value name=\"string\">a</value>\n" + " <value name=\"integer\">25</value>\n" + " <value name=\"decimal\">64.345</value>\n" + " <value name=\"datetime\">01-01-2014</value>\n" + " <value name=\"duration\">PT1S</value>\n" + " </record>\n" + " </array>\n" + " </record>\n" + "</IDataXMLCoder>\n"; IDataMap map = new IDataMap(IDataXMLParser.getInstance().parse(InputStreamHelper.normalize(xml))); IData[] array = (IData[])map.get("array"); IDataComparisonCriterion c1 = new IDataComparisonCriterion("string", "string", false); IDataComparisonCriterion c2 = new IDataComparisonCriterion("integer", "integer", false); IData[] result = IDataHelper.sort(array, c1, c2); assertEquals(3, result.length); IDataMap first = new IDataMap(result[0]); assertEquals("a", first.get("string")); assertEquals("25", first.get("integer")); IDataMap second = new IDataMap(result[1]); assertEquals("a", second.get("string")); assertEquals("26", second.get("integer")); IDataMap third = new IDataMap(result[2]); assertEquals("z", third.get("string")); assertEquals("99", third.get("integer")); } @Test public void testSortWithMultipleStringKeysAscending() throws Exception { IData[] array = new IData[6]; IDataMap item1 = new IDataMap(); item1.put("key1", "z"); item1.put("key2", "z"); IDataMap item2 = new IDataMap(); item2.put("key1", "z"); item2.put("key2", "y"); IDataMap item3 = new IDataMap(); item3.put("key1", "z"); item3.put("key2", "x"); IDataMap item4 = new IDataMap(); item4.put("key1", "a"); item4.put("key2", "z"); IDataMap item5 = new IDataMap(); item5.put("key1", "a"); item5.put("key2", "y"); IDataMap item6 = new IDataMap(); item6.put("key1", "a"); item6.put("key2", "x"); array[0] = item1; array[1] = item2; array[2] = item3; array[3] = item4; array[4] = item5; array[5] = item6; IDataComparisonCriterion c1 = new IDataComparisonCriterion("key1", "string", false); IDataComparisonCriterion c2 = new IDataComparisonCriterion("key2", "string", false); IData[] result = IDataHelper.sort(array, c1, c2); assertEquals(6, result.length); IDataMap first = IDataMap.of(result[0]); assertEquals("a", first.get("key1")); assertEquals("x", first.get("key2")); IDataMap second = IDataMap.of(result[1]); assertEquals("a", second.get("key1")); assertEquals("y", second.get("key2")); IDataMap third = IDataMap.of(result[2]); assertEquals("a", third.get("key1")); assertEquals("z", third.get("key2")); IDataMap fourth = IDataMap.of(result[3]); assertEquals("z", fourth.get("key1")); assertEquals("x", fourth.get("key2")); IDataMap fifth = IDataMap.of(result[4]); assertEquals("z", fifth.get("key1")); assertEquals("y", fifth.get("key2")); IDataMap sixth = IDataMap.of(result[5]); assertEquals("z", sixth.get("key1")); assertEquals("z", sixth.get("key2")); } @Test public void testSortWithMultipleStringKeysDescending() throws Exception { IData[] array = new IData[6]; IDataMap item1 = new IDataMap(); item1.put("key1", "z"); item1.put("key2", "z"); IDataMap item2 = new IDataMap(); item2.put("key1", "z"); item2.put("key2", "y"); IDataMap item3 = new IDataMap(); item3.put("key1", "z"); item3.put("key2", "x"); IDataMap item4 = new IDataMap(); item4.put("key1", "a"); item4.put("key2", "z"); IDataMap item5 = new IDataMap(); item5.put("key1", "a"); item5.put("key2", "y"); IDataMap item6 = new IDataMap(); item6.put("key1", "a"); item6.put("key2", "x"); array[0] = item1; array[1] = item2; array[2] = item3; array[3] = item4; array[4] = item5; array[5] = item6; IDataComparisonCriterion c1 = new IDataComparisonCriterion("key1", "string", true); IDataComparisonCriterion c2 = new IDataComparisonCriterion("key2", "string", true); IData[] result = IDataHelper.sort(array, c1, c2); assertEquals(6, result.length); IDataMap first = IDataMap.of(result[0]); assertEquals("z", first.get("key1")); assertEquals("z", first.get("key2")); IDataMap second = IDataMap.of(result[1]); assertEquals("z", second.get("key1")); assertEquals("y", second.get("key2")); IDataMap third = IDataMap.of(result[2]); assertEquals("z", third.get("key1")); assertEquals("x", third.get("key2")); IDataMap fourth = IDataMap.of(result[3]); assertEquals("a", fourth.get("key1")); assertEquals("z", fourth.get("key2")); IDataMap fifth = IDataMap.of(result[4]); assertEquals("a", fifth.get("key1")); assertEquals("y", fifth.get("key2")); IDataMap sixth = IDataMap.of(result[5]); assertEquals("a", sixth.get("key1")); assertEquals("x", sixth.get("key2")); } @Test public void testSortWithMultipleStringKeysAscendingDescending() throws Exception { IData[] array = new IData[6]; IDataMap item1 = new IDataMap(); item1.put("key1", "z"); item1.put("key2", "z"); IDataMap item2 = new IDataMap(); item2.put("key1", "z"); item2.put("key2", "y"); IDataMap item3 = new IDataMap(); item3.put("key1", "z"); item3.put("key2", "x"); IDataMap item4 = new IDataMap(); item4.put("key1", "a"); item4.put("key2", "z"); IDataMap item5 = new IDataMap(); item5.put("key1", "a"); item5.put("key2", "y"); IDataMap item6 = new IDataMap(); item6.put("key1", "a"); item6.put("key2", "x"); array[0] = item1; array[1] = item2; array[2] = item3; array[3] = item4; array[4] = item5; array[5] = item6; IDataComparisonCriterion c1 = new IDataComparisonCriterion("key1", "string", false); IDataComparisonCriterion c2 = new IDataComparisonCriterion("key2", "string", true); IData[] result = IDataHelper.sort(array, c1, c2); assertEquals(6, result.length); IDataMap first = IDataMap.of(result[0]); assertEquals("a", first.get("key1")); assertEquals("z", first.get("key2")); IDataMap second = IDataMap.of(result[1]); assertEquals("a", second.get("key1")); assertEquals("y", second.get("key2")); IDataMap third = IDataMap.of(result[2]); assertEquals("a", third.get("key1")); assertEquals("x", third.get("key2")); IDataMap fourth = IDataMap.of(result[3]); assertEquals("z", fourth.get("key1")); assertEquals("z", fourth.get("key2")); IDataMap fifth = IDataMap.of(result[4]); assertEquals("z", fifth.get("key1")); assertEquals("y", fifth.get("key2")); IDataMap sixth = IDataMap.of(result[5]); assertEquals("z", sixth.get("key1")); assertEquals("x", sixth.get("key2")); } @Test public void testSortWithMultipleStringKeysDescendingAscending() throws Exception { IData[] array = new IData[6]; IDataMap item1 = new IDataMap(); item1.put("key1", "z"); item1.put("key2", "z"); IDataMap item2 = new IDataMap(); item2.put("key1", "z"); item2.put("key2", "y"); IDataMap item3 = new IDataMap(); item3.put("key1", "z"); item3.put("key2", "x"); IDataMap item4 = new IDataMap(); item4.put("key1", "a"); item4.put("key2", "z"); IDataMap item5 = new IDataMap(); item5.put("key1", "a"); item5.put("key2", "y"); IDataMap item6 = new IDataMap(); item6.put("key1", "a"); item6.put("key2", "x"); array[0] = item1; array[1] = item2; array[2] = item3; array[3] = item4; array[4] = item5; array[5] = item6; IDataComparisonCriterion c1 = new IDataComparisonCriterion("key1", "string", true); IDataComparisonCriterion c2 = new IDataComparisonCriterion("key2", "string", false); IData[] result = IDataHelper.sort(array, c1, c2); assertEquals(6, result.length); IDataMap first = IDataMap.of(result[0]); assertEquals("z", first.get("key1")); assertEquals("x", first.get("key2")); IDataMap second = IDataMap.of(result[1]); assertEquals("z", second.get("key1")); assertEquals("y", second.get("key2")); IDataMap third = IDataMap.of(result[2]); assertEquals("z", third.get("key1")); assertEquals("z", third.get("key2")); IDataMap fourth = IDataMap.of(result[3]); assertEquals("a", fourth.get("key1")); assertEquals("x", fourth.get("key2")); IDataMap fifth = IDataMap.of(result[4]); assertEquals("a", fifth.get("key1")); assertEquals("y", fifth.get("key2")); IDataMap sixth = IDataMap.of(result[5]); assertEquals("a", sixth.get("key1")); assertEquals("z", sixth.get("key2")); } @Test public void testSortWithIDataArrayCriteria() throws Exception { IData[] array = new IData[6]; IDataMap item1 = new IDataMap(); item1.put("key1", "z"); item1.put("key2", "z"); IDataMap item2 = new IDataMap(); item2.put("key1", "z"); item2.put("key2", "y"); IDataMap item3 = new IDataMap(); item3.put("key1", "z"); item3.put("key2", "x"); IDataMap item4 = new IDataMap(); item4.put("key1", "a"); item4.put("key2", "z"); IDataMap item5 = new IDataMap(); item5.put("key1", "a"); item5.put("key2", "y"); IDataMap item6 = new IDataMap(); item6.put("key1", "a"); item6.put("key2", "x"); array[0] = item1; array[1] = item2; array[2] = item3; array[3] = item4; array[4] = item5; array[5] = item6; IData[] criteria = new IData[2]; IDataMap criteria1 = new IDataMap(); criteria1.put("key", "key1"); criteria1.put("type", "string"); criteria1.put("descending?", "true"); IDataMap criteria2 = new IDataMap(); criteria2.put("key", "key2"); criteria2.put("type", "string"); criteria2.put("descending?", "false"); criteria[0] = criteria1; criteria[1] = criteria2; IData[] result = IDataHelper.sort(array, criteria); assertEquals(6, result.length); IDataMap first = IDataMap.of(result[0]); assertEquals("z", first.get("key1")); assertEquals("x", first.get("key2")); IDataMap second = IDataMap.of(result[1]); assertEquals("z", second.get("key1")); assertEquals("y", second.get("key2")); IDataMap third = IDataMap.of(result[2]); assertEquals("z", third.get("key1")); assertEquals("z", third.get("key2")); IDataMap fourth = IDataMap.of(result[3]); assertEquals("a", fourth.get("key1")); assertEquals("x", fourth.get("key2")); IDataMap fifth = IDataMap.of(result[4]); assertEquals("a", fifth.get("key1")); assertEquals("y", fifth.get("key2")); IDataMap sixth = IDataMap.of(result[5]); assertEquals("a", sixth.get("key1")); assertEquals("z", sixth.get("key2")); } @Test public void testGetAsArrayWithSingleOccurrence() throws Exception { Object[] expected = new String[] { "1" }; IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); IDataUtil.put(cursor, "a", "1"); IDataUtil.put(cursor, "b", "4"); cursor.destroy(); Object[] actual = IDataHelper.getAsArray(document, "a"); assertArrayEquals(expected, actual); assertTrue(actual instanceof String[]); } @Test public void testGetAsArrayWithArrayIndex() throws Exception { Object[] expected = new String[] { "2" }; Object[] array = new String[] { "1", "2", "3" }; IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); IDataUtil.put(cursor, "a", array); IDataUtil.put(cursor, "b", "4"); cursor.destroy(); Object[] actual = IDataHelper.getAsArray(document, "a[1]"); assertArrayEquals(expected, actual); assertTrue(actual instanceof String[]); } @Test public void testGetAsArrayWithMultipleOccurrence() throws Exception { Object[] expected = new String[] { "1", "2", "3" }; IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "1"); cursor.insertAfter("a", "2"); cursor.insertAfter("a", "3"); cursor.insertAfter("b", "4"); cursor.destroy(); Object[] actual = IDataHelper.getAsArray(document, "a"); assertArrayEquals(expected, actual); assertTrue(actual instanceof String[]); } @Test public void testGetAsArrayWithNthKeyAndMultipleOccurrence() throws Exception { Object[] expected = new String[] { "2" }; IData document = IDataFactory.create(); IDataCursor cursor = document.getCursor(); cursor.insertAfter("a", "1"); cursor.insertAfter("a", "2"); cursor.insertAfter("a", "3"); cursor.insertAfter("b", "4"); cursor.destroy(); Object[] actual = IDataHelper.getAsArray(document, "a(1)"); assertArrayEquals(expected, actual); assertTrue(actual instanceof String[]); } @Test public void testGetAsArrayWithQualifiedKeyAndSingleOccurrence() throws Exception { Object[] expected = new String[] { "1" }; IData child = IDataFactory.create(); IDataCursor cursor = child.getCursor(); cursor.insertAfter("b", "1"); cursor.insertAfter("c", "2"); cursor.insertAfter("c", "3"); cursor.insertAfter("c", "4"); cursor.destroy(); IDataMap parent = new IDataMap(); parent.put("a", child); Object[] actual = IDataHelper.getAsArray(parent, "a/b"); assertArrayEquals(expected, actual); assertTrue(actual instanceof String[]); } @Test public void testGetAsArrayWithQualifiedKeyAndMultipleOccurrence() throws Exception { Object[] expected = new String[] { "2", "3", "4" }; IData child = IDataFactory.create(); IDataCursor cursor = child.getCursor(); cursor.insertAfter("b", "1"); cursor.insertAfter("c", "2"); cursor.insertAfter("c", "3"); cursor.insertAfter("c", "4"); cursor.destroy(); IDataMap parent = new IDataMap(); parent.put("a", child); Object[] actual = IDataHelper.getAsArray(parent, "a/c"); assertArrayEquals(expected, actual); assertTrue(actual instanceof String[]); } @Test public void testGetAsArrayWithQualifiedKeyAndMultipleArrays() throws Exception { Object[] expected = new String[] { "1", "2", "3", "4", "5", "6", "7" }; Object[] array1 = new String[] { "1", "2", "3" }; Object[] array2 = new String[] { "4", "5", "6" }; IData child = IDataFactory.create(); IDataCursor cursor = child.getCursor(); cursor.insertAfter("b", "1"); cursor.insertAfter("c", array1); cursor.insertAfter("c", array2); cursor.insertAfter("c", "7"); cursor.destroy(); IDataMap parent = new IDataMap(); parent.put("a", child); Object[] actual = IDataHelper.getAsArray(parent, "a/c"); assertArrayEquals(expected, actual); assertTrue(actual instanceof String[]); } @Test public void testArrayify() throws Exception { Object[] expected = new String[] { "2", "3", "4" }; IData child = IDataFactory.create(); IDataCursor cursor = child.getCursor(); cursor.insertAfter("b", "1"); cursor.insertAfter("c", "2"); cursor.insertAfter("c", "3"); cursor.insertAfter("c", "4"); cursor.destroy(); IDataMap parent = new IDataMap(); parent.put("a", child); IDataHelper.arrayify(parent, "a/c"); assertArrayEquals(expected, (Object[])IDataHelper.get(parent, "a/c")); } @Test public void testUniqueWithOneKey() throws Exception { IData[] array = new IData[6]; IDataMap item1 = new IDataMap(); item1.put("key1", "z"); item1.put("key2", "z"); IDataMap item2 = new IDataMap(); item2.put("key1", "z"); item2.put("key2", "y"); IDataMap item3 = new IDataMap(); item3.put("key1", "z"); item3.put("key2", "x"); IDataMap item4 = new IDataMap(); item4.put("key1", "a"); item4.put("key2", "z"); IDataMap item5 = new IDataMap(); item5.put("key1", "a"); item5.put("key2", "y"); IDataMap item6 = new IDataMap(); item6.put("key1", "a"); item6.put("key2", "x"); array[0] = item1; array[1] = item2; array[2] = item3; array[3] = item4; array[4] = item5; array[5] = item6; IData[] result = IDataHelper.unique(array, "key1"); assertEquals(2, result.length); IDataMap first = IDataMap.of(result[0]); assertEquals("a", first.get("key1")); assertEquals("z", first.get("key2")); IDataMap second = IDataMap.of(result[1]); assertEquals("z", second.get("key1")); assertEquals("z", second.get("key2")); } @Test public void testUniqueWithTwoKeys() throws Exception { IData[] array = new IData[6]; IDataMap item1 = new IDataMap(); item1.put("key1", "z"); item1.put("key2", "z"); item1.put("key3", "1"); IDataMap item2 = new IDataMap(); item2.put("key1", "z"); item2.put("key2", "y"); item2.put("key3", "1"); IDataMap item3 = new IDataMap(); item3.put("key1", "z"); item3.put("key2", "x"); item3.put("key3", "1"); IDataMap item4 = new IDataMap(); item4.put("key1", "z"); item4.put("key2", "z"); item4.put("key3", "2"); IDataMap item5 = new IDataMap(); item5.put("key1", "z"); item5.put("key2", "y"); item5.put("key3", "2"); IDataMap item6 = new IDataMap(); item6.put("key1", "a"); item6.put("key2", "x"); item6.put("key3", "1"); array[0] = item1; array[1] = item2; array[2] = item3; array[3] = item4; array[4] = item5; array[5] = item6; IData[] result = IDataHelper.unique(array, "key1", "key2"); assertEquals(4, result.length); IDataMap first = IDataMap.of(result[0]); assertEquals("a", first.get("key1")); assertEquals("x", first.get("key2")); assertEquals("1", first.get("key3")); IDataMap second = IDataMap.of(result[1]); assertEquals("z", second.get("key1")); assertEquals("x", second.get("key2")); assertEquals("1", second.get("key3")); IDataMap third = IDataMap.of(result[2]); assertEquals("z", third.get("key1")); assertEquals("y", third.get("key2")); assertEquals("1", third.get("key3")); IDataMap fourth = IDataMap.of(result[3]); assertEquals("z", fourth.get("key1")); assertEquals("z", fourth.get("key2")); assertEquals("1", fourth.get("key3")); } @Test public void testUniqueWithNoKeys() throws Exception { IData[] array = new IData[6]; IDataMap item1 = new IDataMap(); item1.put("key1", "z"); item1.put("key2", "z"); item1.put("key3", "z"); IDataMap item2 = new IDataMap(); item2.put("key1", "z"); item2.put("key2", "y"); item2.put("key3", new Object()); IDataMap item3 = new IDataMap(); item3.put("key1", "z"); item3.put("key2", "x"); item3.put("key3", new Object()); IDataMap item4 = new IDataMap(); item4.put("key1", "z"); item4.put("key2", "z"); item4.put("key3", "z"); IDataMap item5 = new IDataMap(); item5.put("key1", "z"); item5.put("key2", "y"); item5.put("key3", new Object()); IDataMap item6 = new IDataMap(); item6.put("key1", "a"); item6.put("key2", "x"); item6.put("key3", new Object()); array[0] = item1; array[1] = item2; array[2] = item3; array[3] = item4; array[4] = item5; array[5] = item6; IData[] result = IDataHelper.unique(array); assertEquals(5, result.length); IDataMap first = IDataMap.of(result[0]); assertEquals("a", first.get("key1")); assertEquals("x", first.get("key2")); IDataMap second = IDataMap.of(result[1]); assertEquals("z", second.get("key1")); assertEquals("x", second.get("key2")); IDataMap third = IDataMap.of(result[2]); assertEquals("z", third.get("key1")); assertEquals("y", third.get("key2")); IDataMap fourth = IDataMap.of(result[3]); assertEquals("z", fourth.get("key1")); assertEquals("y", fourth.get("key2")); IDataMap fifth = IDataMap.of(result[4]); assertEquals("z", fifth.get("key1")); assertEquals("z", fifth.get("key2")); assertEquals("z", fifth.get("key3")); } @Test public void testGetLeafValuesForIData() throws Exception { String[] expected = new String[] { "1", "2", "3", "4", "6" }; IDataMap parent = new IDataMap(); parent.put("a", "1"); IDataMap child = new IDataMap(); child.put("c", "2"); child.put("d", new String[] { "3", "4" }); child.put("e", new Integer("5")); child.put("f", "6"); parent.put("b", child); Object[] actual = IDataHelper.getLeafValues(parent, String.class); assertArrayEquals(expected, actual); } @Test public void testGetLeafValuesForIDataArray() throws Exception { String[] expected = new String[] { "1", "2", "3", "4", "6", "7", "8", "9" }; IData[] array = new IData[2]; IDataMap parent = new IDataMap(); parent.put("a", "1"); IDataMap child = new IDataMap(); child.put("c", "2"); child.put("d", new String[] { "3", "4" }); child.put("e", new Integer("5")); child.put("f", "6"); parent.put("b", child); array[0] = parent; parent = new IDataMap(); child = new IDataMap(); child.put("h", "7"); child.put("i", new String[] { "8", "9" }); child.put("j", new Integer("10")); parent.put("g", child); array[1] = parent; Object[] actual = IDataHelper.getLeafValues(array, String.class); assertArrayEquals(expected, actual); } @Test public void testJoin() throws Exception { IDataMap map = new IDataMap(); map.put("a", "1"); map.put("b", "2"); IDataMap child = new IDataMap(); child.put("d", new String[]{"3", "4"}); child.put("e", new String[][]{{"5", "6"}, {"7", "8"}}); map.put("c", child); map.put("f", new String[]{"9", "10", "11", "12"}); IDataMap[] array = new IDataMap[2]; array[0] = new IDataMap(); array[0].put("h", "13"); array[0].put("i", "14"); array[1] = new IDataMap(); array[1].put("j", "15"); map.put("g", array); assertEquals("a: 1, b: 2, c: {d: [3, 4], e: [[5, 6], [7, 8]]}, f: [9, 10, 11, 12], g: [{h: 13, i: 14}, {j: 15}]", IDataHelper.join(map)); } @Test public void testJoinWithCustomSeparators() throws Exception { IDataMap map = new IDataMap(); map.put("z", null); map.put("a", "1"); map.put("b", "2"); IDataMap child = new IDataMap(); child.put("d", new String[]{null, "3", "4"}); child.put("e", new String[][]{{"5", "6"}, {"7", "8"}, null, {null, "9"}}); map.put("c", child); map.put("f", new String[]{"9", "10", null, "12", null}); IDataMap[] array = new IDataMap[2]; array[0] = new IDataMap(); array[0].put("h", "13"); array[0].put("i", "14"); array[1] = new IDataMap(); array[1].put("j", "15"); array[1].put("k", null); map.put("g", array); map.put("l", new String[0]); assertEquals("z = null; a = 1; b = 2; c = {d = [null, 3, 4]; e = [[5, 6], [7, 8], null, [null, 9]]}; f = [9, 10, null, 12, null]; g = [{h = 13; i = 14}, {j = 15; k = null}]; l = []", IDataHelper.join(map, "; ", ", ", " = ")); assertEquals("a = 1; b = 2; c = {d = [3, 4]; e = [[5, 6], [7, 8], [9]]}; f = [9, 10, 12]; g = [{h = 13; i = 14}, {j = 15}]; l = []", IDataHelper.join(map, "; ", ", ", " = ", Sanitization.REMOVE_NULLS)); } @Test public void testGetFromCursor() throws Exception { IDataCursor cursor = document.getCursor(); IDataHelper.put(cursor, "a", "1"); IDataHelper.put(cursor, "b", 2); IDataHelper.put(cursor, "c", 3.14f); IDataHelper.put(cursor, "d", true); IDataHelper.put(cursor, "e", 4L); IDataHelper.put(cursor, "f", "true"); IDataHelper.put(cursor, "g", 5, false, false, false); IDataHelper.put(cursor, "g", true, false, false, false); cursor.destroy(); cursor = document.getCursor(); assertEquals("1", IDataHelper.get(cursor, "a", String.class)); assertEquals(new Integer(2), IDataHelper.get(cursor, "b", Integer.class)); assertEquals(new Long(2), IDataHelper.get(cursor, "b", Long.class)); assertEquals(new Float(3.14), IDataHelper.get(cursor, "c", Float.class)); assertEquals(new Double(new Float(3.14).doubleValue()), IDataHelper.get(cursor, "c", Double.class)); assertEquals(true, IDataHelper.get(cursor, "d", Boolean.class)); assertEquals(false, IDataHelper.getOrDefault(cursor, "e", Boolean.class, false)); assertEquals(true, IDataHelper.getOrDefault(cursor, "e", Boolean.class, true)); assertEquals(true, IDataHelper.get(cursor, "f", Boolean.class)); assertEquals(false, IDataHelper.getOrDefault(cursor, "missing", Boolean.class, false)); assertEquals(true, IDataHelper.getOrDefault(cursor, "missing", Boolean.class, true)); assertEquals(true, IDataHelper.get(cursor, "g", Boolean.class, true)); cursor.destroy(); } }