testEdgeWrapRebind.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include "testBase.h"
  2. static void testEdgeWrapAddItemToObjectDiscardOldKey(void)
  3. {
  4. // 复杂链路:
  5. // Parse -> DetachByKey(带 key 的容器) -> AddItemToObject(新 key) -> Compare。
  6. // 目标:验证 AddItemToObject 会丢弃原 key,仅保留新 key。
  7. RyanJson_t root = RyanJsonParse("{\"src\":{\"old\":{\"v\":1}},\"dst\":{}}");
  8. TEST_ASSERT_NOT_NULL(root);
  9. RyanJson_t src = RyanJsonGetObjectToKey(root, "src");
  10. RyanJson_t dst = RyanJsonGetObjectToKey(root, "dst");
  11. TEST_ASSERT_NOT_NULL(src);
  12. TEST_ASSERT_NOT_NULL(dst);
  13. RyanJson_t moved = RyanJsonDetachByKey(src, "old");
  14. TEST_ASSERT_NOT_NULL(moved);
  15. TEST_ASSERT_TRUE_MESSAGE(RyanJsonAddItemToObject(dst, "new", moved), "AddItemToObject 包装挂载失败");
  16. TEST_ASSERT_NOT_NULL(RyanJsonGetObjectToKey(dst, "new"));
  17. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToKey(dst, "old"), "包装后不应保留旧 key");
  18. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectToKey(dst, "new", "v")));
  19. RyanJson_t expect = RyanJsonParse("{\"src\":{},\"dst\":{\"new\":{\"v\":1}}}");
  20. TEST_ASSERT_NOT_NULL(expect);
  21. TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
  22. RyanJsonDelete(expect);
  23. RyanJsonDelete(root);
  24. }
  25. static void testEdgeWrapAddItemToArrayDiscardOldKey(void)
  26. {
  27. // 复杂链路:
  28. // Parse -> DetachByKey(带 key 的容器) -> AddItemToArray -> Compare/属性校验。
  29. // 目标:验证 AddItemToArray 会丢弃原 key,Array 元素不应携带 key。
  30. RyanJson_t root = RyanJsonParse("{\"src\":{\"old\":{\"v\":1}},\"arr\":[]}");
  31. TEST_ASSERT_NOT_NULL(root);
  32. RyanJson_t src = RyanJsonGetObjectToKey(root, "src");
  33. RyanJson_t arr = RyanJsonGetObjectToKey(root, "arr");
  34. TEST_ASSERT_NOT_NULL(src);
  35. TEST_ASSERT_NOT_NULL(arr);
  36. RyanJson_t moved = RyanJsonDetachByKey(src, "old");
  37. TEST_ASSERT_NOT_NULL(moved);
  38. TEST_ASSERT_TRUE_MESSAGE(RyanJsonAddItemToArray(arr, moved), "AddItemToArray 包装挂载失败");
  39. TEST_ASSERT_EQUAL_UINT32(1U, RyanJsonGetArraySize(arr));
  40. RyanJson_t arrItem = RyanJsonGetObjectByIndex(arr, 0);
  41. TEST_ASSERT_NOT_NULL(arrItem);
  42. TEST_ASSERT_FALSE_MESSAGE(RyanJsonIsKey(arrItem), "Array 元素不应携带 key");
  43. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectToKey(arrItem, "v")));
  44. RyanJson_t expect = RyanJsonParse("{\"src\":{},\"arr\":[{\"v\":1}]}");
  45. TEST_ASSERT_NOT_NULL(expect);
  46. TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
  47. RyanJsonDelete(expect);
  48. RyanJsonDelete(root);
  49. }
  50. static void testEdgeWrapObjectNodeToArrayThenRebindNewKey(void)
  51. {
  52. // 复杂链路:
  53. // Parse -> DetachByKey -> AddItemToArray -> DetachByIndex -> ChangeKey(失败) -> AddItemToObject。
  54. // 目标:验证 Object 节点经 Array 中转后会失去 key,必须通过 AddItemToObject 重新绑定新 key。
  55. RyanJson_t root = RyanJsonParse("{\"obj\":{\"k\":{\"v\":1}},\"arr\":[]}");
  56. TEST_ASSERT_NOT_NULL(root);
  57. RyanJson_t obj = RyanJsonGetObjectToKey(root, "obj");
  58. RyanJson_t arr = RyanJsonGetObjectToKey(root, "arr");
  59. TEST_ASSERT_NOT_NULL(obj);
  60. TEST_ASSERT_NOT_NULL(arr);
  61. RyanJson_t moved = RyanJsonDetachByKey(obj, "k");
  62. TEST_ASSERT_NOT_NULL(moved);
  63. TEST_ASSERT_TRUE(RyanJsonAddItemToArray(arr, moved));
  64. RyanJson_t movedBack = RyanJsonDetachByIndex(arr, 0);
  65. TEST_ASSERT_NOT_NULL(movedBack);
  66. TEST_ASSERT_FALSE_MESSAGE(RyanJsonChangeKey(movedBack, "k2"), "Array 元素无 key,ChangeKey 应失败");
  67. TEST_ASSERT_TRUE_MESSAGE(RyanJsonAddItemToObject(obj, "k2", movedBack), "AddItemToObject 重新绑定 key 失败");
  68. RyanJson_t expect = RyanJsonParse("{\"obj\":{\"k2\":{\"v\":1}},\"arr\":[]}");
  69. TEST_ASSERT_NOT_NULL(expect);
  70. TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
  71. RyanJsonDelete(expect);
  72. RyanJsonDelete(root);
  73. }
  74. static void testEdgeWrapArrayElementToObjectAndBackPreservesWrappedKey(void)
  75. {
  76. // 复杂链路:
  77. // Parse -> DetachByIndex -> AddItemToObject -> DetachByKey -> Insert(Array)。
  78. // 目标:验证 Array 元素包装成 Object 字段后,再插回 Array 时会保留包装阶段生成的 key。
  79. RyanJson_t root = RyanJsonParse("{\"arr\":[{\"id\":\"a\"},{\"id\":\"b\"}],\"obj\":{}}");
  80. TEST_ASSERT_NOT_NULL(root);
  81. RyanJson_t arr = RyanJsonGetObjectToKey(root, "arr");
  82. RyanJson_t obj = RyanJsonGetObjectToKey(root, "obj");
  83. TEST_ASSERT_NOT_NULL(arr);
  84. TEST_ASSERT_NOT_NULL(obj);
  85. RyanJson_t moved = RyanJsonDetachByIndex(arr, 0);
  86. TEST_ASSERT_NOT_NULL(moved);
  87. TEST_ASSERT_TRUE_MESSAGE(RyanJsonAddItemToObject(obj, "first", moved), "将 Array 元素包装挂到 Object 失败");
  88. RyanJson_t movedBack = RyanJsonDetachByKey(obj, "first");
  89. TEST_ASSERT_NOT_NULL(movedBack);
  90. TEST_ASSERT_TRUE_MESSAGE(RyanJsonInsert(arr, 1, movedBack), "将包装节点插回 Array 失败");
  91. TEST_ASSERT_EQUAL_UINT32(2U, RyanJsonGetArraySize(arr));
  92. TEST_ASSERT_EQUAL_UINT32(0U, RyanJsonGetSize(obj));
  93. RyanJson_t e0 = RyanJsonGetObjectByIndex(arr, 0);
  94. RyanJson_t e1 = RyanJsonGetObjectByIndex(arr, 1);
  95. TEST_ASSERT_NOT_NULL(e0);
  96. TEST_ASSERT_NOT_NULL(e1);
  97. TEST_ASSERT_EQUAL_STRING("b", RyanJsonGetStringValue(RyanJsonGetObjectToKey(e0, "id")));
  98. TEST_ASSERT_EQUAL_STRING("a", RyanJsonGetStringValue(RyanJsonGetObjectToKey(e1, "id")));
  99. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsKey(e1), "包装节点插回 Array 后应仍携带 key");
  100. RyanJsonDelete(root);
  101. }
  102. static void testEdgeWrapChangeDetachedKeyThenInsertBack(void)
  103. {
  104. // 复杂链路:
  105. // Parse -> DetachByKey -> ChangeKey -> Insert(回插同 Object) -> Compare。
  106. // 目标:验证分离节点改 key 后仍可稳定插回 Object。
  107. RyanJson_t root = RyanJsonParse("{\"o\":{\"a\":1,\"b\":2}}");
  108. TEST_ASSERT_NOT_NULL(root);
  109. RyanJson_t obj = RyanJsonGetObjectToKey(root, "o");
  110. TEST_ASSERT_NOT_NULL(obj);
  111. RyanJson_t moved = RyanJsonDetachByKey(obj, "a");
  112. TEST_ASSERT_NOT_NULL(moved);
  113. TEST_ASSERT_TRUE(RyanJsonChangeKey(moved, "c"));
  114. TEST_ASSERT_TRUE(RyanJsonInsert(obj, 0, moved));
  115. TEST_ASSERT_FALSE(RyanJsonHasObjectToKey(root, "o", "a"));
  116. TEST_ASSERT_TRUE(RyanJsonHasObjectToKey(root, "o", "b"));
  117. TEST_ASSERT_TRUE(RyanJsonHasObjectToKey(root, "o", "c"));
  118. RyanJson_t expect = RyanJsonParse("{\"o\":{\"b\":2,\"c\":1}}");
  119. TEST_ASSERT_NOT_NULL(expect);
  120. TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
  121. RyanJsonDelete(expect);
  122. RyanJsonDelete(root);
  123. }
  124. void testEdgeWrapRebindRunner(void)
  125. {
  126. UnitySetTestFile(__FILE__);
  127. RUN_TEST(testEdgeWrapAddItemToObjectDiscardOldKey);
  128. RUN_TEST(testEdgeWrapAddItemToArrayDiscardOldKey);
  129. RUN_TEST(testEdgeWrapObjectNodeToArrayThenRebindNewKey);
  130. RUN_TEST(testEdgeWrapArrayElementToObjectAndBackPreservesWrappedKey);
  131. RUN_TEST(testEdgeWrapChangeDetachedKeyThenInsertBack);
  132. }