testDetach.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. #include "testBase.h"
  2. static void testDetachEdgeCases(void)
  3. {
  4. // 分离接口输入 NULL
  5. TEST_ASSERT_NULL_MESSAGE(RyanJsonDetachByKey(NULL, "key"), "DetachByKey(NULL, key) 应返回 NULL");
  6. TEST_ASSERT_NULL_MESSAGE(RyanJsonDetachByIndex(NULL, 0), "DetachByIndex(NULL, 0) 应返回 NULL");
  7. // 分离不存在的元素
  8. RyanJson_t obj = RyanJsonCreateObject();
  9. RyanJsonAddIntToObject(obj, "a", 1);
  10. TEST_ASSERT_NULL_MESSAGE(RyanJsonDetachByKey(obj, "non_existent"), "DetachByKey(不存在) 应返回 NULL");
  11. TEST_ASSERT_NULL_MESSAGE(RyanJsonDetachByIndex(obj, 99), "DetachByIndex(越界) 应返回 NULL");
  12. // 从非容器节点分离
  13. RyanJson_t val = RyanJsonCreateString("str", "value");
  14. TEST_ASSERT_NULL_MESSAGE(RyanJsonDetachByKey(val, "a"), "从 String DetachByKey 应返回 NULL");
  15. TEST_ASSERT_NULL_MESSAGE(RyanJsonDetachByIndex(val, 0), "从 String DetachByIndex 应返回 NULL");
  16. RyanJsonDelete(obj);
  17. RyanJsonDelete(val);
  18. }
  19. static void testDetachDuplicateKey(void)
  20. {
  21. RyanJson_t obj = RyanJsonCreateObject();
  22. TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, "dup", 1));
  23. #if true == RyanJsonStrictObjectKeyCheck
  24. TEST_ASSERT_FALSE_MESSAGE(RyanJsonAddIntToObject(obj, "dup", 2), "严格模式下对象不应允许重复 key");
  25. #else
  26. TEST_ASSERT_TRUE_MESSAGE(RyanJsonAddIntToObject(obj, "dup", 2), "非严格模式下对象应允许重复 key");
  27. #endif
  28. RyanJson_t only = RyanJsonGetObjectByKey(obj, "dup");
  29. TEST_ASSERT_NOT_NULL(only);
  30. #if true == RyanJsonDefaultAddAtHead && false == RyanJsonStrictObjectKeyCheck
  31. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetIntValue(only));
  32. #else
  33. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(only));
  34. #endif
  35. RyanJson_t detached = RyanJsonDetachByKey(obj, "dup");
  36. TEST_ASSERT_NOT_NULL(detached);
  37. #if true == RyanJsonDefaultAddAtHead && false == RyanJsonStrictObjectKeyCheck
  38. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetIntValue(detached));
  39. #else
  40. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(detached));
  41. #endif
  42. RyanJsonDelete(detached);
  43. #if true == RyanJsonStrictObjectKeyCheck
  44. TEST_ASSERT_NULL(RyanJsonGetObjectByKey(obj, "dup"));
  45. #else
  46. RyanJson_t second = RyanJsonGetObjectByKey(obj, "dup");
  47. TEST_ASSERT_NOT_NULL(second);
  48. #if true == RyanJsonDefaultAddAtHead
  49. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(second));
  50. #else
  51. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetIntValue(second));
  52. #endif
  53. RyanJson_t detached2 = RyanJsonDetachByKey(obj, "dup");
  54. TEST_ASSERT_NOT_NULL(detached2);
  55. #if true == RyanJsonDefaultAddAtHead
  56. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(detached2));
  57. #else
  58. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetIntValue(detached2));
  59. #endif
  60. RyanJsonDelete(detached2);
  61. TEST_ASSERT_NULL(RyanJsonGetObjectByKey(obj, "dup"));
  62. #endif
  63. RyanJsonDelete(obj);
  64. }
  65. static void testDetachCrossObject(void)
  66. {
  67. // 从一个 Object 分离节点并迁移到另一个 Object
  68. RyanJson_t obj1 = RyanJsonCreateObject();
  69. RyanJsonAddIntToObject(obj1, "move_me", 100);
  70. RyanJson_t obj2 = RyanJsonCreateObject();
  71. RyanJson_t item = RyanJsonDetachByKey(obj1, "move_me");
  72. TEST_ASSERT_NOT_NULL(item);
  73. TEST_ASSERT_EQUAL_INT(100, RyanJsonGetIntValue(item));
  74. // 迁移到 obj2
  75. // 注意:RyanJsonAddItemToObject 会创建包装节点,可能引入额外层级。
  76. // 这里使用 ChangeKey + Insert,表达“移动并重命名”的语义。
  77. RyanJsonChangeKey(item, "moved");
  78. RyanJsonInsert(obj2, UINT32_MAX, item);
  79. TEST_ASSERT_EQUAL_INT(100, RyanJsonGetIntValue(RyanJsonGetObjectToKey(obj2, "moved")));
  80. RyanJsonDelete(obj1);
  81. RyanJsonDelete(obj2);
  82. }
  83. static void testDetachReInsert(void)
  84. {
  85. // 分离 -> 修改 -> 重新插入
  86. RyanJson_t arr = RyanJsonCreateArray();
  87. RyanJsonAddIntToArray(arr, 10);
  88. RyanJson_t item = RyanJsonDetachByIndex(arr, 0);
  89. TEST_ASSERT_NOT_NULL(item);
  90. TEST_ASSERT_EQUAL_INT(10, RyanJsonGetIntValue(item));
  91. RyanJsonAddIntToArray(arr, 20); // 当前数组为 [20]
  92. // 使用 RyanJsonInsert 直接插入,避免 RyanJsonAddItemToArray 的包装行为
  93. RyanJsonInsert(arr, UINT32_MAX, item); // 当前数组为 [20, 10]
  94. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetArraySize(arr));
  95. TEST_ASSERT_EQUAL_INT(20, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 0)));
  96. TEST_ASSERT_EQUAL_INT(10, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 1)));
  97. RyanJsonDelete(arr);
  98. }
  99. static void testDetachSingleNodeAndReuse(void)
  100. {
  101. // Object:单节点分离后应变为空 Object,并可重新插回
  102. RyanJson_t obj = RyanJsonCreateObject();
  103. TEST_ASSERT_NOT_NULL(obj);
  104. TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, "only", 11));
  105. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetSize(obj));
  106. RyanJson_t detachedObjItem = RyanJsonDetachByKey(obj, "only");
  107. TEST_ASSERT_NOT_NULL(detachedObjItem);
  108. TEST_ASSERT_TRUE(RyanJsonIsDetachedItem(detachedObjItem));
  109. TEST_ASSERT_EQUAL_INT(0, RyanJsonGetSize(obj));
  110. TEST_ASSERT_NULL(RyanJsonGetObjectValue(obj));
  111. TEST_ASSERT_NULL(RyanJsonDetachByKey(obj, "only"));
  112. TEST_ASSERT_TRUE(RyanJsonInsert(obj, 0, detachedObjItem));
  113. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetSize(obj));
  114. TEST_ASSERT_EQUAL_INT(11, RyanJsonGetIntValue(RyanJsonGetObjectByKey(obj, "only")));
  115. // Array:单节点分离后应变为空 Array,并可重新插回
  116. RyanJson_t arr = RyanJsonCreateArray();
  117. TEST_ASSERT_NOT_NULL(arr);
  118. TEST_ASSERT_TRUE(RyanJsonAddIntToArray(arr, 22));
  119. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetSize(arr));
  120. RyanJson_t detachedArrItem = RyanJsonDetachByIndex(arr, 0);
  121. TEST_ASSERT_NOT_NULL(detachedArrItem);
  122. TEST_ASSERT_TRUE(RyanJsonIsDetachedItem(detachedArrItem));
  123. TEST_ASSERT_EQUAL_INT(0, RyanJsonGetSize(arr));
  124. TEST_ASSERT_NULL(RyanJsonGetObjectValue(arr));
  125. TEST_ASSERT_NULL(RyanJsonDetachByIndex(arr, 0));
  126. TEST_ASSERT_TRUE(RyanJsonInsert(arr, UINT32_MAX, detachedArrItem));
  127. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetSize(arr));
  128. TEST_ASSERT_EQUAL_INT(22, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 0)));
  129. RyanJsonDelete(obj);
  130. RyanJsonDelete(arr);
  131. }
  132. static void testDetachTailAndMiddleThenAppend(void)
  133. {
  134. // Object:先分离尾节点,再分离中间节点,最后追加新节点,验证链表修复正确
  135. RyanJson_t obj = RyanJsonCreateObject();
  136. TEST_ASSERT_NOT_NULL(obj);
  137. TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, "a", 1));
  138. TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, "b", 2));
  139. TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, "c", 3));
  140. RyanJson_t detachedTail = RyanJsonDetachByKey(obj, "c");
  141. TEST_ASSERT_NOT_NULL(detachedTail);
  142. TEST_ASSERT_TRUE(RyanJsonIsDetachedItem(detachedTail));
  143. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetSize(obj));
  144. TEST_ASSERT_NULL(RyanJsonGetObjectByKey(obj, "c"));
  145. RyanJsonDelete(detachedTail);
  146. RyanJson_t detachedMiddle = RyanJsonDetachByKey(obj, "b");
  147. TEST_ASSERT_NOT_NULL(detachedMiddle);
  148. TEST_ASSERT_TRUE(RyanJsonIsDetachedItem(detachedMiddle));
  149. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetSize(obj));
  150. TEST_ASSERT_NULL(RyanJsonGetObjectByKey(obj, "b"));
  151. RyanJsonDelete(detachedMiddle);
  152. TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, "d", 4));
  153. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetSize(obj));
  154. #if true == RyanJsonDefaultAddAtHead
  155. TEST_ASSERT_EQUAL_INT(4, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(obj, 0)));
  156. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(obj, 1)));
  157. #else
  158. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(obj, 0)));
  159. TEST_ASSERT_EQUAL_INT(4, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(obj, 1)));
  160. #endif
  161. // Array:同样覆盖“尾/中分离后再追加”的路径
  162. RyanJson_t arr = RyanJsonCreateArray();
  163. TEST_ASSERT_NOT_NULL(arr);
  164. TEST_ASSERT_TRUE(RyanJsonAddIntToArray(arr, 10));
  165. TEST_ASSERT_TRUE(RyanJsonAddIntToArray(arr, 20));
  166. TEST_ASSERT_TRUE(RyanJsonAddIntToArray(arr, 30));
  167. RyanJson_t arrTail = RyanJsonDetachByIndex(arr, 2);
  168. TEST_ASSERT_NOT_NULL(arrTail);
  169. TEST_ASSERT_TRUE(RyanJsonIsDetachedItem(arrTail));
  170. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetSize(arr));
  171. RyanJsonDelete(arrTail);
  172. RyanJson_t arrMiddle = RyanJsonDetachByIndex(arr, 1);
  173. TEST_ASSERT_NOT_NULL(arrMiddle);
  174. TEST_ASSERT_TRUE(RyanJsonIsDetachedItem(arrMiddle));
  175. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetSize(arr));
  176. RyanJsonDelete(arrMiddle);
  177. TEST_ASSERT_TRUE(RyanJsonAddIntToArray(arr, 40));
  178. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetSize(arr));
  179. #if true == RyanJsonDefaultAddAtHead
  180. TEST_ASSERT_EQUAL_INT(40, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 0)));
  181. TEST_ASSERT_EQUAL_INT(30, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 1)));
  182. #else
  183. TEST_ASSERT_EQUAL_INT(10, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 0)));
  184. TEST_ASSERT_EQUAL_INT(40, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 1)));
  185. #endif
  186. RyanJsonDelete(arr);
  187. RyanJsonDelete(obj);
  188. }
  189. static void testDetachStandardOperations(void)
  190. {
  191. char jsonstr[] =
  192. "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":"
  193. "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},"
  194. "\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],"
  195. "\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],"
  196. "\"array\":[16,16.89,\"hello\",true,false,null],"
  197. "\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{"
  198. "\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,"
  199. "\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,"
  200. "\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},"
  201. "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}],"
  202. "\"string2222\":\"hello\"}";
  203. RyanJson_t json = RyanJsonParse(jsonstr);
  204. TEST_ASSERT_NOT_NULL_MESSAGE(json, "解析 Json 失败");
  205. /**
  206. * @brief 对象子项分离测试(头、中、尾)
  207. */
  208. {
  209. // 头部(第一个 key:inter)
  210. RyanJson_t detached = RyanJsonDetachByIndex(json, 0);
  211. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离头部项 inter 失败");
  212. RyanJsonDelete(detached);
  213. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToKey(json, "inter"), "分离后 inter 依然存在");
  214. // 中间(double)
  215. detached = RyanJsonDetachByKey(json, "double");
  216. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离中间项 double 失败");
  217. RyanJsonDelete(detached);
  218. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToKey(json, "double"), "分离后 double 依然存在");
  219. // 尾部(最后一个 key:string2222)
  220. uint32_t lastIndex = RyanJsonGetSize(json) - 1;
  221. detached = RyanJsonDetachByIndex(json, lastIndex);
  222. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离尾部项 string2222 失败");
  223. RyanJsonDelete(detached);
  224. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToKey(json, "string2222"), "分离后 string2222 依然存在");
  225. }
  226. /**
  227. * @brief 数组元素分离测试 (arrayInt / arrayDouble / arrayString)
  228. */
  229. {
  230. RyanJson_t arrInt = RyanJsonGetObjectByKey(json, "arrayInt");
  231. TEST_ASSERT_NOT_NULL_MESSAGE(arrInt, "获取 arrayInt 失败");
  232. uint32_t size = RyanJsonGetSize(arrInt);
  233. RyanJson_t detached = RyanJsonDetachByIndex(arrInt, 0);
  234. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离 arrayInt 头部项失败");
  235. RyanJsonDelete(detached);
  236. TEST_ASSERT_EQUAL_INT_MESSAGE(size - 1, RyanJsonGetSize(arrInt), "分离 arrayInt 头部后长度未减少");
  237. // 中间
  238. size = RyanJsonGetSize(arrInt);
  239. detached = RyanJsonDetachByIndex(arrInt, 1);
  240. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离 arrayInt 中间项失败");
  241. RyanJsonDelete(detached);
  242. TEST_ASSERT_EQUAL_INT_MESSAGE(size - 1, RyanJsonGetSize(arrInt), "分离 arrayInt 中间项后长度未减少");
  243. // 尾部
  244. size = RyanJsonGetSize(arrInt);
  245. detached = RyanJsonDetachByIndex(arrInt, size - 1);
  246. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离 arrayInt 尾部项失败");
  247. RyanJsonDelete(detached);
  248. TEST_ASSERT_EQUAL_INT_MESSAGE(size - 1, RyanJsonGetSize(arrInt), "分离 arrayInt 尾部后长度未减少");
  249. }
  250. {
  251. RyanJson_t arrDouble = RyanJsonGetObjectByKey(json, "arrayDouble");
  252. TEST_ASSERT_NOT_NULL_MESSAGE(arrDouble, "获取 arrayDouble 失败");
  253. uint32_t size = RyanJsonGetSize(arrDouble);
  254. RyanJsonDelete(RyanJsonDetachByIndex(arrDouble, 0));
  255. TEST_ASSERT_EQUAL_INT_MESSAGE(size - 1, RyanJsonGetSize(arrDouble), "分离 arrayDouble 头部后长度未减少");
  256. }
  257. {
  258. RyanJson_t arrString = RyanJsonGetObjectByKey(json, "arrayString");
  259. TEST_ASSERT_NOT_NULL_MESSAGE(arrString, "获取 arrayString 失败");
  260. uint32_t size = RyanJsonGetSize(arrString);
  261. RyanJsonDelete(RyanJsonDetachByIndex(arrString, size - 1));
  262. TEST_ASSERT_EQUAL_INT_MESSAGE(size - 1, RyanJsonGetSize(arrString), "分离 arrayString 尾部后长度未减少");
  263. }
  264. /**
  265. * @brief 嵌套对象分离测试 (item)
  266. */
  267. {
  268. RyanJson_t detached = RyanJsonDetachByKey(json, "item");
  269. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离嵌套对象 item 失败");
  270. RyanJsonDelete(detached);
  271. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToKey(json, "item"), "分离后 item 依然存在");
  272. }
  273. /**
  274. * @brief 数组对象元素分离测试 (arrayItem 头、中、尾)
  275. */
  276. {
  277. RyanJson_t arr = RyanJsonGetObjectByKey(json, "arrayItem");
  278. TEST_ASSERT_NOT_NULL_MESSAGE(arr, "获取 arrayItem 失败");
  279. uint32_t size = RyanJsonGetSize(arr);
  280. // 头部
  281. RyanJson_t detached = RyanJsonDetachByIndex(arr, 0);
  282. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离对象数组头部项失败");
  283. RyanJsonDelete(detached);
  284. TEST_ASSERT_EQUAL_INT_MESSAGE(size - 1, RyanJsonGetSize(arr), "分离对象数组头部后长度未减少");
  285. // 中间
  286. size = RyanJsonGetSize(arr);
  287. detached = RyanJsonDetachByIndex(arr, 1);
  288. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离对象数组中间项失败");
  289. RyanJsonDelete(detached);
  290. TEST_ASSERT_EQUAL_INT_MESSAGE(size - 1, RyanJsonGetSize(arr), "分离对象数组中间后长度未减少");
  291. // 尾部
  292. size = RyanJsonGetSize(arr);
  293. detached = RyanJsonDetachByIndex(arr, RyanJsonGetSize(arr) - 1);
  294. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离对象数组尾部项失败");
  295. RyanJsonDelete(detached);
  296. TEST_ASSERT_EQUAL_INT_MESSAGE(size - 1, RyanJsonGetSize(arr), "分离对象数组尾部后长度未减少");
  297. }
  298. /**
  299. * @brief 特殊类型分离测试(null / bool)
  300. */
  301. {
  302. RyanJson_t detached = RyanJsonDetachByKey(json, "null");
  303. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离 null 失败");
  304. RyanJsonDelete(detached);
  305. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToKey(json, "null"), "分离后 null 依然存在");
  306. detached = RyanJsonDetachByKey(json, "boolTrue");
  307. TEST_ASSERT_NOT_NULL_MESSAGE(detached, "分离 boolTrue 失败");
  308. RyanJsonDelete(detached);
  309. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToKey(json, "boolTrue"), "分离后 boolTrue 依然存在");
  310. }
  311. RyanJsonDelete(json);
  312. }
  313. static void testDetachMassiveItemsStress(void)
  314. {
  315. // 循环创建并分离节点,验证内存稳定
  316. int32_t count = 100;
  317. RyanJson_t arr = RyanJsonCreateArray();
  318. for (int32_t i = 0; i < count; i++)
  319. {
  320. RyanJsonAddIntToArray(arr, i);
  321. }
  322. // 这里采用“每次分离 index=0”的策略,避免索引迁移带来的复杂性
  323. for (int32_t i = 0; i < count; i++)
  324. {
  325. RyanJson_t item = RyanJsonDetachByIndex(arr, 0);
  326. TEST_ASSERT_NOT_NULL(item);
  327. #if true == RyanJsonDefaultAddAtHead
  328. TEST_ASSERT_EQUAL_INT(count - 1 - i, RyanJsonGetIntValue(item));
  329. #else
  330. TEST_ASSERT_EQUAL_INT(i, RyanJsonGetIntValue(item));
  331. #endif
  332. RyanJsonDelete(item);
  333. }
  334. TEST_ASSERT_EQUAL_INT(0, RyanJsonGetArraySize(arr));
  335. RyanJsonDelete(arr);
  336. // 分离刚添加的对象字段(字段类型为 String)
  337. RyanJson_t obj = RyanJsonCreateObject();
  338. // 使用标准 AddString 宏:会创建带 key 的 String 节点并插入
  339. RyanJsonAddStringToObject(obj, "sub", "v");
  340. RyanJson_t detached = RyanJsonDetachByKey(obj, "sub");
  341. TEST_ASSERT_NOT_NULL(detached);
  342. TEST_ASSERT_EQUAL_STRING("v", RyanJsonGetStringValue(detached));
  343. // 再次分离应返回 NULL
  344. TEST_ASSERT_NULL(RyanJsonDetachByKey(obj, "sub"));
  345. RyanJsonDelete(detached);
  346. RyanJsonDelete(obj);
  347. }
  348. void testDetachRunner(void)
  349. {
  350. UnitySetTestFile(__FILE__);
  351. RUN_TEST(testDetachEdgeCases);
  352. RUN_TEST(testDetachDuplicateKey);
  353. RUN_TEST(testDetachCrossObject);
  354. RUN_TEST(testDetachReInsert);
  355. RUN_TEST(testDetachSingleNodeAndReuse);
  356. RUN_TEST(testDetachTailAndMiddleThenAppend);
  357. RUN_TEST(testDetachStandardOperations);
  358. RUN_TEST(testDetachMassiveItemsStress);
  359. }