| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- #include "testBase.h"
- static void testEdgeWrapAddItemToObjectDiscardOldKey(void)
- {
- // 复杂链路:
- // Parse -> DetachByKey(带 key 的容器) -> AddItemToObject(新 key) -> Compare。
- // 目标:验证 AddItemToObject 会丢弃原 key,仅保留新 key。
- RyanJson_t root = RyanJsonParse("{\"src\":{\"old\":{\"v\":1}},\"dst\":{}}");
- TEST_ASSERT_NOT_NULL(root);
- RyanJson_t src = RyanJsonGetObjectToKey(root, "src");
- RyanJson_t dst = RyanJsonGetObjectToKey(root, "dst");
- TEST_ASSERT_NOT_NULL(src);
- TEST_ASSERT_NOT_NULL(dst);
- RyanJson_t moved = RyanJsonDetachByKey(src, "old");
- TEST_ASSERT_NOT_NULL(moved);
- TEST_ASSERT_TRUE_MESSAGE(RyanJsonAddItemToObject(dst, "new", moved), "AddItemToObject 包装挂载失败");
- TEST_ASSERT_NOT_NULL(RyanJsonGetObjectToKey(dst, "new"));
- TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToKey(dst, "old"), "包装后不应保留旧 key");
- TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectToKey(dst, "new", "v")));
- RyanJson_t expect = RyanJsonParse("{\"src\":{},\"dst\":{\"new\":{\"v\":1}}}");
- TEST_ASSERT_NOT_NULL(expect);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
- RyanJsonDelete(expect);
- RyanJsonDelete(root);
- }
- static void testEdgeWrapAddItemToArrayDiscardOldKey(void)
- {
- // 复杂链路:
- // Parse -> DetachByKey(带 key 的容器) -> AddItemToArray -> Compare/属性校验。
- // 目标:验证 AddItemToArray 会丢弃原 key,Array 元素不应携带 key。
- RyanJson_t root = RyanJsonParse("{\"src\":{\"old\":{\"v\":1}},\"arr\":[]}");
- TEST_ASSERT_NOT_NULL(root);
- RyanJson_t src = RyanJsonGetObjectToKey(root, "src");
- RyanJson_t arr = RyanJsonGetObjectToKey(root, "arr");
- TEST_ASSERT_NOT_NULL(src);
- TEST_ASSERT_NOT_NULL(arr);
- RyanJson_t moved = RyanJsonDetachByKey(src, "old");
- TEST_ASSERT_NOT_NULL(moved);
- TEST_ASSERT_TRUE_MESSAGE(RyanJsonAddItemToArray(arr, moved), "AddItemToArray 包装挂载失败");
- TEST_ASSERT_EQUAL_UINT32(1U, RyanJsonGetArraySize(arr));
- RyanJson_t arrItem = RyanJsonGetObjectByIndex(arr, 0);
- TEST_ASSERT_NOT_NULL(arrItem);
- TEST_ASSERT_FALSE_MESSAGE(RyanJsonIsKey(arrItem), "Array 元素不应携带 key");
- TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectToKey(arrItem, "v")));
- RyanJson_t expect = RyanJsonParse("{\"src\":{},\"arr\":[{\"v\":1}]}");
- TEST_ASSERT_NOT_NULL(expect);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
- RyanJsonDelete(expect);
- RyanJsonDelete(root);
- }
- static void testEdgeWrapObjectNodeToArrayThenRebindNewKey(void)
- {
- // 复杂链路:
- // Parse -> DetachByKey -> AddItemToArray -> DetachByIndex -> ChangeKey(失败) -> AddItemToObject。
- // 目标:验证 Object 节点经 Array 中转后会失去 key,必须通过 AddItemToObject 重新绑定新 key。
- RyanJson_t root = RyanJsonParse("{\"obj\":{\"k\":{\"v\":1}},\"arr\":[]}");
- TEST_ASSERT_NOT_NULL(root);
- RyanJson_t obj = RyanJsonGetObjectToKey(root, "obj");
- RyanJson_t arr = RyanJsonGetObjectToKey(root, "arr");
- TEST_ASSERT_NOT_NULL(obj);
- TEST_ASSERT_NOT_NULL(arr);
- RyanJson_t moved = RyanJsonDetachByKey(obj, "k");
- TEST_ASSERT_NOT_NULL(moved);
- TEST_ASSERT_TRUE(RyanJsonAddItemToArray(arr, moved));
- RyanJson_t movedBack = RyanJsonDetachByIndex(arr, 0);
- TEST_ASSERT_NOT_NULL(movedBack);
- TEST_ASSERT_FALSE_MESSAGE(RyanJsonChangeKey(movedBack, "k2"), "Array 元素无 key,ChangeKey 应失败");
- TEST_ASSERT_TRUE_MESSAGE(RyanJsonAddItemToObject(obj, "k2", movedBack), "AddItemToObject 重新绑定 key 失败");
- RyanJson_t expect = RyanJsonParse("{\"obj\":{\"k2\":{\"v\":1}},\"arr\":[]}");
- TEST_ASSERT_NOT_NULL(expect);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
- RyanJsonDelete(expect);
- RyanJsonDelete(root);
- }
- static void testEdgeWrapArrayElementToObjectAndBackPreservesWrappedKey(void)
- {
- // 复杂链路:
- // Parse -> DetachByIndex -> AddItemToObject -> DetachByKey -> Insert(Array)。
- // 目标:验证 Array 元素包装成 Object 字段后,再插回 Array 时会保留包装阶段生成的 key。
- RyanJson_t root = RyanJsonParse("{\"arr\":[{\"id\":\"a\"},{\"id\":\"b\"}],\"obj\":{}}");
- TEST_ASSERT_NOT_NULL(root);
- RyanJson_t arr = RyanJsonGetObjectToKey(root, "arr");
- RyanJson_t obj = RyanJsonGetObjectToKey(root, "obj");
- TEST_ASSERT_NOT_NULL(arr);
- TEST_ASSERT_NOT_NULL(obj);
- RyanJson_t moved = RyanJsonDetachByIndex(arr, 0);
- TEST_ASSERT_NOT_NULL(moved);
- TEST_ASSERT_TRUE_MESSAGE(RyanJsonAddItemToObject(obj, "first", moved), "将 Array 元素包装挂到 Object 失败");
- RyanJson_t movedBack = RyanJsonDetachByKey(obj, "first");
- TEST_ASSERT_NOT_NULL(movedBack);
- TEST_ASSERT_TRUE_MESSAGE(RyanJsonInsert(arr, 1, movedBack), "将包装节点插回 Array 失败");
- TEST_ASSERT_EQUAL_UINT32(2U, RyanJsonGetArraySize(arr));
- TEST_ASSERT_EQUAL_UINT32(0U, RyanJsonGetSize(obj));
- RyanJson_t e0 = RyanJsonGetObjectByIndex(arr, 0);
- RyanJson_t e1 = RyanJsonGetObjectByIndex(arr, 1);
- TEST_ASSERT_NOT_NULL(e0);
- TEST_ASSERT_NOT_NULL(e1);
- TEST_ASSERT_EQUAL_STRING("b", RyanJsonGetStringValue(RyanJsonGetObjectToKey(e0, "id")));
- TEST_ASSERT_EQUAL_STRING("a", RyanJsonGetStringValue(RyanJsonGetObjectToKey(e1, "id")));
- TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsKey(e1), "包装节点插回 Array 后应仍携带 key");
- RyanJsonDelete(root);
- }
- static void testEdgeWrapChangeDetachedKeyThenInsertBack(void)
- {
- // 复杂链路:
- // Parse -> DetachByKey -> ChangeKey -> Insert(回插同 Object) -> Compare。
- // 目标:验证分离节点改 key 后仍可稳定插回 Object。
- RyanJson_t root = RyanJsonParse("{\"o\":{\"a\":1,\"b\":2}}");
- TEST_ASSERT_NOT_NULL(root);
- RyanJson_t obj = RyanJsonGetObjectToKey(root, "o");
- TEST_ASSERT_NOT_NULL(obj);
- RyanJson_t moved = RyanJsonDetachByKey(obj, "a");
- TEST_ASSERT_NOT_NULL(moved);
- TEST_ASSERT_TRUE(RyanJsonChangeKey(moved, "c"));
- TEST_ASSERT_TRUE(RyanJsonInsert(obj, 0, moved));
- TEST_ASSERT_FALSE(RyanJsonHasObjectToKey(root, "o", "a"));
- TEST_ASSERT_TRUE(RyanJsonHasObjectToKey(root, "o", "b"));
- TEST_ASSERT_TRUE(RyanJsonHasObjectToKey(root, "o", "c"));
- RyanJson_t expect = RyanJsonParse("{\"o\":{\"b\":2,\"c\":1}}");
- TEST_ASSERT_NOT_NULL(expect);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
- RyanJsonDelete(expect);
- RyanJsonDelete(root);
- }
- void testEdgeWrapRebindRunner(void)
- {
- UnitySetTestFile(__FILE__);
- RUN_TEST(testEdgeWrapAddItemToObjectDiscardOldKey);
- RUN_TEST(testEdgeWrapAddItemToArrayDiscardOldKey);
- RUN_TEST(testEdgeWrapObjectNodeToArrayThenRebindNewKey);
- RUN_TEST(testEdgeWrapArrayElementToObjectAndBackPreservesWrappedKey);
- RUN_TEST(testEdgeWrapChangeDetachedKeyThenInsertBack);
- }
|