testStabilityLinkedListStress.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #include "testBase.h"
  2. static void testListStabilityArrayDeleteHeadTailThenInsert(void)
  3. {
  4. // 复杂链路:
  5. // Parse(Array) -> DeleteByIndex(head/tail) -> Insert(head/tail) -> 遍历链表校验。
  6. // 目标:验证 Array 头尾删插后链表稳定。
  7. RyanJson_t arr = RyanJsonParse("[1,2,3,4,5]");
  8. TEST_ASSERT_NOT_NULL(arr);
  9. TEST_ASSERT_TRUE(RyanJsonDeleteByIndex(arr, 0));
  10. TEST_ASSERT_TRUE(RyanJsonDeleteByIndex(arr, RyanJsonGetArraySize(arr) - 1U));
  11. TEST_ASSERT_TRUE(RyanJsonInsert(arr, 0, RyanJsonCreateInt(NULL, 9)));
  12. TEST_ASSERT_TRUE(RyanJsonInsert(arr, 99, RyanJsonCreateInt(NULL, 8)));
  13. TEST_ASSERT_EQUAL_UINT32(5U, RyanJsonGetArraySize(arr));
  14. TEST_ASSERT_EQUAL_INT(9, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 0)));
  15. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 1)));
  16. TEST_ASSERT_EQUAL_INT(3, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 2)));
  17. TEST_ASSERT_EQUAL_INT(4, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 3)));
  18. TEST_ASSERT_EQUAL_INT(8, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(arr, 4)));
  19. uint32_t size = RyanJsonGetArraySize(arr);
  20. uint32_t count = 0;
  21. RyanJson_t node = RyanJsonGetObjectValue(arr);
  22. RyanJson_t last = NULL;
  23. while (node)
  24. {
  25. count++;
  26. if (count > size + 1U) { TEST_FAIL_MESSAGE("Array 链表疑似形成环"); }
  27. last = node;
  28. node = RyanJsonGetNext(node);
  29. }
  30. TEST_ASSERT_EQUAL_UINT32(size, count);
  31. TEST_ASSERT_NOT_NULL(last);
  32. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetNext(last), "Array 尾节点 GetNext 应返回 NULL");
  33. RyanJsonDelete(arr);
  34. }
  35. static void testListStabilityArrayLargeChurnNoCycle(void)
  36. {
  37. // 复杂链路:
  38. // Create(Array) -> 批量 Insert -> Detach/Insert -> 遍历链表校验。
  39. // 目标:验证较多节点下链表无环且尾节点正确。
  40. RyanJson_t arr = RyanJsonCreateArray();
  41. TEST_ASSERT_NOT_NULL(arr);
  42. for (int32_t i = 0; i < 20; i++)
  43. {
  44. TEST_ASSERT_TRUE(RyanJsonInsert(arr, 99, RyanJsonCreateInt(NULL, i)));
  45. }
  46. RyanJson_t moved1 = RyanJsonDetachByIndex(arr, 5);
  47. RyanJson_t moved2 = RyanJsonDetachByIndex(arr, 10);
  48. TEST_ASSERT_NOT_NULL(moved1);
  49. TEST_ASSERT_NOT_NULL(moved2);
  50. TEST_ASSERT_TRUE(RyanJsonInsert(arr, 0, moved1));
  51. TEST_ASSERT_TRUE(RyanJsonInsert(arr, 99, moved2));
  52. uint32_t size = RyanJsonGetArraySize(arr);
  53. uint32_t count = 0;
  54. RyanJson_t node = RyanJsonGetObjectValue(arr);
  55. RyanJson_t last = NULL;
  56. while (node)
  57. {
  58. count++;
  59. if (count > size + 1U) { TEST_FAIL_MESSAGE("Array 链表疑似形成环"); }
  60. last = node;
  61. node = RyanJsonGetNext(node);
  62. }
  63. TEST_ASSERT_EQUAL_UINT32(size, count);
  64. TEST_ASSERT_NOT_NULL(last);
  65. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetNext(last), "Array 尾节点 GetNext 应返回 NULL");
  66. RyanJsonDelete(arr);
  67. }
  68. static void testListStabilityObjectDeleteHeadTailThenInsert(void)
  69. {
  70. // 复杂链路:
  71. // Parse(Object) -> DeleteByKey(head/tail) -> Insert(head/tail) -> 遍历链表校验。
  72. // 目标:验证 Object 头尾删插后链表稳定。
  73. RyanJson_t obj = RyanJsonParse("{\"a\":1,\"b\":2,\"c\":3,\"d\":4}");
  74. TEST_ASSERT_NOT_NULL(obj);
  75. TEST_ASSERT_TRUE(RyanJsonDeleteByKey(obj, "a"));
  76. TEST_ASSERT_TRUE(RyanJsonDeleteByKey(obj, "d"));
  77. TEST_ASSERT_TRUE(RyanJsonInsert(obj, 0, RyanJsonCreateInt("x", 9)));
  78. TEST_ASSERT_TRUE(RyanJsonInsert(obj, 99, RyanJsonCreateInt("y", 8)));
  79. TEST_ASSERT_EQUAL_UINT32(4U, RyanJsonGetSize(obj));
  80. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "b"));
  81. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "c"));
  82. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "x"));
  83. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "y"));
  84. uint32_t size = RyanJsonGetSize(obj);
  85. uint32_t count = 0;
  86. RyanJson_t node = RyanJsonGetObjectValue(obj);
  87. RyanJson_t last = NULL;
  88. while (node)
  89. {
  90. count++;
  91. if (count > size + 1U) { TEST_FAIL_MESSAGE("Object 链表疑似形成环"); }
  92. last = node;
  93. node = RyanJsonGetNext(node);
  94. }
  95. TEST_ASSERT_EQUAL_UINT32(size, count);
  96. TEST_ASSERT_NOT_NULL(last);
  97. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetNext(last), "Object 尾节点 GetNext 应返回 NULL");
  98. RyanJsonDelete(obj);
  99. }
  100. static void testListStabilityObjectDetachThenReplaceAndInsert(void)
  101. {
  102. // 复杂链路:
  103. // Parse(Object) -> DetachByKey -> ReplaceByKey -> Insert -> 遍历链表校验。
  104. // 目标:验证 Object 分离/替换/插入后的链表稳定。
  105. RyanJson_t obj = RyanJsonParse("{\"a\":1,\"b\":2,\"c\":3}");
  106. TEST_ASSERT_NOT_NULL(obj);
  107. RyanJson_t moved = RyanJsonDetachByKey(obj, "b");
  108. TEST_ASSERT_NOT_NULL(moved);
  109. TEST_ASSERT_TRUE(RyanJsonReplaceByKey(obj, "a", RyanJsonCreateInt("a", 9)));
  110. TEST_ASSERT_TRUE(RyanJsonChangeKey(moved, "d"));
  111. TEST_ASSERT_TRUE(RyanJsonInsert(obj, 99, moved));
  112. TEST_ASSERT_EQUAL_UINT32(3U, RyanJsonGetSize(obj));
  113. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "a"));
  114. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "c"));
  115. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "d"));
  116. uint32_t size = RyanJsonGetSize(obj);
  117. uint32_t count = 0;
  118. RyanJson_t node = RyanJsonGetObjectValue(obj);
  119. RyanJson_t last = NULL;
  120. while (node)
  121. {
  122. count++;
  123. if (count > size + 1U) { TEST_FAIL_MESSAGE("Object 链表疑似形成环"); }
  124. last = node;
  125. node = RyanJsonGetNext(node);
  126. }
  127. TEST_ASSERT_EQUAL_UINT32(size, count);
  128. TEST_ASSERT_NOT_NULL(last);
  129. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetNext(last), "Object 尾节点 GetNext 应返回 NULL");
  130. RyanJsonDelete(obj);
  131. }
  132. static void testListStabilityObjectMultiReplaceByIndex(void)
  133. {
  134. // 复杂链路:
  135. // Parse(Object) -> ReplaceByIndex(多次) -> 遍历链表校验。
  136. // 目标:验证多次索引替换后链表稳定。
  137. RyanJson_t obj = RyanJsonParse("{\"a\":1,\"b\":2,\"c\":3}");
  138. TEST_ASSERT_NOT_NULL(obj);
  139. TEST_ASSERT_TRUE(RyanJsonReplaceByIndex(obj, 0, RyanJsonCreateInt("x", 9)));
  140. TEST_ASSERT_TRUE(RyanJsonReplaceByIndex(obj, 1, RyanJsonCreateInt("y", 8)));
  141. TEST_ASSERT_EQUAL_UINT32(3U, RyanJsonGetSize(obj));
  142. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "x"));
  143. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "y"));
  144. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "c"));
  145. uint32_t size = RyanJsonGetSize(obj);
  146. uint32_t count = 0;
  147. RyanJson_t node = RyanJsonGetObjectValue(obj);
  148. RyanJson_t last = NULL;
  149. while (node)
  150. {
  151. count++;
  152. if (count > size + 1U) { TEST_FAIL_MESSAGE("Object 链表疑似形成环"); }
  153. last = node;
  154. node = RyanJsonGetNext(node);
  155. }
  156. TEST_ASSERT_EQUAL_UINT32(size, count);
  157. TEST_ASSERT_NOT_NULL(last);
  158. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetNext(last), "Object 尾节点 GetNext 应返回 NULL");
  159. RyanJsonDelete(obj);
  160. }
  161. static void testListStabilityObjectDuplicateKeyDeleteLoop(void)
  162. {
  163. // 复杂链路:
  164. // Parse(重复 key) -> DeleteByKey(多次) -> 遍历链表校验。
  165. // 目标:验证重复 key 删除后的链表稳定。
  166. RyanJson_t obj = RyanJsonParse("{\"a\":1,\"a\":2,\"b\":3}");
  167. if (NULL == obj)
  168. {
  169. // strict 控制组:无重复 key。
  170. RyanJson_t control = RyanJsonParse("{\"a\":1,\"b\":3}");
  171. TEST_ASSERT_NOT_NULL(control);
  172. TEST_ASSERT_TRUE(RyanJsonDeleteByKey(control, "a"));
  173. TEST_ASSERT_EQUAL_UINT32(1U, RyanJsonGetSize(control));
  174. RyanJsonDelete(control);
  175. return;
  176. }
  177. TEST_ASSERT_TRUE(RyanJsonDeleteByKey(obj, "a"));
  178. TEST_ASSERT_TRUE(RyanJsonDeleteByKey(obj, "a"));
  179. TEST_ASSERT_EQUAL_UINT32(1U, RyanJsonGetSize(obj));
  180. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(obj, "b"));
  181. uint32_t size = RyanJsonGetSize(obj);
  182. uint32_t count = 0;
  183. RyanJson_t node = RyanJsonGetObjectValue(obj);
  184. RyanJson_t last = NULL;
  185. while (node)
  186. {
  187. count++;
  188. if (count > size + 1U) { TEST_FAIL_MESSAGE("Object 链表疑似形成环"); }
  189. last = node;
  190. node = RyanJsonGetNext(node);
  191. }
  192. TEST_ASSERT_EQUAL_UINT32(size, count);
  193. TEST_ASSERT_NOT_NULL(last);
  194. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetNext(last), "Object 尾节点 GetNext 应返回 NULL");
  195. RyanJsonDelete(obj);
  196. }
  197. void testStabilityLinkedListStressRunner(void)
  198. {
  199. RUN_TEST(testListStabilityArrayDeleteHeadTailThenInsert);
  200. RUN_TEST(testListStabilityArrayLargeChurnNoCycle);
  201. RUN_TEST(testListStabilityObjectDeleteHeadTailThenInsert);
  202. RUN_TEST(testListStabilityObjectDetachThenReplaceAndInsert);
  203. RUN_TEST(testListStabilityObjectMultiReplaceByIndex);
  204. RUN_TEST(testListStabilityObjectDuplicateKeyDeleteLoop);
  205. }