1d52f0aecSMichael Jones //===-- Unittests for strtoull --------------------------------------------===//
2d52f0aecSMichael Jones //
3d52f0aecSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d52f0aecSMichael Jones // See https://llvm.org/LICENSE.txt for license information.
5d52f0aecSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d52f0aecSMichael Jones //
7d52f0aecSMichael Jones //===----------------------------------------------------------------------===//
8d52f0aecSMichael Jones 
9d52f0aecSMichael Jones #include "src/stdlib/strtoull.h"
10d52f0aecSMichael Jones 
11d52f0aecSMichael Jones #include <errno.h>
12d52f0aecSMichael Jones #include <limits.h>
131d02a8bcSMichael Jones #include <stddef.h>
14d52f0aecSMichael Jones 
154e1a164dSRoland McGrath #include "utils/UnitTest/Test.h"
164e1a164dSRoland McGrath 
TEST(LlvmLibcStrToULLTest,InvalidBase)17d52f0aecSMichael Jones TEST(LlvmLibcStrToULLTest, InvalidBase) {
18d52f0aecSMichael Jones   const char *ten = "10";
19d52f0aecSMichael Jones   errno = 0;
20d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(ten, nullptr, -1), 0ull);
21d52f0aecSMichael Jones   ASSERT_EQ(errno, EINVAL);
22d52f0aecSMichael Jones }
23d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULLTest,CleanBaseTenDecode)24d52f0aecSMichael Jones TEST(LlvmLibcStrToULLTest, CleanBaseTenDecode) {
25d52f0aecSMichael Jones   char *str_end = nullptr;
26d52f0aecSMichael Jones 
27d52f0aecSMichael Jones   const char *ten = "10";
28d52f0aecSMichael Jones   errno = 0;
29d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(ten, &str_end, 10), 10ull);
30d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
311d02a8bcSMichael Jones   EXPECT_EQ(str_end - ten, ptrdiff_t(2));
32d52f0aecSMichael Jones   errno = 0;
33d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(ten, nullptr, 10), 10ull);
34d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
35d52f0aecSMichael Jones 
36d52f0aecSMichael Jones   const char *hundred = "100";
37d52f0aecSMichael Jones   errno = 0;
38d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(hundred, &str_end, 10), 100ull);
39d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
401d02a8bcSMichael Jones   EXPECT_EQ(str_end - hundred, ptrdiff_t(3));
41d52f0aecSMichael Jones 
42d52f0aecSMichael Jones   const char *negative = "-100";
43d52f0aecSMichael Jones   errno = 0;
44d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(negative, &str_end, 10), -(100ull));
45d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
461d02a8bcSMichael Jones   EXPECT_EQ(str_end - negative, ptrdiff_t(4));
47d52f0aecSMichael Jones 
48d52f0aecSMichael Jones   const char *big_number = "123456789012345";
49d52f0aecSMichael Jones   errno = 0;
50d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(big_number, &str_end, 10),
51d52f0aecSMichael Jones             123456789012345ull);
52d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
531d02a8bcSMichael Jones   EXPECT_EQ(str_end - big_number, ptrdiff_t(15));
54d52f0aecSMichael Jones 
55d52f0aecSMichael Jones   const char *unsigned_long_long_max_number = "18446744073709551615";
56d52f0aecSMichael Jones   errno = 0;
57d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(unsigned_long_long_max_number, &str_end, 10),
58d52f0aecSMichael Jones             18446744073709551615ull);
59d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
601d02a8bcSMichael Jones   EXPECT_EQ(str_end - unsigned_long_long_max_number, ptrdiff_t(20));
61d52f0aecSMichael Jones 
62d52f0aecSMichael Jones   const char *too_big_number = "123456789012345678901";
63d52f0aecSMichael Jones   errno = 0;
64d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(too_big_number, &str_end, 10), ULLONG_MAX);
65d52f0aecSMichael Jones   ASSERT_EQ(errno, ERANGE);
661d02a8bcSMichael Jones   EXPECT_EQ(str_end - too_big_number, ptrdiff_t(21));
67d52f0aecSMichael Jones 
68d52f0aecSMichael Jones   const char *too_big_negative_number = "-123456789012345678901";
69d52f0aecSMichael Jones   errno = 0;
70d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(too_big_negative_number, &str_end, 10),
71d52f0aecSMichael Jones             ULLONG_MAX);
72d52f0aecSMichael Jones   ASSERT_EQ(errno, ERANGE);
731d02a8bcSMichael Jones   EXPECT_EQ(str_end - too_big_negative_number, ptrdiff_t(22));
74d52f0aecSMichael Jones 
75d52f0aecSMichael Jones   const char *long_number_range_test =
76d52f0aecSMichael Jones       "10000000000000000000000000000000000000000000000000";
77d52f0aecSMichael Jones   errno = 0;
78d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(long_number_range_test, &str_end, 10),
79d52f0aecSMichael Jones             ULLONG_MAX);
80d52f0aecSMichael Jones   ASSERT_EQ(errno, ERANGE);
811d02a8bcSMichael Jones   EXPECT_EQ(str_end - long_number_range_test, ptrdiff_t(50));
82d52f0aecSMichael Jones }
83d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULLTest,MessyBaseTenDecode)84d52f0aecSMichael Jones TEST(LlvmLibcStrToULLTest, MessyBaseTenDecode) {
85d52f0aecSMichael Jones   char *str_end = nullptr;
86d52f0aecSMichael Jones 
87d52f0aecSMichael Jones   const char *spaces_before = "     10";
88d52f0aecSMichael Jones   errno = 0;
89d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(spaces_before, &str_end, 10), 10ull);
90d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
911d02a8bcSMichael Jones   EXPECT_EQ(str_end - spaces_before, ptrdiff_t(7));
92d52f0aecSMichael Jones 
93d52f0aecSMichael Jones   const char *spaces_after = "10      ";
94d52f0aecSMichael Jones   errno = 0;
95d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(spaces_after, &str_end, 10), 10ull);
96d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
971d02a8bcSMichael Jones   EXPECT_EQ(str_end - spaces_after, ptrdiff_t(2));
98d52f0aecSMichael Jones 
99d52f0aecSMichael Jones   const char *word_before = "word10";
100d52f0aecSMichael Jones   errno = 0;
101d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(word_before, &str_end, 10), 0ull);
102d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1031d02a8bcSMichael Jones   EXPECT_EQ(str_end - word_before, ptrdiff_t(0));
104d52f0aecSMichael Jones 
105d52f0aecSMichael Jones   const char *word_after = "10word";
106d52f0aecSMichael Jones   errno = 0;
107d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(word_after, &str_end, 10), 10ull);
108d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1091d02a8bcSMichael Jones   EXPECT_EQ(str_end - word_after, ptrdiff_t(2));
110d52f0aecSMichael Jones 
111d52f0aecSMichael Jones   const char *two_numbers = "10 999";
112d52f0aecSMichael Jones   errno = 0;
113d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(two_numbers, &str_end, 10), 10ull);
114d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1151d02a8bcSMichael Jones   EXPECT_EQ(str_end - two_numbers, ptrdiff_t(2));
116d52f0aecSMichael Jones 
117d52f0aecSMichael Jones   const char *two_signs = "--10 999";
118d52f0aecSMichael Jones   errno = 0;
119d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(two_signs, &str_end, 10), 0ull);
120d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
121*53804d4eSMichael Jones   EXPECT_EQ(str_end - two_signs, ptrdiff_t(0));
122d52f0aecSMichael Jones 
123d52f0aecSMichael Jones   const char *sign_before = "+2=4";
124d52f0aecSMichael Jones   errno = 0;
125d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(sign_before, &str_end, 10), 2ull);
126d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1271d02a8bcSMichael Jones   EXPECT_EQ(str_end - sign_before, ptrdiff_t(2));
128d52f0aecSMichael Jones 
129d52f0aecSMichael Jones   const char *sign_after = "2+2=4";
130d52f0aecSMichael Jones   errno = 0;
131d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(sign_after, &str_end, 10), 2ull);
132d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1331d02a8bcSMichael Jones   EXPECT_EQ(str_end - sign_after, ptrdiff_t(1));
134d52f0aecSMichael Jones 
135d52f0aecSMichael Jones   const char *tab_before = "\t10";
136d52f0aecSMichael Jones   errno = 0;
137d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(tab_before, &str_end, 10), 10ull);
138d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1391d02a8bcSMichael Jones   EXPECT_EQ(str_end - tab_before, ptrdiff_t(3));
140d52f0aecSMichael Jones 
141d52f0aecSMichael Jones   const char *all_together = "\t  -12345and+67890";
142d52f0aecSMichael Jones   errno = 0;
143d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(all_together, &str_end, 10), -(12345ull));
144d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1451d02a8bcSMichael Jones   EXPECT_EQ(str_end - all_together, ptrdiff_t(9));
146*53804d4eSMichael Jones 
147*53804d4eSMichael Jones   const char *just_spaces = "  ";
148*53804d4eSMichael Jones   errno = 0;
149*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(just_spaces, &str_end, 10), 0ull);
150*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
151*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_spaces, ptrdiff_t(0));
152*53804d4eSMichael Jones 
153*53804d4eSMichael Jones   const char *just_space_and_sign = " +";
154*53804d4eSMichael Jones   errno = 0;
155*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(just_space_and_sign, &str_end, 10), 0ull);
156*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
157*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_space_and_sign, ptrdiff_t(0));
158d52f0aecSMichael Jones }
159d52f0aecSMichael Jones 
int_to_b36_char(int input)160d52f0aecSMichael Jones static char int_to_b36_char(int input) {
161d52f0aecSMichael Jones   if (input < 0 || input > 36)
162d52f0aecSMichael Jones     return '0';
163d52f0aecSMichael Jones   if (input < 10)
1644e1a164dSRoland McGrath     return static_cast<char>('0' + input);
1654e1a164dSRoland McGrath   return static_cast<char>('A' + input - 10);
166d52f0aecSMichael Jones }
167d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULLTest,DecodeInOtherBases)168d52f0aecSMichael Jones TEST(LlvmLibcStrToULLTest, DecodeInOtherBases) {
169d52f0aecSMichael Jones   char small_string[4] = {'\0', '\0', '\0', '\0'};
1704e1a164dSRoland McGrath   for (int base = 2; base <= 36; ++base) {
1714e1a164dSRoland McGrath     for (int first_digit = 0; first_digit <= 36; ++first_digit) {
172d52f0aecSMichael Jones       small_string[0] = int_to_b36_char(first_digit);
173d52f0aecSMichael Jones       if (first_digit < base) {
174d52f0aecSMichael Jones         errno = 0;
175d52f0aecSMichael Jones         ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base),
1764e1a164dSRoland McGrath                   static_cast<unsigned long long int>(first_digit));
177d52f0aecSMichael Jones         ASSERT_EQ(errno, 0);
178d52f0aecSMichael Jones       } else {
179d52f0aecSMichael Jones         errno = 0;
180d52f0aecSMichael Jones         ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base), 0ull);
181d52f0aecSMichael Jones         ASSERT_EQ(errno, 0);
182d52f0aecSMichael Jones       }
183d52f0aecSMichael Jones     }
184d52f0aecSMichael Jones   }
185d52f0aecSMichael Jones 
1864e1a164dSRoland McGrath   for (int base = 2; base <= 36; ++base) {
1874e1a164dSRoland McGrath     for (int first_digit = 0; first_digit <= 36; ++first_digit) {
188d52f0aecSMichael Jones       small_string[0] = int_to_b36_char(first_digit);
1894e1a164dSRoland McGrath       for (int second_digit = 0; second_digit <= 36; ++second_digit) {
190d52f0aecSMichael Jones         small_string[1] = int_to_b36_char(second_digit);
191d52f0aecSMichael Jones         if (first_digit < base && second_digit < base) {
192d52f0aecSMichael Jones           errno = 0;
193d52f0aecSMichael Jones           ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base),
1944e1a164dSRoland McGrath                     static_cast<unsigned long long int>(second_digit +
1954e1a164dSRoland McGrath                                                         (first_digit * base)));
196d52f0aecSMichael Jones           ASSERT_EQ(errno, 0);
197d52f0aecSMichael Jones         } else if (first_digit < base) {
198d52f0aecSMichael Jones           errno = 0;
199d52f0aecSMichael Jones           ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base),
2004e1a164dSRoland McGrath                     static_cast<unsigned long long int>(first_digit));
201d52f0aecSMichael Jones           ASSERT_EQ(errno, 0);
202d52f0aecSMichael Jones         } else {
203d52f0aecSMichael Jones           errno = 0;
204d52f0aecSMichael Jones           ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base), 0ull);
205d52f0aecSMichael Jones           ASSERT_EQ(errno, 0);
206d52f0aecSMichael Jones         }
207d52f0aecSMichael Jones       }
208d52f0aecSMichael Jones     }
209d52f0aecSMichael Jones   }
210d52f0aecSMichael Jones 
2114e1a164dSRoland McGrath   for (int base = 2; base <= 36; ++base) {
2124e1a164dSRoland McGrath     for (int first_digit = 0; first_digit <= 36; ++first_digit) {
213d52f0aecSMichael Jones       small_string[0] = int_to_b36_char(first_digit);
2144e1a164dSRoland McGrath       for (int second_digit = 0; second_digit <= 36; ++second_digit) {
215d52f0aecSMichael Jones         small_string[1] = int_to_b36_char(second_digit);
2164e1a164dSRoland McGrath         for (int third_digit = 0; third_digit <= 36; ++third_digit) {
217d52f0aecSMichael Jones           small_string[2] = int_to_b36_char(third_digit);
218d52f0aecSMichael Jones 
219d52f0aecSMichael Jones           if (first_digit < base && second_digit < base && third_digit < base) {
220d52f0aecSMichael Jones             errno = 0;
221d52f0aecSMichael Jones             ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base),
2224e1a164dSRoland McGrath                       static_cast<unsigned long long int>(
223d52f0aecSMichael Jones                           third_digit + (second_digit * base) +
2244e1a164dSRoland McGrath                           (first_digit * base * base)));
225d52f0aecSMichael Jones             ASSERT_EQ(errno, 0);
226d52f0aecSMichael Jones           } else if (first_digit < base && second_digit < base) {
227d52f0aecSMichael Jones             errno = 0;
228d52f0aecSMichael Jones             ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base),
2294e1a164dSRoland McGrath                       static_cast<unsigned long long int>(
2304e1a164dSRoland McGrath                           second_digit + (first_digit * base)));
231d52f0aecSMichael Jones             ASSERT_EQ(errno, 0);
232d52f0aecSMichael Jones           } else if (first_digit < base) {
233d52f0aecSMichael Jones             // if the base is 16 there is a special case for the prefix 0X.
234d52f0aecSMichael Jones             // The number is treated as a one digit hexadecimal.
235d52f0aecSMichael Jones             if (base == 16 && first_digit == 0 && second_digit == 33) {
236d52f0aecSMichael Jones               if (third_digit < base) {
237d52f0aecSMichael Jones                 errno = 0;
238d52f0aecSMichael Jones                 ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base),
2394e1a164dSRoland McGrath                           static_cast<unsigned long long int>(third_digit));
240d52f0aecSMichael Jones                 ASSERT_EQ(errno, 0);
241d52f0aecSMichael Jones               } else {
242d52f0aecSMichael Jones                 errno = 0;
243d52f0aecSMichael Jones                 ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base),
244d52f0aecSMichael Jones                           0ull);
245d52f0aecSMichael Jones                 ASSERT_EQ(errno, 0);
246d52f0aecSMichael Jones               }
247d52f0aecSMichael Jones             } else {
248d52f0aecSMichael Jones               errno = 0;
249d52f0aecSMichael Jones               ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base),
2504e1a164dSRoland McGrath                         static_cast<unsigned long long int>(first_digit));
251d52f0aecSMichael Jones               ASSERT_EQ(errno, 0);
252d52f0aecSMichael Jones             }
253d52f0aecSMichael Jones           } else {
254d52f0aecSMichael Jones             errno = 0;
255d52f0aecSMichael Jones             ASSERT_EQ(__llvm_libc::strtoull(small_string, nullptr, base), 0ull);
256d52f0aecSMichael Jones             ASSERT_EQ(errno, 0);
257d52f0aecSMichael Jones           }
258d52f0aecSMichael Jones         }
259d52f0aecSMichael Jones       }
260d52f0aecSMichael Jones     }
261d52f0aecSMichael Jones   }
262d52f0aecSMichael Jones }
263d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULLTest,CleanBaseSixteenDecode)264d52f0aecSMichael Jones TEST(LlvmLibcStrToULLTest, CleanBaseSixteenDecode) {
265d52f0aecSMichael Jones   char *str_end = nullptr;
266d52f0aecSMichael Jones 
267d52f0aecSMichael Jones   const char *no_prefix = "123abc";
268d52f0aecSMichael Jones   errno = 0;
269d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(no_prefix, &str_end, 16), 0x123abcull);
270d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
2711d02a8bcSMichael Jones   EXPECT_EQ(str_end - no_prefix, ptrdiff_t(6));
272d52f0aecSMichael Jones 
273d52f0aecSMichael Jones   const char *yes_prefix = "0x456def";
274d52f0aecSMichael Jones   errno = 0;
275d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(yes_prefix, &str_end, 16), 0x456defull);
276d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
2771d02a8bcSMichael Jones   EXPECT_EQ(str_end - yes_prefix, ptrdiff_t(8));
27837ce7349SMichael Jones 
27937ce7349SMichael Jones   const char *letter_after_prefix = "0xabc123";
28037ce7349SMichael Jones   errno = 0;
28137ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(letter_after_prefix, &str_end, 16),
28237ce7349SMichael Jones             0xabc123ull);
28337ce7349SMichael Jones   ASSERT_EQ(errno, 0);
28437ce7349SMichael Jones   EXPECT_EQ(str_end - letter_after_prefix, ptrdiff_t(8));
28537ce7349SMichael Jones }
28637ce7349SMichael Jones 
TEST(LlvmLibcStrToULLTest,MessyBaseSixteenDecode)28737ce7349SMichael Jones TEST(LlvmLibcStrToULLTest, MessyBaseSixteenDecode) {
28837ce7349SMichael Jones   char *str_end = nullptr;
28937ce7349SMichael Jones 
29037ce7349SMichael Jones   const char *just_prefix = "0x";
29137ce7349SMichael Jones   errno = 0;
29237ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(just_prefix, &str_end, 16), 0ull);
29337ce7349SMichael Jones   ASSERT_EQ(errno, 0);
29437ce7349SMichael Jones   EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
29537ce7349SMichael Jones 
29637ce7349SMichael Jones   errno = 0;
29737ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(just_prefix, &str_end, 0), 0ull);
29837ce7349SMichael Jones   ASSERT_EQ(errno, 0);
29937ce7349SMichael Jones   EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
30037ce7349SMichael Jones 
30137ce7349SMichael Jones   const char *prefix_with_x_after = "0xx";
30237ce7349SMichael Jones   errno = 0;
30337ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(prefix_with_x_after, &str_end, 16), 0ull);
30437ce7349SMichael Jones   ASSERT_EQ(errno, 0);
30537ce7349SMichael Jones   EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
30637ce7349SMichael Jones 
30737ce7349SMichael Jones   errno = 0;
30837ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(prefix_with_x_after, &str_end, 0), 0ull);
30937ce7349SMichael Jones   ASSERT_EQ(errno, 0);
31037ce7349SMichael Jones   EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
311d52f0aecSMichael Jones }
312d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULLTest,AutomaticBaseSelection)313d52f0aecSMichael Jones TEST(LlvmLibcStrToULLTest, AutomaticBaseSelection) {
314d52f0aecSMichael Jones   char *str_end = nullptr;
315d52f0aecSMichael Jones 
316d52f0aecSMichael Jones   const char *base_ten = "12345";
317d52f0aecSMichael Jones   errno = 0;
318d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(base_ten, &str_end, 0), 12345ull);
319d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
3201d02a8bcSMichael Jones   EXPECT_EQ(str_end - base_ten, ptrdiff_t(5));
321d52f0aecSMichael Jones 
322d52f0aecSMichael Jones   const char *base_sixteen_no_prefix = "123abc";
323d52f0aecSMichael Jones   errno = 0;
324d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(base_sixteen_no_prefix, &str_end, 0), 123ull);
325d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
3261d02a8bcSMichael Jones   EXPECT_EQ(str_end - base_sixteen_no_prefix, ptrdiff_t(3));
327d52f0aecSMichael Jones 
328d52f0aecSMichael Jones   const char *base_sixteen_with_prefix = "0x456def";
329d52f0aecSMichael Jones   errno = 0;
330d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(base_sixteen_with_prefix, &str_end, 0),
331d52f0aecSMichael Jones             0x456defull);
332d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
3331d02a8bcSMichael Jones   EXPECT_EQ(str_end - base_sixteen_with_prefix, ptrdiff_t(8));
334d52f0aecSMichael Jones 
335d52f0aecSMichael Jones   const char *base_eight_with_prefix = "012345";
336d52f0aecSMichael Jones   errno = 0;
337d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(base_eight_with_prefix, &str_end, 0),
338d52f0aecSMichael Jones             012345ull);
339d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
3401d02a8bcSMichael Jones   EXPECT_EQ(str_end - base_eight_with_prefix, ptrdiff_t(6));
341*53804d4eSMichael Jones 
342*53804d4eSMichael Jones   const char *just_zero = "0";
343*53804d4eSMichael Jones   errno = 0;
344*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(just_zero, &str_end, 0), 0ull);
345*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
346*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_zero, ptrdiff_t(1));
347*53804d4eSMichael Jones 
348*53804d4eSMichael Jones   const char *just_zero_x = "0x";
349*53804d4eSMichael Jones   errno = 0;
350*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(just_zero_x, &str_end, 0), 0ull);
351*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
352*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_zero_x, ptrdiff_t(1));
353*53804d4eSMichael Jones 
354*53804d4eSMichael Jones   const char *just_zero_eight = "08";
355*53804d4eSMichael Jones   errno = 0;
356*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoull(just_zero_eight, &str_end, 0), 0ull);
357*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
358*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_zero_eight, ptrdiff_t(1));
359d52f0aecSMichael Jones }
360