NativeFormatTests.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. //===- llvm/unittest/Support/NativeFormatTests.cpp - formatting tests -----===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/ADT/SmallString.h"
  10. #include "llvm/Support/NativeFormatting.h"
  11. #include "llvm/Support/raw_ostream.h"
  12. #include "gtest/gtest.h"
  13. #include <type_traits>
  14. using namespace llvm;
  15. namespace {
  16. template <typename T>
  17. typename std::enable_if<std::is_signed<T>::value, std::string>::type
  18. format_number(T N, IntegerStyle Style, Optional<size_t> Precision = None,
  19. Optional<int> Width = None) {
  20. return format_number(static_cast<long>(N), Style, Precision, Width);
  21. }
  22. template <typename T>
  23. typename std::enable_if<std::is_unsigned<T>::value, std::string>::type
  24. format_number(T N, IntegerStyle Style, Optional<size_t> Precision = None,
  25. Optional<int> Width = None) {
  26. return format_number(static_cast<unsigned long>(N), Style, Precision, Width);
  27. }
  28. template <typename T>
  29. typename std::enable_if<std::is_pointer<T>::value, std::string>::type
  30. format_number(T N, HexStyle Style, Optional<size_t> Precision = None,
  31. Optional<int> Width = None) {
  32. IntegerStyle IS = hexStyleToIntHexStyle(Style);
  33. return format_number(reinterpret_cast<uintptr_t>(N), IS, Precision, Width);
  34. }
  35. std::string format_number(unsigned long N, IntegerStyle Style,
  36. Optional<size_t> Precision = None,
  37. Optional<int> Width = None) {
  38. std::string S;
  39. llvm::raw_string_ostream Str(S);
  40. write_ulong(Str, N, Style, Precision, Width);
  41. Str.flush();
  42. return S;
  43. }
  44. std::string format_number(long N, IntegerStyle Style,
  45. Optional<size_t> Precision = None,
  46. Optional<int> Width = None) {
  47. std::string S;
  48. llvm::raw_string_ostream Str(S);
  49. write_long(Str, N, Style, Precision, Width);
  50. Str.flush();
  51. return S;
  52. }
  53. std::string format_number(unsigned long long N, IntegerStyle Style,
  54. Optional<size_t> Precision = None,
  55. Optional<int> Width = None) {
  56. std::string S;
  57. llvm::raw_string_ostream Str(S);
  58. write_ulonglong(Str, N, Style, Precision, Width);
  59. Str.flush();
  60. return S;
  61. }
  62. std::string format_number(long long N, IntegerStyle Style,
  63. Optional<size_t> Precision = None,
  64. Optional<int> Width = None) {
  65. std::string S;
  66. llvm::raw_string_ostream Str(S);
  67. write_longlong(Str, N, Style, Precision, Width);
  68. Str.flush();
  69. return S;
  70. }
  71. std::string format_number(unsigned long long N, HexStyle Style,
  72. Optional<size_t> Precision = None,
  73. Optional<int> Width = None) {
  74. std::string S;
  75. llvm::raw_string_ostream Str(S);
  76. write_hex(Str, N, Style, Precision, Width);
  77. Str.flush();
  78. return S;
  79. }
  80. std::string format_number(double D, FloatStyle Style,
  81. Optional<size_t> Precision = None,
  82. Optional<int> Width = None) {
  83. std::string S;
  84. llvm::raw_string_ostream Str(S);
  85. write_double(Str, D, Style, Precision, Width);
  86. Str.flush();
  87. return S;
  88. }
  89. // Test basic number formatting with various styles and default width and
  90. // precision.
  91. TEST(NativeFormatTest, BasicIntegerTests) {
  92. // Simple fixed point integers. Default precision is 2.
  93. EXPECT_EQ("0.00", format_number(0, IntegerStyle::Fixed));
  94. EXPECT_EQ("2425.00", format_number(2425, IntegerStyle::Fixed));
  95. EXPECT_EQ("-2425.00", format_number(-2425, IntegerStyle::Fixed));
  96. EXPECT_EQ("0.00", format_number(0LL, IntegerStyle::Fixed));
  97. EXPECT_EQ("257257257235709.00",
  98. format_number(257257257235709LL, IntegerStyle::Fixed));
  99. EXPECT_EQ("-257257257235709.00",
  100. format_number(-257257257235709LL, IntegerStyle::Fixed));
  101. // Simple integers with no decimal. Default precision is 0.
  102. EXPECT_EQ("0", format_number(0, IntegerStyle::Integer));
  103. EXPECT_EQ("2425", format_number(2425, IntegerStyle::Integer));
  104. EXPECT_EQ("-2425", format_number(-2425, IntegerStyle::Integer));
  105. EXPECT_EQ("0", format_number(0LL, IntegerStyle::Integer));
  106. EXPECT_EQ("257257257235709",
  107. format_number(257257257235709LL, IntegerStyle::Integer));
  108. EXPECT_EQ("-257257257235709",
  109. format_number(-257257257235709LL, IntegerStyle::Integer));
  110. // Exponent based integers. Default precision is 6.
  111. EXPECT_EQ("3.700000e+01", format_number(37, IntegerStyle::Exponent));
  112. EXPECT_EQ("4.238000e+03", format_number(4238, IntegerStyle::Exponent));
  113. EXPECT_EQ("3.700000E+01", format_number(37, IntegerStyle::ExponentUpper));
  114. EXPECT_EQ("4.238000E+03", format_number(4238, IntegerStyle::ExponentUpper));
  115. // Number formatting. Default precision is 0.
  116. EXPECT_EQ("0", format_number(0, IntegerStyle::Number));
  117. EXPECT_EQ("2,425", format_number(2425, IntegerStyle::Number));
  118. EXPECT_EQ("-2,425", format_number(-2425, IntegerStyle::Number));
  119. EXPECT_EQ("257,257,257,235,709",
  120. format_number(257257257235709LL, IntegerStyle::Number));
  121. EXPECT_EQ("-257,257,257,235,709",
  122. format_number(-257257257235709LL, IntegerStyle::Number));
  123. // Percent formatting. Default precision is 0.
  124. EXPECT_EQ("0%", format_number(0, IntegerStyle::Percent));
  125. EXPECT_EQ("100%", format_number(1, IntegerStyle::Percent));
  126. EXPECT_EQ("-100%", format_number(-1, IntegerStyle::Percent));
  127. // Hex formatting. Default precision is 0.
  128. // lower case, prefix.
  129. EXPECT_EQ("0x0", format_number(0, HexStyle::PrefixLower));
  130. EXPECT_EQ("0xbeef", format_number(0xbeefLL, HexStyle::PrefixLower));
  131. EXPECT_EQ("0xdeadbeef", format_number(0xdeadbeefLL, HexStyle::PrefixLower));
  132. // upper-case, prefix.
  133. EXPECT_EQ("0x0", format_number(0, HexStyle::PrefixUpper));
  134. EXPECT_EQ("0xBEEF", format_number(0xbeefLL, HexStyle::PrefixUpper));
  135. EXPECT_EQ("0xDEADBEEF", format_number(0xdeadbeefLL, HexStyle::PrefixUpper));
  136. // lower-case, no prefix
  137. EXPECT_EQ("0", format_number(0, HexStyle::Lower));
  138. EXPECT_EQ("beef", format_number(0xbeefLL, HexStyle::Lower));
  139. EXPECT_EQ("deadbeef", format_number(0xdeadbeefLL, HexStyle::Lower));
  140. // upper-case, no prefix.
  141. EXPECT_EQ("0", format_number(0, HexStyle::Upper));
  142. EXPECT_EQ("BEEF", format_number(0xbeef, HexStyle::Upper));
  143. EXPECT_EQ("DEADBEEF", format_number(0xdeadbeef, HexStyle::Upper));
  144. EXPECT_EQ("0xFFFFFFFF", format_number(-1, IntegerStyle::HexUpperPrefix));
  145. }
  146. // Test pointer type formatting with various styles and default width and
  147. // precision.
  148. TEST(NativeFormatTest, BasicPointerTests) {
  149. // lower-case, prefix
  150. EXPECT_EQ("0x0", format_number((void *)nullptr, HexStyle::PrefixLower));
  151. EXPECT_EQ("0xbeef", format_number((void *)0xbeefLL, HexStyle::PrefixLower));
  152. EXPECT_EQ("0xdeadbeef",
  153. format_number((void *)0xdeadbeefLL, HexStyle::PrefixLower));
  154. // upper-case, prefix.
  155. EXPECT_EQ("0x0", format_number((void *)nullptr, HexStyle::PrefixUpper));
  156. EXPECT_EQ("0xBEEF", format_number((void *)0xbeefLL, HexStyle::PrefixUpper));
  157. EXPECT_EQ("0xDEADBEEF",
  158. format_number((void *)0xdeadbeefLL, HexStyle::PrefixUpper));
  159. // lower-case, no prefix
  160. EXPECT_EQ("0", format_number((void *)nullptr, HexStyle::Lower));
  161. EXPECT_EQ("beef", format_number((void *)0xbeefLL, HexStyle::Lower));
  162. EXPECT_EQ("deadbeef", format_number((void *)0xdeadbeefLL, HexStyle::Lower));
  163. // upper-case, no prefix.
  164. EXPECT_EQ("0", format_number((void *)nullptr, HexStyle::Upper));
  165. EXPECT_EQ("BEEF", format_number((void *)0xbeefLL, HexStyle::Upper));
  166. EXPECT_EQ("DEADBEEF", format_number((void *)0xdeadbeefLL, HexStyle::Upper));
  167. }
  168. // Test basic floating point formatting with various styles and default width
  169. // and precision.
  170. TEST(NativeFormatTest, BasicFloatingPointTests) {
  171. // Double
  172. EXPECT_EQ("0.000000e+00", format_number(0.0, FloatStyle::Exponent));
  173. EXPECT_EQ("-0.000000e+00", format_number(-0.0, FloatStyle::Exponent));
  174. EXPECT_EQ("1.100000e+00", format_number(1.1, FloatStyle::Exponent));
  175. EXPECT_EQ("1.100000E+00", format_number(1.1, FloatStyle::ExponentUpper));
  176. // Default precision is 2 for floating points.
  177. EXPECT_EQ("1.10", format_number(1.1, FloatStyle::Fixed));
  178. EXPECT_EQ("1.34", format_number(1.34, FloatStyle::Fixed));
  179. EXPECT_EQ("1.34", format_number(1.344, FloatStyle::Fixed));
  180. EXPECT_EQ("1.35", format_number(1.346, FloatStyle::Fixed));
  181. }
  182. // Test common boundary cases and min/max conditions.
  183. TEST(NativeFormatTest, BoundaryTests) {
  184. // Min and max.
  185. EXPECT_EQ("18446744073709551615",
  186. format_number(UINT64_MAX, IntegerStyle::Integer));
  187. EXPECT_EQ("9223372036854775807",
  188. format_number(INT64_MAX, IntegerStyle::Integer));
  189. EXPECT_EQ("-9223372036854775808",
  190. format_number(INT64_MIN, IntegerStyle::Integer));
  191. EXPECT_EQ("4294967295", format_number(UINT32_MAX, IntegerStyle::Integer));
  192. EXPECT_EQ("2147483647", format_number(INT32_MAX, IntegerStyle::Integer));
  193. EXPECT_EQ("-2147483648", format_number(INT32_MIN, IntegerStyle::Integer));
  194. EXPECT_EQ("nan", format_number(std::numeric_limits<double>::quiet_NaN(),
  195. FloatStyle::Fixed));
  196. EXPECT_EQ("INF", format_number(std::numeric_limits<double>::infinity(),
  197. FloatStyle::Fixed));
  198. }
  199. TEST(NativeFormatTest, HexTests) {
  200. // Test hex formatting with different widths and precisions.
  201. // Precision less than the value should print the full value anyway.
  202. EXPECT_EQ("0x0", format_number(0, IntegerStyle::HexLowerPrefix, 0));
  203. EXPECT_EQ("0xabcde", format_number(0xABCDE, IntegerStyle::HexLowerPrefix, 3));
  204. // Precision greater than the value should pad with 0s.
  205. // TODO: The prefix should not be counted in the precision. But unfortunately
  206. // it is and we have to live with it unless we fix all existing users of
  207. // prefixed hex formatting.
  208. EXPECT_EQ("0x000", format_number(0, IntegerStyle::HexLowerPrefix, 5));
  209. EXPECT_EQ("0x0abcde",
  210. format_number(0xABCDE, IntegerStyle::HexLowerPrefix, 8));
  211. EXPECT_EQ("00000", format_number(0, IntegerStyle::HexLowerNoPrefix, 5));
  212. EXPECT_EQ("000abcde",
  213. format_number(0xABCDE, IntegerStyle::HexLowerNoPrefix, 8));
  214. // Try printing more digits than can fit in a uint64.
  215. EXPECT_EQ("0x00000000000000abcde",
  216. format_number(0xABCDE, IntegerStyle::HexLowerPrefix, 21));
  217. // Width less than the amount to be printed should print the full amount.
  218. EXPECT_EQ("0x0", format_number(0, IntegerStyle::HexLowerPrefix, 0, 0));
  219. EXPECT_EQ("0xabcde",
  220. format_number(0xABCDE, IntegerStyle::HexLowerPrefix, 0, 0));
  221. // Width greater than the value should pad with spaces.
  222. EXPECT_EQ(" 0x0", format_number(0, IntegerStyle::HexLowerPrefix, 0, 5));
  223. EXPECT_EQ(" 0xabcde",
  224. format_number(0xABCDE, IntegerStyle::HexLowerPrefix, 0, 8));
  225. // Should also work with no prefix.
  226. EXPECT_EQ(" 000", format_number(0, IntegerStyle::HexLowerNoPrefix, 3, 5));
  227. EXPECT_EQ(" 0abcde",
  228. format_number(0xABCDE, IntegerStyle::HexLowerNoPrefix, 6, 9));
  229. // And with pointers.
  230. EXPECT_EQ(" 0x000",
  231. format_number((void *)nullptr, HexStyle::PrefixLower, 5, 7));
  232. // Try printing more digits than can fit in a uint64.
  233. EXPECT_EQ(" 0x000abcde",
  234. format_number(0xABCDE, IntegerStyle::HexLowerPrefix, 10, 15));
  235. }
  236. TEST(NativeFormatTest, IntegerTests) {
  237. // Test plain integer formatting with non-default widths and precisions.
  238. // Too low precision should print the whole number.
  239. EXPECT_EQ("-10", format_number(-10, IntegerStyle::Integer, 1));
  240. // Additional precision should padd with 0s.
  241. EXPECT_EQ("-00010", format_number(-10, IntegerStyle::Integer, 5));
  242. EXPECT_EQ("-00100", format_number(-100, IntegerStyle::Integer, 5));
  243. EXPECT_EQ("-01000", format_number(-1000, IntegerStyle::Integer, 5));
  244. EXPECT_EQ("-001234567890",
  245. format_number(-1234567890, IntegerStyle::Integer, 12));
  246. EXPECT_EQ("00010", format_number(10, IntegerStyle::Integer, 5));
  247. EXPECT_EQ("00100", format_number(100, IntegerStyle::Integer, 5));
  248. EXPECT_EQ("01000", format_number(1000, IntegerStyle::Integer, 5));
  249. EXPECT_EQ("001234567890",
  250. format_number(1234567890, IntegerStyle::Integer, 12));
  251. // Too low width should print the full number.
  252. EXPECT_EQ("-10", format_number(-10, IntegerStyle::Integer, None, 2));
  253. // Additional width should padd with spaces.
  254. EXPECT_EQ(" -00010", format_number(-10, IntegerStyle::Integer, 5, 8));
  255. EXPECT_EQ(" -00100", format_number(-100, IntegerStyle::Integer, 5, 8));
  256. EXPECT_EQ(" -01000", format_number(-1000, IntegerStyle::Integer, 5, 8));
  257. EXPECT_EQ(" -001234567890",
  258. format_number(-1234567890, IntegerStyle::Integer, 12, 14));
  259. EXPECT_EQ(" 00010", format_number(10, IntegerStyle::Integer, 5, 8));
  260. EXPECT_EQ(" 00100", format_number(100, IntegerStyle::Integer, 5, 8));
  261. EXPECT_EQ(" 01000", format_number(1000, IntegerStyle::Integer, 5, 8));
  262. EXPECT_EQ(" 001234567890",
  263. format_number(1234567890, IntegerStyle::Integer, 12, 14));
  264. }
  265. TEST(NativeFormatTest, CommaTests) {
  266. // Test comma grouping with default widths and precisions.
  267. EXPECT_EQ("0", format_number(0, IntegerStyle::Number));
  268. EXPECT_EQ("10", format_number(10, IntegerStyle::Number));
  269. EXPECT_EQ("100", format_number(100, IntegerStyle::Number));
  270. EXPECT_EQ("1,000", format_number(1000, IntegerStyle::Number));
  271. EXPECT_EQ("1,234,567,890", format_number(1234567890, IntegerStyle::Number));
  272. // Test comma grouping with non-default widths and precisions.
  273. EXPECT_EQ("-10", format_number(-10, IntegerStyle::Number));
  274. EXPECT_EQ("-100", format_number(-100, IntegerStyle::Number));
  275. EXPECT_EQ("-1,000", format_number(-1000, IntegerStyle::Number));
  276. EXPECT_EQ("-1,234,567,890", format_number(-1234567890, IntegerStyle::Number));
  277. EXPECT_EQ(" 1,000", format_number(1000, IntegerStyle::Number, None, 7));
  278. EXPECT_EQ(" -1,000", format_number(-1000, IntegerStyle::Number, None, 7));
  279. EXPECT_EQ(" -0,001,000", format_number(-1000, IntegerStyle::Number, 7, 11));
  280. EXPECT_EQ(" 0,001,000", format_number(1000, IntegerStyle::Number, 7, 11));
  281. }
  282. TEST(NativeFormatTest, PercentTests) {
  283. // Integer percents.
  284. EXPECT_EQ("0%", format_number(0, IntegerStyle::Percent));
  285. EXPECT_EQ("0.00%", format_number(0, IntegerStyle::Percent, 2));
  286. EXPECT_EQ(" 0.00%", format_number(0, IntegerStyle::Percent, 2, 7));
  287. EXPECT_EQ(" 100.00%", format_number(1, IntegerStyle::Percent, 2, 8));
  288. EXPECT_EQ(" 100%", format_number(1, IntegerStyle::Percent, None, 8));
  289. EXPECT_EQ(" 100.000%", format_number(1, IntegerStyle::Percent, 3, 9));
  290. // Floating point percents. Default precision is 2 for floating point types,
  291. // even for 0.
  292. EXPECT_EQ("0.00%", format_number(0.0, FloatStyle::Percent));
  293. EXPECT_EQ("0%", format_number(0.0, FloatStyle::Percent, 0));
  294. EXPECT_EQ(" 0.00%", format_number(0.0, FloatStyle::Percent, 2, 6));
  295. EXPECT_EQ(" 4.2%", format_number(.042379, FloatStyle::Percent, 1, 5));
  296. EXPECT_EQ("4.24%", format_number(.042379, FloatStyle::Percent, 2, 5));
  297. EXPECT_EQ("4.238%", format_number(.042379, FloatStyle::Percent, 3, 5));
  298. EXPECT_EQ(" 0.424%", format_number(.0042379, FloatStyle::Percent, 3, 8));
  299. EXPECT_EQ(" -0.424%", format_number(-.0042379, FloatStyle::Percent, 3, 8));
  300. }
  301. TEST(NativeFormatTest, FixedTests) {
  302. // Integer fixed numbers. Default precision is 2. Make sure no decimal
  303. // is printed with 0 precision.
  304. EXPECT_EQ("1.00", format_number(1, IntegerStyle::Fixed));
  305. EXPECT_EQ("1", format_number(1, IntegerStyle::Fixed, 0));
  306. EXPECT_EQ(" 1.00", format_number(1, IntegerStyle::Fixed, 2, 6));
  307. EXPECT_EQ("-1.00", format_number(-1, IntegerStyle::Fixed));
  308. EXPECT_EQ("-1.00", format_number(-1, IntegerStyle::Fixed, 2));
  309. EXPECT_EQ(" -1.00", format_number(-1, IntegerStyle::Fixed, 2, 6));
  310. // Float fixed numbers. Default precision is 2.
  311. EXPECT_EQ("0.00", format_number(0.0, FloatStyle::Fixed));
  312. EXPECT_EQ("1.00", format_number(1.0, FloatStyle::Fixed));
  313. // But can be forced to 0
  314. EXPECT_EQ("0", format_number(0.0, FloatStyle::Fixed, 0));
  315. // It should round up when appropriate.
  316. EXPECT_EQ("3.14", format_number(3.1415, FloatStyle::Fixed, 2));
  317. EXPECT_EQ("3.142", format_number(3.1415, FloatStyle::Fixed, 3));
  318. // Padding should work properly with both positive and negative numbers.
  319. EXPECT_EQ(" 3.14", format_number(3.1415, FloatStyle::Fixed, 2, 7));
  320. EXPECT_EQ(" 3.142", format_number(3.1415, FloatStyle::Fixed, 3, 7));
  321. EXPECT_EQ(" -3.14", format_number(-3.1415, FloatStyle::Fixed, 2, 7));
  322. EXPECT_EQ(" -3.142", format_number(-3.1415, FloatStyle::Fixed, 3, 7));
  323. }
  324. }