testKeyEscapeRoundtrip.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #include "testBase.h"
  2. static void testKeyEscapePrintRoundtripQuote(void)
  3. {
  4. // 复杂链路:
  5. // Parse(含引号 key) -> Print -> Parse -> Compare。
  6. // 目标:验证 key 中的 \" 被正确转义与往返保持一致。
  7. RyanJson_t root = RyanJsonParse("{\"\\\"\":1}");
  8. TEST_ASSERT_NOT_NULL(root);
  9. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  10. TEST_ASSERT_NOT_NULL(out);
  11. TEST_ASSERT_EQUAL_STRING("{\"\\\"\":1}", out);
  12. RyanJson_t roundtrip = RyanJsonParse(out);
  13. TEST_ASSERT_NOT_NULL(roundtrip);
  14. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  15. RyanJsonDelete(roundtrip);
  16. RyanJsonFree(out);
  17. RyanJsonDelete(root);
  18. }
  19. static void testKeyEscapePrintRoundtripBackslash(void)
  20. {
  21. // 复杂链路:
  22. // Parse(含反斜杠 key) -> Print -> Parse -> Compare。
  23. // 目标:验证 key 中的 \\ 被正确转义与往返保持一致。
  24. RyanJson_t root = RyanJsonParse("{\"\\\\\":1}");
  25. TEST_ASSERT_NOT_NULL(root);
  26. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  27. TEST_ASSERT_NOT_NULL(out);
  28. TEST_ASSERT_EQUAL_STRING("{\"\\\\\":1}", out);
  29. RyanJson_t roundtrip = RyanJsonParse(out);
  30. TEST_ASSERT_NOT_NULL(roundtrip);
  31. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  32. RyanJsonDelete(roundtrip);
  33. RyanJsonFree(out);
  34. RyanJsonDelete(root);
  35. }
  36. static void testKeyEscapePrintRoundtripSolidus(void)
  37. {
  38. // 复杂链路:
  39. // Parse(含斜杠 key) -> Print -> Parse -> Compare。
  40. // 目标:验证 key 中的 \\/ 会被稳定输出并往返一致。
  41. RyanJson_t root = RyanJsonParse("{\"\\/\":1}");
  42. TEST_ASSERT_NOT_NULL(root);
  43. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  44. TEST_ASSERT_NOT_NULL(out);
  45. // 当前实现不会强制转义 '/', 输出应为 "/"
  46. TEST_ASSERT_EQUAL_STRING("{\"/\":1}", out);
  47. RyanJson_t roundtrip = RyanJsonParse(out);
  48. TEST_ASSERT_NOT_NULL(roundtrip);
  49. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  50. RyanJsonDelete(roundtrip);
  51. RyanJsonFree(out);
  52. RyanJsonDelete(root);
  53. }
  54. static void testKeyEscapePrintRoundtripTab(void)
  55. {
  56. // 复杂链路:
  57. // Parse(含制表符 key) -> Print -> Parse -> Compare。
  58. // 目标:验证 key 中的 \t 输出为转义序列并往返一致。
  59. RyanJson_t root = RyanJsonParse("{\"\\t\":1}");
  60. TEST_ASSERT_NOT_NULL(root);
  61. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  62. TEST_ASSERT_NOT_NULL(out);
  63. TEST_ASSERT_EQUAL_STRING("{\"\\t\":1}", out);
  64. RyanJson_t roundtrip = RyanJsonParse(out);
  65. TEST_ASSERT_NOT_NULL(roundtrip);
  66. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  67. RyanJsonDelete(roundtrip);
  68. RyanJsonFree(out);
  69. RyanJsonDelete(root);
  70. }
  71. static void testKeyEscapePrintRoundtripNewline(void)
  72. {
  73. // 复杂链路:
  74. // Parse(含换行 key) -> Print -> Parse -> Compare。
  75. // 目标:验证 key 中的 \n 输出为转义序列并往返一致。
  76. RyanJson_t root = RyanJsonParse("{\"\\n\":1}");
  77. TEST_ASSERT_NOT_NULL(root);
  78. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  79. TEST_ASSERT_NOT_NULL(out);
  80. TEST_ASSERT_EQUAL_STRING("{\"\\n\":1}", out);
  81. RyanJson_t roundtrip = RyanJsonParse(out);
  82. TEST_ASSERT_NOT_NULL(roundtrip);
  83. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  84. RyanJsonDelete(roundtrip);
  85. RyanJsonFree(out);
  86. RyanJsonDelete(root);
  87. }
  88. static void testKeyEscapePrintRoundtripCarriageReturn(void)
  89. {
  90. // 复杂链路:
  91. // Parse(含回车 key) -> Print -> Parse -> Compare。
  92. // 目标:验证 key 中的 \r 输出为转义序列并往返一致。
  93. RyanJson_t root = RyanJsonParse("{\"\\r\":1}");
  94. TEST_ASSERT_NOT_NULL(root);
  95. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  96. TEST_ASSERT_NOT_NULL(out);
  97. TEST_ASSERT_EQUAL_STRING("{\"\\r\":1}", out);
  98. RyanJson_t roundtrip = RyanJsonParse(out);
  99. TEST_ASSERT_NOT_NULL(roundtrip);
  100. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  101. RyanJsonDelete(roundtrip);
  102. RyanJsonFree(out);
  103. RyanJsonDelete(root);
  104. }
  105. static void testKeyEscapePrintRoundtripBackspace(void)
  106. {
  107. // 复杂链路:
  108. // Parse(含退格 key) -> Print -> Parse -> Compare。
  109. // 目标:验证 key 中的 \b 输出为转义序列并往返一致。
  110. RyanJson_t root = RyanJsonParse("{\"\\b\":1}");
  111. TEST_ASSERT_NOT_NULL(root);
  112. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  113. TEST_ASSERT_NOT_NULL(out);
  114. TEST_ASSERT_EQUAL_STRING("{\"\\b\":1}", out);
  115. RyanJson_t roundtrip = RyanJsonParse(out);
  116. TEST_ASSERT_NOT_NULL(roundtrip);
  117. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  118. RyanJsonDelete(roundtrip);
  119. RyanJsonFree(out);
  120. RyanJsonDelete(root);
  121. }
  122. static void testKeyEscapePrintRoundtripUnicodeControl(void)
  123. {
  124. // 复杂链路:
  125. // Parse(含 \\u0001 key) -> Print -> Parse -> Compare。
  126. // 目标:验证低位控制字符会被输出为 \\uXXXX。
  127. RyanJson_t root = RyanJsonParse("{\"\\u0001\":1}");
  128. TEST_ASSERT_NOT_NULL(root);
  129. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  130. TEST_ASSERT_NOT_NULL(out);
  131. TEST_ASSERT_EQUAL_STRING("{\"\\u0001\":1}", out);
  132. RyanJson_t roundtrip = RyanJsonParse(out);
  133. TEST_ASSERT_NOT_NULL(roundtrip);
  134. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  135. RyanJsonDelete(roundtrip);
  136. RyanJsonFree(out);
  137. RyanJsonDelete(root);
  138. }
  139. static void testStringValueEscapePrintRoundtrip(void)
  140. {
  141. // 复杂链路:
  142. // Parse(含 \\u0001 的 String 值) -> Print -> Parse -> Compare。
  143. // 目标:验证低位控制字符在 value 中的转义与往返一致性(避免与基础转义矩阵重复)。
  144. RyanJson_t root = RyanJsonParse("{\"v\":\"\\u0001\"}");
  145. TEST_ASSERT_NOT_NULL(root);
  146. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  147. TEST_ASSERT_NOT_NULL(out);
  148. TEST_ASSERT_EQUAL_STRING("{\"v\":\"\\u0001\"}", out);
  149. RyanJson_t roundtrip = RyanJsonParse(out);
  150. TEST_ASSERT_NOT_NULL(roundtrip);
  151. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  152. RyanJsonDelete(roundtrip);
  153. RyanJsonFree(out);
  154. RyanJsonDelete(root);
  155. }
  156. static void testKeyEscapePrintRoundtripUtf8(void)
  157. {
  158. // 复杂链路:
  159. // Parse(\\u4E2D) -> Print -> Parse -> Compare。
  160. // 目标:验证 \\uXXXX 会被解码为 UTF-8 并按原字节打印输出。
  161. RyanJson_t root = RyanJsonParse("{\"\\u4E2D\":1}");
  162. TEST_ASSERT_NOT_NULL(root);
  163. char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  164. TEST_ASSERT_NOT_NULL(out);
  165. // 注意:C String 中 \\x 会吞掉后续十六进制字符,需拆分字面量。
  166. char expect[] = "{\"\xE4"
  167. "\xB8"
  168. "\xAD\":1}";
  169. TEST_ASSERT_EQUAL_STRING(expect, out);
  170. RyanJson_t roundtrip = RyanJsonParse(out);
  171. TEST_ASSERT_NOT_NULL(roundtrip);
  172. TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
  173. RyanJsonDelete(roundtrip);
  174. RyanJsonFree(out);
  175. RyanJsonDelete(root);
  176. }
  177. void testKeyEscapeRoundtripRunner(void)
  178. {
  179. UnitySetTestFile(__FILE__);
  180. RUN_TEST(testKeyEscapePrintRoundtripQuote);
  181. RUN_TEST(testKeyEscapePrintRoundtripBackslash);
  182. RUN_TEST(testKeyEscapePrintRoundtripSolidus);
  183. RUN_TEST(testKeyEscapePrintRoundtripTab);
  184. RUN_TEST(testKeyEscapePrintRoundtripNewline);
  185. RUN_TEST(testKeyEscapePrintRoundtripCarriageReturn);
  186. RUN_TEST(testKeyEscapePrintRoundtripBackspace);
  187. RUN_TEST(testKeyEscapePrintRoundtripUnicodeControl);
  188. RUN_TEST(testStringValueEscapePrintRoundtrip);
  189. RUN_TEST(testKeyEscapePrintRoundtripUtf8);
  190. }