1d52f0aecSMichael Jones //===-- Unittests for strtoul ---------------------------------------------===//
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/strtoul.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(LlvmLibcStrToULTest,InvalidBase)17d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, InvalidBase) {
18d52f0aecSMichael Jones   const char *ten = "10";
19d52f0aecSMichael Jones   errno = 0;
20d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(ten, nullptr, -1), 0ul);
21d52f0aecSMichael Jones   ASSERT_EQ(errno, EINVAL);
22d52f0aecSMichael Jones }
23d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULTest,CleanBaseTenDecode)24d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, 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::strtoul(ten, &str_end, 10), 10ul);
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::strtoul(ten, nullptr, 10), 10ul);
34d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
35d52f0aecSMichael Jones 
36d52f0aecSMichael Jones   const char *hundred = "100";
37d52f0aecSMichael Jones   errno = 0;
38d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(hundred, &str_end, 10), 100ul);
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::strtoul(negative, &str_end, 10), -(100ul));
45d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
461d02a8bcSMichael Jones   EXPECT_EQ(str_end - negative, ptrdiff_t(4));
47d52f0aecSMichael Jones 
48fdee2d76SMichael Jones   const char *big_number = "1234567890";
49d52f0aecSMichael Jones   errno = 0;
50fdee2d76SMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(big_number, &str_end, 10), 1234567890ul);
51d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
52fdee2d76SMichael Jones   EXPECT_EQ(str_end - big_number, ptrdiff_t(10));
53d52f0aecSMichael Jones 
54d52f0aecSMichael Jones   const char *too_big_number = "123456789012345678901";
55d52f0aecSMichael Jones   errno = 0;
56d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(too_big_number, &str_end, 10), ULONG_MAX);
57d52f0aecSMichael Jones   ASSERT_EQ(errno, ERANGE);
581d02a8bcSMichael Jones   EXPECT_EQ(str_end - too_big_number, ptrdiff_t(21));
59d52f0aecSMichael Jones 
60d52f0aecSMichael Jones   const char *too_big_negative_number = "-123456789012345678901";
61d52f0aecSMichael Jones   errno = 0;
62d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(too_big_negative_number, &str_end, 10),
63d52f0aecSMichael Jones             ULONG_MAX);
64d52f0aecSMichael Jones   ASSERT_EQ(errno, ERANGE);
651d02a8bcSMichael Jones   EXPECT_EQ(str_end - too_big_negative_number, ptrdiff_t(22));
66d52f0aecSMichael Jones 
67d52f0aecSMichael Jones   const char *long_number_range_test =
68d52f0aecSMichael Jones       "10000000000000000000000000000000000000000000000000";
69d52f0aecSMichael Jones   errno = 0;
70d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(long_number_range_test, &str_end, 10),
71d52f0aecSMichael Jones             ULONG_MAX);
72d52f0aecSMichael Jones   ASSERT_EQ(errno, ERANGE);
731d02a8bcSMichael Jones   EXPECT_EQ(str_end - long_number_range_test, ptrdiff_t(50));
74d52f0aecSMichael Jones }
75d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULTest,MessyBaseTenDecode)76d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, MessyBaseTenDecode) {
77d52f0aecSMichael Jones   char *str_end = nullptr;
78d52f0aecSMichael Jones 
79d52f0aecSMichael Jones   const char *spaces_before = "     10";
80d52f0aecSMichael Jones   errno = 0;
81d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(spaces_before, &str_end, 10), 10ul);
82d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
831d02a8bcSMichael Jones   EXPECT_EQ(str_end - spaces_before, ptrdiff_t(7));
84d52f0aecSMichael Jones 
85d52f0aecSMichael Jones   const char *spaces_after = "10      ";
86d52f0aecSMichael Jones   errno = 0;
87d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(spaces_after, &str_end, 10), 10ul);
88d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
891d02a8bcSMichael Jones   EXPECT_EQ(str_end - spaces_after, ptrdiff_t(2));
90d52f0aecSMichael Jones 
91d52f0aecSMichael Jones   const char *word_before = "word10";
92d52f0aecSMichael Jones   errno = 0;
93d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(word_before, &str_end, 10), 0ul);
94d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
951d02a8bcSMichael Jones   EXPECT_EQ(str_end - word_before, ptrdiff_t(0));
96d52f0aecSMichael Jones 
97d52f0aecSMichael Jones   const char *word_after = "10word";
98d52f0aecSMichael Jones   errno = 0;
99d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(word_after, &str_end, 10), 10ul);
100d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1011d02a8bcSMichael Jones   EXPECT_EQ(str_end - word_after, ptrdiff_t(2));
102d52f0aecSMichael Jones 
103d52f0aecSMichael Jones   const char *two_numbers = "10 999";
104d52f0aecSMichael Jones   errno = 0;
105d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(two_numbers, &str_end, 10), 10ul);
106d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1071d02a8bcSMichael Jones   EXPECT_EQ(str_end - two_numbers, ptrdiff_t(2));
108d52f0aecSMichael Jones 
109d52f0aecSMichael Jones   const char *two_signs = "--10 999";
110d52f0aecSMichael Jones   errno = 0;
111d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(two_signs, &str_end, 10), 0ul);
112d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
113*53804d4eSMichael Jones   EXPECT_EQ(str_end - two_signs, ptrdiff_t(0));
114d52f0aecSMichael Jones 
115d52f0aecSMichael Jones   const char *sign_before = "+2=4";
116d52f0aecSMichael Jones   errno = 0;
117d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(sign_before, &str_end, 10), 2ul);
118d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1191d02a8bcSMichael Jones   EXPECT_EQ(str_end - sign_before, ptrdiff_t(2));
120d52f0aecSMichael Jones 
121d52f0aecSMichael Jones   const char *sign_after = "2+2=4";
122d52f0aecSMichael Jones   errno = 0;
123d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(sign_after, &str_end, 10), 2ul);
124d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1251d02a8bcSMichael Jones   EXPECT_EQ(str_end - sign_after, ptrdiff_t(1));
126d52f0aecSMichael Jones 
127d52f0aecSMichael Jones   const char *tab_before = "\t10";
128d52f0aecSMichael Jones   errno = 0;
129d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(tab_before, &str_end, 10), 10ul);
130d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1311d02a8bcSMichael Jones   EXPECT_EQ(str_end - tab_before, ptrdiff_t(3));
132d52f0aecSMichael Jones 
133d52f0aecSMichael Jones   const char *all_together = "\t  -12345and+67890";
134d52f0aecSMichael Jones   errno = 0;
135d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(all_together, &str_end, 10), -(12345ul));
136d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
1371d02a8bcSMichael Jones   EXPECT_EQ(str_end - all_together, ptrdiff_t(9));
138*53804d4eSMichael Jones 
139*53804d4eSMichael Jones   const char *just_spaces = "  ";
140*53804d4eSMichael Jones   errno = 0;
141*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(just_spaces, &str_end, 10), 0ul);
142*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
143*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_spaces, ptrdiff_t(0));
144*53804d4eSMichael Jones 
145*53804d4eSMichael Jones   const char *just_space_and_sign = " +";
146*53804d4eSMichael Jones   errno = 0;
147*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(just_space_and_sign, &str_end, 10), 0ul);
148*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
149*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_space_and_sign, ptrdiff_t(0));
150d52f0aecSMichael Jones }
151d52f0aecSMichael Jones 
int_to_b36_char(int input)152d52f0aecSMichael Jones static char int_to_b36_char(int input) {
153d52f0aecSMichael Jones   if (input < 0 || input > 36)
154d52f0aecSMichael Jones     return '0';
155d52f0aecSMichael Jones   if (input < 10)
1564e1a164dSRoland McGrath     return static_cast<char>('0' + input);
1574e1a164dSRoland McGrath   return static_cast<char>('A' + input - 10);
158d52f0aecSMichael Jones }
159d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULTest,DecodeInOtherBases)160d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, DecodeInOtherBases) {
161d52f0aecSMichael Jones   char small_string[4] = {'\0', '\0', '\0', '\0'};
1624e1a164dSRoland McGrath   for (int base = 2; base <= 36; ++base) {
1634e1a164dSRoland McGrath     for (int first_digit = 0; first_digit <= 36; ++first_digit) {
164d52f0aecSMichael Jones       small_string[0] = int_to_b36_char(first_digit);
165d52f0aecSMichael Jones       if (first_digit < base) {
166d52f0aecSMichael Jones         errno = 0;
167d52f0aecSMichael Jones         ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
1684e1a164dSRoland McGrath                   static_cast<unsigned long int>(first_digit));
169d52f0aecSMichael Jones         ASSERT_EQ(errno, 0);
170d52f0aecSMichael Jones       } else {
171d52f0aecSMichael Jones         errno = 0;
172d52f0aecSMichael Jones         ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base), 0ul);
173d52f0aecSMichael Jones         ASSERT_EQ(errno, 0);
174d52f0aecSMichael Jones       }
175d52f0aecSMichael Jones     }
176d52f0aecSMichael Jones   }
177d52f0aecSMichael Jones 
1784e1a164dSRoland McGrath   for (int base = 2; base <= 36; ++base) {
1794e1a164dSRoland McGrath     for (int first_digit = 0; first_digit <= 36; ++first_digit) {
180d52f0aecSMichael Jones       small_string[0] = int_to_b36_char(first_digit);
1814e1a164dSRoland McGrath       for (int second_digit = 0; second_digit <= 36; ++second_digit) {
182d52f0aecSMichael Jones         small_string[1] = int_to_b36_char(second_digit);
183d52f0aecSMichael Jones         if (first_digit < base && second_digit < base) {
184d52f0aecSMichael Jones           errno = 0;
185d52f0aecSMichael Jones           ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
1864e1a164dSRoland McGrath                     static_cast<unsigned long int>(second_digit +
1874e1a164dSRoland McGrath                                                    (first_digit * base)));
188d52f0aecSMichael Jones           ASSERT_EQ(errno, 0);
189d52f0aecSMichael Jones         } else if (first_digit < base) {
190d52f0aecSMichael Jones           errno = 0;
191d52f0aecSMichael Jones           ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
1924e1a164dSRoland McGrath                     static_cast<unsigned long int>(first_digit));
193d52f0aecSMichael Jones           ASSERT_EQ(errno, 0);
194d52f0aecSMichael Jones         } else {
195d52f0aecSMichael Jones           errno = 0;
196d52f0aecSMichael Jones           ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base), 0ul);
197d52f0aecSMichael Jones           ASSERT_EQ(errno, 0);
198d52f0aecSMichael Jones         }
199d52f0aecSMichael Jones       }
200d52f0aecSMichael Jones     }
201d52f0aecSMichael Jones   }
202d52f0aecSMichael Jones 
2034e1a164dSRoland McGrath   for (int base = 2; base <= 36; ++base) {
2044e1a164dSRoland McGrath     for (int first_digit = 0; first_digit <= 36; ++first_digit) {
205d52f0aecSMichael Jones       small_string[0] = int_to_b36_char(first_digit);
2064e1a164dSRoland McGrath       for (int second_digit = 0; second_digit <= 36; ++second_digit) {
207d52f0aecSMichael Jones         small_string[1] = int_to_b36_char(second_digit);
2084e1a164dSRoland McGrath         for (int third_digit = 0; third_digit <= 36; ++third_digit) {
209d52f0aecSMichael Jones           small_string[2] = int_to_b36_char(third_digit);
210d52f0aecSMichael Jones 
211d52f0aecSMichael Jones           if (first_digit < base && second_digit < base && third_digit < base) {
212d52f0aecSMichael Jones             errno = 0;
213d52f0aecSMichael Jones             ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
2144e1a164dSRoland McGrath                       static_cast<unsigned long int>(
215d52f0aecSMichael Jones                           third_digit + (second_digit * base) +
2164e1a164dSRoland McGrath                           (first_digit * base * base)));
217d52f0aecSMichael Jones             ASSERT_EQ(errno, 0);
218d52f0aecSMichael Jones           } else if (first_digit < base && second_digit < base) {
219d52f0aecSMichael Jones             errno = 0;
220d52f0aecSMichael Jones             ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
2214e1a164dSRoland McGrath                       static_cast<unsigned long int>(second_digit +
2224e1a164dSRoland McGrath                                                      (first_digit * base)));
223d52f0aecSMichael Jones             ASSERT_EQ(errno, 0);
224d52f0aecSMichael Jones           } else if (first_digit < base) {
225d52f0aecSMichael Jones             // if the base is 16 there is a special case for the prefix 0X.
226d52f0aecSMichael Jones             // The number is treated as a one digit hexadecimal.
227d52f0aecSMichael Jones             if (base == 16 && first_digit == 0 && second_digit == 33) {
228d52f0aecSMichael Jones               if (third_digit < base) {
229d52f0aecSMichael Jones                 errno = 0;
230d52f0aecSMichael Jones                 ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
2314e1a164dSRoland McGrath                           static_cast<unsigned long int>(third_digit));
232d52f0aecSMichael Jones                 ASSERT_EQ(errno, 0);
233d52f0aecSMichael Jones               } else {
234d52f0aecSMichael Jones                 errno = 0;
235d52f0aecSMichael Jones                 ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
236d52f0aecSMichael Jones                           0ul);
237d52f0aecSMichael Jones                 ASSERT_EQ(errno, 0);
238d52f0aecSMichael Jones               }
239d52f0aecSMichael Jones             } else {
240d52f0aecSMichael Jones               errno = 0;
241d52f0aecSMichael Jones               ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
242225eb8a2SRoland McGrath                         static_cast<unsigned long int>(first_digit));
243d52f0aecSMichael Jones               ASSERT_EQ(errno, 0);
244d52f0aecSMichael Jones             }
245d52f0aecSMichael Jones           } else {
246d52f0aecSMichael Jones             errno = 0;
247d52f0aecSMichael Jones             ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base), 0ul);
248d52f0aecSMichael Jones             ASSERT_EQ(errno, 0);
249d52f0aecSMichael Jones           }
250d52f0aecSMichael Jones         }
251d52f0aecSMichael Jones       }
252d52f0aecSMichael Jones     }
253d52f0aecSMichael Jones   }
254d52f0aecSMichael Jones }
255d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULTest,CleanBaseSixteenDecode)256d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, CleanBaseSixteenDecode) {
257d52f0aecSMichael Jones   char *str_end = nullptr;
258d52f0aecSMichael Jones 
259d52f0aecSMichael Jones   const char *no_prefix = "123abc";
260d52f0aecSMichael Jones   errno = 0;
261d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(no_prefix, &str_end, 16), 0x123abcul);
262d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
2631d02a8bcSMichael Jones   EXPECT_EQ(str_end - no_prefix, ptrdiff_t(6));
264d52f0aecSMichael Jones 
265d52f0aecSMichael Jones   const char *yes_prefix = "0x456def";
266d52f0aecSMichael Jones   errno = 0;
267d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(yes_prefix, &str_end, 16), 0x456deful);
268d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
2691d02a8bcSMichael Jones   EXPECT_EQ(str_end - yes_prefix, ptrdiff_t(8));
27037ce7349SMichael Jones 
27137ce7349SMichael Jones   const char *letter_after_prefix = "0xabc123";
27237ce7349SMichael Jones   errno = 0;
27337ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(letter_after_prefix, &str_end, 16),
27437ce7349SMichael Jones             0xabc123ul);
27537ce7349SMichael Jones   ASSERT_EQ(errno, 0);
27637ce7349SMichael Jones   EXPECT_EQ(str_end - letter_after_prefix, ptrdiff_t(8));
27737ce7349SMichael Jones }
27837ce7349SMichael Jones 
TEST(LlvmLibcStrToULTest,MessyBaseSixteenDecode)27937ce7349SMichael Jones TEST(LlvmLibcStrToULTest, MessyBaseSixteenDecode) {
28037ce7349SMichael Jones   char *str_end = nullptr;
28137ce7349SMichael Jones 
28237ce7349SMichael Jones   const char *just_prefix = "0x";
28337ce7349SMichael Jones   errno = 0;
28437ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(just_prefix, &str_end, 16), 0ul);
28537ce7349SMichael Jones   ASSERT_EQ(errno, 0);
28637ce7349SMichael Jones   EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
28737ce7349SMichael Jones 
28837ce7349SMichael Jones   errno = 0;
28937ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(just_prefix, &str_end, 0), 0ul);
29037ce7349SMichael Jones   ASSERT_EQ(errno, 0);
29137ce7349SMichael Jones   EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
29237ce7349SMichael Jones 
29337ce7349SMichael Jones   const char *prefix_with_x_after = "0xx";
29437ce7349SMichael Jones   errno = 0;
29537ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(prefix_with_x_after, &str_end, 16), 0ul);
29637ce7349SMichael Jones   ASSERT_EQ(errno, 0);
29737ce7349SMichael Jones   EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
29837ce7349SMichael Jones 
29937ce7349SMichael Jones   errno = 0;
30037ce7349SMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(prefix_with_x_after, &str_end, 0), 0ul);
30137ce7349SMichael Jones   ASSERT_EQ(errno, 0);
30237ce7349SMichael Jones   EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
303d52f0aecSMichael Jones }
304d52f0aecSMichael Jones 
TEST(LlvmLibcStrToULTest,AutomaticBaseSelection)305d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, AutomaticBaseSelection) {
306d52f0aecSMichael Jones   char *str_end = nullptr;
307d52f0aecSMichael Jones 
308d52f0aecSMichael Jones   const char *base_ten = "12345";
309d52f0aecSMichael Jones   errno = 0;
310d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(base_ten, &str_end, 0), 12345ul);
311d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
3121d02a8bcSMichael Jones   EXPECT_EQ(str_end - base_ten, ptrdiff_t(5));
313d52f0aecSMichael Jones 
314d52f0aecSMichael Jones   const char *base_sixteen_no_prefix = "123abc";
315d52f0aecSMichael Jones   errno = 0;
316d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(base_sixteen_no_prefix, &str_end, 0), 123ul);
317d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
3181d02a8bcSMichael Jones   EXPECT_EQ(str_end - base_sixteen_no_prefix, ptrdiff_t(3));
319d52f0aecSMichael Jones 
320d52f0aecSMichael Jones   const char *base_sixteen_with_prefix = "0x456def";
321d52f0aecSMichael Jones   errno = 0;
322d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(base_sixteen_with_prefix, &str_end, 0),
323d52f0aecSMichael Jones             0x456deful);
324d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
3251d02a8bcSMichael Jones   EXPECT_EQ(str_end - base_sixteen_with_prefix, ptrdiff_t(8));
326d52f0aecSMichael Jones 
327d52f0aecSMichael Jones   const char *base_eight_with_prefix = "012345";
328d52f0aecSMichael Jones   errno = 0;
329d52f0aecSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(base_eight_with_prefix, &str_end, 0),
330d52f0aecSMichael Jones             012345ul);
331d52f0aecSMichael Jones   ASSERT_EQ(errno, 0);
3321d02a8bcSMichael Jones   EXPECT_EQ(str_end - base_eight_with_prefix, ptrdiff_t(6));
333*53804d4eSMichael Jones 
334*53804d4eSMichael Jones   const char *just_zero = "0";
335*53804d4eSMichael Jones   errno = 0;
336*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(just_zero, &str_end, 0), 0ul);
337*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
338*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_zero, ptrdiff_t(1));
339*53804d4eSMichael Jones 
340*53804d4eSMichael Jones   const char *just_zero_x = "0x";
341*53804d4eSMichael Jones   errno = 0;
342*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(just_zero_x, &str_end, 0), 0ul);
343*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
344*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_zero_x, ptrdiff_t(1));
345*53804d4eSMichael Jones 
346*53804d4eSMichael Jones   const char *just_zero_eight = "08";
347*53804d4eSMichael Jones   errno = 0;
348*53804d4eSMichael Jones   ASSERT_EQ(__llvm_libc::strtoul(just_zero_eight, &str_end, 0), 0ul);
349*53804d4eSMichael Jones   ASSERT_EQ(errno, 0);
350*53804d4eSMichael Jones   EXPECT_EQ(str_end - just_zero_eight, ptrdiff_t(1));
351d52f0aecSMichael Jones }
352