SimpleKernel 1.17.0
Loading...
Searching...
No Matches
sk_libc_test.cpp
Go to the documentation of this file.
1
5#include <gtest/gtest.h>
6
7// Rename functions to avoid conflict with standard library
8#define atof sk_atof
9#define atoi sk_atoi
10#define atol sk_atol
11#define atoll sk_atoll
12#define strtod sk_strtod
13#define strtof sk_strtof
14#define strtold sk_strtold
15#define strtol sk_strtol
16#define strtoll sk_strtoll
17#define strtoul sk_strtoul
18#define strtoull sk_strtoull
19
20#include "../../src/libc/sk_stdlib.c"
21
22TEST(SkLibcTest, Atoi) {
23 EXPECT_EQ(sk_atoi("123"), 123);
24 EXPECT_EQ(sk_atoi("-123"), -123);
25 EXPECT_EQ(sk_atoi("+123"), 123);
26 EXPECT_EQ(sk_atoi("0"), 0);
27 EXPECT_EQ(sk_atoi(" 456"), 456); // Leading spaces
28 EXPECT_EQ(sk_atoi("789abc"), 789); // Stop at non-digit
29}
30
31TEST(SkLibcTest, Atol) {
32 EXPECT_EQ(sk_atol("123456789"), 123456789L);
33 EXPECT_EQ(sk_atol("-123456789"), -123456789L);
34}
35
36TEST(SkLibcTest, Atoll) {
37 EXPECT_EQ(sk_atoll("123456789012345"), 123456789012345LL);
38 EXPECT_EQ(sk_atoll("-123456789012345"), -123456789012345LL);
39}
40
41TEST(SkLibcTest, Atof) {
42 EXPECT_DOUBLE_EQ(sk_atof("3.14"), 3.14);
43 EXPECT_DOUBLE_EQ(sk_atof("-2.5"), -2.5);
44 EXPECT_DOUBLE_EQ(sk_atof("0.0"), 0.0);
45 EXPECT_DOUBLE_EQ(sk_atof("123.456"), 123.456);
46}
47
48TEST(SkLibcTest, Strtol) {
49 char* end;
50 EXPECT_EQ(sk_strtol("123", &end, 10), 123L);
51 EXPECT_EQ(*end, '\0');
52
53 EXPECT_EQ(sk_strtol("-123", &end, 10), -123L);
54 EXPECT_EQ(sk_strtol(" 100", &end, 10), 100L);
55 EXPECT_EQ(*end, '\0');
56
57 // Base 16
58 EXPECT_EQ(sk_strtol("0xABC", &end, 16), 2748L);
59 EXPECT_EQ(*end, '\0');
60 EXPECT_EQ(sk_strtol("-0xabc", &end, 16), -2748L);
61
62 // Auto detect base
63 EXPECT_EQ(sk_strtol("0x10", &end, 0), 16L);
64 EXPECT_EQ(sk_strtol("010", &end, 0), 8L);
65 EXPECT_EQ(sk_strtol("10", &end, 0), 10L);
66
67 // Stop at invalid
68 EXPECT_EQ(sk_strtol("123xyz", &end, 10), 123L);
69 EXPECT_EQ(*end, 'x');
70}
71
72TEST(SkLibcTest, Strtoul) {
73 char* end;
74 EXPECT_EQ(sk_strtoul("123", &end, 10), 123UL);
75 EXPECT_EQ(sk_strtoul("0xFF", &end, 16), 255UL);
76 EXPECT_EQ(sk_strtoul("11", &end, 2), 3UL);
77}
78
79TEST(SkLibcTest, Strtoll) {
80 char* end;
81 // min for 64bit signed
82 // -9223372036854775808
83 EXPECT_EQ(sk_strtoll("-9223372036854775808", &end, 10),
84 -9223372036854775807LL - 1);
85}
86
87TEST(SkLibcTest, Strtoull) {
88 char* end;
89 // max for 64bit unsigned
90 // 18446744073709551615
91 EXPECT_EQ(sk_strtoull("18446744073709551615", &end, 10),
92 18446744073709551615ULL);
93}
94
95TEST(SkLibcTest, Strtod) {
96 char* end;
97 EXPECT_DOUBLE_EQ(sk_strtod("3.14159", &end), 3.14159);
98 EXPECT_EQ(*end, '\0');
99 EXPECT_DOUBLE_EQ(sk_strtod(" -123.456abc", &end), -123.456);
100 EXPECT_EQ(*end, 'a');
101}
102
103TEST(SkLibcTest, Strtof) {
104 char* end;
105 EXPECT_FLOAT_EQ(sk_strtof("3.14", &end), 3.14f);
106}
107
108// 边界条件测试
109TEST(SkLibcTest, AtoiEdgeCases) {
110 // 空格和前导零
111 EXPECT_EQ(sk_atoi(" 000123"), 123);
112
113 // 最大/最小值(在 int 范围内)
114 EXPECT_EQ(sk_atoi("2147483647"), 2147483647);
115 EXPECT_EQ(sk_atoi("-2147483648"), -2147483648);
116
117 // 无效输入
118 EXPECT_EQ(sk_atoi("abc"), 0);
119 EXPECT_EQ(sk_atoi(""), 0);
120}
121
122TEST(SkLibcTest, AtolEdgeCases) {
123 // 长整型范围
124 EXPECT_EQ(sk_atol("9223372036854775807"), 9223372036854775807L);
125 EXPECT_EQ(sk_atol("-9223372036854775808"), -9223372036854775807L - 1);
126}
127
128TEST(SkLibcTest, AtofEdgeCases) {
129 // 科学计数法(如果支持)
130 EXPECT_DOUBLE_EQ(sk_atof("1e2"), 100.0);
131 EXPECT_DOUBLE_EQ(sk_atof("1.5e-2"), 0.015);
132
133 // 零
134 EXPECT_DOUBLE_EQ(sk_atof("0.0"), 0.0);
135 EXPECT_DOUBLE_EQ(sk_atof("-0.0"), -0.0);
136
137 // 小数点
138 EXPECT_DOUBLE_EQ(sk_atof(".5"), 0.5);
139 EXPECT_DOUBLE_EQ(sk_atof("5."), 5.0);
140}
141
142TEST(SkLibcTest, StrtolEdgeCases) {
143 char* end;
144
145 // 空字符串
146 EXPECT_EQ(sk_strtol("", &end, 10), 0L);
147
148 // 只有符号
149 EXPECT_EQ(sk_strtol("+", &end, 10), 0L);
150 EXPECT_EQ(sk_strtol("-", &end, 10), 0L);
151
152 // 二进制数字(注意:标准 strtol 不识别 "0b" 前缀)
153 EXPECT_EQ(sk_strtol("1010", &end, 2), 10L);
154 EXPECT_EQ(sk_strtol("11111111", &end, 2), 255L);
155
156 // 负的十六进制
157 EXPECT_EQ(sk_strtol("-0xFF", &end, 16), -255L);
158}
159
160TEST(SkLibcTest, StrtoulEdgeCases) {
161 char* end;
162
163 // 最大无符号值
164 EXPECT_EQ(sk_strtoul("4294967295", &end, 10), 4294967295UL);
165
166 // 八进制
167 EXPECT_EQ(sk_strtoul("0777", &end, 8), 511UL);
168
169 // 二进制
170 EXPECT_EQ(sk_strtoul("1111", &end, 2), 15UL);
171}
172
173TEST(SkLibcTest, StrtollEdgeCases) {
174 char* end;
175
176 // 零
177 EXPECT_EQ(sk_strtoll("0", &end, 10), 0LL);
178
179 // 负的最大值
180 EXPECT_EQ(sk_strtoll("-9223372036854775807", &end, 10),
181 -9223372036854775807LL);
182}
183
184TEST(SkLibcTest, StrtoullEdgeCases) {
185 char* end;
186
187 // 零
188 EXPECT_EQ(sk_strtoull("0", &end, 10), 0ULL);
189
190 // 十六进制最大值
191 EXPECT_EQ(sk_strtoull("FFFFFFFFFFFFFFFF", &end, 16), 18446744073709551615ULL);
192}
193
194TEST(SkLibcTest, StrtodEdgeCases) {
195 char* end;
196
197 // 无穷大(如果支持)
198 // EXPECT_TRUE(std::isinf(sk_strtod("inf", &end)));
199
200 // 非常小的数
201 EXPECT_DOUBLE_EQ(sk_strtod("0.000001", &end), 0.000001);
202
203 // 非常大的数
204 EXPECT_DOUBLE_EQ(sk_strtod("123456789.0", &end), 123456789.0);
205}
206
207TEST(SkLibcTest, StrtofEdgeCases) {
208 char* end;
209
210 // 零
211 EXPECT_FLOAT_EQ(sk_strtof("0.0", &end), 0.0f);
212
213 // 负数
214 EXPECT_FLOAT_EQ(sk_strtof("-1.5", &end), -1.5f);
215}
216
217TEST(SkLibcTest, BaseDetection) {
218 char* end;
219
220 // Base 0 应该自动检测
221 EXPECT_EQ(sk_strtol("0x10", &end, 0), 16L);
222 EXPECT_EQ(sk_strtol("010", &end, 0), 8L);
223 EXPECT_EQ(sk_strtol("10", &end, 0), 10L);
224}
225
226TEST(SkLibcTest, WhitespaceHandling) {
227 // 测试各种空白字符
228 EXPECT_EQ(sk_atoi(" \t\n\r123"), 123);
229 EXPECT_EQ(sk_atoi("\t\t\t456"), 456);
230}
231
232TEST(SkLibcTest, SignHandling) {
233 // 测试符号处理
234 EXPECT_EQ(sk_atoi("+123"), 123);
235 EXPECT_EQ(sk_atoi("-123"), -123);
236 EXPECT_EQ(sk_atoi("++123"), 0); // 双符号应该无效
237 EXPECT_EQ(sk_atoi("--123"), 0);
238}
239
240TEST(SkLibcTest, PartialConversion) {
241 char* end;
242
243 // 部分转换
244 EXPECT_EQ(sk_strtol("123abc", &end, 10), 123L);
245 EXPECT_STREQ(end, "abc");
246
247 EXPECT_EQ(sk_strtol("0xFFGG", &end, 16), 255L);
248 EXPECT_STREQ(end, "GG");
249}
void * end[]
内核结束
TEST(SkLibcTest, Atoi)
#define EXPECT_EQ(val1, val2, msg)