TestFormat.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibTest/TestCase.h>
  7. #include <AK/String.h>
  8. #include <AK/StringBuilder.h>
  9. TEST_CASE(is_integral_works_properly)
  10. {
  11. EXPECT(!IsIntegral<const char*>);
  12. EXPECT(IsIntegral<unsigned long>);
  13. }
  14. TEST_CASE(format_string_literals)
  15. {
  16. EXPECT_EQ(String::formatted("prefix-{}-suffix", "abc"), "prefix-abc-suffix");
  17. EXPECT_EQ(String::formatted("{}{}{}", "a", "b", "c"), "abc");
  18. }
  19. TEST_CASE(format_integers)
  20. {
  21. EXPECT_EQ(String::formatted("{}", 42u), "42");
  22. EXPECT_EQ(String::formatted("{:4}", 42u), " 42");
  23. EXPECT_EQ(String::formatted("{:08}", 42u), "00000042");
  24. EXPECT_EQ(String::formatted("{:7}", -17), " -17");
  25. EXPECT_EQ(String::formatted("{}", -17), "-17");
  26. EXPECT_EQ(String::formatted("{:04}", 13), "0013");
  27. EXPECT_EQ(String::formatted("{:08x}", 4096), "00001000");
  28. EXPECT_EQ(String::formatted("{:x}", 0x1111222233334444ull), "1111222233334444");
  29. EXPECT_EQ(String::formatted("{:4}", 12345678), "12345678");
  30. }
  31. TEST_CASE(reorder_format_arguments)
  32. {
  33. EXPECT_EQ(String::formatted("{1}{0}", "a", "b"), "ba");
  34. EXPECT_EQ(String::formatted("{0}{1}", "a", "b"), "ab");
  35. // Compiletime check bypass: ignoring a passed argument.
  36. EXPECT_EQ(String::formatted("{0}{0}{0}"sv, "a", "b"), "aaa");
  37. // Compiletime check bypass: ignoring a passed argument.
  38. EXPECT_EQ(String::formatted("{1}{}{0}"sv, "a", "b", "c"), "baa");
  39. }
  40. TEST_CASE(escape_braces)
  41. {
  42. EXPECT_EQ(String::formatted("{{{}", "foo"), "{foo");
  43. EXPECT_EQ(String::formatted("{}}}", "bar"), "bar}");
  44. }
  45. TEST_CASE(everything)
  46. {
  47. EXPECT_EQ(String::formatted("{{{:04}/{}/{0:8}/{1}", 42u, "foo"), "{0042/foo/ 42/foo");
  48. }
  49. TEST_CASE(string_builder)
  50. {
  51. StringBuilder builder;
  52. builder.appendff(" {} ", 42);
  53. builder.appendff("{1}{0} ", 1, 2);
  54. EXPECT_EQ(builder.to_string(), " 42 21 ");
  55. }
  56. TEST_CASE(format_without_arguments)
  57. {
  58. EXPECT_EQ(String::formatted("foo"), "foo");
  59. }
  60. TEST_CASE(format_upper_case_integer)
  61. {
  62. EXPECT_EQ(String::formatted("{:4X}", 0xff), " FF");
  63. EXPECT_EQ(String::formatted("{:#4X}", 0xff), "0XFF");
  64. EXPECT_EQ(String::formatted("{:b}", 0xff), "11111111");
  65. EXPECT_EQ(String::formatted("{:B}", 0xff), "11111111");
  66. EXPECT_EQ(String::formatted("{:#b}", 0xff), "0b11111111");
  67. }
  68. TEST_CASE(format_aligned)
  69. {
  70. EXPECT_EQ(String::formatted("{:*<8}", 13), "13******");
  71. EXPECT_EQ(String::formatted("{:*^8}", 13), "***13***");
  72. EXPECT_EQ(String::formatted("{:*>8}", 13), "******13");
  73. EXPECT_EQ(String::formatted("{:*>+8}", 13), "*****+13");
  74. EXPECT_EQ(String::formatted("{:*^ 8}", 13), "** 13***");
  75. }
  76. TEST_CASE(format_octal)
  77. {
  78. EXPECT_EQ(String::formatted("{:o}", 0744), "744");
  79. EXPECT_EQ(String::formatted("{:#o}", 0744), "0744");
  80. }
  81. TEST_CASE(zero_pad)
  82. {
  83. EXPECT_EQ(String::formatted("{: <010}", 42), "42 ");
  84. EXPECT_EQ(String::formatted("{:010}", 42), "0000000042");
  85. EXPECT_EQ(String::formatted("{:/^010}", 42), "////42////");
  86. EXPECT_EQ(String::formatted("{:04x}", -32), "-0020");
  87. EXPECT_EQ(String::formatted("{:#06x}", -64), "-0x000040");
  88. }
  89. TEST_CASE(replacement_field)
  90. {
  91. EXPECT_EQ(String::formatted("{:*>{1}}", 13, static_cast<size_t>(10)), "********13");
  92. EXPECT_EQ(String::formatted("{:*<{1}}", 7, 4), "7***");
  93. // Compiletime check bypass: intentionally ignoring extra arguments
  94. EXPECT_EQ(String::formatted("{:{2}}"sv, -5, 8, 16), " -5");
  95. EXPECT_EQ(String::formatted("{{{:*^{1}}}}", 1, 3), "{*1*}");
  96. EXPECT_EQ(String::formatted("{:0{}}", 1, 3), "001");
  97. }
  98. TEST_CASE(replacement_field_regression)
  99. {
  100. // FIXME: Compiletime check bypass: cannot parse '}}' correctly.
  101. EXPECT_EQ(String::formatted("{:{}}"sv, "", static_cast<unsigned long>(6)), " ");
  102. }
  103. TEST_CASE(complex_string_specifiers)
  104. {
  105. EXPECT_EQ(String::formatted("{:.8}", "123456789"), "12345678");
  106. EXPECT_EQ(String::formatted("{:9}", "abcd"), "abcd ");
  107. EXPECT_EQ(String::formatted("{:>9}", "abcd"), " abcd");
  108. EXPECT_EQ(String::formatted("{:^9}", "abcd"), " abcd ");
  109. EXPECT_EQ(String::formatted("{:4.6}", "a"), "a ");
  110. EXPECT_EQ(String::formatted("{:4.6}", "abcdef"), "abcdef");
  111. EXPECT_EQ(String::formatted("{:4.6}", "abcdefghi"), "abcdef");
  112. }
  113. TEST_CASE(cast_integer_to_character)
  114. {
  115. EXPECT_EQ(String::formatted("{:c}", static_cast<int>('a')), "a");
  116. EXPECT_EQ(String::formatted("{:c}", static_cast<unsigned int>('f')), "f");
  117. }
  118. TEST_CASE(boolean_values)
  119. {
  120. EXPECT_EQ(String::formatted("{}", true), "true");
  121. EXPECT_EQ(String::formatted("{}", false), "false");
  122. EXPECT_EQ(String::formatted("{:6}", true), "true ");
  123. EXPECT_EQ(String::formatted("{:>4}", false), "false");
  124. EXPECT_EQ(String::formatted("{:d}", false), "0");
  125. EXPECT_EQ(String::formatted("{:d}", true), "1");
  126. EXPECT_EQ(String::formatted("{:#08x}", true), "0x00000001");
  127. }
  128. TEST_CASE(pointers)
  129. {
  130. void* ptr = reinterpret_cast<void*>(0x4000);
  131. if (sizeof(void*) == 4) {
  132. EXPECT_EQ(String::formatted("{:p}", 32), "0x00000020");
  133. EXPECT_EQ(String::formatted("{:p}", ptr), "0x00004000");
  134. EXPECT_EQ(String::formatted("{}", ptr), "0x00004000");
  135. } else if (sizeof(void*) == 8) {
  136. EXPECT_EQ(String::formatted("{:p}", 32), "0x0000000000000020");
  137. EXPECT_EQ(String::formatted("{:p}", ptr), "0x0000000000004000");
  138. EXPECT_EQ(String::formatted("{}", ptr), "0x0000000000004000");
  139. } else {
  140. VERIFY_NOT_REACHED();
  141. }
  142. }
  143. // If the format implementation did absolutely nothing, all tests would pass. This
  144. // is because when a test fails we only write "FAIL" to stdout using format.
  145. //
  146. // This is a bit scary, thus this test. At least this test should fail in this case.
  147. TEST_CASE(ensure_that_format_works)
  148. {
  149. if (String::formatted("FAIL") != "FAIL") {
  150. fprintf(stderr, "FAIL\n");
  151. exit(1);
  152. }
  153. if (String::formatted("{} FAIL {}", 1, 2) != "1 FAIL 2") {
  154. fprintf(stderr, "FAIL\n");
  155. exit(1);
  156. }
  157. }
  158. TEST_CASE(format_string_literal_as_pointer)
  159. {
  160. const char* literal = "abc";
  161. EXPECT_EQ(String::formatted("{:p}", literal), String::formatted("{:p}", reinterpret_cast<FlatPtr>(literal)));
  162. }
  163. TEST_CASE(format_character)
  164. {
  165. char a = 'a';
  166. EXPECT_EQ(String::formatted("{}", true ? a : 'b'), "a");
  167. }
  168. struct A {
  169. };
  170. struct B {
  171. };
  172. template<>
  173. struct AK::Formatter<B> : Formatter<StringView> {
  174. void format(FormatBuilder& builder, B)
  175. {
  176. Formatter<StringView>::format(builder, "B");
  177. }
  178. };
  179. TEST_CASE(format_if_supported)
  180. {
  181. EXPECT_EQ(String::formatted("{}", FormatIfSupported { A {} }), "?");
  182. EXPECT_EQ(String::formatted("{}", FormatIfSupported { B {} }), "B");
  183. }
  184. TEST_CASE(file_descriptor)
  185. {
  186. char filename[] = "/tmp/test-file-descriptor-XXXXXX";
  187. int fd = mkstemp(filename);
  188. FILE* file = fdopen(fd, "w+");
  189. outln(file, "{}", "Hello, World!");
  190. out(file, "foo");
  191. outln(file, "bar");
  192. rewind(file);
  193. Array<u8, 256> buffer;
  194. const auto nread = fread(buffer.data(), 1, buffer.size(), file);
  195. EXPECT_EQ("Hello, World!\nfoobar\n"sv, StringView { buffer.span().trim(nread) });
  196. fclose(file);
  197. }
  198. TEST_CASE(floating_point_numbers)
  199. {
  200. EXPECT_EQ(String::formatted("{}", 1.12), "1.12");
  201. EXPECT_EQ(String::formatted("{}", 1.), "1");
  202. EXPECT_EQ(String::formatted("{:.3}", 1.12), "1.12");
  203. EXPECT_EQ(String::formatted("{:.1}", 1.12), "1.1");
  204. EXPECT_EQ(String::formatted("{}", -1.12), "-1.12");
  205. // FIXME: There is always the question what we mean with the width field. Do we mean significant digits?
  206. // Do we mean the whole width? This is what was the simplest to implement:
  207. EXPECT_EQ(String::formatted("{:x>5.1}", 1.12), "xx1.1");
  208. }
  209. TEST_CASE(no_precision_no_trailing_number)
  210. {
  211. EXPECT_EQ(String::formatted("{:.0}", 0.1), "0");
  212. }
  213. TEST_CASE(yay_this_implementation_sucks)
  214. {
  215. EXPECT_EQ(String::formatted("{:.0}", .99999999999), "0");
  216. }
  217. TEST_CASE(precision_with_trailing_zeros)
  218. {
  219. EXPECT_EQ(String::formatted("{:0.3}", 1.12), "1.120");
  220. EXPECT_EQ(String::formatted("{:0.1}", 1.12), "1.1");
  221. }
  222. TEST_CASE(magnitude_less_than_zero)
  223. {
  224. EXPECT_EQ(String::formatted("{}", -0.654), "-0.654");
  225. EXPECT_EQ(String::formatted("{}", 0.654), "0.654");
  226. }
  227. TEST_CASE(format_nullptr)
  228. {
  229. EXPECT_EQ(String::formatted("{}", nullptr), String::formatted("{:p}", static_cast<FlatPtr>(0)));
  230. }
  231. struct C {
  232. int i;
  233. };
  234. template<>
  235. struct AK::Formatter<C> : AK::Formatter<FormatString> {
  236. void format(FormatBuilder& builder, C c)
  237. {
  238. return AK::Formatter<FormatString>::format(builder, "C(i={})", c.i);
  239. }
  240. };
  241. TEST_CASE(use_format_string_formatter)
  242. {
  243. EXPECT_EQ(String::formatted("{:*<10}", C { 42 }), "C(i=42)***");
  244. }
  245. TEST_CASE(long_long_regression)
  246. {
  247. EXPECT_EQ(String::formatted("{}", 0x0123456789abcdefLL), "81985529216486895");
  248. StringBuilder builder;
  249. AK::FormatBuilder fmtbuilder { builder };
  250. fmtbuilder.put_i64(0x0123456789abcdefLL);
  251. EXPECT_EQ(builder.string_view(), "81985529216486895");
  252. }
  253. TEST_CASE(hex_dump)
  254. {
  255. EXPECT_EQ(String::formatted("{:hex-dump}", "0000"), "30303030");
  256. EXPECT_EQ(String::formatted("{:>4hex-dump}", "0000"), "30303030 0000");
  257. EXPECT_EQ(String::formatted("{:>2hex-dump}", "0000"), "3030 00\n3030 00");
  258. EXPECT_EQ(String::formatted("{:*>4hex-dump}", "0000"), "30303030****0000");
  259. }