SimpleKernel 1.17.0
Loading...
Searching...
No Matches
sk_string_test.cpp File Reference
#include <gtest/gtest.h>
#include "../../src/libc/sk_string.c"
Include dependency graph for sk_string_test.cpp:

Go to the source code of this file.

Macros

#define memcpy   sk_memcpy
 
#define memmove   sk_memmove
 
#define memset   sk_memset
 
#define memcmp   sk_memcmp
 
#define memchr   sk_memchr
 
#define strcpy   strcpy
 
#define strncpy   sk_strncpy
 
#define strcat   sk_strcat
 
#define strcmp   sk_strcmp
 
#define strncmp   sk_strncmp
 
#define strlen   sk_strlen
 
#define strnlen   sk_strnlen
 
#define strchr   sk_strchr
 
#define strrchr   sk_strrchr
 

Functions

 TEST (SkStringTest, Memcpy)
 
 TEST (SkStringTest, Memmove)
 
 TEST (SkStringTest, Memset)
 
 TEST (SkStringTest, Memcmp)
 
 TEST (SkStringTest, Memchr)
 
 TEST (SkStringTest, Strcpy)
 
 TEST (SkStringTest, Strncpy)
 
 TEST (SkStringTest, Strcat)
 
 TEST (SkStringTest, Strcmp)
 
 TEST (SkStringTest, Strncmp)
 
 TEST (SkStringTest, Strlen)
 
 TEST (SkStringTest, Strnlen)
 
 TEST (SkStringTest, Strchr)
 
 TEST (SkStringTest, Strrchr)
 
 TEST (SkStringTest, MemcpyEdgeCases)
 
 TEST (SkStringTest, MemsetEdgeCases)
 
 TEST (SkStringTest, StrcmpEdgeCases)
 
 TEST (SkStringTest, StrlenEdgeCases)
 
 TEST (SkStringTest, StrnlenEdgeCases)
 
 TEST (SkStringTest, StrchrEdgeCases)
 
 TEST (SkStringTest, StrrchrEdgeCases)
 
 TEST (SkStringTest, MemmoveOverlapForward)
 
 TEST (SkStringTest, MemmoveOverlapBackward)
 
 TEST (SkStringTest, MemmoveNoOverlap)
 
 TEST (SkStringTest, MemchrNotFound)
 
 TEST (SkStringTest, MemcmpEqual)
 
 TEST (SkStringTest, MemcmpDifferentLengths)
 
 TEST (SkStringTest, StrcatMultiple)
 
 TEST (SkStringTest, StrncpyPadding)
 

Macro Definition Documentation

◆ memchr

#define memchr   sk_memchr

Definition at line 12 of file sk_string_test.cpp.

◆ memcmp

#define memcmp   sk_memcmp

Definition at line 11 of file sk_string_test.cpp.

◆ memcpy

#define memcpy   sk_memcpy

Definition at line 8 of file sk_string_test.cpp.

◆ memmove

#define memmove   sk_memmove

Definition at line 9 of file sk_string_test.cpp.

◆ memset

#define memset   sk_memset

Definition at line 10 of file sk_string_test.cpp.

◆ strcat

#define strcat   sk_strcat

Definition at line 15 of file sk_string_test.cpp.

◆ strchr

#define strchr   sk_strchr

Definition at line 20 of file sk_string_test.cpp.

◆ strcmp

#define strcmp   sk_strcmp

Definition at line 16 of file sk_string_test.cpp.

◆ strcpy

#define strcpy   strcpy

Definition at line 13 of file sk_string_test.cpp.

◆ strlen

#define strlen   sk_strlen

Definition at line 18 of file sk_string_test.cpp.

◆ strncmp

#define strncmp   sk_strncmp

Definition at line 17 of file sk_string_test.cpp.

◆ strncpy

#define strncpy   sk_strncpy

Definition at line 14 of file sk_string_test.cpp.

◆ strnlen

#define strnlen   sk_strnlen

Definition at line 19 of file sk_string_test.cpp.

◆ strrchr

#define strrchr   sk_strrchr

Definition at line 21 of file sk_string_test.cpp.

Function Documentation

◆ TEST() [1/29]

TEST ( SkStringTest  ,
Memchr   
)

Definition at line 77 of file sk_string_test.cpp.

77 {
78 char s[] = "hello world";
79 const void* res = memchr(s, 'w', 11);
80 EXPECT_EQ(static_cast<const char*>(res), &s[6]);
81
82 res = memchr(s, 'z', 11);
83 EXPECT_EQ(res, nullptr);
84}
#define memchr
#define EXPECT_EQ(val1, val2, msg)

