This is an automated email from the ASF dual-hosted git repository.

mkataria pushed a commit to branch OAK-11692_2
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 03411073bbc5351e2e45d05ab6adfbd9bf9d0584
Author: Mohit Kataria <tiho...@gmail.com>
AuthorDate: Thu May 8 21:42:54 2025 +0530

    OAK-11692: Added more tests in JsonUtilsTest
---
 .../apache/jackrabbit/oak/json/JsonUtilsTest.java  | 468 +++++++++++++++------
 1 file changed, 330 insertions(+), 138 deletions(-)

diff --git 
a/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/json/JsonUtilsTest.java 
b/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/json/JsonUtilsTest.java
index c3848bbea0..9823793f93 100644
--- 
a/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/json/JsonUtilsTest.java
+++ 
b/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/json/JsonUtilsTest.java
@@ -18,21 +18,53 @@
  */
 package org.apache.jackrabbit.oak.json;
 
+import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.junit.Test;
 
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.List;
 import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class JsonUtilsTest {
 
+    // Helper methods to reduce duplication
+    private NodeBuilder createNodeBuilder() {
+        return new MemoryNodeBuilder(EmptyNodeState.EMPTY_NODE);
+    }
+
+    private <T> void assertPropertyValue(Map<String, Object> result, String 
propertyName, T expectedValue) {
+        assertNotNull(result);
+        assertTrue("Missing property: " + propertyName, 
result.containsKey(propertyName));
+        assertEquals("Property value mismatch for " + propertyName, 
expectedValue, result.get(propertyName));
+    }
+
+    private <T> void assertArrayValues(Map<String, Object> result, String 
propertyName, List<T> expectedValues) {
+        assertNotNull(result);
+        assertTrue("Missing array property: " + propertyName, 
result.containsKey(propertyName));
+
+        List<T> resultArray = (List<T>) result.get(propertyName);
+        assertNotNull(resultArray);
+        assertEquals("Array size mismatch for " + propertyName, 
expectedValues.size(), resultArray.size());
+
+        for (int i = 0; i < expectedValues.size(); i++) {
+            assertEquals("Value mismatch at index " + i + " for " + 
propertyName,
+                         expectedValues.get(i), resultArray.get(i));
+        }
+    }
+
+    // JSON validation tests
     @Test
     public void testNullInput() {
         assertFalse(JsonUtils.isValidJson(null, false));
@@ -47,40 +79,64 @@ public class JsonUtilsTest {
 
     @Test
     public void testValidJsonObject() {
-        assertTrue(JsonUtils.isValidJson("{}", false));
-        assertTrue(JsonUtils.isValidJson("{\"key\":\"value\"}", false));
-        assertTrue(JsonUtils.isValidJson("{\"key\":123}", false));
-        assertTrue(JsonUtils.isValidJson("{\"key\":true}", false));
-        assertTrue(JsonUtils.isValidJson("{\"key\":null}", false));
-        assertTrue(JsonUtils.isValidJson("{\"key\":{\"nested\":\"value\"}}", 
false));
+        String[] validObjects = {
+            "{}",
+            "{\"key\":\"value\"}",
+            "{\"key\":123}",
+            "{\"key\":true}",
+            "{\"key\":null}",
+            "{\"key\":{\"nested\":\"value\"}}"
+        };
+
+        for (String json : validObjects) {
+            assertTrue("Should be valid JSON: " + json, 
JsonUtils.isValidJson(json, false));
+        }
     }
 
     @Test
     public void testInvalidJsonObject() {
-        assertFalse(JsonUtils.isValidJson("{", false));
-        assertFalse(JsonUtils.isValidJson("}", false));
-        assertFalse(JsonUtils.isValidJson("{key:value}", false));
-        assertFalse(JsonUtils.isValidJson("{\"key\":value}", false));
-        assertFalse(JsonUtils.isValidJson("{\"key\":\"value\"", false));
-        assertFalse(JsonUtils.isValidJson("{\"key\":\"value\",}", false));
+        String[] invalidObjects = {
+            "{",
+            "}",
+            "{key:value}",
+            "{\"key\":value}",
+            "{\"key\":\"value\"",
+            "{\"key\":\"value\",}"
+        };
+
+        for (String json : invalidObjects) {
+            assertFalse("Should be invalid JSON: " + json, 
JsonUtils.isValidJson(json, false));
+        }
     }
 
     @Test
     public void testValidJsonArray() {
-        assertTrue(JsonUtils.isValidJson("[]", true));
-        assertTrue(JsonUtils.isValidJson("[1,2,3]", true));
-        assertTrue(JsonUtils.isValidJson("[\"a\",\"b\",\"c\"]", true));
-        assertTrue(JsonUtils.isValidJson("[true,false,null]", true));
-        
assertTrue(JsonUtils.isValidJson("[{\"key\":\"value\"},{\"key2\":123}]", true));
+        String[] validArrays = {
+            "[]",
+            "[1,2,3]",
+            "[\"a\",\"b\",\"c\"]",
+            "[true,false,null]",
+            "[{\"key\":\"value\"},{\"key2\":123}]"
+        };
+
+        for (String json : validArrays) {
+            assertTrue("Should be valid JSON array: " + json, 
JsonUtils.isValidJson(json, true));
+        }
     }
 
     @Test
     public void testInvalidJsonArray() {
-        assertFalse(JsonUtils.isValidJson("[", true));
-        assertFalse(JsonUtils.isValidJson("]", true));
-        assertFalse(JsonUtils.isValidJson("[1,2,]", true));
-        assertFalse(JsonUtils.isValidJson("[1 2 3]", true));
-        assertFalse(JsonUtils.isValidJson("[\"unclosed]", true));
+        String[] invalidArrays = {
+            "[",
+            "]",
+            "[1,2,]",
+            "[1 2 3]",
+            "[\"unclosed]"
+        };
+
+        for (String json : invalidArrays) {
+            assertFalse("Should be invalid JSON array: " + json, 
JsonUtils.isValidJson(json, true));
+        }
     }
 
     @Test
@@ -91,63 +147,59 @@ public class JsonUtilsTest {
 
     @Test
     public void testValidPrimitiveValues() {
-        assertFalse(JsonUtils.isValidJson("123", false));
-        assertFalse(JsonUtils.isValidJson("\"string\"", false));
-        assertFalse(JsonUtils.isValidJson("true", false));
-        assertFalse(JsonUtils.isValidJson("false", false));
-        assertFalse(JsonUtils.isValidJson("null", false));
-    }
-
-    @Test
-    public void testInvalidPrimitiveValues() {
-        assertFalse(JsonUtils.isValidJson("undefined", false));
-        assertFalse(JsonUtils.isValidJson("'string'", false));
-        assertFalse(JsonUtils.isValidJson("TRUE", false));
-        assertFalse(JsonUtils.isValidJson("False", false));
-        assertFalse(JsonUtils.isValidJson("NULL", false));
+        String[] primitives = {
+            "123",
+            "\"string\"",
+            "true",
+            "false",
+            "null"
+        };
+
+        for (String json : primitives) {
+            assertFalse("Primitive values should not be valid JSON objects: " 
+ json,
+                       JsonUtils.isValidJson(json, false));
+        }
     }
 
     @Test
     public void testComplexNestedStructures() {
+        // Valid structures
         
assertTrue(JsonUtils.isValidJson("{\"array\":[1,2,{\"nested\":true}]}", false));
         assertTrue(JsonUtils.isValidJson("[{\"obj\":{}},[[],{}]]", true));
         
assertTrue(JsonUtils.isValidJson("{\"a\":{\"b\":{\"c\":{\"d\":null}}}}", 
false));
+
+        // Invalid structures
         
assertFalse(JsonUtils.isValidJson("{\"array\":[1,2,{\"nested\":Undefined}]}", 
false));
         
assertFalse(JsonUtils.isValidJson("{\"array\":[1,2,{\"nested\":NaN}]}", false));
         
assertFalse(JsonUtils.isValidJson("{\"array\":[1,2,{\"nested\":Infinity}]}", 
false));
         
assertFalse(JsonUtils.isValidJson("{\"a\":{\"b\":{\"c\":{\"d\":void}}}}", 
false));
     }
 
+    // NodeState to Map conversion tests
     @Test
     public void testConvertNodeStateToMap() {
-        MemoryNodeBuilder builder = new 
MemoryNodeBuilder(EmptyNodeState.EMPTY_NODE);
+        NodeBuilder builder = createNodeBuilder();
         builder.setProperty("property1", "value1");
         builder.setProperty("property2", 123);
-        NodeState nodeState = builder.getNodeState();
 
-        Map<String, Object> result = 
JsonUtils.convertNodeStateToMap(nodeState, 2, true);
+        Map<String, Object> result = 
JsonUtils.convertNodeStateToMap(builder.getNodeState(), 2, true);
 
-        assertNotNull(result);
-        assertEquals(2, result.size());
-        assertTrue(result.containsKey("property1"));
-        assertTrue(result.containsKey("property2"));
-        assertEquals("value1", result.get("property1"));
-        assertEquals(123L, result.get("property2"));
+        assertPropertyValue(result, "property1", "value1");
+        assertPropertyValue(result, "property2", 123L);
     }
 
     @Test
     public void testConvertNodeStateToMapWithMaxDepth() {
-        MemoryNodeBuilder builder = new 
MemoryNodeBuilder(EmptyNodeState.EMPTY_NODE);
+        NodeBuilder builder = createNodeBuilder();
         builder.setProperty("property1", "value1");
-        NodeState nodeState = builder.getNodeState();
 
-        Map<String, Object> result = 
JsonUtils.convertNodeStateToMap(nodeState, 0, true);
+        Map<String, Object> result = 
JsonUtils.convertNodeStateToMap(builder.getNodeState(), 0, true);
         assertNotNull(result);
     }
 
     @Test
     public void testConvertNodeStateToMapWithNestedNodes() {
-        NodeBuilder builder = new MemoryNodeBuilder(EmptyNodeState.EMPTY_NODE);
+        NodeBuilder builder = createNodeBuilder();
         builder.setProperty("prop1", "val1");
 
         NodeBuilder child = builder.child("child1");
@@ -161,110 +213,250 @@ public class JsonUtilsTest {
 
         NodeState nodeState = builder.getNodeState();
 
-        // Test with maxDepth = 0 (should return only properties on current 
node)
-        Map<String, Object> result0 = 
JsonUtils.convertNodeStateToMap(nodeState, 0, true);
-        assertNotNull(result0);
-        assertEquals(1, result0.size());
-        assertTrue(result0.containsKey("prop1"));
-        assertEquals("val1", result0.get("prop1"));
-        assertNotNull(result0);
-        assertTrue(result0.containsKey("prop1"));
-        assertFalse(result0.containsKey("child1"));
-
-
-        // Test with maxDepth = 1 (should include child1)
-        Map<String, Object> result1 = 
JsonUtils.convertNodeStateToMap(nodeState, 1, true);
-        assertNotNull(result1);
-        assertTrue(result1.containsKey("child1"));
-        Map<String, Object> childMap1 = (Map<String, Object>) 
result1.get("child1");
-        assertEquals("childVal1", childMap1.get("childProp1"));
-        assertNotNull(result1);
-        assertTrue(result1.containsKey("prop1"));
-        assertTrue(result1.containsKey("child1"));
-        assertFalse(childMap1.containsKey("grandChild1"));
-
-
-        // Test with maxDepth = 2 (should include grandChild1)
-        Map<String, Object> result2 = 
JsonUtils.convertNodeStateToMap(nodeState, 2, true);
-        Map<String, Object> childMap2 = (Map<String, Object>) 
result2.get("child1");
-        assertTrue(childMap2.containsKey("grandChild1"));
-        Map<String, Object> grandChildMap2 = (Map<String, Object>) 
childMap2.get("grandChild1");
-        assertEquals("grandChildVal1", grandChildMap2.get("grandChildProp1"));
-        assertNotNull(result2);
-        assertTrue(result2.containsKey("prop1"));
-        assertTrue(result2.containsKey("child1"));
-        assertFalse(grandChildMap2.containsKey("greatGrandChild1"));
-
-        // Test with maxDepth = 3 (should include greatGrandChild1)
-        Map<String, Object> result3 = 
JsonUtils.convertNodeStateToMap(nodeState, 3, true);
-        Map<String, Object> childMap3 = (Map<String, Object>) 
result3.get("child1");
-        Map<String, Object> grandChildMap3 = (Map<String, Object>) 
childMap3.get("grandChild1");
-        Map<String, Object> greatGrandChildMap3 = (Map<String, Object>) 
grandChildMap3.get("greatGrandChild1");
-        assertEquals("greatGrandChildVal1", 
greatGrandChildMap3.get("greatGrandChildProp1"));
-        assertNotNull(result3);
-        assertTrue(result3.containsKey("prop1"));
-        assertTrue(result3.containsKey("child1"));
-
-        // Test with maxDepth = -1 (should return all nodes and properties)
-        Map<String, Object> resultNeg1 = 
JsonUtils.convertNodeStateToMap(nodeState, -1, true);
-        Map<String, Object> childMapNeg1 = (Map<String, Object>) 
resultNeg1.get("child1");
-        Map<String, Object> grandChildMapNeg1 = (Map<String, Object>) 
childMapNeg1.get("grandChild1");
-        assertTrue(grandChildMapNeg1.containsKey("greatGrandChild1"));
-        Map<String, Object> greatGrandChildMapNeg1 = (Map<String, Object>) 
grandChildMapNeg1.get("greatGrandChild1");
-        assertEquals("greatGrandChildVal1", 
greatGrandChildMapNeg1.get("greatGrandChildProp1"));
-        assertNotNull(resultNeg1);
-        assertTrue(resultNeg1.containsKey("prop1"));
-        assertTrue(resultNeg1.containsKey("child1"));
-
-
+        // Test different depth limits
+        int[] depthLimits = {0, 1, 2, 3, -1};
+        for (int depth : depthLimits) {
+            Map<String, Object> result = 
JsonUtils.convertNodeStateToMap(nodeState, depth, true);
+            assertNotNull(result);
+            assertTrue(result.containsKey("prop1"));
+
+            if (depth != 0) {
+                assertTrue(result.containsKey("child1"));
+                Map<String, Object> childMap = (Map<String, Object>) 
result.get("child1");
+                assertTrue(childMap.containsKey("childProp1"));
+
+                if (depth > 1 || depth == -1) {
+                    assertTrue(childMap.containsKey("grandChild1"));
+                    Map<String, Object> grandChildMap = (Map<String, Object>) 
childMap.get("grandChild1");
+                    assertTrue(grandChildMap.containsKey("grandChildProp1"));
+
+                    if (depth > 2 || depth == -1) {
+                        
assertTrue(grandChildMap.containsKey("greatGrandChild1"));
+                        Map<String, Object> greatGrandChildMap = (Map<String, 
Object>) grandChildMap.get("greatGrandChild1");
+                        
assertTrue(greatGrandChildMap.containsKey("greatGrandChildProp1"));
+                    }
+                }
+            }
+        }
     }
 
     @Test
     public void testConvertNodeStateToMapWithHiddenNodesAndProperties() {
-        NodeBuilder builder = new MemoryNodeBuilder(EmptyNodeState.EMPTY_NODE);
+        NodeBuilder builder = createNodeBuilder();
 
-        // Regular property
+        // Regular property and child
         builder.setProperty("regularProp", "regularValue");
-
-        // Hidden property (starts with ":")
-        builder.setProperty(":hiddenProp", "hiddenValue");
-
-        // Regular child
         NodeBuilder regularChild = builder.child("regularChild");
         regularChild.setProperty("childProp", "childValue");
 
-        // Hidden child (starts with ":")
+        // Hidden property and child (starts with ":")
+        builder.setProperty(":hiddenProp", "hiddenValue");
         NodeBuilder hiddenChild = builder.child(":hiddenChild");
         hiddenChild.setProperty("hiddenChildProp", "hiddenChildValue");
 
         NodeState nodeState = builder.getNodeState();
 
+        // Test with shouldSerializeHiddenNodesOrProperties = false
+        Map<String, Object> resultHidden = 
JsonUtils.convertNodeStateToMap(nodeState, -1, false);
+        assertNotNull(resultHidden);
+        assertEquals(2, resultHidden.size());
+        assertTrue(resultHidden.containsKey("regularProp"));
+        assertTrue(resultHidden.containsKey("regularChild"));
+        assertFalse(resultHidden.containsKey(":hiddenProp"));
+        assertFalse(resultHidden.containsKey(":hiddenChild"));
+
         // Test with shouldSerializeHiddenNodesOrProperties = true
-        // Hidden nodes and properties should be excluded
-        Map<String, Object> resultWithHiddenExcluded = 
JsonUtils.convertNodeStateToMap(nodeState, -1, false);
-        assertNotNull(resultWithHiddenExcluded);
-        assertEquals(2, resultWithHiddenExcluded.size());
-        assertTrue(resultWithHiddenExcluded.containsKey("regularProp"));
-        assertTrue(resultWithHiddenExcluded.containsKey("regularChild"));
-        assertFalse(resultWithHiddenExcluded.containsKey(":hiddenProp"));
-        assertFalse(resultWithHiddenExcluded.containsKey(":hiddenChild"));
+        Map<String, Object> resultVisible = 
JsonUtils.convertNodeStateToMap(nodeState, -1, true);
+        assertNotNull(resultVisible);
+        assertEquals(4, resultVisible.size());
+        assertTrue(resultVisible.containsKey("regularProp"));
+        assertTrue(resultVisible.containsKey("regularChild"));
+        assertTrue(resultVisible.containsKey(":hiddenProp"));
+        assertTrue(resultVisible.containsKey(":hiddenChild"));
+    }
 
-        // Test with shouldSerializeHiddenNodesOrProperties = false
-        // Hidden nodes and properties should be included
-        Map<String, Object> resultWithHiddenIncluded = 
JsonUtils.convertNodeStateToMap(nodeState, -1, true);
-        assertNotNull(resultWithHiddenIncluded);
-        assertEquals(4, resultWithHiddenIncluded.size());
-        assertTrue(resultWithHiddenIncluded.containsKey("regularProp"));
-        assertTrue(resultWithHiddenIncluded.containsKey("regularChild"));
-        assertTrue(resultWithHiddenIncluded.containsKey(":hiddenProp"));
-        assertTrue(resultWithHiddenIncluded.containsKey(":hiddenChild"));
-        assertEquals("hiddenValue", 
resultWithHiddenIncluded.get(":hiddenProp"));
-
-        // Verify nested content
-        Map<String, Object> regularChildMap = (Map<String, Object>) 
resultWithHiddenIncluded.get("regularChild");
-        assertEquals("childValue", regularChildMap.get("childProp"));
-
-        Map<String, Object> hiddenChildMap = (Map<String, Object>) 
resultWithHiddenIncluded.get(":hiddenChild");
-        assertEquals("hiddenChildValue", 
hiddenChildMap.get("hiddenChildProp"));
+    // Type-specific property tests
+    @Test
+    public void testNodeStateWithDecimalValues() {
+        NodeBuilder builder = createNodeBuilder();
+
+        // Single decimal property
+        BigDecimal singleDecimal = new BigDecimal("123.456");
+        builder.setProperty("decimalProp", singleDecimal);
+
+        // Array of decimal values
+        List<BigDecimal> decimalValues = Arrays.asList(
+                new BigDecimal("1.1"),
+                new BigDecimal("2.2"),
+                new BigDecimal("3.3"),
+                new BigDecimal("9999.9999")
+        );
+        builder.setProperty("decimalArray", decimalValues, Type.DECIMALS);
+
+        Map<String, Object> result = 
JsonUtils.convertNodeStateToMap(builder.getNodeState(), -1, true);
+
+        assertPropertyValue(result, "decimalProp", singleDecimal);
+        assertArrayValues(result, "decimalArray", decimalValues);
+    }
+
+    @Test
+    public void testNodeStateWithDateValues() {
+        NodeBuilder builder = createNodeBuilder();
+
+        // Single date property
+        Calendar date1 = Calendar.getInstance();
+        builder.setProperty("dateProp", date1);
+
+        Map<String, Object> result = 
JsonUtils.convertNodeStateToMap(builder.getNodeState(), -1, true);
+
+        assertTrue(result.containsKey("dateProp"));
+
+        // Date property should be a String (ISO formatted date)
+        Object dateValue = result.get("dateProp");
+        assertTrue("Date value is of type " + dateValue.getClass().getName(),
+                  dateValue instanceof String);
+        // Verify it looks like an ISO date string
+        String dateStr = (String) dateValue;
+        assertTrue("Date value should be in ISO format: " + dateStr,
+                
dateStr.matches("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.*"));
+    }
+
+    @Test
+    public void testNodeStateWithDateArrayValues() {
+        NodeBuilder builder = createNodeBuilder();
+
+        // String ISO dates for array
+        List<String> dateStrings = Arrays.asList(
+            "2021-01-01T10:30:00.000Z",
+            "2022-02-02T12:45:00.000Z",
+            "2023-03-03T14:15:00.000Z"
+        );
+
+        builder.setProperty("dateStringArray", dateStrings, Type.DATES);
+
+        Map<String, Object> result = 
JsonUtils.convertNodeStateToMap(builder.getNodeState(), -1, true);
+
+        assertTrue(result.containsKey("dateStringArray"));
+
+        // Check date array contains String objects (ISO format dates)
+        List<?> resultArray = (List<?>) result.get("dateStringArray");
+        assertNotNull(resultArray);
+        assertEquals(3, resultArray.size());
+
+        for (Object date : resultArray) {
+            assertTrue("Date array element is of type " + 
date.getClass().getName(),
+                     date instanceof String);
+            String dateStr = (String) date;
+            assertTrue("Date array value should be in ISO format: " + dateStr,
+                    
dateStr.matches("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.*"));
+        }
+    }
+
+    @Test
+    public void testNodeStateWithPrimitiveValues() {
+        NodeBuilder builder = createNodeBuilder();
+
+        // Boolean properties
+        builder.setProperty("boolTrue", true);
+        builder.setProperty("boolFalse", false);
+        List<Boolean> booleanValues = Arrays.asList(true, false, true, true, 
false);
+        builder.setProperty("booleanArray", booleanValues, Type.BOOLEANS);
+
+        // Double properties
+        builder.setProperty("doubleValue", 123.456);
+        builder.setProperty("doubleZero", 0.0);
+        builder.setProperty("doubleNegative", -987.654);
+        List<Double> doubleValues = Arrays.asList(1.1, 2.2, 3.3, -4.4, 0.0);
+        builder.setProperty("doubleArray", doubleValues, Type.DOUBLES);
+
+        // Long properties
+        builder.setProperty("longValue", 1234567890L);
+        builder.setProperty("longZero", 0L);
+        builder.setProperty("longNegative", -9876543210L);
+        builder.setProperty("longMax", Long.MAX_VALUE);
+        builder.setProperty("longMin", Long.MIN_VALUE);
+        List<Long> longValues = Arrays.asList(11L, 22L, 33L, -44L, 0L);
+        builder.setProperty("longArray", longValues, Type.LONGS);
+
+        // String array
+        List<String> mixedStrings = Arrays.asList("string", "123", "true");
+        builder.setProperty("mixedArray", mixedStrings, Type.STRINGS);
+
+        Map<String, Object> result = 
JsonUtils.convertNodeStateToMap(builder.getNodeState(), -1, true);
+
+        // Check boolean values
+        assertPropertyValue(result, "boolTrue", true);
+        assertPropertyValue(result, "boolFalse", false);
+        assertArrayValues(result, "booleanArray", booleanValues);
+
+        // Check double values
+        assertEquals(123.456, (Double) result.get("doubleValue"), 0.0001);
+        assertEquals(0.0, (Double) result.get("doubleZero"), 0.0001);
+        assertEquals(-987.654, (Double) result.get("doubleNegative"), 0.0001);
+
+        List<Double> doubleResultArray = (List<Double>) 
result.get("doubleArray");
+        for (int i = 0; i < doubleValues.size(); i++) {
+            assertEquals(doubleValues.get(i), doubleResultArray.get(i), 
0.0001);
+        }
+
+        // Check long values
+        assertPropertyValue(result, "longValue", 1234567890L);
+        assertPropertyValue(result, "longZero", 0L);
+        assertPropertyValue(result, "longNegative", -9876543210L);
+        assertPropertyValue(result, "longMax", Long.MAX_VALUE);
+        assertPropertyValue(result, "longMin", Long.MIN_VALUE);
+        assertArrayValues(result, "longArray", longValues);
+
+        // Check string array
+        assertArrayValues(result, "mixedArray", mixedStrings);
+    }
+
+    @Test
+    public void testNodeStateToJson() {
+        try {
+            NodeBuilder builder = createNodeBuilder();
+
+            // Add various types of properties
+            builder.setProperty("string", "string value");
+            builder.setProperty("long", 12345L);
+            builder.setProperty("double", 123.456);
+            builder.setProperty("boolean", true);
+            builder.setProperty("decimal", new BigDecimal("987.654"));
+
+            // Add array properties
+            builder.setProperty("stringArray", Arrays.asList("value1", 
"value2", "value3"), Type.STRINGS);
+            builder.setProperty("longArray", Arrays.asList(1L, 2L, 3L), 
Type.LONGS);
+            builder.setProperty("doubleArray", Arrays.asList(1.1, 2.2, 3.3), 
Type.DOUBLES);
+
+            // Add a child node
+            NodeBuilder child = builder.child("child");
+            child.setProperty("childProp", "child value");
+
+            NodeState nodeState = builder.getNodeState();
+
+            String json = JsonUtils.nodeStateToJson(nodeState, -1);
+
+            // Basic verification that the JSON contains expected values
+            assertTrue(json.contains("\"string\" : \"string value\""));
+            assertTrue(json.contains("\"long\" : 12345"));
+            assertTrue(json.contains("\"double\" : 123.456"));
+            assertTrue(json.contains("\"boolean\" : true"));
+
+            // Verify array format
+            assertTrue(json.contains("\"stringArray\" : [ \"value1\", 
\"value2\", \"value3\" ]"));
+            assertTrue(json.contains("\"longArray\" : [ 1, 2, 3 ]"));
+
+            // Verify child node
+            assertTrue(json.contains("\"child\" : {"));
+            assertTrue(json.contains("\"childProp\" : \"child value\""));
+
+            // Test with limited depth
+            String jsonLimitedDepth = JsonUtils.nodeStateToJson(nodeState, 0);
+            assertTrue(jsonLimitedDepth.contains("\"string\" : \"string 
value\""));
+            assertFalse(jsonLimitedDepth.contains("\"childProp\" : \"child 
value\""));
+
+        } catch (Exception e) {
+            fail("Exception thrown during test: " + e.getMessage());
+        }
     }
 }

Reply via email to