| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- #include "testBase.h"
- static void testKeyEscapePrintRoundtripQuote(void)
- {
- // 复杂链路:
- // Parse(含引号 key) -> Print -> Parse -> Compare。
- // 目标:验证 key 中的 \" 被正确转义与往返保持一致。
- RyanJson_t root = RyanJsonParse("{\"\\\"\":1}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- TEST_ASSERT_EQUAL_STRING("{\"\\\"\":1}", out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- static void testKeyEscapePrintRoundtripBackslash(void)
- {
- // 复杂链路:
- // Parse(含反斜杠 key) -> Print -> Parse -> Compare。
- // 目标:验证 key 中的 \\ 被正确转义与往返保持一致。
- RyanJson_t root = RyanJsonParse("{\"\\\\\":1}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- TEST_ASSERT_EQUAL_STRING("{\"\\\\\":1}", out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- static void testKeyEscapePrintRoundtripSolidus(void)
- {
- // 复杂链路:
- // Parse(含斜杠 key) -> Print -> Parse -> Compare。
- // 目标:验证 key 中的 \\/ 会被稳定输出并往返一致。
- RyanJson_t root = RyanJsonParse("{\"\\/\":1}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- // 当前实现不会强制转义 '/', 输出应为 "/"
- TEST_ASSERT_EQUAL_STRING("{\"/\":1}", out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- static void testKeyEscapePrintRoundtripTab(void)
- {
- // 复杂链路:
- // Parse(含制表符 key) -> Print -> Parse -> Compare。
- // 目标:验证 key 中的 \t 输出为转义序列并往返一致。
- RyanJson_t root = RyanJsonParse("{\"\\t\":1}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- TEST_ASSERT_EQUAL_STRING("{\"\\t\":1}", out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- static void testKeyEscapePrintRoundtripNewline(void)
- {
- // 复杂链路:
- // Parse(含换行 key) -> Print -> Parse -> Compare。
- // 目标:验证 key 中的 \n 输出为转义序列并往返一致。
- RyanJson_t root = RyanJsonParse("{\"\\n\":1}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- TEST_ASSERT_EQUAL_STRING("{\"\\n\":1}", out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- static void testKeyEscapePrintRoundtripCarriageReturn(void)
- {
- // 复杂链路:
- // Parse(含回车 key) -> Print -> Parse -> Compare。
- // 目标:验证 key 中的 \r 输出为转义序列并往返一致。
- RyanJson_t root = RyanJsonParse("{\"\\r\":1}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- TEST_ASSERT_EQUAL_STRING("{\"\\r\":1}", out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- static void testKeyEscapePrintRoundtripBackspace(void)
- {
- // 复杂链路:
- // Parse(含退格 key) -> Print -> Parse -> Compare。
- // 目标:验证 key 中的 \b 输出为转义序列并往返一致。
- RyanJson_t root = RyanJsonParse("{\"\\b\":1}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- TEST_ASSERT_EQUAL_STRING("{\"\\b\":1}", out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- static void testKeyEscapePrintRoundtripUnicodeControl(void)
- {
- // 复杂链路:
- // Parse(含 \\u0001 key) -> Print -> Parse -> Compare。
- // 目标:验证低位控制字符会被输出为 \\uXXXX。
- RyanJson_t root = RyanJsonParse("{\"\\u0001\":1}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- TEST_ASSERT_EQUAL_STRING("{\"\\u0001\":1}", out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- static void testStringValueEscapePrintRoundtrip(void)
- {
- // 复杂链路:
- // Parse(含 \\u0001 的 String 值) -> Print -> Parse -> Compare。
- // 目标:验证低位控制字符在 value 中的转义与往返一致性(避免与基础转义矩阵重复)。
- RyanJson_t root = RyanJsonParse("{\"v\":\"\\u0001\"}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- TEST_ASSERT_EQUAL_STRING("{\"v\":\"\\u0001\"}", out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- static void testKeyEscapePrintRoundtripUtf8(void)
- {
- // 复杂链路:
- // Parse(\\u4E2D) -> Print -> Parse -> Compare。
- // 目标:验证 \\uXXXX 会被解码为 UTF-8 并按原字节打印输出。
- RyanJson_t root = RyanJsonParse("{\"\\u4E2D\":1}");
- TEST_ASSERT_NOT_NULL(root);
- char *out = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(out);
- // 注意:C String 中 \\x 会吞掉后续十六进制字符,需拆分字面量。
- char expect[] = "{\"\xE4"
- "\xB8"
- "\xAD\":1}";
- TEST_ASSERT_EQUAL_STRING(expect, out);
- RyanJson_t roundtrip = RyanJsonParse(out);
- TEST_ASSERT_NOT_NULL(roundtrip);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, roundtrip));
- RyanJsonDelete(roundtrip);
- RyanJsonFree(out);
- RyanJsonDelete(root);
- }
- void testKeyEscapeRoundtripRunner(void)
- {
- UnitySetTestFile(__FILE__);
- RUN_TEST(testKeyEscapePrintRoundtripQuote);
- RUN_TEST(testKeyEscapePrintRoundtripBackslash);
- RUN_TEST(testKeyEscapePrintRoundtripSolidus);
- RUN_TEST(testKeyEscapePrintRoundtripTab);
- RUN_TEST(testKeyEscapePrintRoundtripNewline);
- RUN_TEST(testKeyEscapePrintRoundtripCarriageReturn);
- RUN_TEST(testKeyEscapePrintRoundtripBackspace);
- RUN_TEST(testKeyEscapePrintRoundtripUnicodeControl);
- RUN_TEST(testStringValueEscapePrintRoundtrip);
- RUN_TEST(testKeyEscapePrintRoundtripUtf8);
- }
|