◆ TEST() [2/29]

TEST ( SkStringTest  ,
MemchrNotFound   
)

Definition at line 272 of file sk_string_test.cpp.

272 {
273 char s[] = "hello world";
274 EXPECT_EQ(memchr(s, 'x', 11), nullptr);
275 EXPECT_EQ(memchr(s, 'z', 11), nullptr);
276}

◆ TEST() [3/29]

TEST ( SkStringTest  ,
Memcmp   
)

Definition at line 66 of file sk_string_test.cpp.

66 {
67 char s1[] = "abc";
68 char s2[] = "abc";
69 char s3[] = "abd";
70 char s4[] = "aba";
71
72 EXPECT_EQ(memcmp(s1, s2, 3), 0);
73 EXPECT_LT(memcmp(s1, s3, 3), 0); // 'c' < 'd' -> 99 - 100 < 0
74 EXPECT_GT(memcmp(s1, s4, 3), 0); // 'c' > 'a'
75}
#define memcmp
#define EXPECT_LT(val1, val2, msg)
#define EXPECT_GT(val1, val2, msg)

◆ TEST() [4/29]

TEST ( SkStringTest  ,
MemcmpDifferentLengths   
)

Definition at line 284 of file sk_string_test.cpp.

284 {
285 char s1[] = "abc";
286 char s2[] = "abcd";
287 // 只比较前3个字节
288 EXPECT_EQ(memcmp(s1, s2, 3), 0);
289}

◆ TEST() [5/29]

TEST ( SkStringTest  ,
MemcmpEqual   
)

Definition at line 278 of file sk_string_test.cpp.

278 {
279 char s1[] = "test";
280 char s2[] = "test";
281 EXPECT_EQ(memcmp(s1, s2, 4), 0);
282}

◆ TEST() [6/29]

TEST ( SkStringTest  ,
Memcpy   
)

Definition at line 34 of file sk_string_test.cpp.

34 {
35 char src[] = "hello";
36 char dest[10];
37 memcpy(dest, src, 6);
38 EXPECT_STREQ(dest, "hello");
39}
#define memcpy

◆ TEST() [7/29]

TEST ( SkStringTest  ,
MemcpyEdgeCases   
)

Definition at line 160 of file sk_string_test.cpp.

160 {
161 char src[] = "test";
162 char dest[10];
163
164 // 零长度复制
165 memcpy(dest, src, 0);
166
167 // 单字节复制
168 memcpy(dest, src, 1);
169 EXPECT_EQ(dest[0], 't');
170}

◆ TEST() [8/29]

TEST ( SkStringTest  ,
Memmove   
)

Definition at line 41 of file sk_string_test.cpp.

41 {
42 char str[] = "memory move test";
43 // Overlap: dest > src
44 memmove(str + 7, str, 6); // "memory " -> "memory " at pos 7
45 // "memory memoryest"
46 EXPECT_STREQ(str, "memory memoryest");
47
48 char str2[] = "memory move test";
49 // Overlap: dest < src
50 memmove(str2, str2 + 7, 4); // "move" -> starts at 0
51 // "move ry move test"
52 EXPECT_EQ(str2[0], 'm');
53 EXPECT_EQ(str2[1], 'o');
54 EXPECT_EQ(str2[2], 'v');
55 EXPECT_EQ(str2[3], 'e');
56}
#define memmove

◆ TEST() [9/29]

TEST ( SkStringTest  ,
MemmoveNoOverlap   
)

Definition at line 264 of file sk_string_test.cpp.

264 {
265 // 无重叠
266 char src[] = "source";
267 char dest[10];
268 memmove(dest, src, 7);
269 EXPECT_STREQ(dest, "source");
270}

◆ TEST() [10/29]

TEST ( SkStringTest  ,
MemmoveOverlapBackward   
)

Definition at line 253 of file sk_string_test.cpp.

253 {
254 // 测试后向重叠: dest < src
255 char str[] = "1234567890";
256 memmove(str, str + 3, 5); // "4567567890"
257 EXPECT_EQ(str[0], '4');
258 EXPECT_EQ(str[1], '5');
259 EXPECT_EQ(str[2], '6');
260 EXPECT_EQ(str[3], '7');
261 EXPECT_EQ(str[4], '8');
262}

◆ TEST() [11/29]

