testEdgeParseOptions.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. #include "testBase.h"
  2. static void testEdgeParsePrintRequireTerminatorRejectTail(void)
  3. {
  4. // 复杂链路:
  5. // ParseOptions(requireNullTerminator=true, 尾部垃圾) -> 失败。
  6. // 目标:验证严格尾部校验会拒绝非空白尾部。
  7. const char *text = "{\"a\":1}x";
  8. const uint32_t len = (uint32_t)strlen(text);
  9. const char *sentinel = "sentinel";
  10. const char *end = sentinel;
  11. RyanJson_t json = RyanJsonParseOptions(text, len, RyanJsonTrue, &end);
  12. TEST_ASSERT_NULL(json);
  13. TEST_ASSERT_EQUAL_PTR(sentinel, end);
  14. }
  15. static void testEdgeParsePrintRequireTerminatorAcceptWhitespace(void)
  16. {
  17. // 复杂链路:
  18. // ParseOptions(requireNullTerminator=true, 尾部空白) -> 成功。
  19. // 目标:验证严格模式允许尾部空白。
  20. const char *text = "{\"a\":1}\n\t ";
  21. const uint32_t len = (uint32_t)strlen(text);
  22. const char *end = NULL;
  23. RyanJson_t json = RyanJsonParseOptions(text, len, RyanJsonTrue, &end);
  24. TEST_ASSERT_NOT_NULL(json);
  25. TEST_ASSERT_EQUAL_PTR(text + len, end);
  26. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectByKey(json, "a")));
  27. RyanJsonDelete(json);
  28. }
  29. static void testEdgeParsePrintParseEndPtrSequentialObjectArray(void)
  30. {
  31. // 复杂链路:
  32. // ParseOptions(Object) -> parseEndPtr -> ParseOptions(Array)。
  33. // 目标:验证 end 指针可驱动顺序解析。
  34. const char *text = " {\"a\":1} [2,3]";
  35. const uint32_t len = (uint32_t)strlen(text);
  36. const char *end = NULL;
  37. RyanJson_t first = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  38. TEST_ASSERT_NOT_NULL(first);
  39. TEST_ASSERT_NOT_NULL(end);
  40. uint32_t remain = (uint32_t)(len - (uint32_t)(end - text));
  41. RyanJson_t second = RyanJsonParseOptions(end, remain, RyanJsonFalse, NULL);
  42. TEST_ASSERT_NOT_NULL(second);
  43. TEST_ASSERT_TRUE(RyanJsonIsArray(second));
  44. TEST_ASSERT_EQUAL_UINT32(2U, RyanJsonGetArraySize(second));
  45. RyanJsonDelete(second);
  46. RyanJsonDelete(first);
  47. }
  48. static void testEdgeParsePrintParseEndPtrSequentialScalarObject(void)
  49. {
  50. // 复杂链路:
  51. // ParseOptions(标量) -> parseEndPtr -> ParseOptions(Object)。
  52. // 目标:验证标量后续解析可继续推进。
  53. const char *text = "true{\"b\":2}";
  54. const uint32_t len = (uint32_t)strlen(text);
  55. const char *end = NULL;
  56. RyanJson_t first = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  57. TEST_ASSERT_NOT_NULL(first);
  58. TEST_ASSERT_TRUE(RyanJsonIsBool(first));
  59. uint32_t remain = (uint32_t)(len - (uint32_t)(end - text));
  60. RyanJson_t second = RyanJsonParseOptions(end, remain, RyanJsonFalse, NULL);
  61. TEST_ASSERT_NOT_NULL(second);
  62. TEST_ASSERT_EQUAL_INT(2, RyanJsonGetIntValue(RyanJsonGetObjectByKey(second, "b")));
  63. RyanJsonDelete(second);
  64. RyanJsonDelete(first);
  65. }
  66. static void testEdgeParsePrintParseEndPtrStringWithBracesThenObject(void)
  67. {
  68. // 复杂链路:
  69. // ParseOptions(String 含 '}'/'{'/转义引号) -> parseEndPtr -> ParseOptions(Object)。
  70. // 目标:验证 String 内容不会干扰 end 指针定位。
  71. const char *text = "\"a}b{\\\"c\\\"\"{\"k\":1}";
  72. const uint32_t len = (uint32_t)strlen(text);
  73. const char *end = NULL;
  74. RyanJson_t first = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  75. TEST_ASSERT_NOT_NULL(first);
  76. TEST_ASSERT_TRUE(RyanJsonIsString(first));
  77. TEST_ASSERT_EQUAL_STRING("a}b{\"c\"", RyanJsonGetStringValue(first));
  78. TEST_ASSERT_NOT_NULL(end);
  79. TEST_ASSERT_EQUAL_CHAR('{', *end);
  80. uint32_t remain = (uint32_t)(len - (uint32_t)(end - text));
  81. RyanJson_t second = RyanJsonParseOptions(end, remain, RyanJsonFalse, NULL);
  82. TEST_ASSERT_NOT_NULL(second);
  83. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectByKey(second, "k")));
  84. RyanJsonDelete(second);
  85. RyanJsonDelete(first);
  86. }
  87. static void testEdgeParsePrintParseEndPtrStringWithEscapesThenArray(void)
  88. {
  89. // 复杂链路:
  90. // ParseOptions(含 \\\" 与 \\\\ 的 String) -> parseEndPtr -> ParseOptions(Array)。
  91. // 目标:验证转义序列不会干扰 end 指针定位。
  92. const char *text = "\"a\\\"b\\\\c\"[1,2]";
  93. const uint32_t len = (uint32_t)strlen(text);
  94. const char *end = NULL;
  95. RyanJson_t first = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  96. TEST_ASSERT_NOT_NULL(first);
  97. TEST_ASSERT_TRUE(RyanJsonIsString(first));
  98. TEST_ASSERT_EQUAL_STRING("a\"b\\c", RyanJsonGetStringValue(first));
  99. TEST_ASSERT_NOT_NULL(end);
  100. TEST_ASSERT_EQUAL_CHAR('[', *end);
  101. uint32_t remain = (uint32_t)(len - (uint32_t)(end - text));
  102. RyanJson_t second = RyanJsonParseOptions(end, remain, RyanJsonFalse, NULL);
  103. TEST_ASSERT_NOT_NULL(second);
  104. TEST_ASSERT_TRUE(RyanJsonIsArray(second));
  105. TEST_ASSERT_EQUAL_UINT32(2U, RyanJsonGetArraySize(second));
  106. RyanJsonDelete(second);
  107. RyanJsonDelete(first);
  108. }
  109. static void testEdgeParsePrintParseEndPtrStringWithUnicodeEscapeThenObject(void)
  110. {
  111. // 复杂链路:
  112. // ParseOptions(含 \\uXXXX String) -> parseEndPtr -> ParseOptions(Object)。
  113. // 目标:验证 Unicode 转义解码不影响 end 指针。
  114. const char *text = "\"\\u4E2D\"{\"k\":1}";
  115. const uint32_t len = (uint32_t)strlen(text);
  116. const char *end = NULL;
  117. RyanJson_t first = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  118. TEST_ASSERT_NOT_NULL(first);
  119. TEST_ASSERT_TRUE(RyanJsonIsString(first));
  120. TEST_ASSERT_EQUAL_STRING("\xE4\xB8\xAD", RyanJsonGetStringValue(first));
  121. TEST_ASSERT_NOT_NULL(end);
  122. TEST_ASSERT_EQUAL_CHAR('{', *end);
  123. uint32_t remain = (uint32_t)(len - (uint32_t)(end - text));
  124. RyanJson_t second = RyanJsonParseOptions(end, remain, RyanJsonFalse, NULL);
  125. TEST_ASSERT_NOT_NULL(second);
  126. TEST_ASSERT_EQUAL_INT(1, RyanJsonGetIntValue(RyanJsonGetObjectByKey(second, "k")));
  127. RyanJsonDelete(second);
  128. RyanJsonDelete(first);
  129. }
  130. static void testEdgeParsePrintParseEndPtrStringWithSurrogateEscapeThenBool(void)
  131. {
  132. // 复杂链路:
  133. // ParseOptions(含代理对 String) -> parseEndPtr -> ParseOptions(Bool)。
  134. // 目标:验证代理对解码不影响 end 指针。
  135. const char *text = "\"\\uD83D\\uDE03\" true";
  136. const uint32_t len = (uint32_t)strlen(text);
  137. const char *end = NULL;
  138. RyanJson_t first = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  139. TEST_ASSERT_NOT_NULL(first);
  140. TEST_ASSERT_TRUE(RyanJsonIsString(first));
  141. TEST_ASSERT_EQUAL_STRING("\xF0\x9F\x98\x83", RyanJsonGetStringValue(first));
  142. TEST_ASSERT_NOT_NULL(end);
  143. uint32_t remain = (uint32_t)(len - (uint32_t)(end - text));
  144. RyanJson_t second = RyanJsonParseOptions(end, remain, RyanJsonFalse, NULL);
  145. TEST_ASSERT_NOT_NULL(second);
  146. TEST_ASSERT_TRUE(RyanJsonIsBool(second));
  147. TEST_ASSERT_TRUE(RyanJsonGetBoolValue(second));
  148. RyanJsonDelete(second);
  149. RyanJsonDelete(first);
  150. }
  151. static void testEdgeParsePrintMinifyStripComments(void)
  152. {
  153. // 复杂链路:
  154. // Minify(包含注释) -> 结果校验。
  155. // 目标:验证注释与空白被正确剔除。
  156. char buf[] = " { /*c*/ \"a\" : 1 , //x\n \"b\" : 2 } ";
  157. uint32_t len = RyanJsonMinify(buf, (int32_t)(sizeof(buf) - 1U));
  158. buf[len] = '\0';
  159. TEST_ASSERT_EQUAL_STRING("{\"a\":1,\"b\":2}", buf);
  160. }
  161. static void testEdgeParsePrintMinifyPreserveSlashInString(void)
  162. {
  163. // 复杂链路:
  164. // Minify(String 含注释样式) -> 结果校验。
  165. // 目标:验证 String 内的 // 与 /* */ 不被误删。
  166. char buf[] = "{\"pat\":\"a//b\",\"block\":\"x/*y*/z\"}";
  167. uint32_t len = RyanJsonMinify(buf, (int32_t)(sizeof(buf) - 1U));
  168. buf[len] = '\0';
  169. TEST_ASSERT_EQUAL_STRING("{\"pat\":\"a//b\",\"block\":\"x/*y*/z\"}", buf);
  170. }
  171. static void testEdgeParsePrintMinifyPreserveEscapedQuote(void)
  172. {
  173. // 复杂链路:
  174. // Minify(含转义引号与 //) -> 结果校验。
  175. // 目标:验证转义序列不被误处理。
  176. char buf[] = "{\"msg\":\"he said: \\\"//not\\\"\"}";
  177. uint32_t len = RyanJsonMinify(buf, (int32_t)(sizeof(buf) - 1U));
  178. buf[len] = '\0';
  179. TEST_ASSERT_EQUAL_STRING("{\"msg\":\"he said: \\\"//not\\\"\"}", buf);
  180. }
  181. static void testEdgeParsePrintMinifyPreserveEscapedCommentMarkers(void)
  182. {
  183. // 复杂链路:
  184. // Minify(String 含 \\// 与 \\/* */) -> 结果校验。
  185. // 目标:验证转义反斜杠 + 注释标记组合不会被误删。
  186. char buf[] = "/*h*/{\"s\":\"x\\\\//y\",\"t\":\"u\\\\/*v*/w\",\"q\":\"\\\\\\\"/*\"}//t\n";
  187. uint32_t len = RyanJsonMinify(buf, (int32_t)(sizeof(buf) - 1U));
  188. buf[len] = '\0';
  189. TEST_ASSERT_EQUAL_STRING("{\"s\":\"x\\\\//y\",\"t\":\"u\\\\/*v*/w\",\"q\":\"\\\\\\\"/*\"}", buf);
  190. }
  191. static void testEdgeParsePrintParseOptionsSizeZeroFailure(void)
  192. {
  193. // 复杂链路:
  194. // ParseOptions(size=0) -> 失败 -> end 指针不应被污染。
  195. const char *text = "{}";
  196. const char *sentinel = "sentinel";
  197. const char *end = sentinel;
  198. RyanJson_t json = RyanJsonParseOptions(text, 0, RyanJsonFalse, &end);
  199. TEST_ASSERT_NULL_MESSAGE(json, "ParseOptions(size=0) 应失败");
  200. TEST_ASSERT_EQUAL_PTR_MESSAGE(sentinel, end, "ParseOptions 失败时不应修改 end 指针");
  201. }
  202. static void testEdgeParsePrintParseOptionsTruncatedScalar(void)
  203. {
  204. // 复杂链路:
  205. // ParseOptions(被截断的 true) -> 失败 -> end 指针不应被污染。
  206. const char *text = "true";
  207. const char *sentinel = "sentinel";
  208. const char *end = sentinel;
  209. RyanJson_t json = RyanJsonParseOptions(text, 3, RyanJsonFalse, &end); // "tru"
  210. TEST_ASSERT_NULL_MESSAGE(json, "ParseOptions(截断标量) 应失败");
  211. TEST_ASSERT_EQUAL_PTR_MESSAGE(sentinel, end, "ParseOptions 失败时不应修改 end 指针");
  212. }
  213. static void testEdgeParsePrintParseOptionsTruncatedStringBySize(void)
  214. {
  215. // 复杂链路:
  216. // ParseOptions(被截断的 String) -> 失败 -> end 指针不应被污染。
  217. const char *text = "\"ok\"";
  218. const char *sentinel = "sentinel";
  219. const char *end = sentinel;
  220. RyanJson_t json = RyanJsonParseOptions(text, 3, RyanJsonFalse, &end); // "\"ok"
  221. TEST_ASSERT_NULL_MESSAGE(json, "ParseOptions(截断 String) 应失败");
  222. TEST_ASSERT_EQUAL_PTR_MESSAGE(sentinel, end, "ParseOptions 失败时不应修改 end 指针");
  223. }
  224. static void testEdgeParsePrintParseOptionsTruncatedUnicodeBySize(void)
  225. {
  226. // 复杂链路:
  227. // ParseOptions(截断 Unicode 转义) -> 失败 -> end 指针不应被污染。
  228. const char *text = "\"\\u1234\"";
  229. const char *sentinel = "sentinel";
  230. const char *end = sentinel;
  231. RyanJson_t json = RyanJsonParseOptions(text, 5, RyanJsonFalse, &end); // "\"\\u12"
  232. TEST_ASSERT_NULL_MESSAGE(json, "ParseOptions(截断 Unicode 转义) 应失败");
  233. TEST_ASSERT_EQUAL_PTR_MESSAGE(sentinel, end, "ParseOptions 失败时不应修改 end 指针");
  234. }
  235. static void testEdgeParsePrintParseOptionsTruncatedArray(void)
  236. {
  237. // 复杂链路:
  238. // ParseOptions(截断 Array) -> 失败 -> end 指针不变。
  239. // 目标:验证截断 Array 被拒绝。
  240. const char *text = "[1,2";
  241. const char *sentinel = "sentinel";
  242. const char *end = sentinel;
  243. RyanJson_t json = RyanJsonParseOptions(text, 4, RyanJsonFalse, &end);
  244. TEST_ASSERT_NULL(json);
  245. TEST_ASSERT_EQUAL_PTR(sentinel, end);
  246. }
  247. static void testEdgeParsePrintMinifyThenParseRoundtrip(void)
  248. {
  249. // 复杂链路:
  250. // Minify -> Parse -> Print -> Parse -> Compare。
  251. // 目标:验证 Minify 后的文档可稳定回环。
  252. char raw[] = "{\n\t\"a\" : 1 , /*c*/ \"b\" : [ true , false ] }";
  253. uint32_t len = RyanJsonMinify(raw, (int32_t)(sizeof(raw) - 1U));
  254. raw[len] = '\0';
  255. RyanJson_t root = RyanJsonParse(raw);
  256. TEST_ASSERT_NOT_NULL(root);
  257. char *printed = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
  258. TEST_ASSERT_NOT_NULL(printed);
  259. RyanJson_t reparsed = RyanJsonParse(printed);
  260. TEST_ASSERT_NOT_NULL(reparsed);
  261. TEST_ASSERT_TRUE(RyanJsonCompare(root, reparsed));
  262. RyanJsonDelete(reparsed);
  263. RyanJsonFree(printed);
  264. RyanJsonDelete(root);
  265. }
  266. static void testEdgeParsePrintParseOptionsLeadingWhitespaceEndPtr(void)
  267. {
  268. // 复杂链路:
  269. // ParseOptions(含前导空白) -> parseEndPtr -> 解析第二文档。
  270. // 目标:验证前导空白不影响 end 推进。
  271. const char *text = " {\"a\":1}{\"b\":2}";
  272. const uint32_t len = (uint32_t)strlen(text);
  273. const char *end = NULL;
  274. RyanJson_t first = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  275. TEST_ASSERT_NOT_NULL(first);
  276. uint32_t remain = (uint32_t)(len - (uint32_t)(end - text));
  277. RyanJson_t second = RyanJsonParseOptions(end, remain, RyanJsonFalse, NULL);
  278. TEST_ASSERT_NOT_NULL(second);
  279. RyanJsonDelete(second);
  280. RyanJsonDelete(first);
  281. }
  282. static void testEdgeParsePrintMinifyEmbeddedTabs(void)
  283. {
  284. // 复杂链路:
  285. // Minify(含 \t \r) -> 结果校验。
  286. // 目标:验证制表符与回车被剔除。
  287. char buf[] = "\t{\r\n\"a\" : 1\t}\r";
  288. uint32_t len = RyanJsonMinify(buf, (int32_t)(sizeof(buf) - 1U));
  289. buf[len] = '\0';
  290. TEST_ASSERT_EQUAL_STRING("{\"a\":1}", buf);
  291. }
  292. static void testEdgeParsePrintParseOptionsGarbageAfterArray(void)
  293. {
  294. // 复杂链路:
  295. // ParseOptions(Array) -> end 指向垃圾 -> 续读校验。
  296. // 目标:验证垃圾段不被误解析。
  297. const char *text = "[1,2]x{\"b\":1}";
  298. const uint32_t len = (uint32_t)strlen(text);
  299. const char *end = NULL;
  300. RyanJson_t first = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  301. TEST_ASSERT_NOT_NULL(first);
  302. TEST_ASSERT_NOT_NULL(end);
  303. TEST_ASSERT_EQUAL_CHAR('x', *end);
  304. uint32_t remain = (uint32_t)(len - (uint32_t)(end - text));
  305. RyanJson_t bad = RyanJsonParseOptions(end, remain, RyanJsonFalse, NULL);
  306. TEST_ASSERT_NULL(bad);
  307. const char *secondStart = end + 1;
  308. uint32_t remain2 = (uint32_t)((text + len) - secondStart);
  309. RyanJson_t second = RyanJsonParseOptions(secondStart, remain2, RyanJsonFalse, NULL);
  310. TEST_ASSERT_NOT_NULL(second);
  311. RyanJsonDelete(second);
  312. RyanJsonDelete(first);
  313. }
  314. static void testEdgeParsePrintStrictTailCommentReject(void)
  315. {
  316. // 复杂链路:
  317. // ParseOptions(requireNullTerminator=true, 尾部注释) -> 失败。
  318. // 目标:验证严格模式拒绝非空白尾部。
  319. const char *text = "{\"a\":1}/*x*/";
  320. const uint32_t len = (uint32_t)strlen(text);
  321. const char *sentinel = "sentinel";
  322. const char *end = sentinel;
  323. RyanJson_t json = RyanJsonParseOptions(text, len, RyanJsonTrue, &end);
  324. TEST_ASSERT_NULL(json);
  325. TEST_ASSERT_EQUAL_PTR(sentinel, end);
  326. }
  327. static void testEdgeParsePrintParseEndPtrTrailingWhitespace(void)
  328. {
  329. // 复杂链路:
  330. // ParseOptions(requireNullTerminator=false, 尾部空白) -> end 指向空白。
  331. // 目标:验证 parseEndPtr 停留在空白起始位置。
  332. const char *text = "{\"a\":1} ";
  333. const uint32_t len = (uint32_t)strlen(text);
  334. const char *end = NULL;
  335. RyanJson_t json = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  336. TEST_ASSERT_NOT_NULL(json);
  337. TEST_ASSERT_NOT_NULL(end);
  338. TEST_ASSERT_EQUAL_CHAR(' ', *end);
  339. RyanJsonDelete(json);
  340. }
  341. static void testEdgeParsePrintParseEndPtrAfterWhitespacePrefix(void)
  342. {
  343. // 复杂链路:
  344. // ParseOptions(前导空白) -> parseEndPtr -> 指向后续文本。
  345. // 目标:验证前导空白不影响 end 指针推进。
  346. const char *text = " {\"a\":1}tail";
  347. const uint32_t len = (uint32_t)strlen(text);
  348. const char *end = NULL;
  349. RyanJson_t json = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  350. TEST_ASSERT_NOT_NULL(json);
  351. TEST_ASSERT_NOT_NULL(end);
  352. TEST_ASSERT_EQUAL_STRING("tail", end);
  353. RyanJsonDelete(json);
  354. }
  355. static void testEdgeParsePrintParseOptionsFailDoesNotWriteEnd(void)
  356. {
  357. // 复杂链路:
  358. // ParseOptions(失败) -> end 指针不变。
  359. // 目标:验证失败路径不污染 end。
  360. const char *text = "{";
  361. const char *sentinel = "sentinel";
  362. const char *end = sentinel;
  363. RyanJson_t json = RyanJsonParseOptions(text, 1, RyanJsonFalse, &end);
  364. TEST_ASSERT_NULL(json);
  365. TEST_ASSERT_EQUAL_PTR(sentinel, end);
  366. }
  367. static void testEdgeParsePrintParseOptionsSecondFailEndUnchanged(void)
  368. {
  369. // 复杂链路:
  370. // ParseOptions(首段成功) -> ParseOptions(二段失败) -> end 不污染。
  371. // 目标:验证二段失败不会修改 end 指针。
  372. const char *text = "{\"a\":1}{\"b\":2}";
  373. const uint32_t len = (uint32_t)strlen(text);
  374. const char *end = NULL;
  375. RyanJson_t first = RyanJsonParseOptions(text, len, RyanJsonFalse, &end);
  376. TEST_ASSERT_NOT_NULL(first);
  377. TEST_ASSERT_NOT_NULL(end);
  378. const char *sentinel = end;
  379. RyanJson_t second = RyanJsonParseOptions(end, 2, RyanJsonFalse, &end);
  380. TEST_ASSERT_NULL(second);
  381. TEST_ASSERT_EQUAL_PTR(sentinel, end);
  382. RyanJsonDelete(first);
  383. }
  384. void testEdgeParseOptionsRunner(void)
  385. {
  386. UnitySetTestFile(__FILE__);
  387. RUN_TEST(testEdgeParsePrintRequireTerminatorRejectTail);
  388. RUN_TEST(testEdgeParsePrintRequireTerminatorAcceptWhitespace);
  389. RUN_TEST(testEdgeParsePrintParseEndPtrSequentialObjectArray);
  390. RUN_TEST(testEdgeParsePrintParseEndPtrSequentialScalarObject);
  391. RUN_TEST(testEdgeParsePrintParseEndPtrStringWithBracesThenObject);
  392. RUN_TEST(testEdgeParsePrintParseEndPtrStringWithEscapesThenArray);
  393. RUN_TEST(testEdgeParsePrintParseEndPtrStringWithUnicodeEscapeThenObject);
  394. RUN_TEST(testEdgeParsePrintParseEndPtrStringWithSurrogateEscapeThenBool);
  395. RUN_TEST(testEdgeParsePrintMinifyStripComments);
  396. RUN_TEST(testEdgeParsePrintMinifyPreserveSlashInString);
  397. RUN_TEST(testEdgeParsePrintMinifyPreserveEscapedQuote);
  398. RUN_TEST(testEdgeParsePrintMinifyPreserveEscapedCommentMarkers);
  399. RUN_TEST(testEdgeParsePrintParseOptionsSizeZeroFailure);
  400. RUN_TEST(testEdgeParsePrintParseOptionsTruncatedScalar);
  401. RUN_TEST(testEdgeParsePrintParseOptionsTruncatedStringBySize);
  402. RUN_TEST(testEdgeParsePrintParseOptionsTruncatedUnicodeBySize);
  403. RUN_TEST(testEdgeParsePrintParseOptionsTruncatedArray);
  404. RUN_TEST(testEdgeParsePrintMinifyThenParseRoundtrip);
  405. RUN_TEST(testEdgeParsePrintParseOptionsLeadingWhitespaceEndPtr);
  406. RUN_TEST(testEdgeParsePrintMinifyEmbeddedTabs);
  407. RUN_TEST(testEdgeParsePrintParseOptionsGarbageAfterArray);
  408. RUN_TEST(testEdgeParsePrintStrictTailCommentReject);
  409. RUN_TEST(testEdgeParsePrintParseEndPtrTrailingWhitespace);
  410. RUN_TEST(testEdgeParsePrintParseEndPtrAfterWhitespacePrefix);
  411. RUN_TEST(testEdgeParsePrintParseOptionsFailDoesNotWriteEnd);
  412. RUN_TEST(testEdgeParsePrintParseOptionsSecondFailEndUnchanged);
  413. }