testPrint.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. #include "testBase.h"
  2. static RyanJson_t createObjectWithIntMember(const char *key, int32_t value)
  3. {
  4. RyanJson_t obj = RyanJsonCreateObject();
  5. TEST_ASSERT_NOT_NULL(obj);
  6. TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, key, value));
  7. return obj;
  8. }
  9. static RyanJsonPrintStyle makeStyle(const char *indent, const char *newline, uint8_t spaceAfterColon, RyanJsonBool_e format)
  10. {
  11. RyanJsonPrintStyle style = {
  12. .indent = indent,
  13. .indentLen = (uint32_t)strlen(indent),
  14. .newline = newline,
  15. .newlineLen = (uint32_t)strlen(newline),
  16. .spaceAfterColon = spaceAfterColon,
  17. .format = format,
  18. };
  19. return style;
  20. }
  21. void testPrintStyleEdgeCases(void)
  22. {
  23. // NULL 输入
  24. TEST_ASSERT_NULL(RyanJsonPrint(NULL, 10, RyanJsonTrue, NULL));
  25. RyanJson_t json = RyanJsonCreateObject();
  26. TEST_ASSERT_NULL(RyanJsonPrintWithStyle(json, 10, NULL, NULL));
  27. // format=false 但提供打印风格
  28. RyanJsonPrintStyle style = makeStyle(" ", "\n", 1, RyanJsonFalse);
  29. char *minified = RyanJsonPrintWithStyle(json, 10, &style, NULL);
  30. TEST_ASSERT_NOT_NULL(minified);
  31. TEST_ASSERT_EQUAL_STRING("{}", minified); // 应为压缩输出,不包含空格与换行
  32. RyanJsonFree(minified);
  33. // 极端小缓冲区(验证内部自动扩容)
  34. // RyanJsonPrint 内部会强制最小缓冲区尺寸,这里只需验证行为正确且不崩溃
  35. RyanJsonAddIntToObject(json, "a", 1);
  36. char *smallBufPrint = RyanJsonPrint(json, 1, RyanJsonFalse, NULL);
  37. TEST_ASSERT_NOT_NULL(smallBufPrint);
  38. TEST_ASSERT_EQUAL_STRING("{\"a\":1}", smallBufPrint);
  39. RyanJsonFree(smallBufPrint);
  40. RyanJsonDelete(json);
  41. }
  42. static void testPrintPreallocatedTooSmall(void)
  43. {
  44. RyanJson_t obj = RyanJsonCreateObject();
  45. RyanJsonAddStringToObject(obj, "k", "v");
  46. char smallBuf[4] = {0};
  47. char *out = RyanJsonPrintPreallocated(obj, smallBuf, sizeof(smallBuf), RyanJsonFalse, NULL);
  48. TEST_ASSERT_NULL_MESSAGE(out, "Preallocated buffer 过小应返回 NULL");
  49. RyanJsonDelete(obj);
  50. }
  51. static void testPrintPreallocatedExactFit(void)
  52. {
  53. RyanJson_t nullJson = RyanJsonCreateNull(NULL);
  54. char buf[5];
  55. memset(buf, 'X', sizeof(buf));
  56. char *out = RyanJsonPrintPreallocated(nullJson, buf, sizeof(buf), RyanJsonFalse, NULL);
  57. TEST_ASSERT_NOT_NULL_MESSAGE(out, "Preallocated buffer 刚好够用应成功");
  58. TEST_ASSERT_EQUAL_STRING("null", out);
  59. RyanJsonDelete(nullJson);
  60. }
  61. static void testPrintPreallocatedExactFitObjectString(void)
  62. {
  63. RyanJson_t obj = RyanJsonCreateObject();
  64. TEST_ASSERT_NOT_NULL(obj);
  65. TEST_ASSERT_TRUE(RyanJsonAddStringToObject(obj, "k", "v"));
  66. uint32_t expectedLen = 0;
  67. char *expected = RyanJsonPrint(obj, 0, RyanJsonFalse, &expectedLen);
  68. TEST_ASSERT_NOT_NULL(expected);
  69. char exactBuf[16] = {0};
  70. TEST_ASSERT_TRUE_MESSAGE(expectedLen + 1U <= sizeof(exactBuf), "测试缓冲区长度不足");
  71. char *out = RyanJsonPrintPreallocated(obj, exactBuf, expectedLen + 1U, RyanJsonFalse, NULL);
  72. TEST_ASSERT_NOT_NULL_MESSAGE(out, "对象(string)预分配刚好够用应成功");
  73. TEST_ASSERT_EQUAL_STRING(expected, out);
  74. RyanJsonFree(expected);
  75. RyanJsonDelete(obj);
  76. }
  77. // 该用例覆盖预分配缓冲行为,后续可按场景继续拆分
  78. static void testPrintPreallocatedObjectIntHeadroom(void)
  79. {
  80. RyanJson_t obj = createObjectWithIntMember("a", 1);
  81. // 先拿到基准输出长度
  82. uint32_t expectLen = 0;
  83. char *expect = RyanJsonPrint(obj, 0, RyanJsonFalse, &expectLen);
  84. if (NULL == expect)
  85. {
  86. RyanJsonDelete(obj);
  87. TEST_FAIL_MESSAGE("基准打印失败,无法构造刚好够用缓冲区");
  88. return;
  89. }
  90. // 对象中包含 int 时,PrintNumber 内部会做 INT32_MIN 级别的预留校验,
  91. // 因此“仅够最终输出长度”的缓冲区会失败,这是当前实现的既定行为。
  92. char *exactBuf = (char *)malloc((size_t)expectLen + 1U);
  93. if (NULL == exactBuf)
  94. {
  95. RyanJsonFree(expect);
  96. RyanJsonDelete(obj);
  97. TEST_FAIL_MESSAGE("malloc 失败");
  98. return;
  99. }
  100. char *out = RyanJsonPrintPreallocated(obj, exactBuf, expectLen + 1U, RyanJsonFalse, NULL);
  101. TEST_ASSERT_NULL_MESSAGE(out, "对象(int)预分配仅按最终长度应失败(需要额外预留空间)");
  102. // 给足预留空间后应成功
  103. char headroomBuf[32] = {0};
  104. out = RyanJsonPrintPreallocated(obj, headroomBuf, sizeof(headroomBuf), RyanJsonFalse, NULL);
  105. if (NULL == out)
  106. {
  107. RyanJsonFree(expect);
  108. free(exactBuf);
  109. RyanJsonDelete(obj);
  110. TEST_FAIL_MESSAGE("对象(int)预分配带预留空间应成功");
  111. return;
  112. }
  113. TEST_ASSERT_EQUAL_STRING(expect, out);
  114. TEST_ASSERT_EQUAL_UINT32(expectLen, (uint32_t)strlen(out));
  115. RyanJsonFree(expect);
  116. free(exactBuf);
  117. RyanJsonDelete(obj);
  118. }
  119. static void testPrintPreallocatedWithStyleNullArgs(void)
  120. {
  121. RyanJson_t obj = createObjectWithIntMember("a", 1);
  122. RyanJsonPrintStyle style = makeStyle(" ", "\n", 1, RyanJsonTrue);
  123. char buf[64] = {0};
  124. TEST_ASSERT_NULL(RyanJsonPrintPreallocatedWithStyle(NULL, buf, sizeof(buf), &style, NULL));
  125. TEST_ASSERT_NULL(RyanJsonPrintPreallocatedWithStyle(obj, NULL, sizeof(buf), &style, NULL));
  126. TEST_ASSERT_NULL(RyanJsonPrintPreallocatedWithStyle(obj, buf, sizeof(buf), NULL, NULL));
  127. TEST_ASSERT_NULL(RyanJsonPrintPreallocatedWithStyle(obj, buf, 0, &style, NULL));
  128. RyanJsonDelete(obj);
  129. }
  130. static void testPrintPreallocatedWithStyleTooSmall(void)
  131. {
  132. RyanJson_t obj = createObjectWithIntMember("a", 1);
  133. RyanJsonPrintStyle style = makeStyle(" ", "\n", 1, RyanJsonTrue);
  134. char tinyBuf[2] = {0};
  135. char *out = RyanJsonPrintPreallocatedWithStyle(obj, tinyBuf, sizeof(tinyBuf), &style, NULL);
  136. TEST_ASSERT_NULL_MESSAGE(out, "WithStyle 预分配缓冲区过小应返回 NULL");
  137. RyanJsonDelete(obj);
  138. }
  139. static void testPrintPreallocatedWithStyleSuccessAndLen(void)
  140. {
  141. RyanJson_t obj = createObjectWithIntMember("a", 1);
  142. RyanJsonPrintStyle style = makeStyle(" ", "\n", 2, RyanJsonTrue);
  143. char buf[64] = {0};
  144. uint32_t len = 0;
  145. char *out = RyanJsonPrintPreallocatedWithStyle(obj, buf, sizeof(buf), &style, &len);
  146. TEST_ASSERT_NOT_NULL(out);
  147. TEST_ASSERT_EQUAL_STRING("{\n \"a\": 1\n}", out);
  148. TEST_ASSERT_EQUAL_UINT32((uint32_t)strlen(out), len);
  149. RyanJsonDelete(obj);
  150. }
  151. static void testPrintPreallocatedWithStyleFormatFalseMinified(void)
  152. {
  153. RyanJson_t obj = createObjectWithIntMember("a", 1);
  154. RyanJsonPrintStyle style = makeStyle("--------", "\r\n", 4, RyanJsonFalse);
  155. char buf[64] = {0};
  156. char *out = RyanJsonPrintPreallocatedWithStyle(obj, buf, sizeof(buf), &style, NULL);
  157. TEST_ASSERT_NOT_NULL(out);
  158. TEST_ASSERT_EQUAL_STRING("{\"a\":1}", out);
  159. RyanJsonDelete(obj);
  160. }
  161. static void testPrintIntBoundaryPreallocated(void)
  162. {
  163. RyanJson_t intJson = RyanJsonCreateInt(NULL, INT32_MIN);
  164. TEST_ASSERT_NOT_NULL(intJson);
  165. char tooSmall[11] = {0};
  166. char *out = RyanJsonPrintPreallocated(intJson, tooSmall, sizeof(tooSmall), RyanJsonFalse, NULL);
  167. TEST_ASSERT_NULL_MESSAGE(out, "INT32_MIN 预分配 11 字节应失败");
  168. char exactFit[12] = {0};
  169. out = RyanJsonPrintPreallocated(intJson, exactFit, sizeof(exactFit), RyanJsonFalse, NULL);
  170. TEST_ASSERT_NOT_NULL_MESSAGE(out, "INT32_MIN 预分配 12 字节应成功");
  171. TEST_ASSERT_EQUAL_STRING("-2147483648", out);
  172. RyanJsonDelete(intJson);
  173. }
  174. static void testPrintDoubleBoundaryPreallocated(void)
  175. {
  176. RyanJson_t doubleJson = RyanJsonCreateDouble(NULL, 1.5);
  177. TEST_ASSERT_NOT_NULL(doubleJson);
  178. uint32_t expectLen = 0;
  179. char *expect = RyanJsonPrint(doubleJson, 0, RyanJsonFalse, &expectLen);
  180. if (NULL == expect)
  181. {
  182. RyanJsonDelete(doubleJson);
  183. TEST_FAIL_MESSAGE("double 基准打印失败");
  184. return;
  185. }
  186. // 与 int 类似,double 路径会先申请固定工作区(RyanJsonDoubleBufferSize),
  187. // 所以仅按最终输出长度预分配会失败。
  188. char *exactBuf = (char *)malloc((size_t)expectLen + 1U);
  189. if (NULL == exactBuf)
  190. {
  191. RyanJsonFree(expect);
  192. RyanJsonDelete(doubleJson);
  193. TEST_FAIL_MESSAGE("malloc 失败");
  194. return;
  195. }
  196. char *out = RyanJsonPrintPreallocated(doubleJson, exactBuf, expectLen + 1U, RyanJsonFalse, NULL);
  197. TEST_ASSERT_NULL_MESSAGE(out, "double 预分配仅按最终长度应失败(需要额外预留空间)");
  198. char headroomBuf[128] = {0};
  199. out = RyanJsonPrintPreallocated(doubleJson, headroomBuf, sizeof(headroomBuf), RyanJsonFalse, NULL);
  200. TEST_ASSERT_NOT_NULL_MESSAGE(out, "double 预分配带预留空间应成功");
  201. TEST_ASSERT_EQUAL_STRING(expect, out);
  202. RyanJsonFree(expect);
  203. free(exactBuf);
  204. RyanJsonDelete(doubleJson);
  205. // 特殊值:NaN / Infinity 应打印为 null
  206. RyanJson_t nanJson = RyanJsonCreateDouble(NULL, NAN);
  207. RyanJson_t infJson = RyanJsonCreateDouble(NULL, INFINITY);
  208. TEST_ASSERT_NOT_NULL(nanJson);
  209. TEST_ASSERT_NOT_NULL(infJson);
  210. char specialBuf[128] = {0};
  211. out = RyanJsonPrintPreallocated(nanJson, specialBuf, sizeof(specialBuf), RyanJsonFalse, NULL);
  212. TEST_ASSERT_NOT_NULL(out);
  213. TEST_ASSERT_EQUAL_STRING("null", out);
  214. memset(specialBuf, 0, sizeof(specialBuf));
  215. out = RyanJsonPrintPreallocated(infJson, specialBuf, sizeof(specialBuf), RyanJsonFalse, NULL);
  216. TEST_ASSERT_NOT_NULL(out);
  217. TEST_ASSERT_EQUAL_STRING("null", out);
  218. RyanJsonDelete(nanJson);
  219. RyanJsonDelete(infJson);
  220. }
  221. static void testPrintDoubleScientificAndRoundtrip(void)
  222. {
  223. RyanJson_t obj = RyanJsonCreateObject();
  224. TEST_ASSERT_NOT_NULL(obj);
  225. TEST_ASSERT_TRUE(RyanJsonAddDoubleToObject(obj, "large", 1.0e20));
  226. TEST_ASSERT_TRUE(RyanJsonAddDoubleToObject(obj, "tiny", 1.0e-5));
  227. TEST_ASSERT_TRUE(RyanJsonAddDoubleToObject(obj, "frac", 0.1));
  228. char *printed = RyanJsonPrint(obj, 128, RyanJsonFalse, NULL);
  229. TEST_ASSERT_NOT_NULL(printed);
  230. // large 在当前测试配置下应走科学计数法
  231. char *largePos = strstr(printed, "\"large\":");
  232. char *tinyPos = strstr(printed, "\"tiny\":");
  233. TEST_ASSERT_NOT_NULL(largePos);
  234. TEST_ASSERT_NOT_NULL(tinyPos);
  235. char *largeValueStart = strchr(largePos, ':');
  236. TEST_ASSERT_NOT_NULL(largeValueStart);
  237. largeValueStart++;
  238. char *largeComma = strpbrk(largePos, ",}");
  239. char *tinyComma = strpbrk(tinyPos, ",}");
  240. TEST_ASSERT_NOT_NULL(largeComma);
  241. TEST_ASSERT_NOT_NULL(tinyComma);
  242. int32_t largeHasScientific = (NULL != memchr((const void *)largeValueStart, 'e', (size_t)(largeComma - largeValueStart))) ||
  243. (NULL != memchr((const void *)largeValueStart, 'E', (size_t)(largeComma - largeValueStart)));
  244. #ifdef RyanJsonLinuxTestEnv
  245. // Linux 测试分支会在实现内覆盖格式选择,large 路径固定走科学计数法
  246. TEST_ASSERT_TRUE_MESSAGE(largeHasScientific, "RyanJsonLinuxTestEnv 下 large 应包含科学计数法输出");
  247. #elif true == RyanJsonSnprintfSupportScientific
  248. TEST_ASSERT_TRUE_MESSAGE(largeHasScientific, "开启科学计数法时 large 应包含科学计数法输出");
  249. #else
  250. TEST_ASSERT_FALSE_MESSAGE(largeHasScientific, "关闭科学计数法时 large 不应包含科学计数法输出");
  251. #endif
  252. RyanJson_t roundtrip = RyanJsonParse(printed);
  253. RyanJsonFree(printed);
  254. TEST_ASSERT_NOT_NULL(roundtrip);
  255. TEST_ASSERT_TRUE(RyanJsonCompareDouble(1.0e20, RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(roundtrip, "large"))));
  256. TEST_ASSERT_TRUE(RyanJsonCompareDouble(1.0e-5, RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(roundtrip, "tiny"))));
  257. TEST_ASSERT_TRUE(RyanJsonCompareDouble(0.1, RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(roundtrip, "frac"))));
  258. RyanJsonDelete(roundtrip);
  259. RyanJsonDelete(obj);
  260. }
  261. static int32_t gPrintFailAfter = -1;
  262. static int32_t gPrintAllocCount = 0;
  263. static void *printFailMalloc(size_t size)
  264. {
  265. if (gPrintFailAfter >= 0 && gPrintAllocCount++ >= gPrintFailAfter) { return NULL; }
  266. return unityTestMalloc(size);
  267. }
  268. static void *printFailRealloc(void *block, size_t size)
  269. {
  270. if (gPrintFailAfter >= 0 && gPrintAllocCount++ >= gPrintFailAfter) { return NULL; }
  271. return unityTestRealloc(block, size);
  272. }
  273. static void setPrintFailAfter(int32_t failAfter)
  274. {
  275. gPrintFailAfter = failAfter;
  276. gPrintAllocCount = 0;
  277. RyanJsonInitHooks(printFailMalloc, unityTestFree, printFailRealloc);
  278. }
  279. static void restorePrintHooks(void)
  280. {
  281. RyanJsonInitHooks(unityTestMalloc, unityTestFree, unityTestRealloc);
  282. gPrintFailAfter = -1;
  283. gPrintAllocCount = 0;
  284. }
  285. static void testPrintOom(void)
  286. {
  287. RyanJson_t obj = createObjectWithIntMember("a", 1);
  288. setPrintFailAfter(0);
  289. char *printed = RyanJsonPrint(obj, 32, RyanJsonFalse, NULL);
  290. // 恢复 hooks
  291. restorePrintHooks();
  292. if (printed) { RyanJsonFree(printed); }
  293. TEST_ASSERT_NULL_MESSAGE(printed, "Print OOM 应返回 NULL");
  294. RyanJsonDelete(obj);
  295. }
  296. static void testPrintFinalAppendOom(void)
  297. {
  298. char longStr[58];
  299. memset(longStr, 'a', sizeof(longStr) - 1);
  300. longStr[sizeof(longStr) - 1] = '\0';
  301. RyanJson_t obj = RyanJsonCreateObject();
  302. RyanJsonAddStringToObject(obj, "k", longStr);
  303. setPrintFailAfter(1);
  304. char *printed = RyanJsonPrint(obj, RyanJsonPrintfPreAlloSize, RyanJsonFalse, NULL);
  305. // 恢复 hooks
  306. restorePrintHooks();
  307. if (printed) { RyanJsonFree(printed); }
  308. TEST_ASSERT_NULL_MESSAGE(printed, "Print 末尾扩容失败应返回 NULL");
  309. RyanJsonDelete(obj);
  310. }
  311. /**
  312. * @brief 定制化打印风格测试
  313. * 验证 RyanJsonPrintWithStyle 接口以及各种格式化选项
  314. */
  315. static void testPrintCrazy(void)
  316. {
  317. // 打印空对象/空数组
  318. RyanJson_t emptyObj = RyanJsonCreateObject();
  319. char *s = RyanJsonPrint(emptyObj, 0, RyanJsonFalse, NULL);
  320. TEST_ASSERT_EQUAL_STRING("{}", s);
  321. RyanJsonFree(s);
  322. RyanJsonDelete(emptyObj);
  323. RyanJson_t emptyArr = RyanJsonCreateArray();
  324. s = RyanJsonPrint(emptyArr, 0, RyanJsonFalse, NULL);
  325. TEST_ASSERT_EQUAL_STRING("[]", s);
  326. RyanJsonFree(s);
  327. RyanJsonDelete(emptyArr);
  328. // 极限缓冲区测试
  329. RyanJson_t json = RyanJsonCreateObject();
  330. RyanJsonAddStringToObject(json, "k", "v");
  331. // size=0:自动选择初始缓冲
  332. s = RyanJsonPrint(json, 0, RyanJsonFalse, NULL);
  333. TEST_ASSERT_EQUAL_STRING("{\"k\":\"v\"}", s);
  334. RyanJsonFree(s);
  335. // size=1:初始空间过小,预期自动扩容
  336. s = RyanJsonPrint(json, 1, RyanJsonFalse, NULL);
  337. TEST_ASSERT_EQUAL_STRING("{\"k\":\"v\"}", s);
  338. RyanJsonFree(s);
  339. RyanJsonDelete(json);
  340. // 极端打印风格
  341. RyanJson_t obj = createObjectWithIntMember("a", 1);
  342. RyanJsonPrintStyle crazyStyle = makeStyle("--------", "\n\n", 4, RyanJsonTrue);
  343. uint32_t len;
  344. s = RyanJsonPrintWithStyle(obj, 10, &crazyStyle, &len);
  345. // 预期片段:{\n\n--------"a": 1\n\n}
  346. // 校验长度与关键片段
  347. TEST_ASSERT_EQUAL_INT(strlen(s), len);
  348. TEST_ASSERT_NOT_NULL(strstr(s, "--------\"a\": 1"));
  349. RyanJsonFree(s);
  350. RyanJsonDelete(obj);
  351. }
  352. static void testPrintDefault(void)
  353. {
  354. const char *jsonstr = "{\"a\":1,\"b\":true}";
  355. RyanJson_t json = RyanJsonParse(jsonstr);
  356. TEST_ASSERT_NOT_NULL(json);
  357. // 测试默认格式化打印(使用 RyanJsonPrint 简化校验)
  358. char *defaultFormat = RyanJsonPrint(json, 256, RyanJsonTrue, NULL);
  359. // 期望形如:
  360. // {
  361. // \t"a": 1,
  362. // \t"b": true
  363. // }
  364. TEST_ASSERT_NOT_NULL(defaultFormat);
  365. TEST_ASSERT_TRUE_MESSAGE(strstr(defaultFormat, "\t\"a\": 1") != NULL, "默认格式化:缩进或冒号后空格错误");
  366. RyanJsonFree(defaultFormat);
  367. RyanJsonDelete(json);
  368. }
  369. static void testPrintCustomStyle(void)
  370. {
  371. const char *jsonstr = "{\"a\":1,\"b\":true}";
  372. RyanJson_t json = RyanJsonParse(jsonstr);
  373. TEST_ASSERT_NOT_NULL(json);
  374. // 测试自定义风格:2 个空格缩进、Windows 换行、冒号后 2 个空格
  375. RyanJsonPrintStyle style = makeStyle(" ", "\r\n", 2, RyanJsonTrue);
  376. uint32_t len = 0;
  377. char *customPrint = RyanJsonPrintWithStyle(json, 256, &style, &len);
  378. TEST_ASSERT_NOT_NULL(customPrint);
  379. // 校验特征点
  380. TEST_ASSERT_TRUE_MESSAGE(strstr(customPrint, "\r\n \"a\": 1") != NULL, "自定义格式化:缩进、换行或冒号后空格匹配失败");
  381. TEST_ASSERT_EQUAL_INT_MESSAGE(strlen(customPrint), len, "返回长度不一致");
  382. RyanJsonFree(customPrint);
  383. RyanJsonDelete(json);
  384. }
  385. void testPrintRunner(void)
  386. {
  387. UnitySetTestFile(__FILE__);
  388. RUN_TEST(testPrintStyleEdgeCases);
  389. RUN_TEST(testPrintPreallocatedTooSmall);
  390. RUN_TEST(testPrintPreallocatedExactFit);
  391. RUN_TEST(testPrintPreallocatedExactFitObjectString);
  392. RUN_TEST(testPrintPreallocatedObjectIntHeadroom);
  393. RUN_TEST(testPrintPreallocatedWithStyleNullArgs);
  394. RUN_TEST(testPrintPreallocatedWithStyleTooSmall);
  395. RUN_TEST(testPrintPreallocatedWithStyleSuccessAndLen);
  396. RUN_TEST(testPrintPreallocatedWithStyleFormatFalseMinified);
  397. RUN_TEST(testPrintIntBoundaryPreallocated);
  398. RUN_TEST(testPrintDoubleBoundaryPreallocated);
  399. RUN_TEST(testPrintDoubleScientificAndRoundtrip);
  400. RUN_TEST(testPrintOom);
  401. RUN_TEST(testPrintFinalAppendOom);
  402. RUN_TEST(testPrintCrazy);
  403. RUN_TEST(testPrintDefault);
  404. RUN_TEST(testPrintCustomStyle);
  405. }