TEST ( SkStringTest  ,
MemmoveOverlapForward   
)

Definition at line 242 of file sk_string_test.cpp.

242 {
243 // 测试前向重叠: dest > src
244 char str[] = "1234567890";
245 memmove(str + 3, str, 5); // "12312345890"
246 EXPECT_EQ(str[3], '1');
247 EXPECT_EQ(str[4], '2');
248 EXPECT_EQ(str[5], '3');
249 EXPECT_EQ(str[6], '4');
250 EXPECT_EQ(str[7], '5');
251}

◆ TEST() [12/29]

TEST ( SkStringTest  ,
Memset   
)

Definition at line 58 of file sk_string_test.cpp.

58 {
59 char buffer[10];
60 memset(buffer, 'A', 5);
61 for (int i = 0; i < 5; ++i) {
62 EXPECT_EQ(buffer[i], 'A');
63 }
64}
#define memset

◆ TEST() [13/29]

TEST ( SkStringTest  ,
MemsetEdgeCases   
)

Definition at line 172 of file sk_string_test.cpp.

172 {
173 char buffer[10];
174
175 // 零长度设置
176 memset(buffer, 'A', 0);
177
178 // 使用 0 填充
179 memset(buffer, 0, 5);
180 for (int i = 0; i < 5; ++i) {
181 EXPECT_EQ(buffer[i], 0);
182 }
183
184 // 使用负值填充 (转换为 unsigned char)
185 memset(buffer, -1, 3);
186 for (int i = 0; i < 3; ++i) {
187 EXPECT_EQ(static_cast<unsigned char>(buffer[i]), 255);
188 }
189}

◆ TEST() [14/29]

TEST ( SkStringTest  ,
Strcat   
)

Definition at line 118 of file sk_string_test.cpp.

118 {
119 char dest[20] = "hello";
120 sk_strcat(dest, " world");
121 EXPECT_STREQ(dest, "hello world");
122}

◆ TEST() [15/29]

TEST ( SkStringTest  ,
StrcatMultiple   
)

Definition at line 291 of file sk_string_test.cpp.

291 {
292 char dest[30] = "hello";
293 sk_strcat(dest, " ");
294 sk_strcat(dest, "world");
295 sk_strcat(dest, "!");
296 EXPECT_STREQ(dest, "hello world!");
297}

◆ TEST() [16/29]

TEST ( SkStringTest  ,
Strchr   
)

Definition at line 146 of file sk_string_test.cpp.

146 {
147 char s[] = "hello";
148 EXPECT_STREQ(strchr(s, 'e'), "ello");
149 EXPECT_EQ(strchr(s, 'z'), nullptr);
150 EXPECT_STREQ(strchr(s, 'l'), "llo"); // first 'l'
151}
#define strchr

◆ TEST() [17/29]

TEST ( SkStringTest  ,
StrchrEdgeCases   
)

Definition at line 222 of file sk_string_test.cpp.

222 {
223 char s[] = "hello";
224
225 // 查找空字符
226 EXPECT_EQ(strchr(s, '\0'), &s[5]);
227
228 // 第一个字符
229 EXPECT_EQ(strchr(s, 'h'), s);
230}

◆ TEST() [18/29]

TEST ( SkStringTest  ,
Strcmp   
)

Definition at line 124 of file sk_string_test.cpp.

124 {
125 EXPECT_EQ(strcmp("abc", "abc"), 0);
126 EXPECT_LT(strcmp("abc", "abd"), 0);
127 EXPECT_GT(strcmp("abc", "aba"), 0);
128 EXPECT_LT(strcmp("abc", "abcd"), 0);
129}
#define strcmp

◆ TEST() [19/29]

TEST ( SkStringTest  ,
StrcmpEdgeCases   
)

Definition at line 191 of file sk_string_test.cpp.

191 {
192 // 空字符串比较
193 EXPECT_EQ(strcmp("", ""), 0);
194 EXPECT_LT(strcmp("", "a"), 0);
195 EXPECT_GT(strcmp("a", ""), 0);
196
197 // 一个字符串是另一个的前缀
198 EXPECT_LT(strcmp("abc", "abcd"), 0);
199 EXPECT_GT(strcmp("abcd", "abc"), 0);
200}

◆ TEST() [20/29]

TEST ( SkStringTest  ,
Strcpy   
)

Definition at line 86 of file sk_string_test.cpp.

86 {
87 char src[] = "test";
88 char dest[10];
89 strcpy(dest, src);
90 EXPECT_STREQ(dest, "test");
91}
#define strcpy

