testScenarioChainMutations.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "testBase.h"
  2. static void testChainScenarioDeepMoveReplaceAndRoundtrip(void)
  3. {
  4. // 复杂链路:
  5. // Parse -> Detach/Change/Insert(嵌套) -> ReplaceByIndex -> AddItemToObject ->
  6. // ReplaceByKey(meta) -> Print/Parse。
  7. // 目标:覆盖嵌套 Array/Object 的多步变更与往返稳定性。
  8. RyanJson_t root = RyanJsonParse(
  9. "{\"cfg\":{\"mode\":\"a\",\"limit\":3},\"items\":[{\"id\":1,\"tags\":[\"x\",\"y\"]},{\"id\":2,\"tags\":[\"z\"]}],"
  10. "\"meta\":{\"ver\":1}}");
  11. TEST_ASSERT_NOT_NULL(root);
  12. RyanJson_t items = RyanJsonGetObjectToKey(root, "items");
  13. TEST_ASSERT_NOT_NULL(items);
  14. RyanJson_t moved = RyanJsonDetachByIndex(items, 0);
  15. TEST_ASSERT_NOT_NULL(moved);
  16. TEST_ASSERT_TRUE(RyanJsonChangeIntValue(RyanJsonGetObjectToKey(moved, "id"), 10));
  17. RyanJson_t tags = RyanJsonGetObjectToKey(moved, "tags");
  18. TEST_ASSERT_NOT_NULL(tags);
  19. RyanJson_t tag = RyanJsonDetachByIndex(tags, 1);
  20. TEST_ASSERT_NOT_NULL(tag);
  21. TEST_ASSERT_TRUE(RyanJsonChangeStringValue(tag, "yy"));
  22. TEST_ASSERT_TRUE(RyanJsonInsert(tags, 0, tag));
  23. TEST_ASSERT_TRUE(RyanJsonReplaceByIndex(items, 0, RyanJsonCreateInt(NULL, 99)));
  24. RyanJson_t cfg = RyanJsonGetObjectToKey(root, "cfg");
  25. TEST_ASSERT_NOT_NULL(cfg);
  26. TEST_ASSERT_TRUE(RyanJsonAddItemToObject(cfg, "primary", moved));
  27. RyanJson_t metaNew = RyanJsonCreateObject();
  28. TEST_ASSERT_NOT_NULL(metaNew);
  29. TEST_ASSERT_TRUE(RyanJsonAddIntToObject(metaNew, "ver", 2));
  30. TEST_ASSERT_TRUE(RyanJsonAddStringToObject(metaNew, "note", "ok"));
  31. TEST_ASSERT_TRUE(RyanJsonReplaceByKey(root, "meta", metaNew));
  32. RyanJson_t expect =
  33. RyanJsonParse("{\"cfg\":{\"mode\":\"a\",\"limit\":3,\"primary\":{\"id\":10,\"tags\":[\"yy\",\"x\"]}},\"items\":[99],"
  34. "\"meta\":{\"ver\":2,\"note\":\"ok\"}}");
  35. TEST_ASSERT_NOT_NULL(expect);
  36. TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
  37. char *printed = RyanJsonPrint(root, 0, RyanJsonFalse, NULL);
  38. TEST_ASSERT_NOT_NULL(printed);
  39. RyanJson_t roundtrip = RyanJsonParse(printed);
  40. TEST_ASSERT_NOT_NULL(roundtrip);
  41. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  42. RyanJsonDelete(roundtrip);
  43. RyanJsonFree(printed);
  44. RyanJsonDelete(expect);
  45. RyanJsonDelete(root);
  46. }
  47. static void testChainScenarioSwapArrayObjectNodesWithMetaReplace(void)
  48. {
  49. // 复杂链路:
  50. // Parse -> DetachByIndex(Array Object) -> ChangeKey -> Insert(Object) ->
  51. // DetachByKey(Object) -> ChangeKey -> Insert(Array) -> ReplaceByKey(meta)。
  52. // 目标:覆盖 Array 中 Object 与 Object 字段互换、以及 meta 容器替换的组合路径。
  53. RyanJson_t root = RyanJsonParse("{\"obj\":{\"x\":1,\"y\":{\"id\":1}},\"arr\":[{\"id\":2},3],\"meta\":{\"flag\":true}}");
  54. TEST_ASSERT_NOT_NULL(root);
  55. RyanJson_t obj = RyanJsonGetObjectToKey(root, "obj");
  56. RyanJson_t arr = RyanJsonGetObjectToKey(root, "arr");
  57. TEST_ASSERT_NOT_NULL(obj);
  58. TEST_ASSERT_NOT_NULL(arr);
  59. RyanJson_t fromArr = RyanJsonDetachByIndex(arr, 0);
  60. TEST_ASSERT_NOT_NULL(fromArr);
  61. TEST_ASSERT_TRUE(RyanJsonAddItemToObject(obj, "fromArr", fromArr));
  62. TEST_ASSERT_EQUAL_UINT32(1U, RyanJsonGetArraySize(arr));
  63. RyanJson_t moved = RyanJsonDetachByKey(obj, "y");
  64. TEST_ASSERT_NOT_NULL(moved);
  65. TEST_ASSERT_TRUE(RyanJsonChangeKey(moved, "moved"));
  66. TEST_ASSERT_TRUE(RyanJsonInsert(arr, 0, moved));
  67. RyanJson_t metaNew = RyanJsonCreateObject();
  68. TEST_ASSERT_NOT_NULL(metaNew);
  69. TEST_ASSERT_TRUE(RyanJsonAddBoolToObject(metaNew, "flag", RyanJsonFalse));
  70. TEST_ASSERT_TRUE(RyanJsonAddStringToObject(metaNew, "tag", "swap"));
  71. TEST_ASSERT_TRUE(RyanJsonReplaceByKey(root, "meta", metaNew));
  72. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectToKey(obj, "x")));
  73. RyanJson_t fromArrNode = RyanJsonGetObjectToKey(obj, "fromArr");
  74. TEST_ASSERT_NOT_NULL(fromArrNode);
  75. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetIntValue(RyanJsonGetObjectToKey(fromArrNode, "id")));
  76. TEST_ASSERT_NULL(RyanJsonGetObjectToKey(obj, "y"));
  77. TEST_ASSERT_EQUAL_UINT32(2U, RyanJsonGetArraySize(arr));
  78. RyanJson_t arr0 = RyanJsonGetObjectByIndex(arr, 0);
  79. RyanJson_t arr1 = RyanJsonGetObjectByIndex(arr, 1);
  80. TEST_ASSERT_TRUE(RyanJsonIsObject(arr0));
  81. TEST_ASSERT_TRUE(RyanJsonIsInt(arr1));
  82. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectToKey(arr0, "id")));
  83. TEST_ASSERT_EQUAL_INT(3, RyanJsonGetIntValue(arr1));
  84. RyanJson_t meta = RyanJsonGetObjectToKey(root, "meta");
  85. TEST_ASSERT_NOT_NULL(meta);
  86. TEST_ASSERT_EQUAL_INT(RyanJsonFalse, RyanJsonGetBoolValue(RyanJsonGetObjectToKey(meta, "flag")));
  87. TEST_ASSERT_EQUAL_STRING("swap", RyanJsonGetStringValue(RyanJsonGetObjectToKey(meta, "tag")));
  88. RyanJsonDelete(root);
  89. }
  90. void testScenarioChainMutationsRunner(void)
  91. {
  92. UnitySetTestFile(__FILE__);
  93. RUN_TEST(testChainScenarioDeepMoveReplaceAndRoundtrip);
  94. RUN_TEST(testChainScenarioSwapArrayObjectNodesWithMetaReplace);
  95. }