1d52f0aecSMichael Jones //===-- Unittests for strtol ---------------------------------------------===//
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/strtol.h"
10d52f0aecSMichael Jones
11d52f0aecSMichael Jones #include "utils/UnitTest/Test.h"
12d52f0aecSMichael Jones
13d52f0aecSMichael Jones #include <errno.h>
14d52f0aecSMichael Jones #include <limits.h>
151d02a8bcSMichael Jones #include <stddef.h>
16d52f0aecSMichael Jones
TEST(LlvmLibcStrToLTest,InvalidBase)17d52f0aecSMichael Jones TEST(LlvmLibcStrToLTest, InvalidBase) {
18d52f0aecSMichael Jones const char *ten = "10";
19d52f0aecSMichael Jones errno = 0;
20d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(ten, nullptr, -1), 0l);
21d52f0aecSMichael Jones ASSERT_EQ(errno, EINVAL);
22d52f0aecSMichael Jones }
23d52f0aecSMichael Jones
TEST(LlvmLibcStrToLTest,CleanBaseTenDecode)24d52f0aecSMichael Jones TEST(LlvmLibcStrToLTest, 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::strtol(ten, &str_end, 10), 10l);
30d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
311d02a8bcSMichael Jones EXPECT_EQ(str_end - ten, ptrdiff_t(2));
321d02a8bcSMichael Jones
33d52f0aecSMichael Jones errno = 0;
34d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(ten, nullptr, 10), 10l);
35d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
36d52f0aecSMichael Jones
37d52f0aecSMichael Jones const char *hundred = "100";
38d52f0aecSMichael Jones errno = 0;
39d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(hundred, &str_end, 10), 100l);
40d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
411d02a8bcSMichael Jones EXPECT_EQ(str_end - hundred, ptrdiff_t(3));
42d52f0aecSMichael Jones
43d52f0aecSMichael Jones const char *negative = "-100";
44d52f0aecSMichael Jones errno = 0;
45d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(negative, &str_end, 10), -100l);
46d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
471d02a8bcSMichael Jones EXPECT_EQ(str_end - negative, ptrdiff_t(4));
48d52f0aecSMichael Jones
496bbfd6a9SMichael Jones const char *big_number = "1234567890";
50d52f0aecSMichael Jones errno = 0;
516bbfd6a9SMichael Jones ASSERT_EQ(__llvm_libc::strtol(big_number, &str_end, 10), 1234567890l);
52d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
536bbfd6a9SMichael Jones EXPECT_EQ(str_end - big_number, ptrdiff_t(10));
54d52f0aecSMichael Jones
556bbfd6a9SMichael Jones const char *big_negative_number = "-1234567890";
56d52f0aecSMichael Jones errno = 0;
57d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(big_negative_number, &str_end, 10),
586bbfd6a9SMichael Jones -1234567890l);
59d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
606bbfd6a9SMichael Jones EXPECT_EQ(str_end - big_negative_number, ptrdiff_t(11));
61d52f0aecSMichael Jones
62d52f0aecSMichael Jones const char *too_big_number = "123456789012345678901";
63d52f0aecSMichael Jones errno = 0;
64d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(too_big_number, &str_end, 10), LONG_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::strtol(too_big_negative_number, &str_end, 10),
71d52f0aecSMichael Jones LONG_MIN);
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::strtol(long_number_range_test, &str_end, 10),
79d52f0aecSMichael Jones LONG_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(LlvmLibcStrToLTest,MessyBaseTenDecode)84d52f0aecSMichael Jones TEST(LlvmLibcStrToLTest, 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::strtol(spaces_before, &str_end, 10), 10l);
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::strtol(spaces_after, &str_end, 10), 10l);
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::strtol(word_before, &str_end, 10), 0l);
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::strtol(word_after, &str_end, 10), 10l);
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::strtol(two_numbers, &str_end, 10), 10l);
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::strtol(two_signs, &str_end, 10), 0l);
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::strtol(sign_before, &str_end, 10), 2l);
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::strtol(sign_after, &str_end, 10), 2l);
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::strtol(tab_before, &str_end, 10), 10l);
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::strtol(all_together, &str_end, 10), -12345l);
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::strtol(just_spaces, &str_end, 10), 0l);
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::strtol(just_space_and_sign, &str_end, 10), 0l);
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(LlvmLibcStrToLTest,DecodeInOtherBases)168d52f0aecSMichael Jones TEST(LlvmLibcStrToLTest, 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::strtol(small_string, nullptr, base),
1764e1a164dSRoland McGrath static_cast<long int>(first_digit));
177d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
178d52f0aecSMichael Jones } else {
179d52f0aecSMichael Jones errno = 0;
180d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(small_string, nullptr, base), 0l);
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::strtol(small_string, nullptr, base),
1944e1a164dSRoland McGrath static_cast<long int>(second_digit + (first_digit * base)));
195d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
196d52f0aecSMichael Jones } else if (first_digit < base) {
197d52f0aecSMichael Jones errno = 0;
198d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(small_string, nullptr, base),
1994e1a164dSRoland McGrath static_cast<long int>(first_digit));
200d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
201d52f0aecSMichael Jones } else {
202d52f0aecSMichael Jones errno = 0;
203d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(small_string, nullptr, base), 0l);
204d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
205d52f0aecSMichael Jones }
206d52f0aecSMichael Jones }
207d52f0aecSMichael Jones }
208d52f0aecSMichael Jones }
209d52f0aecSMichael Jones
2104e1a164dSRoland McGrath for (int base = 2; base <= 36; ++base) {
2114e1a164dSRoland McGrath for (int first_digit = 0; first_digit <= 36; ++first_digit) {
212d52f0aecSMichael Jones small_string[0] = int_to_b36_char(first_digit);
2134e1a164dSRoland McGrath for (int second_digit = 0; second_digit <= 36; ++second_digit) {
214d52f0aecSMichael Jones small_string[1] = int_to_b36_char(second_digit);
2154e1a164dSRoland McGrath for (int third_digit = 0; third_digit <= 36; ++third_digit) {
216d52f0aecSMichael Jones small_string[2] = int_to_b36_char(third_digit);
217d52f0aecSMichael Jones
218d52f0aecSMichael Jones if (first_digit < base && second_digit < base && third_digit < base) {
219d52f0aecSMichael Jones errno = 0;
220d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(small_string, nullptr, base),
2214e1a164dSRoland McGrath static_cast<long int>(third_digit +
2224e1a164dSRoland McGrath (second_digit * base) +
2234e1a164dSRoland McGrath (first_digit * base * base)));
224d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
225d52f0aecSMichael Jones } else if (first_digit < base && second_digit < base) {
226d52f0aecSMichael Jones errno = 0;
2274e1a164dSRoland McGrath ASSERT_EQ(
2284e1a164dSRoland McGrath __llvm_libc::strtol(small_string, nullptr, base),
2294e1a164dSRoland McGrath static_cast<long int>(second_digit + (first_digit * base)));
230d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
231d52f0aecSMichael Jones } else if (first_digit < base) {
232d52f0aecSMichael Jones // if the base is 16 there is a special case for the prefix 0X.
233d52f0aecSMichael Jones // The number is treated as a one digit hexadecimal.
234d52f0aecSMichael Jones if (base == 16 && first_digit == 0 && second_digit == 33) {
235d52f0aecSMichael Jones if (third_digit < base) {
236d52f0aecSMichael Jones errno = 0;
237d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(small_string, nullptr, base),
2384e1a164dSRoland McGrath static_cast<long int>(third_digit));
239d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
240d52f0aecSMichael Jones } else {
241d52f0aecSMichael Jones errno = 0;
242d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(small_string, nullptr, base), 0l);
243d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
244d52f0aecSMichael Jones }
245d52f0aecSMichael Jones } else {
246d52f0aecSMichael Jones errno = 0;
247d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(small_string, nullptr, base),
2484e1a164dSRoland McGrath static_cast<long int>(first_digit));
249d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
250d52f0aecSMichael Jones }
251d52f0aecSMichael Jones } else {
252d52f0aecSMichael Jones errno = 0;
253d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(small_string, nullptr, base), 0l);
254d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
255d52f0aecSMichael Jones }
256d52f0aecSMichael Jones }
257d52f0aecSMichael Jones }
258d52f0aecSMichael Jones }
259d52f0aecSMichael Jones }
260d52f0aecSMichael Jones }
261d52f0aecSMichael Jones
TEST(LlvmLibcStrToLTest,CleanBaseSixteenDecode)262d52f0aecSMichael Jones TEST(LlvmLibcStrToLTest, CleanBaseSixteenDecode) {
263d52f0aecSMichael Jones char *str_end = nullptr;
264d52f0aecSMichael Jones
265d52f0aecSMichael Jones const char *no_prefix = "123abc";
266d52f0aecSMichael Jones errno = 0;
267d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(no_prefix, &str_end, 16), 0x123abcl);
268d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
2691d02a8bcSMichael Jones EXPECT_EQ(str_end - no_prefix, ptrdiff_t(6));
270d52f0aecSMichael Jones
271d52f0aecSMichael Jones const char *yes_prefix = "0x456def";
272d52f0aecSMichael Jones errno = 0;
273d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(yes_prefix, &str_end, 16), 0x456defl);
274d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
2751d02a8bcSMichael Jones EXPECT_EQ(str_end - yes_prefix, ptrdiff_t(8));
27637ce7349SMichael Jones
27737ce7349SMichael Jones const char *letter_after_prefix = "0xabc123";
27837ce7349SMichael Jones errno = 0;
27937ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtol(letter_after_prefix, &str_end, 16), 0xabc123l);
28037ce7349SMichael Jones ASSERT_EQ(errno, 0);
28137ce7349SMichael Jones EXPECT_EQ(str_end - letter_after_prefix, ptrdiff_t(8));
28237ce7349SMichael Jones }
28337ce7349SMichael Jones
TEST(LlvmLibcStrToLTest,MessyBaseSixteenDecode)28437ce7349SMichael Jones TEST(LlvmLibcStrToLTest, MessyBaseSixteenDecode) {
28537ce7349SMichael Jones char *str_end = nullptr;
28637ce7349SMichael Jones
28737ce7349SMichael Jones const char *just_prefix = "0x";
28837ce7349SMichael Jones errno = 0;
28937ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtol(just_prefix, &str_end, 16), 0l);
29037ce7349SMichael Jones ASSERT_EQ(errno, 0);
29137ce7349SMichael Jones EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
29237ce7349SMichael Jones
29337ce7349SMichael Jones errno = 0;
29437ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtol(just_prefix, &str_end, 0), 0l);
29537ce7349SMichael Jones ASSERT_EQ(errno, 0);
29637ce7349SMichael Jones EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
29737ce7349SMichael Jones
29837ce7349SMichael Jones const char *prefix_with_x_after = "0xx";
29937ce7349SMichael Jones errno = 0;
30037ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtol(prefix_with_x_after, &str_end, 16), 0l);
30137ce7349SMichael Jones ASSERT_EQ(errno, 0);
30237ce7349SMichael Jones EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
30337ce7349SMichael Jones
30437ce7349SMichael Jones errno = 0;
30537ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtol(prefix_with_x_after, &str_end, 0), 0l);
30637ce7349SMichael Jones ASSERT_EQ(errno, 0);
30737ce7349SMichael Jones EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
308d52f0aecSMichael Jones }
309d52f0aecSMichael Jones
TEST(LlvmLibcStrToLTest,AutomaticBaseSelection)310d52f0aecSMichael Jones TEST(LlvmLibcStrToLTest, AutomaticBaseSelection) {
311d52f0aecSMichael Jones char *str_end = nullptr;
312d52f0aecSMichael Jones
313d52f0aecSMichael Jones const char *base_ten = "12345";
314d52f0aecSMichael Jones errno = 0;
315d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(base_ten, &str_end, 0), 12345l);
316d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
3171d02a8bcSMichael Jones EXPECT_EQ(str_end - base_ten, ptrdiff_t(5));
318d52f0aecSMichael Jones
319d52f0aecSMichael Jones const char *base_sixteen_no_prefix = "123abc";
320d52f0aecSMichael Jones errno = 0;
321d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(base_sixteen_no_prefix, &str_end, 0), 123l);
322d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
3231d02a8bcSMichael Jones EXPECT_EQ(str_end - base_sixteen_no_prefix, ptrdiff_t(3));
324d52f0aecSMichael Jones
325d52f0aecSMichael Jones const char *base_sixteen_with_prefix = "0x456def";
326d52f0aecSMichael Jones errno = 0;
327d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(base_sixteen_with_prefix, &str_end, 0),
328d52f0aecSMichael Jones 0x456defl);
329d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
3301d02a8bcSMichael Jones EXPECT_EQ(str_end - base_sixteen_with_prefix, ptrdiff_t(8));
331d52f0aecSMichael Jones
332d52f0aecSMichael Jones const char *base_eight_with_prefix = "012345";
333d52f0aecSMichael Jones errno = 0;
334d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtol(base_eight_with_prefix, &str_end, 0), 012345l);
335d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
3361d02a8bcSMichael Jones EXPECT_EQ(str_end - base_eight_with_prefix, ptrdiff_t(6));
337*53804d4eSMichael Jones
338*53804d4eSMichael Jones const char *just_zero = "0";
339*53804d4eSMichael Jones errno = 0;
340*53804d4eSMichael Jones ASSERT_EQ(__llvm_libc::strtol(just_zero, &str_end, 0), 0l);
341*53804d4eSMichael Jones ASSERT_EQ(errno, 0);
342*53804d4eSMichael Jones EXPECT_EQ(str_end - just_zero, ptrdiff_t(1));
343*53804d4eSMichael Jones
344*53804d4eSMichael Jones const char *just_zero_x = "0x";
345*53804d4eSMichael Jones errno = 0;
346*53804d4eSMichael Jones ASSERT_EQ(__llvm_libc::strtol(just_zero_x, &str_end, 0), 0l);
347*53804d4eSMichael Jones ASSERT_EQ(errno, 0);
348*53804d4eSMichael Jones EXPECT_EQ(str_end - just_zero_x, ptrdiff_t(1));
349*53804d4eSMichael Jones
350*53804d4eSMichael Jones const char *just_zero_eight = "08";
351*53804d4eSMichael Jones errno = 0;
352*53804d4eSMichael Jones ASSERT_EQ(__llvm_libc::strtol(just_zero_eight, &str_end, 0), 0l);
353*53804d4eSMichael Jones ASSERT_EQ(errno, 0);
354*53804d4eSMichael Jones EXPECT_EQ(str_end - just_zero_eight, ptrdiff_t(1));
355d52f0aecSMichael Jones }
356