1//===-- Unittests for wcs_to_integer --------------------------------------===//
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/libc_errno.h"
10#include "src/__support/wcs_to_integer.h"
11#include <stddef.h>
12
13#include "test/UnitTest/Test.h"
14
15// This file is for testing the src_len argument and other internal interface
16// features. Primary testing is done through the public interface.
17
18TEST(LlvmLibcStrToIntegerTest, SimpleLength) {
19 auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"12345", 10, 10);
20 EXPECT_FALSE(result.has_error());
21 EXPECT_EQ(result.parsed_len, ptrdiff_t(5));
22 ASSERT_EQ(result.value, 12345);
23
24 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"12345", 10, 2);
25 EXPECT_FALSE(result.has_error());
26 EXPECT_EQ(result.parsed_len, ptrdiff_t(2));
27 ASSERT_EQ(result.value, 12);
28
29 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"12345", 10, 0);
30 EXPECT_FALSE(result.has_error());
31 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
32 ASSERT_EQ(result.value, 0);
33}
34
35TEST(LlvmLibcStrToIntegerTest, LeadingSpaces) {
36 auto result =
37 LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 15);
38 EXPECT_FALSE(result.has_error());
39 EXPECT_EQ(result.parsed_len, ptrdiff_t(10));
40 ASSERT_EQ(result.value, 12345);
41
42 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 10);
43 EXPECT_FALSE(result.has_error());
44 EXPECT_EQ(result.parsed_len, ptrdiff_t(10));
45 ASSERT_EQ(result.value, 12345);
46
47 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 7);
48 EXPECT_FALSE(result.has_error());
49 EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
50 ASSERT_EQ(result.value, 12);
51
52 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 5);
53 EXPECT_FALSE(result.has_error());
54 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
55 ASSERT_EQ(result.value, 0);
56
57 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 0);
58 EXPECT_FALSE(result.has_error());
59 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
60 ASSERT_EQ(result.value, 0);
61}
62
63TEST(LlvmLibcStrToIntegerTest, LeadingSign) {
64 auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 10);
65 EXPECT_FALSE(result.has_error());
66 EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
67 ASSERT_EQ(result.value, 12345);
68
69 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 10);
70 EXPECT_FALSE(result.has_error());
71 EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
72 ASSERT_EQ(result.value, -12345);
73
74 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 6);
75 EXPECT_FALSE(result.has_error());
76 EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
77 ASSERT_EQ(result.value, 12345);
78
79 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 6);
80 EXPECT_FALSE(result.has_error());
81 EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
82 ASSERT_EQ(result.value, -12345);
83
84 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 3);
85 EXPECT_FALSE(result.has_error());
86 EXPECT_EQ(result.parsed_len, ptrdiff_t(3));
87 ASSERT_EQ(result.value, 12);
88
89 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 3);
90 EXPECT_FALSE(result.has_error());
91 EXPECT_EQ(result.parsed_len, ptrdiff_t(3));
92 ASSERT_EQ(result.value, -12);
93
94 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 1);
95 EXPECT_FALSE(result.has_error());
96 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
97 ASSERT_EQ(result.value, 0);
98
99 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 1);
100 EXPECT_FALSE(result.has_error());
101 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
102 ASSERT_EQ(result.value, 0);
103
104 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 0);
105 EXPECT_FALSE(result.has_error());
106 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
107 ASSERT_EQ(result.value, 0);
108
109 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 0);
110 EXPECT_FALSE(result.has_error());
111 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
112 ASSERT_EQ(result.value, 0);
113}
114
115TEST(LlvmLibcStrToIntegerTest, Base16PrefixAutoSelect) {
116 auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 10);
117 EXPECT_FALSE(result.has_error());
118 EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
119 ASSERT_EQ(result.value, 0x12345);
120
121 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 7);
122 EXPECT_FALSE(result.has_error());
123 EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
124 ASSERT_EQ(result.value, 0x12345);
125
126 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 5);
127 EXPECT_FALSE(result.has_error());
128 EXPECT_EQ(result.parsed_len, ptrdiff_t(5));
129 ASSERT_EQ(result.value, 0x123);
130
131 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 2);
132 EXPECT_FALSE(result.has_error());
133 EXPECT_EQ(result.parsed_len, ptrdiff_t(1));
134 ASSERT_EQ(result.value, 0);
135
136 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 0);
137 EXPECT_FALSE(result.has_error());
138 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
139 ASSERT_EQ(result.value, 0);
140}
141
142TEST(LlvmLibcStrToIntegerTest, Base16PrefixManualSelect) {
143 auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 10);
144 EXPECT_FALSE(result.has_error());
145 EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
146 ASSERT_EQ(result.value, 0x12345);
147
148 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 7);
149 EXPECT_FALSE(result.has_error());
150 EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
151 ASSERT_EQ(result.value, 0x12345);
152
153 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 5);
154 EXPECT_FALSE(result.has_error());
155 EXPECT_EQ(result.parsed_len, ptrdiff_t(5));
156 ASSERT_EQ(result.value, 0x123);
157
158 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 2);
159 EXPECT_FALSE(result.has_error());
160 EXPECT_EQ(result.parsed_len, ptrdiff_t(1));
161 ASSERT_EQ(result.value, 0);
162
163 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 0);
164 EXPECT_FALSE(result.has_error());
165 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
166 ASSERT_EQ(result.value, 0);
167}
168
169TEST(LlvmLibcStrToIntegerTest, Base8PrefixAutoSelect) {
170 auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 10);
171 EXPECT_FALSE(result.has_error());
172 EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
173 ASSERT_EQ(result.value, 012345);
174
175 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 6);
176 EXPECT_FALSE(result.has_error());
177 EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
178 ASSERT_EQ(result.value, 012345);
179
180 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 4);
181 EXPECT_FALSE(result.has_error());
182 EXPECT_EQ(result.parsed_len, ptrdiff_t(4));
183 ASSERT_EQ(result.value, 0123);
184
185 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 1);
186 EXPECT_FALSE(result.has_error());
187 EXPECT_EQ(result.parsed_len, ptrdiff_t(1));
188 ASSERT_EQ(result.value, 0);
189
190 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 0);
191 EXPECT_FALSE(result.has_error());
192 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
193 ASSERT_EQ(result.value, 0);
194}
195
196TEST(LlvmLibcStrToIntegerTest, Base8PrefixManualSelect) {
197 auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 10);
198 EXPECT_FALSE(result.has_error());
199 EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
200 ASSERT_EQ(result.value, 012345);
201
202 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 6);
203 EXPECT_FALSE(result.has_error());
204 EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
205 ASSERT_EQ(result.value, 012345);
206
207 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 4);
208 EXPECT_FALSE(result.has_error());
209 EXPECT_EQ(result.parsed_len, ptrdiff_t(4));
210 ASSERT_EQ(result.value, 0123);
211
212 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 1);
213 EXPECT_FALSE(result.has_error());
214 EXPECT_EQ(result.parsed_len, ptrdiff_t(1));
215 ASSERT_EQ(result.value, 0);
216
217 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 0);
218 EXPECT_FALSE(result.has_error());
219 EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
220 ASSERT_EQ(result.value, 0);
221}
222
223TEST(LlvmLibcStrToIntegerTest, CombinedTests) {
224 auto result =
225 LIBC_NAMESPACE::internal::wcstointeger<int>(L" -0x123", 0, 10);
226 EXPECT_FALSE(result.has_error());
227 EXPECT_EQ(result.parsed_len, ptrdiff_t(10));
228 ASSERT_EQ(result.value, -0x123);
229
230 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" -0x123", 0, 8);
231 EXPECT_FALSE(result.has_error());
232 EXPECT_EQ(result.parsed_len, ptrdiff_t(8));
233 ASSERT_EQ(result.value, -0x1);
234
235 result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" -0x123", 0, 7);
236 EXPECT_FALSE(result.has_error());
237 EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
238 ASSERT_EQ(result.value, 0);
239}
240

source code of libc/test/src/__support/wcs_to_integer_test.cpp