◆ TEST() [21/29]

TEST ( SkStringTest  ,
Strlen   
)

Definition at line 136 of file sk_string_test.cpp.

136 {
137 EXPECT_EQ(strlen("hello"), 5);
138 EXPECT_EQ(strlen(""), 0);
139}
#define strlen

◆ TEST() [22/29]

TEST ( SkStringTest  ,
StrlenEdgeCases   
)

Definition at line 202 of file sk_string_test.cpp.

202 {
203 // 空字符串
204 EXPECT_EQ(strlen(""), 0);
205
206 // 只有空字符
207 const char null_str[] = {'\0', 'a', 'b', '\0'};
208 EXPECT_EQ(strlen(null_str), 0);
209}

◆ TEST() [23/29]

TEST ( SkStringTest  ,
Strncmp   
)

Definition at line 131 of file sk_string_test.cpp.

131 {
132 EXPECT_EQ(sk_strncmp("abc", "abd", 2), 0); // "ab" vs "ab"
133 EXPECT_LT(sk_strncmp("abc", "abd", 3), 0);
134}

◆ TEST() [24/29]

TEST ( SkStringTest  ,
Strncpy   
)

Definition at line 93 of file sk_string_test.cpp.

93 {
94 char src[] = "test string";
95 char dest[20];
96
97 // Normal case
98 sk_strncpy(dest, src, 4);
99 // manual null termination check if expected,
100 // but standard strncpy does NOT null terminate if limit reached?
101 // sk_string.c implementation should be checked.
102 // Usually strncpy pads with nulls if n > src_len, and does NOT null terminate
103 // if n <= src_len
104
105 // Let's verify behavior with simpler test first
106 memset(dest, 0, 20);
107 sk_strncpy(dest, "abc", 5);
108 EXPECT_STREQ(dest, "abc");
109
110 sk_strncpy(dest, "abcdef", 3);
111 EXPECT_EQ(dest[0], 'a');
112 EXPECT_EQ(dest[1], 'b');
113 EXPECT_EQ(dest[2], 'c');
114 // dest[3] should remain 0 from memset
115 EXPECT_EQ(dest[3], '\0');
116}

◆ TEST() [25/29]

TEST ( SkStringTest  ,
StrncpyPadding   
)

Definition at line 299 of file sk_string_test.cpp.

299 {
300 char dest[10];
301 memset(dest, 'X', 10); // 用 'X' 填充
302
303 // 复制短字符串,应该填充空字符
304 sk_strncpy(dest, "ab", 5);
305 EXPECT_EQ(dest[0], 'a');
306 EXPECT_EQ(dest[1], 'b');
307 EXPECT_EQ(dest[2], '\0');
308 EXPECT_EQ(dest[3], '\0');
309 EXPECT_EQ(dest[4], '\0');
310}

◆ TEST() [26/29]

TEST ( SkStringTest  ,
Strnlen   
)

Definition at line 141 of file sk_string_test.cpp.

141 {
142 EXPECT_EQ(strnlen("hello", 10), 5);
143 EXPECT_EQ(strnlen("hello", 3), 3);
144}
#define strnlen

◆ TEST() [27/29]

TEST ( SkStringTest  ,
StrnlenEdgeCases   
)

Definition at line 211 of file sk_string_test.cpp.

211 {
212 // n 为 0
213 EXPECT_EQ(strnlen("hello", 0), 0);
214
215 // n 大于字符串长度
216 EXPECT_EQ(strnlen("hi", 100), 2);
217
218 // n 等于字符串长度
219 EXPECT_EQ(strnlen("hello", 5), 5);
220}

◆ TEST() [28/29]

TEST ( SkStringTest  ,
Strrchr   
)

Definition at line 153 of file sk_string_test.cpp.

153 {
154 char s[] = "hello";
155 EXPECT_STREQ(strrchr(s, 'l'), "lo"); // last 'l'
156 EXPECT_EQ(strrchr(s, 'z'), nullptr);
157}
#define strrchr

◆ TEST() [29/29]

TEST ( SkStringTest  ,
StrrchrEdgeCases   
)

Definition at line 232 of file sk_string_test.cpp.

232 {
233 char s[] = "hello";
234
235 // 查找空字符
236 EXPECT_EQ(strrchr(s, '\0'), &s[5]);
237
238 // 第一个也是最后一个
239 EXPECT_EQ(strrchr(s, 'h'), s);
240}