testKeyMutationLookup.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "testBase.h"
  2. static void testKeyMutationChangeToEmptyThenLookup(void)
  3. {
  4. // 复杂链路:
  5. // Parse -> ChangeKey(空 String) -> PathLookup -> Compare(期望文档)。
  6. // 目标:验证空 key 可被正确定位与序列化。
  7. RyanJson_t root = RyanJsonParse("{\"a\":{\"b\":1}}");
  8. TEST_ASSERT_NOT_NULL(root);
  9. RyanJson_t target = RyanJsonGetObjectToKey(root, "a", "b");
  10. TEST_ASSERT_NOT_NULL(target);
  11. TEST_ASSERT_TRUE(RyanJsonChangeKey(target, ""));
  12. TEST_ASSERT_NULL(RyanJsonGetObjectToKey(root, "a", "b"));
  13. TEST_ASSERT_NOT_NULL(RyanJsonGetObjectToKey(root, "a", ""));
  14. RyanJson_t expect = RyanJsonParse("{\"a\":{\"\":1}}");
  15. TEST_ASSERT_NOT_NULL(expect);
  16. TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
  17. RyanJsonDelete(expect);
  18. RyanJsonDelete(root);
  19. }
  20. static void testKeyMutationChangeToEscapedThenLookup(void)
  21. {
  22. // 复杂链路:
  23. // Parse -> ChangeKey(含引号/反斜杠) -> Lookup -> Compare(期望文档)。
  24. // 目标:验证转义 key 需使用“解码后 String”进行查找。
  25. const char *newKey = "a\"b\\c";
  26. RyanJson_t root = RyanJsonParse("{\"a\":1}");
  27. TEST_ASSERT_NOT_NULL(root);
  28. RyanJson_t target = RyanJsonGetObjectByKey(root, "a");
  29. TEST_ASSERT_NOT_NULL(target);
  30. TEST_ASSERT_TRUE(RyanJsonChangeKey(target, newKey));
  31. TEST_ASSERT_NULL(RyanJsonGetObjectByKey(root, "a"));
  32. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(root, newKey));
  33. RyanJson_t expect = RyanJsonParse("{\"a\\\"b\\\\c\":1}");
  34. TEST_ASSERT_NOT_NULL(expect);
  35. TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
  36. RyanJsonDelete(expect);
  37. RyanJsonDelete(root);
  38. }
  39. static void testKeyMutationControlKeyRoundtrip(void)
  40. {
  41. // 复杂链路:
  42. // Parse -> ChangeKey(含\t/\n) -> Print -> Parse -> Compare。
  43. // 目标:验证控制字符 key 的转义输出与回环解析。
  44. const char *key = "a\tb\nc";
  45. RyanJson_t root = RyanJsonParse("{\"k\":1}");
  46. TEST_ASSERT_NOT_NULL(root);
  47. RyanJson_t node = RyanJsonGetObjectByKey(root, "k");
  48. TEST_ASSERT_NOT_NULL(node);
  49. TEST_ASSERT_TRUE(RyanJsonChangeKey(node, key));
  50. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(root, key));
  51. char *printed = RyanJsonPrint(root, 0, RyanJsonFalse, NULL);
  52. TEST_ASSERT_NOT_NULL(printed);
  53. RyanJson_t reparsed = RyanJsonParse(printed);
  54. TEST_ASSERT_NOT_NULL(reparsed);
  55. TEST_ASSERT_TRUE(RyanJsonCompare(root, reparsed));
  56. RyanJsonDelete(reparsed);
  57. RyanJsonFree(printed);
  58. RyanJsonDelete(root);
  59. }
  60. static void testKeyMutationUtf8KeyRoundtrip(void)
  61. {
  62. // 复杂链路:
  63. // Parse -> ChangeKey(中文) -> Print -> Parse -> Compare。
  64. // 目标:验证 UTF-8 key 的序列化与解析一致性。
  65. const char *key = "中文";
  66. RyanJson_t root = RyanJsonParse("{\"a\":1}");
  67. TEST_ASSERT_NOT_NULL(root);
  68. RyanJson_t node = RyanJsonGetObjectByKey(root, "a");
  69. TEST_ASSERT_NOT_NULL(node);
  70. TEST_ASSERT_TRUE(RyanJsonChangeKey(node, key));
  71. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(root, key));
  72. char *printed = RyanJsonPrint(root, 0, RyanJsonFalse, NULL);
  73. TEST_ASSERT_NOT_NULL(printed);
  74. RyanJson_t reparsed = RyanJsonParse(printed);
  75. TEST_ASSERT_NOT_NULL(reparsed);
  76. TEST_ASSERT_TRUE(RyanJsonCompare(root, reparsed));
  77. RyanJsonDelete(reparsed);
  78. RyanJsonFree(printed);
  79. RyanJsonDelete(root);
  80. }
  81. static void testKeyMutationBackspaceKeyLookupRoundtrip(void)
  82. {
  83. // 复杂链路:
  84. // Parse -> ChangeKey(含\b) -> Lookup -> Print/Parse -> Compare。
  85. // 目标:验证反斜杠控制字符 key 的查找与回环。
  86. const char *key = "a\b";
  87. RyanJson_t root = RyanJsonParse("{\"a\":1}");
  88. TEST_ASSERT_NOT_NULL(root);
  89. RyanJson_t node = RyanJsonGetObjectByKey(root, "a");
  90. TEST_ASSERT_NOT_NULL(node);
  91. TEST_ASSERT_TRUE(RyanJsonChangeKey(node, key));
  92. TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(root, key));
  93. char *printed = RyanJsonPrint(root, 0, RyanJsonFalse, NULL);
  94. TEST_ASSERT_NOT_NULL(printed);
  95. RyanJson_t reparsed = RyanJsonParse(printed);
  96. TEST_ASSERT_NOT_NULL(reparsed);
  97. TEST_ASSERT_TRUE(RyanJsonCompare(root, reparsed));
  98. RyanJsonDelete(reparsed);
  99. RyanJsonFree(printed);
  100. RyanJsonDelete(root);
  101. }
  102. void testKeyMutationLookupRunner(void)
  103. {
  104. UnitySetTestFile(__FILE__);
  105. RUN_TEST(testKeyMutationChangeToEmptyThenLookup);
  106. RUN_TEST(testKeyMutationChangeToEscapedThenLookup);
  107. RUN_TEST(testKeyMutationControlKeyRoundtrip);
  108. RUN_TEST(testKeyMutationUtf8KeyRoundtrip);
  109. RUN_TEST(testKeyMutationBackspaceKeyLookupRoundtrip);
  110. }