diff -r 7156d6699410 -r 5c4ee11417c1 tests/test_json.c --- a/tests/test_json.c Sat Dec 13 16:27:16 2025 +0100 +++ b/tests/test_json.c Sat Dec 13 16:27:24 2025 +0100 @@ -1313,10 +1313,11 @@ } CX_TEST(test_json_compare_objects) { - CxJsonValue *json[7]; + CxJsonValue *json[10]; cxJsonFromString(NULL, "{ }", &json[0]); cxJsonFromString(NULL, "{ }", &json[1]); cxJsonFromString(NULL, "{ \"name\": \"value\" }", &json[2]); + cxJsonFromString(NULL, "{ \"name\": \"value\" }", &json[7]); cxJsonFromString(NULL, "{ \"key0\": \"value0\", \"key1\": \"value1\", \"key2\":null }", &json[3]); cxJsonFromString(NULL, "{ \"key1\": \"value1\", \"key2\":null, \"key0\": \"value0\" }", &json[4]); @@ -1339,33 +1340,77 @@ "}\n"; cxJsonFromString(NULL, json_complex_object, &json[5]); cxJsonFromString(NULL, json_complex_object, &json[6]); + const char *json_complex_object_int_array_mismatch = + "{\n" + " \"bool\": false,\n" + " \"int\": 47,\n" + " \"strings\": [ \"hello\", \"world\" ],\n" + " \"nested\": {\n" + " \"string\": \"test\",\n" + " \"floats\": [ 3.1415, 47.11, 8.15 ],\n" + " \"ints\": [ 4, 8, 16, 15, 23, 42 ],\n" + " \"literals\": [ true, null, false ],\n" + " \"objects\": [\n" + " {},\n" + " { \"unicode\": \"\\u03a3\\u29b0\" },\n" + " { \"array\": [ 1,2,3] }\n" + " ]\n" + " }\n" + "}\n"; + cxJsonFromString(NULL, json_complex_object_int_array_mismatch, &json[8]); + const char *json_complex_object_different_order = + "{\n" + " \"bool\": false,\n" + " \"nested\": {\n" + " \"string\": \"test\",\n" + " \"ints\": [ 4, 8, 15, 16, 23, 42 ],\n" + " \"floats\": [ 3.1415, 47.11, 8.15 ],\n" + " \"objects\": [\n" + " {},\n" + " { \"unicode\": \"\\u03a3\\u29b0\" },\n" + " { \"array\": [ 1,2,3] }\n" + " ],\n" + " \"literals\": [ true, null, false ]\n" + " },\n" + " \"int\": 47,\n" + " \"strings\": [ \"hello\", \"world\" ]\n" + "}\n"; + cxJsonFromString(NULL, json_complex_object_different_order, &json[9]); CX_TEST_DO { - for(int i=0;i<7;i++) { + for (unsigned i = 0; i < cx_nmemb(json); i++) { CX_TEST_ASSERT(cxJsonIsObject(json[i])); } CX_TEST_ASSERT(cxJsonCompare(json[0], json[0]) == 0); CX_TEST_ASSERT(cxJsonCompare(json[0], json[1]) == 0); - CX_TEST_ASSERT(cxJsonCompare(json[2], json[2]) == 0); // <-- fail - - // compare empty object with all other objects - for(int i=2;i<6;i++) { - CX_TEST_ASSERT(cxJsonCompare(json[0], json[i]) != 0); - } + CX_TEST_ASSERT(cxJsonCompare(json[1], json[0]) == 0); + CX_TEST_ASSERT(cxJsonCompare(json[2], json[7]) == 0); + CX_TEST_ASSERT(cxJsonCompare(json[7], json[2]) == 0); // compare different objects CX_TEST_ASSERT(cxJsonCompare(json[2], json[3]) != 0); CX_TEST_ASSERT(cxJsonCompare(json[2], json[5]) != 0); // compare equal objects with different orders - CX_TEST_ASSERT(cxJsonCompare(json[3], json[4]) == 0); // <-- fail + CX_TEST_ASSERT(cxJsonCompare(json[3], json[4]) == 0); // test the same complex object - CX_TEST_ASSERT(cxJsonCompare(json[6], json[7])); // <-- fail, even with hashmap + CX_TEST_ASSERT(cxJsonCompare(json[5], json[6]) == 0); + CX_TEST_ASSERT(cxJsonCompare(json[6], json[5]) == 0); + + // object has a deep difference + CX_TEST_ASSERT(cxJsonCompare(json[5], json[8]) != 0); + CX_TEST_ASSERT(cxJsonCompare(json[8], json[5]) != 0); + + // equal except for the member order + CX_TEST_ASSERT(cxJsonCompare(json[5], json[9]) == 0); + CX_TEST_ASSERT(cxJsonCompare(json[6], json[9]) == 0); + CX_TEST_ASSERT(cxJsonCompare(json[9], json[5]) == 0); + CX_TEST_ASSERT(cxJsonCompare(json[9], json[6]) == 0); } - for(int i=0;i<7;i++) { + for(unsigned i=0;i