testStandardStream.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "testBase.h"
  2. static void testStandardParseOptionsMixedTopLevelSequence(void)
  3. {
  4. // 覆盖 Object -> String -> Null -> Array 的混合顶层流式推进。
  5. const char *stream = " {\"a\":1}\n \"txt\" \n null \n [1,{\"k\":2}] ";
  6. const uint32_t streamLen = (uint32_t)strlen(stream);
  7. const char *end1 = NULL;
  8. RyanJson_t doc1 = RyanJsonParseOptions(stream, streamLen, RyanJsonFalse, &end1);
  9. TEST_ASSERT_NOT_NULL_MESSAGE(doc1, "混合序列文档#1(object) 解析失败");
  10. TEST_ASSERT_NOT_NULL(end1);
  11. TEST_ASSERT_TRUE(RyanJsonIsObject(doc1));
  12. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectToKey(doc1, "a")));
  13. uint32_t remain1 = (uint32_t)(streamLen - (uint32_t)(end1 - stream));
  14. const char *end2 = NULL;
  15. RyanJson_t doc2 = RyanJsonParseOptions(end1, remain1, RyanJsonFalse, &end2);
  16. TEST_ASSERT_NOT_NULL_MESSAGE(doc2, "混合序列文档#2(string) 解析失败");
  17. TEST_ASSERT_NOT_NULL(end2);
  18. TEST_ASSERT_TRUE(RyanJsonIsString(doc2));
  19. TEST_ASSERT_EQUAL_STRING("txt", RyanJsonGetStringValue(doc2));
  20. uint32_t remain2 = (uint32_t)(streamLen - (uint32_t)(end2 - stream));
  21. const char *end3 = NULL;
  22. RyanJson_t doc3 = RyanJsonParseOptions(end2, remain2, RyanJsonFalse, &end3);
  23. TEST_ASSERT_NOT_NULL_MESSAGE(doc3, "混合序列文档#3(null) 解析失败");
  24. TEST_ASSERT_NOT_NULL(end3);
  25. TEST_ASSERT_TRUE(RyanJsonIsNull(doc3));
  26. uint32_t remain3 = (uint32_t)(streamLen - (uint32_t)(end3 - stream));
  27. const char *end4 = NULL;
  28. RyanJson_t doc4 = RyanJsonParseOptions(end3, remain3, RyanJsonTrue, &end4);
  29. TEST_ASSERT_NOT_NULL_MESSAGE(doc4, "混合序列文档#4(array) 解析失败");
  30. TEST_ASSERT_NOT_NULL(end4);
  31. TEST_ASSERT_TRUE(RyanJsonIsArray(doc4));
  32. TEST_ASSERT_EQUAL_UINT32(2U, RyanJsonGetArraySize(doc4));
  33. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(doc4, 0)));
  34. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetIntValue(RyanJsonGetObjectToKey(RyanJsonGetObjectByIndex(doc4, 1), "k")));
  35. TEST_ASSERT_EQUAL_CHAR('\0', *end4);
  36. RyanJsonDelete(doc1);
  37. RyanJsonDelete(doc2);
  38. RyanJsonDelete(doc3);
  39. RyanJsonDelete(doc4);
  40. }
  41. static void testStandardParseOptionsTruncatedSliceBehavior(void)
  42. {
  43. // 覆盖 ParseOptions 的 size 截断语义与完整切片语义。
  44. const char *doc = "{\"a\":1}";
  45. const uint32_t fullLen = (uint32_t)strlen(doc);
  46. const char *end = NULL;
  47. RyanJson_t truncated = RyanJsonParseOptions(doc, fullLen - 1U, RyanJsonFalse, &end);
  48. TEST_ASSERT_NULL_MESSAGE(truncated, "截断切片不应解析成功");
  49. RyanJson_t exact = RyanJsonParseOptions(doc, fullLen, RyanJsonTrue, &end);
  50. TEST_ASSERT_NOT_NULL_MESSAGE(exact, "完整切片应解析成功");
  51. TEST_ASSERT_NOT_NULL(end);
  52. TEST_ASSERT_EQUAL_CHAR('\0', *end);
  53. TEST_ASSERT_TRUE(RyanJsonIsObject(exact));
  54. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectToKey(exact, "a")));
  55. RyanJsonDelete(exact);
  56. }
  57. static void testStandardParseOptionsWithoutEndPointer(void)
  58. {
  59. // 覆盖 parseEndPtr == NULL 时 strict / non-strict 的分流。
  60. const char *text = " {\"a\":1} trailing";
  61. const uint32_t textLen = (uint32_t)strlen(text);
  62. RyanJson_t doc = RyanJsonParseOptions(text, textLen, RyanJsonFalse, NULL);
  63. TEST_ASSERT_NOT_NULL_MESSAGE(doc, "parseEndPtr=NULL + 非强制模式应解析成功");
  64. TEST_ASSERT_TRUE(RyanJsonIsObject(doc));
  65. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectToKey(doc, "a")));
  66. RyanJsonDelete(doc);
  67. doc = RyanJsonParseOptions(text, textLen, RyanJsonTrue, NULL);
  68. TEST_ASSERT_NULL_MESSAGE(doc, "parseEndPtr=NULL + 强制模式应拒绝尾部垃圾");
  69. }
  70. static void testStandardParseOptionsStreamDocsStayIndependentAfterMutation(void)
  71. {
  72. // 覆盖顺序取出多文档后,首文档修改不应污染后续文档。
  73. const char *stream = "{\"a\":[1,2]}{\"b\":true}";
  74. const uint32_t len = (uint32_t)strlen(stream);
  75. const char *end = NULL;
  76. RyanJson_t doc1 = RyanJsonParseOptions(stream, len, RyanJsonFalse, &end);
  77. TEST_ASSERT_NOT_NULL_MESSAGE(doc1, "流文档#1 解析失败");
  78. TEST_ASSERT_NOT_NULL(end);
  79. RyanJson_t doc2 = RyanJsonParseOptions(end, (uint32_t)(len - (uint32_t)(end - stream)), RyanJsonTrue, NULL);
  80. TEST_ASSERT_NOT_NULL_MESSAGE(doc2, "流文档#2 解析失败");
  81. RyanJson_t arr = RyanJsonGetObjectToKey(doc1, "a");
  82. TEST_ASSERT_NOT_NULL(arr);
  83. RyanJson_t detached = RyanJsonDetachByIndex(arr, 0);
  84. TEST_ASSERT_NOT_NULL(detached);
  85. TEST_ASSERT_TRUE_MESSAGE(RyanJsonChangeIntValue(detached, 9), "修改分离 Array 元素失败");
  86. TEST_ASSERT_TRUE_MESSAGE(RyanJsonInsert(arr, 1, detached), "回插修改后的 Array 元素失败");
  87. RyanJson_t expect = RyanJsonParse("{\"a\":[2,9]}");
  88. TEST_ASSERT_NOT_NULL(expect);
  89. TEST_ASSERT_TRUE_MESSAGE(RyanJsonCompare(doc1, expect), "首文档变更结果与期望文档不一致");
  90. TEST_ASSERT_TRUE_MESSAGE(RyanJsonGetBoolValue(RyanJsonGetObjectToKey(doc2, "b")), "第二文档应保持原 Bool 值");
  91. RyanJsonDelete(expect);
  92. RyanJsonDelete(doc2);
  93. RyanJsonDelete(doc1);
  94. }
  95. void testStandardStreamRunner(void)
  96. {
  97. UnitySetTestFile(__FILE__);
  98. RUN_TEST(testStandardParseOptionsMixedTopLevelSequence);
  99. RUN_TEST(testStandardParseOptionsTruncatedSliceBehavior);
  100. RUN_TEST(testStandardParseOptionsWithoutEndPointer);
  101. RUN_TEST(testStandardParseOptionsStreamDocsStayIndependentAfterMutation);
  102. }