xref: /llvm-project/libc/test/src/__support/integer_to_string_test.cpp (revision 625d6928a863cdc60a907d5fcaf03dee60d25c8a)
1 //===-- Unittests for IntegerToString -------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "src/__support/CPP/string_view.h"
10 #include "src/__support/UInt.h"
11 #include "src/__support/UInt128.h"
12 #include "src/__support/integer_to_string.h"
13 
14 #include "test/UnitTest/Test.h"
15 
16 #include "limits.h"
17 
18 using __llvm_libc::IntegerToString;
19 using __llvm_libc::cpp::string_view;
20 
21 TEST(LlvmLibcIntegerToStringTest, UINT8) {
22   char buf[IntegerToString::dec_bufsize<uint8_t>()];
23   EXPECT_EQ(*IntegerToString::dec(uint8_t(0), buf), string_view("0"));
24   EXPECT_EQ(*IntegerToString::dec(uint8_t(1), buf), string_view("1"));
25   EXPECT_EQ(*IntegerToString::dec(uint8_t(12), buf), string_view("12"));
26   EXPECT_EQ(*IntegerToString::dec(uint8_t(123), buf), string_view("123"));
27   EXPECT_EQ(*IntegerToString::dec(uint8_t(UINT8_MAX), buf), string_view("255"));
28   EXPECT_EQ(*IntegerToString::dec(uint8_t(-1), buf), string_view("255"));
29 }
30 
31 TEST(LlvmLibcIntegerToStringTest, INT8) {
32   char buf[IntegerToString::dec_bufsize<int8_t>()];
33   EXPECT_EQ(*IntegerToString::dec(int8_t(0), buf), string_view("0"));
34   EXPECT_EQ(*IntegerToString::dec(int8_t(1), buf), string_view("1"));
35   EXPECT_EQ(*IntegerToString::dec(int8_t(12), buf), string_view("12"));
36   EXPECT_EQ(*IntegerToString::dec(int8_t(123), buf), string_view("123"));
37   EXPECT_EQ(*IntegerToString::dec(int8_t(-12), buf), string_view("-12"));
38   EXPECT_EQ(*IntegerToString::dec(int8_t(-123), buf), string_view("-123"));
39   EXPECT_EQ(*IntegerToString::dec(int8_t(INT8_MAX), buf), string_view("127"));
40   EXPECT_EQ(*IntegerToString::dec(int8_t(INT8_MIN), buf), string_view("-128"));
41 }
42 
43 TEST(LlvmLibcIntegerToStringTest, UINT16) {
44   char buf[IntegerToString::dec_bufsize<uint16_t>()];
45   EXPECT_EQ(*IntegerToString::dec(uint16_t(0), buf), string_view("0"));
46   EXPECT_EQ(*IntegerToString::dec(uint16_t(1), buf), string_view("1"));
47   EXPECT_EQ(*IntegerToString::dec(uint16_t(12), buf), string_view("12"));
48   EXPECT_EQ(*IntegerToString::dec(uint16_t(123), buf), string_view("123"));
49   EXPECT_EQ(*IntegerToString::dec(uint16_t(1234), buf), string_view("1234"));
50   EXPECT_EQ(*IntegerToString::dec(uint16_t(12345), buf), string_view("12345"));
51   EXPECT_EQ(*IntegerToString::dec(uint16_t(UINT16_MAX), buf),
52             string_view("65535"));
53   EXPECT_EQ(*IntegerToString::dec(uint16_t(-1), buf), string_view("65535"));
54 }
55 
56 TEST(LlvmLibcIntegerToStringTest, INT16) {
57   char buf[IntegerToString::dec_bufsize<int16_t>()];
58   EXPECT_EQ(*IntegerToString::dec(int16_t(0), buf), string_view("0"));
59   EXPECT_EQ(*IntegerToString::dec(int16_t(1), buf), string_view("1"));
60   EXPECT_EQ(*IntegerToString::dec(int16_t(12), buf), string_view("12"));
61   EXPECT_EQ(*IntegerToString::dec(int16_t(123), buf), string_view("123"));
62   EXPECT_EQ(*IntegerToString::dec(int16_t(1234), buf), string_view("1234"));
63   EXPECT_EQ(*IntegerToString::dec(int16_t(12345), buf), string_view("12345"));
64   EXPECT_EQ(*IntegerToString::dec(int16_t(-1), buf), string_view("-1"));
65   EXPECT_EQ(*IntegerToString::dec(int16_t(-12), buf), string_view("-12"));
66   EXPECT_EQ(*IntegerToString::dec(int16_t(-123), buf), string_view("-123"));
67   EXPECT_EQ(*IntegerToString::dec(int16_t(-1234), buf), string_view("-1234"));
68   EXPECT_EQ(*IntegerToString::dec(int16_t(-12345), buf), string_view("-12345"));
69   EXPECT_EQ(*IntegerToString::dec(int16_t(INT16_MAX), buf),
70             string_view("32767"));
71   EXPECT_EQ(*IntegerToString::dec(int16_t(INT16_MIN), buf),
72             string_view("-32768"));
73 }
74 
75 TEST(LlvmLibcIntegerToStringTest, UINT32) {
76   char buf[IntegerToString::dec_bufsize<uint32_t>()];
77   EXPECT_EQ(*IntegerToString::dec(uint32_t(0), buf), string_view("0"));
78   EXPECT_EQ(*IntegerToString::dec(uint32_t(1), buf), string_view("1"));
79   EXPECT_EQ(*IntegerToString::dec(uint32_t(12), buf), string_view("12"));
80   EXPECT_EQ(*IntegerToString::dec(uint32_t(123), buf), string_view("123"));
81   EXPECT_EQ(*IntegerToString::dec(uint32_t(1234), buf), string_view("1234"));
82   EXPECT_EQ(*IntegerToString::dec(uint32_t(12345), buf), string_view("12345"));
83   EXPECT_EQ(*IntegerToString::dec(uint32_t(123456), buf), string_view("123456"));
84   EXPECT_EQ(*IntegerToString::dec(uint32_t(1234567), buf),
85             string_view("1234567"));
86   EXPECT_EQ(*IntegerToString::dec(uint32_t(12345678), buf),
87             string_view("12345678"));
88   EXPECT_EQ(*IntegerToString::dec(uint32_t(123456789), buf),
89             string_view("123456789"));
90   EXPECT_EQ(*IntegerToString::dec(uint32_t(1234567890), buf),
91             string_view("1234567890"));
92   EXPECT_EQ(*IntegerToString::dec(uint32_t(UINT32_MAX), buf),
93             string_view("4294967295"));
94   EXPECT_EQ(*IntegerToString::dec(uint32_t(-1), buf), string_view("4294967295"));
95 }
96 
97 TEST(LlvmLibcIntegerToStringTest, INT32) {
98   char buf[IntegerToString::dec_bufsize<int32_t>()];
99   EXPECT_EQ(*IntegerToString::dec(int32_t(0), buf), string_view("0"));
100   EXPECT_EQ(*IntegerToString::dec(int32_t(1), buf), string_view("1"));
101   EXPECT_EQ(*IntegerToString::dec(int32_t(12), buf), string_view("12"));
102   EXPECT_EQ(*IntegerToString::dec(int32_t(123), buf), string_view("123"));
103   EXPECT_EQ(*IntegerToString::dec(int32_t(1234), buf), string_view("1234"));
104   EXPECT_EQ(*IntegerToString::dec(int32_t(12345), buf), string_view("12345"));
105   EXPECT_EQ(*IntegerToString::dec(int32_t(123456), buf), string_view("123456"));
106   EXPECT_EQ(*IntegerToString::dec(int32_t(1234567), buf),
107             string_view("1234567"));
108   EXPECT_EQ(*IntegerToString::dec(int32_t(12345678), buf),
109             string_view("12345678"));
110   EXPECT_EQ(*IntegerToString::dec(int32_t(123456789), buf),
111             string_view("123456789"));
112   EXPECT_EQ(*IntegerToString::dec(int32_t(1234567890), buf),
113             string_view("1234567890"));
114   EXPECT_EQ(*IntegerToString::dec(int32_t(-1), buf), string_view("-1"));
115   EXPECT_EQ(*IntegerToString::dec(int32_t(-12), buf), string_view("-12"));
116   EXPECT_EQ(*IntegerToString::dec(int32_t(-123), buf), string_view("-123"));
117   EXPECT_EQ(*IntegerToString::dec(int32_t(-1234), buf), string_view("-1234"));
118   EXPECT_EQ(*IntegerToString::dec(int32_t(-12345), buf), string_view("-12345"));
119   EXPECT_EQ(*IntegerToString::dec(int32_t(-123456), buf),
120             string_view("-123456"));
121   EXPECT_EQ(*IntegerToString::dec(int32_t(-1234567), buf),
122             string_view("-1234567"));
123   EXPECT_EQ(*IntegerToString::dec(int32_t(-12345678), buf),
124             string_view("-12345678"));
125   EXPECT_EQ(*IntegerToString::dec(int32_t(-123456789), buf),
126             string_view("-123456789"));
127   EXPECT_EQ(*IntegerToString::dec(int32_t(-1234567890), buf),
128             string_view("-1234567890"));
129   EXPECT_EQ(*IntegerToString::dec(int32_t(INT32_MAX), buf),
130             string_view("2147483647"));
131   EXPECT_EQ(*IntegerToString::dec(int32_t(INT32_MIN), buf),
132             string_view("-2147483648"));
133 }
134 
135 TEST(LlvmLibcIntegerToStringTest, UINT64) {
136   char buf[IntegerToString::dec_bufsize<uint64_t>()];
137   EXPECT_EQ(*IntegerToString::dec(uint64_t(0), buf), string_view("0"));
138   EXPECT_EQ(*IntegerToString::dec(uint64_t(1), buf), string_view("1"));
139   EXPECT_EQ(*IntegerToString::dec(uint64_t(12), buf), string_view("12"));
140   EXPECT_EQ(*IntegerToString::dec(uint64_t(123), buf), string_view("123"));
141   EXPECT_EQ(*IntegerToString::dec(uint64_t(1234), buf), string_view("1234"));
142   EXPECT_EQ(*IntegerToString::dec(uint64_t(12345), buf), string_view("12345"));
143   EXPECT_EQ(*IntegerToString::dec(uint64_t(123456), buf), string_view("123456"));
144   EXPECT_EQ(*IntegerToString::dec(uint64_t(1234567), buf),
145             string_view("1234567"));
146   EXPECT_EQ(*IntegerToString::dec(uint64_t(12345678), buf),
147             string_view("12345678"));
148   EXPECT_EQ(*IntegerToString::dec(uint64_t(123456789), buf),
149             string_view("123456789"));
150   EXPECT_EQ(*IntegerToString::dec(uint64_t(1234567890), buf),
151             string_view("1234567890"));
152   EXPECT_EQ(*IntegerToString::dec(uint64_t(1234567890123456789), buf),
153             string_view("1234567890123456789"));
154   EXPECT_EQ(*IntegerToString::dec(uint64_t(UINT64_MAX), buf),
155             string_view("18446744073709551615"));
156   EXPECT_EQ(*IntegerToString::dec(uint64_t(-1), buf),
157             string_view("18446744073709551615"));
158 }
159 
160 TEST(LlvmLibcIntegerToStringTest, INT64) {
161   char buf[IntegerToString::dec_bufsize<int64_t>()];
162   EXPECT_EQ(*IntegerToString::dec(int64_t(0), buf), string_view("0"));
163   EXPECT_EQ(*IntegerToString::dec(int64_t(1), buf), string_view("1"));
164   EXPECT_EQ(*IntegerToString::dec(int64_t(12), buf), string_view("12"));
165   EXPECT_EQ(*IntegerToString::dec(int64_t(123), buf), string_view("123"));
166   EXPECT_EQ(*IntegerToString::dec(int64_t(1234), buf), string_view("1234"));
167   EXPECT_EQ(*IntegerToString::dec(int64_t(12345), buf), string_view("12345"));
168   EXPECT_EQ(*IntegerToString::dec(int64_t(123456), buf), string_view("123456"));
169   EXPECT_EQ(*IntegerToString::dec(int64_t(1234567), buf),
170             string_view("1234567"));
171   EXPECT_EQ(*IntegerToString::dec(int64_t(12345678), buf),
172             string_view("12345678"));
173   EXPECT_EQ(*IntegerToString::dec(int64_t(123456789), buf),
174             string_view("123456789"));
175   EXPECT_EQ(*IntegerToString::dec(int64_t(1234567890), buf),
176             string_view("1234567890"));
177   EXPECT_EQ(*IntegerToString::dec(int64_t(1234567890123456789), buf),
178             string_view("1234567890123456789"));
179   EXPECT_EQ(*IntegerToString::dec(int64_t(-1), buf), string_view("-1"));
180   EXPECT_EQ(*IntegerToString::dec(int64_t(-12), buf), string_view("-12"));
181   EXPECT_EQ(*IntegerToString::dec(int64_t(-123), buf), string_view("-123"));
182   EXPECT_EQ(*IntegerToString::dec(int64_t(-1234), buf), string_view("-1234"));
183   EXPECT_EQ(*IntegerToString::dec(int64_t(-12345), buf), string_view("-12345"));
184   EXPECT_EQ(*IntegerToString::dec(int64_t(-123456), buf),
185             string_view("-123456"));
186   EXPECT_EQ(*IntegerToString::dec(int64_t(-1234567), buf),
187             string_view("-1234567"));
188   EXPECT_EQ(*IntegerToString::dec(int64_t(-12345678), buf),
189             string_view("-12345678"));
190   EXPECT_EQ(*IntegerToString::dec(int64_t(-123456789), buf),
191             string_view("-123456789"));
192   EXPECT_EQ(*IntegerToString::dec(int64_t(-1234567890), buf),
193             string_view("-1234567890"));
194   EXPECT_EQ(*IntegerToString::dec(int64_t(-1234567890123456789), buf),
195             string_view("-1234567890123456789"));
196   EXPECT_EQ(*IntegerToString::dec(int64_t(INT64_MAX), buf),
197             string_view("9223372036854775807"));
198   EXPECT_EQ(*IntegerToString::dec(int64_t(INT64_MIN), buf),
199             string_view("-9223372036854775808"));
200 }
201 
202 TEST(LlvmLibcIntegerToStringTest, UINT64_Base_8) {
203   char buf[IntegerToString::oct_bufsize<uint64_t>()];
204   EXPECT_EQ((*IntegerToString::oct(uint64_t(0), buf)), string_view("0"));
205   EXPECT_EQ((*IntegerToString::oct(uint64_t(012345), buf)),
206             string_view("12345"));
207   EXPECT_EQ((*IntegerToString::oct(uint64_t(0123456701234567012345), buf)),
208             string_view("123456701234567012345"));
209   EXPECT_EQ((*IntegerToString::oct(uint64_t(01777777777777777777777), buf)),
210             string_view("1777777777777777777777"));
211 }
212 
213 TEST(LlvmLibcIntegerToStringTest, UINT64_Base_16) {
214   char buf[IntegerToString::hex_bufsize<uint64_t>()];
215   EXPECT_EQ(*IntegerToString::hex(uint64_t(0), buf), string_view("0"));
216   EXPECT_EQ(*IntegerToString::hex(uint64_t(0x12345), buf), string_view("12345"));
217   EXPECT_EQ((*IntegerToString::hex(uint64_t(0x123456789abcdef), buf)),
218             string_view("123456789abcdef"));
219   EXPECT_EQ(*IntegerToString::hex(uint64_t(0x123456789abcdef), buf, false),
220             string_view("123456789ABCDEF"));
221   EXPECT_EQ(*IntegerToString::hex(uint64_t(0xffffffffffffffff), buf),
222             string_view("ffffffffffffffff"));
223 }
224 
225 TEST(LlvmLibcIntegerToStringTest, UINT64_Base_2) {
226   char buf[IntegerToString::bin_bufsize<uint64_t>()];
227   EXPECT_EQ(*IntegerToString::bin(uint64_t(0), buf), string_view("0"));
228   EXPECT_EQ(*IntegerToString::bin(uint64_t(0xf0c), buf),
229             string_view("111100001100"));
230   EXPECT_EQ(*IntegerToString::bin(uint64_t(0x123abc), buf),
231             string_view("100100011101010111100"));
232   EXPECT_EQ(
233       *IntegerToString::bin(uint64_t(0xffffffffffffffff), buf),
234       string_view(
235           "1111111111111111111111111111111111111111111111111111111111111111"));
236 }
237 
238 TEST(LlvmLibcIntegerToStringTest, UINT64_Base_36) {
239   char buf[IntegerToString::bufsize<36, uint64_t>()];
240   EXPECT_EQ(*IntegerToString::convert<36>(uint64_t(0), buf), string_view("0"));
241   EXPECT_EQ(*IntegerToString::convert<36>(uint64_t(12345), buf),
242             string_view("9ix"));
243   EXPECT_EQ(*IntegerToString::convert<36>(uint64_t(1047601316295595), buf),
244             string_view("abcdefghij"));
245   EXPECT_EQ(*IntegerToString::convert<36>(uint64_t(2092218013456445), buf),
246             string_view("klmnopqrst"));
247   EXPECT_EQ(*IntegerToString::convert<36>(uint64_t(1867590395), buf, false),
248             string_view("UVWXYZ"));
249   EXPECT_EQ(*IntegerToString::convert<36>(uint64_t(0xffffffffffffffff), buf),
250             string_view("3w5e11264sgsf"));
251 }
252 
253 TEST(LlvmLibcIntegerToStringTest, UINT128_Base_16) {
254   char buf[IntegerToString::hex_bufsize<UInt128>()];
255   EXPECT_EQ(*IntegerToString::hex(static_cast<UInt128>(0), buf),
256             string_view("00000000000000000000000000000000"));
257   EXPECT_EQ(*IntegerToString::hex(static_cast<UInt128>(0x12345), buf),
258             string_view("00000000000000000000000000012345"));
259   EXPECT_EQ((*IntegerToString::hex(static_cast<UInt128>(0x1234) << 112, buf)),
260             string_view("12340000000000000000000000000000"));
261   EXPECT_EQ((*IntegerToString::hex(static_cast<UInt128>(0x1234) << 48, buf)),
262             string_view("00000000000000001234000000000000"));
263   EXPECT_EQ((*IntegerToString::hex(static_cast<UInt128>(0x1234) << 52, buf)),
264             string_view("00000000000000012340000000000000"));
265 }
266 
267 TEST(LlvmLibcIntegerToStringTest, UINT256_Base_16) {
268   using UInt256 = __llvm_libc::cpp::UInt<256>;
269   char buf[IntegerToString::hex_bufsize<UInt256>()];
270   EXPECT_EQ(
271       *IntegerToString::hex(static_cast<UInt256>(0), buf),
272       string_view(
273           "0000000000000000000000000000000000000000000000000000000000000000"));
274   EXPECT_EQ(
275       *IntegerToString::hex(static_cast<UInt256>(0x12345), buf),
276       string_view(
277           "0000000000000000000000000000000000000000000000000000000000012345"));
278   EXPECT_EQ(
279       (*IntegerToString::hex(static_cast<UInt256>(0x1234) << 112, buf)),
280       string_view(
281           "0000000000000000000000000000000012340000000000000000000000000000"));
282   EXPECT_EQ(
283       (*IntegerToString::hex(static_cast<UInt256>(0x1234) << 116, buf)),
284       string_view(
285           "0000000000000000000000000000000123400000000000000000000000000000"));
286   EXPECT_EQ(
287       (*IntegerToString::hex(static_cast<UInt256>(0x1234) << 240, buf)),
288       string_view(
289           "1234000000000000000000000000000000000000000000000000000000000000"));
290 }
291