1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <gtest/gtest.h>
17
18 #include <base/containers/string.h>
19 #include <base/containers/type_traits.h>
20 #include <base/math/mathf.h>
21 #include <cstring>
22
23 using namespace testing::ext;
24
25 namespace {
26 constexpr const char* SHORT_STRING = "ABCDEF";
27 constexpr const char* LONG_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; // must exceed 30!!!
28 constexpr const char* SHORT_STRING_LOWERCASE = "abcdef";
29 constexpr const char* LONG_STRING_LOWERCASE = "abcdefghijklmnopqrstuvwxyz1234567890";
30
31 class CustomAllocator {
32 public:
33 // simple linear allocator.
34 uint8_t buf[1024u * sizeof(char)];
35 size_t pos { 0 };
Reset()36 void Reset()
37 {
38 pos = 0;
39 memset_s(buf, sizeof(buf), 0, sizeof(buf));
40 }
alloc(BASE_NS::allocator::size_type size)41 void* alloc(BASE_NS::allocator::size_type size)
42 {
43 void* ret = &buf[pos];
44 pos += size;
45 return ret;
46 }
Free(void *)47 void Free(void*)
48 {
49 return;
50 }
alloc(void * instance,BASE_NS::allocator::size_type size)51 static void* alloc(void* instance, BASE_NS::allocator::size_type size)
52 {
53 return ((CustomAllocator*)instance)->alloc(size);
54 }
Free(void * instance,void * ptr)55 static void Free(void* instance, void* ptr)
56 {
57 ((CustomAllocator*)instance)->Free(ptr);
58 }
59 };
60
61 class ShortAllocator {
62 public:
63 // simple linear allocator.
64 uint8_t buf[64u * sizeof(char)];
65 size_t pos { 0 };
Reset()66 void Reset()
67 {
68 pos = 0;
69 memset_s(buf, sizeof(buf), 0, sizeof(buf));
70 }
alloc(BASE_NS::allocator::size_type size)71 void* alloc(BASE_NS::allocator::size_type size)
72 {
73 void* ret = &buf[pos];
74 pos += size;
75 if (pos > 64u) {
76 return nullptr;
77 }
78 return ret;
79 }
Free(void *)80 void Free(void*)
81 {
82 return;
83 }
alloc(void * instance,BASE_NS::allocator::size_type size)84 static void* alloc(void* instance, BASE_NS::allocator::size_type size)
85 {
86 return ((ShortAllocator*)instance)->alloc(size);
87 }
Free(void * instance,void * ptr)88 static void Free(void* instance, void* ptr)
89 {
90 ((ShortAllocator*)instance)->Free(ptr);
91 }
92 };
93 } // namespace
94
95 class StringTest : public testing::Test {
96 public:
SetUpTestSuite()97 static void SetUpTestSuite() {}
TearDownTestSuite()98 static void TearDownTestSuite() {}
SetUp()99 void SetUp() override {}
TearDown()100 void TearDown() override {}
101 };
102
103 HWTEST_F(StringTest, EmptyString, TestSize.Level1)
104 {
105 {
106 const BASE_NS::string testString;
107
108 EXPECT_TRUE(testString.empty());
109 EXPECT_EQ(0, testString.size());
110
111 EXPECT_EQ(testString.begin(), testString.end());
112 EXPECT_EQ(testString.cbegin(), testString.cend());
113 }
114 {
115 constexpr const char* testStrArr = "\0";
116 const BASE_NS::string testString(testStrArr);
117
118 EXPECT_TRUE(testString.empty());
119 EXPECT_EQ(strlen(testStrArr), testString.size());
120
121 const char* str = testStrArr;
122 for (const auto c : testString) {
123 EXPECT_EQ(*str++, c);
124 }
125 }
126 {
127 constexpr const char testStrArr[] = { '\0' };
128 const BASE_NS::string testString(testStrArr);
129
130 EXPECT_TRUE(testString.empty());
131 EXPECT_EQ(strlen(testStrArr), testString.size());
132
133 const char* str = testStrArr;
134 for (const auto c : testString) {
135 EXPECT_EQ(*str++, c);
136 }
137 }
138 {
139 constexpr const char testStrArr[] = { '\0' };
140 constexpr const char nonEmptyStrArr[] = { "AAAAA" };
141 BASE_NS::string testString(nonEmptyStrArr);
142 testString.clear();
143 EXPECT_TRUE(testString.empty());
144 EXPECT_EQ(strlen(testStrArr), testString.size());
145
146 const char* str = testStrArr;
147 for (const auto c : testString) {
148 EXPECT_EQ(*str++, c);
149 }
150 }
151 {
152 constexpr const char testStrArr[] = { '\0' };
153 constexpr const char nonEmptyStrArr[] = { "AAAAA" };
154 BASE_NS::string testString(nonEmptyStrArr);
155 testString.assign(0, 'A');
156 EXPECT_TRUE(testString.empty());
157 EXPECT_EQ(strlen(testStrArr), testString.size());
158
159 const char* str = testStrArr;
160 for (const auto c : testString) {
161 EXPECT_EQ(*str++, c);
162 }
163 }
164 {
165 constexpr const char testStrArr[] = { '\0' };
166 constexpr const char nonEmptyStrArr[] = { "AAAAA" };
167 BASE_NS::string testString(nonEmptyStrArr);
168 testString.resize(0);
169 EXPECT_TRUE(testString.empty());
170 EXPECT_EQ(strlen(testStrArr), testString.size());
171
172 const char* str = testStrArr;
173 for (const auto c : testString) {
174 EXPECT_EQ(*str++, c);
175 }
176 }
177 {
178 constexpr const char testStrArr[] = { '\0' };
179 BASE_NS::string testString(testStrArr);
180 testString.resize(0);
181 EXPECT_TRUE(testString.empty());
182 EXPECT_EQ(strlen(testStrArr), testString.size());
183
184 const char* str = testStrArr;
185 for (const auto c : testString) {
186 EXPECT_EQ(*str++, c);
187 }
188 }
189 }
190
191 HWTEST_F(StringTest, NonEmptyString, TestSize.Level1)
192 {
193 {
194 constexpr const char* testStrArr = "ABCDEF";
195 const BASE_NS::string testString(testStrArr);
196
197 EXPECT_FALSE(testString.empty());
198 EXPECT_EQ(strlen(testStrArr), testString.size());
199 EXPECT_EQ('B', testString[1]);
200 EXPECT_EQ(testString.front(), testStrArr[0]);
201 EXPECT_EQ(testString.back(), testStrArr[strlen(testStrArr) - 1]);
202 {
203 BASE_NS::string testString2(testStrArr);
204 EXPECT_EQ('B', testString2[1]);
205 EXPECT_EQ(testString2.front(), testStrArr[0]);
206 EXPECT_EQ(testString2.back(), testStrArr[strlen(testStrArr) - 1]);
207 }
208
209 EXPECT_NE(testString.begin(), testString.end());
210 EXPECT_NE(testString.cbegin(), testString.cend());
211 const char* str = testStrArr;
212 for (const auto c : testString) {
213 EXPECT_EQ(*str++, c);
214 }
215 }
216 {
217 constexpr const char* testStrArr = "ABCDEF";
218 const BASE_NS::string testString(testStrArr, 1, 1);
219 EXPECT_EQ(1, testString.length());
220 EXPECT_EQ(*(testStrArr + 1), testString[0]);
221 }
222 {
223 constexpr const char baseStrArr[] = { "CD" };
224 constexpr const char testStrArr[] = { "CDAAA" };
225 BASE_NS::string testString(baseStrArr);
226 testString.resize(5, 'A');
227 EXPECT_EQ(strlen(testStrArr), testString.size());
228 const char* str = testStrArr;
229 for (const auto c : testString) {
230 EXPECT_EQ(*str++, c);
231 }
232 }
233 }
234
AssingString(const char * initialValue,const char * assignedValue,BASE_NS::allocator & initial,BASE_NS::allocator & assigned)235 void AssingString(
236 const char* initialValue, const char* assignedValue, BASE_NS::allocator& initial, BASE_NS::allocator& assigned)
237 {
238 // copy assign
239 {
240 BASE_NS::string testString(initialValue, initial);
241 BASE_NS::string testString2(assignedValue, assigned);
242 testString = testString2;
243 const char* str = assignedValue;
244 for (const auto c : testString) {
245 EXPECT_EQ(*str++, c);
246 }
247 }
248 // move assign
249 {
250 BASE_NS::string testString(initialValue, initial);
251 BASE_NS::string testString2(assignedValue, assigned);
252 testString = BASE_NS::move(testString2);
253 const char* str = assignedValue;
254 for (const auto c : testString) {
255 EXPECT_EQ(*str++, c);
256 }
257 }
258 // c-str assign
259 {
260 BASE_NS::string testString(initialValue, initial);
261 testString = assignedValue;
262 const char* str = assignedValue;
263 for (const auto c : testString) {
264 EXPECT_EQ(*str++, c);
265 }
266 }
267 // char assign
268 {
269 BASE_NS::string testString(initialValue, initial);
270 testString = 'a';
271 const char* str = "a";
272 for (const auto c : testString) {
273 EXPECT_EQ(*str++, c);
274 }
275 }
276 // string_view assign
277 {
278 BASE_NS::string testString(initialValue, initial);
279 testString = BASE_NS::string_view(assignedValue);
280 const char* str = assignedValue;
281 for (const auto c : testString) {
282 EXPECT_EQ(*str++, c);
283 }
284 }
285 // assign(c-str)
286 {
287 BASE_NS::string testString(initialValue, initial);
288 testString.assign(assignedValue);
289 const char* str = assignedValue;
290 for (const auto c : testString) {
291 EXPECT_EQ(*str++, c);
292 }
293 }
294 }
295
AssingString(BASE_NS::allocator & initial,BASE_NS::allocator & assigned)296 void AssingString(BASE_NS::allocator& initial, BASE_NS::allocator& assigned)
297 {
298 // assignment operators to an empty string
299 AssingString("", SHORT_STRING, initial, assigned);
300
301 // assignment operators to an empty string
302 AssingString("", LONG_STRING, initial, assigned);
303
304 // assignment operators to a non-empty short string
305 AssingString(SHORT_STRING_LOWERCASE, SHORT_STRING, initial, assigned);
306
307 // assignment operators to a non-empty short string
308 AssingString(SHORT_STRING_LOWERCASE, LONG_STRING, initial, assigned);
309
310 // assignment operators to a non-empty long string
311 AssingString(LONG_STRING_LOWERCASE, SHORT_STRING, initial, assigned);
312
313 // assignment operators to a non-empty long string
314 AssingString(LONG_STRING_LOWERCASE, LONG_STRING, initial, assigned);
315 }
316
317 HWTEST_F(StringTest, Assign, TestSize.Level1)
318 {
319 AssingString(BASE_NS::default_allocator(), BASE_NS::default_allocator());
320 {
321 CustomAllocator custom;
322 BASE_NS::allocator alloc { &custom, CustomAllocator::alloc, CustomAllocator::Free };
323 AssingString(alloc, BASE_NS::default_allocator());
324 }
325 {
326 CustomAllocator custom;
327 BASE_NS::allocator alloc { &custom, CustomAllocator::alloc, CustomAllocator::Free };
328 AssingString(BASE_NS::default_allocator(), alloc);
329 }
330 {
331 CustomAllocator custom;
332 BASE_NS::allocator alloc { &custom, CustomAllocator::alloc, CustomAllocator::Free };
333 AssingString(alloc, alloc);
334 }
335 {
336 ShortAllocator customShort;
337 char hugeCharArray[256] = "";
338 BASE_NS::allocator alloc { &customShort, ShortAllocator::alloc, ShortAllocator::Free };
339 memset_s(hugeCharArray, sizeof(hugeCharArray), 'A', 200);
340 const char* p = &hugeCharArray[0];
341 const BASE_NS::string valDefault = BASE_NS::string(p, 200);
342 BASE_NS::string valCustom = BASE_NS::string(valDefault, alloc);
343 EXPECT_EQ(valCustom.size(), 0);
344 EXPECT_EQ(valCustom.capacity(), 14); // const empty short string capacity
345 }
346 {
347 ShortAllocator customShort;
348 char hugeCharArray[256] = "";
349 BASE_NS::allocator alloc { &customShort, ShortAllocator::alloc, ShortAllocator::Free };
350 memset_s(hugeCharArray, sizeof(hugeCharArray), 'A', 200);
351 const char* p = &hugeCharArray[0];
352 const BASE_NS::string valDefault = BASE_NS::string(p, 200);
353 BASE_NS::string valCustom(hugeCharArray, alloc);
354 EXPECT_EQ(valCustom.size(), 0);
355 EXPECT_EQ(valCustom.capacity(), 14); // const empty short string capacity
356 }
357 }
358
359 HWTEST_F(StringTest, ReserveAndShrink, TestSize.Level1)
360 {
361 constexpr const BASE_NS::string::size_type newCapacity = 100u;
362 {
363 BASE_NS::string testString;
364 EXPECT_LT(testString.capacity(), newCapacity);
365 testString.reserve(newCapacity);
366 EXPECT_GE(testString.capacity(), newCapacity);
367 testString = SHORT_STRING;
368 }
369 {
370 BASE_NS::string testString(SHORT_STRING);
371 EXPECT_LT(testString.capacity(), newCapacity);
372 testString.reserve(newCapacity);
373 EXPECT_GE(testString.capacity(), newCapacity);
374 // short content is preserved after reserve
375 const char* str = SHORT_STRING;
376 for (const auto c : testString) {
377 EXPECT_EQ(*str++, c);
378 }
379 }
380 {
381 BASE_NS::string testString(LONG_STRING);
382 EXPECT_LT(testString.capacity(), newCapacity);
383 testString.reserve(newCapacity);
384 EXPECT_GE(testString.capacity(), newCapacity);
385 // long content is preserved after reserve
386 const char* str = LONG_STRING;
387 for (const auto c : testString) {
388 EXPECT_EQ(*str++, c);
389 }
390 }
391 {
392 BASE_NS::string testString(SHORT_STRING);
393 EXPECT_LT(testString.capacity(), newCapacity);
394 testString.reserve(newCapacity);
395 const auto newCapacity = testString.capacity();
396 EXPECT_GE(newCapacity, newCapacity);
397 // assigning content that fits in capacity doesn't increase capacity
398 ASSERT_LT(strlen(LONG_STRING), newCapacity);
399 testString = LONG_STRING;
400 EXPECT_EQ(newCapacity, testString.capacity());
401 const char* str = LONG_STRING;
402 for (const auto c : testString) {
403 EXPECT_EQ(*str++, c);
404 }
405 }
406 {
407 BASE_NS::string testString;
408 testString.reserve(newCapacity);
409 testString = LONG_STRING;
410 EXPECT_GE(testString.capacity(), newCapacity);
411
412 // verify that the capacity of a copy constructed string is based on the strlen instead of the 'other' capacity.
413 BASE_NS::string testString2 = testString;
414 EXPECT_LT(testString2.capacity(), testString.capacity());
415 EXPECT_GE(testString2.capacity(), testString2.size());
416 }
417 }
418
VerifyInsertResult(BASE_NS::string const & testString,const char * initialValue,const char * appendValue,int pos=0,int len=-1)419 void VerifyInsertResult(
420 BASE_NS::string const& testString, const char* initialValue, const char* appendValue, int pos = 0, int len = -1)
421 {
422 auto const initialSize = static_cast<int>(strlen(initialValue));
423 auto const appendSize = static_cast<int>(strlen(appendValue));
424 if (len == -1) {
425 len = appendSize;
426 }
427 if (pos > initialSize) {
428 pos = initialSize;
429 }
430 const char* initialStr = initialValue;
431 const char* appendStr = appendValue;
432 const char* newStr = testString.c_str();
433 for (int i = 0; i < pos; ++i) {
434 EXPECT_EQ(*initialStr++, *newStr++);
435 }
436 for (int i = 0; i < len; ++i) {
437 EXPECT_EQ(*appendStr++, *newStr++);
438 }
439 for (int i = pos; i < initialSize; ++i) {
440 EXPECT_EQ(*initialStr++, *newStr++);
441 }
442 }
443
444 HWTEST_F(StringTest, Insert, TestSize.Level1)
445 {
446 // NOTE: need real tests. this is just a smoke test to call each insert overload once.
447 const BASE_NS::string insertString(SHORT_STRING_LOWERCASE);
448 constexpr BASE_NS::string_view insertStringView(SHORT_STRING_LOWERCASE);
449 {
450 BASE_NS::string testString(SHORT_STRING);
451 testString.insert(3, insertStringView.data());
452 VerifyInsertResult(testString, SHORT_STRING, SHORT_STRING_LOWERCASE, 3);
453 }
454 {
455 BASE_NS::string testString(SHORT_STRING);
456 testString.insert(3, LONG_STRING_LOWERCASE);
457 VerifyInsertResult(testString, SHORT_STRING, LONG_STRING_LOWERCASE, 3);
458 }
459 {
460 BASE_NS::string testString(SHORT_STRING);
461 testString.insert(3, SHORT_STRING_LOWERCASE, 2);
462 VerifyInsertResult(testString, SHORT_STRING, SHORT_STRING_LOWERCASE, 3, 2);
463 }
464 {
465 BASE_NS::string testString(SHORT_STRING);
466 testString.insert(3, LONG_STRING_LOWERCASE, 16);
467 VerifyInsertResult(testString, SHORT_STRING, LONG_STRING_LOWERCASE, 3, 16);
468 }
469 {
470 BASE_NS::string testString(SHORT_STRING);
471 testString.insert(99, SHORT_STRING_LOWERCASE, 2);
472 VerifyInsertResult(testString, SHORT_STRING, SHORT_STRING_LOWERCASE, 99, 2);
473 }
474 {
475 BASE_NS::string testString(LONG_STRING);
476 testString.insert(99, LONG_STRING_LOWERCASE, 16);
477 VerifyInsertResult(testString, LONG_STRING, LONG_STRING_LOWERCASE, 99, 16);
478 }
479 }
480
VerifyEraseResult(BASE_NS::string const & testString,const char * initialValue,const size_t index,const size_t count)481 void VerifyEraseResult(
482 BASE_NS::string const& testString, const char* initialValue, const size_t index, const size_t count)
483 {
484 auto const initialSize = strlen(initialValue);
485 const char* originalStr = initialValue;
486 const char* newStr = testString.c_str();
487
488 for (size_t i = 0; i < index; ++i) {
489 EXPECT_EQ(*originalStr++, *newStr++);
490 }
491 if (count != BASE_NS::string::npos) {
492 originalStr += count;
493 for (size_t i = index + count; i < initialSize; ++i) {
494 EXPECT_EQ(*originalStr++, *newStr++);
495 }
496 }
497 }
498
Erase(const char * initialValue)499 void Erase(const char* initialValue)
500 {
501 auto const initialSize = strlen(initialValue);
502
503 {
504 BASE_NS::string testString(initialValue);
505 // default index is 0 and count npos so should result in empty string
506 testString.erase();
507 EXPECT_TRUE(testString.empty());
508 EXPECT_EQ(0, testString.size());
509 VerifyEraseResult(testString, initialValue, 0, BASE_NS::string::npos);
510 }
511 for (size_t index = 0; index < initialSize; ++index) {
512 {
513 BASE_NS::string testString(initialValue);
514 // index + npos should result in size equal to index
515 testString.erase(index);
516 EXPECT_EQ(index, testString.size());
517 VerifyEraseResult(testString, initialValue, index, BASE_NS::string::npos);
518 }
519 {
520 BASE_NS::string testString(initialValue);
521 // erasing index..size should result in size equal to index
522 const size_t count = testString.size() - index;
523 testString.erase(index, count);
524 EXPECT_EQ(index, testString.size());
525 VerifyEraseResult(testString, initialValue, index, count);
526 }
527 {
528 BASE_NS::string testString(initialValue);
529 // erasing index..size - 1 should result in size equal to index + 1
530 const size_t count = testString.size() - index - 1;
531 testString.erase(index, count);
532 EXPECT_EQ(index + 1, testString.size());
533 VerifyEraseResult(testString, initialValue, index, count);
534 }
535 {
536 BASE_NS::string testString(initialValue);
537 // same as erase(index, 1)
538 const auto it =
539 testString.erase(testString.begin() + static_cast<std::string::iterator::difference_type>(index));
540 EXPECT_EQ(initialSize - 1, testString.size());
541 VerifyEraseResult(testString, initialValue, index, 1);
542 // iterator poinst to the character after the erased character
543 EXPECT_EQ(*(initialValue + index + 1), *it);
544 }
545 {
546 BASE_NS::string testString(initialValue);
547 // erasing index..size - 1 should result in size equal to index + 1
548 const auto begin = testString.begin() + static_cast<std::string::iterator::difference_type>(index);
549 const auto end = testString.end() - 1;
550 const auto len = (end - begin);
551 const auto it = testString.erase(begin, end);
552 EXPECT_EQ(index + 1, testString.size());
553 VerifyEraseResult(testString, initialValue, static_cast<size_t>(index), static_cast<size_t>(len));
554 EXPECT_EQ(*(initialValue + index + len), *it);
555 }
556 }
557 {
558 {
559 BASE_NS::string testString(initialValue);
560 const auto it = testString.erase(initialSize + 100, initialSize + 200);
561 EXPECT_EQ(initialSize, testString.size());
562 }
563 }
564 }
565
566 HWTEST_F(StringTest, Erase, TestSize.Level1)
567 {
568 Erase(SHORT_STRING);
569 Erase(LONG_STRING);
570 }
571
AppendString(const char * initialValue,const char * assignedValue)572 void AppendString(const char* initialValue, const char* assignedValue)
573 {
574 // append n x char
575 {
576 BASE_NS::string testString(initialValue);
577 auto const initialSize = testString.size();
578 // appending 3/2 of capacity caused
579 auto const cnt = 3 * testString.capacity() / 2;
580 testString.append(cnt, 'a');
581 ASSERT_EQ(initialSize + cnt, testString.size());
582
583 const char* originalStr = initialValue;
584 const char* newStr = testString.c_str();
585 for (size_t i = 0; i < initialSize; ++i) {
586 EXPECT_EQ(*originalStr++, *newStr++);
587 }
588 for (size_t i = 0; i < cnt; ++i) {
589 EXPECT_EQ('a', *newStr++);
590 }
591 }
592 // append string
593 {
594 BASE_NS::string testString(initialValue);
595 BASE_NS::string testString2(assignedValue);
596
597 auto const initialSize = testString.size();
598 auto const cnt = testString2.size();
599
600 testString.append(testString2);
601 ASSERT_EQ(initialSize + cnt, testString.size());
602
603 const char* originalStr = initialValue;
604 const char* newStr = testString.c_str();
605 for (size_t i = 0; i < initialSize; ++i) {
606 EXPECT_EQ(*originalStr++, *newStr++);
607 }
608 originalStr = assignedValue;
609 for (size_t i = 0; i < cnt; ++i) {
610 EXPECT_EQ(*originalStr++, *newStr++);
611 }
612 }
613 // append substring
614 {
615 BASE_NS::string testString(initialValue);
616 BASE_NS::string testString2(assignedValue);
617
618 auto const initialSize = testString.size();
619 auto const posValue = 1u;
620 auto const assingLen = strlen(assignedValue);
621 auto const cnt = BASE_NS::Math::min(assingLen, size_t(2u));
622
623 testString.append(testString2, posValue, cnt);
624
625 ASSERT_EQ(initialSize + cnt, testString.size());
626
627 const char* originalStr = initialValue;
628 const char* newStr = testString.c_str();
629 for (size_t i = 0; i < initialSize; ++i) {
630 EXPECT_EQ(*originalStr++, *newStr++);
631 }
632 originalStr = assignedValue + posValue;
633 for (size_t i = 0; i < cnt; ++i) {
634 EXPECT_EQ(*originalStr++, *newStr++);
635 }
636 }
637 // append subsring size = -1
638 {
639 BASE_NS::string testString(initialValue);
640 BASE_NS::string testString2(assignedValue);
641
642 auto const initialSize = testString.size();
643 auto const posValue = 1u;
644 auto const assingLen = strlen(assignedValue);
645 auto const cnt = (assingLen >= posValue) ? (assingLen - posValue) : assingLen;
646
647 testString.append(testString2, posValue, static_cast<BASE_NS::string::size_type>(-1));
648 ASSERT_EQ(initialSize + cnt, testString.size());
649
650 const char* originalStr = initialValue;
651 const char* newStr = testString.c_str();
652 for (size_t i = 0; i < initialSize; ++i) {
653 EXPECT_EQ(*originalStr++, *newStr++);
654 }
655 originalStr = assignedValue + posValue;
656 for (size_t i = 0; i < cnt; ++i) {
657 EXPECT_EQ(*originalStr++, *newStr++);
658 }
659 }
660 // append c-str
661 {
662 BASE_NS::string testString(initialValue);
663 auto const initialSize = testString.size();
664 auto const assingLen = strlen(assignedValue);
665 auto const cnt = BASE_NS::Math::min(assingLen, size_t(2u));
666
667 testString.append(assignedValue, cnt);
668
669 ASSERT_EQ(initialSize + cnt, testString.size());
670
671 const char* originalStr = initialValue;
672 const char* newStr = testString.c_str();
673 for (size_t i = 0; i < initialSize; ++i) {
674 EXPECT_EQ(*originalStr++, *newStr++);
675 }
676 originalStr = assignedValue;
677 for (size_t i = 0; i < cnt; ++i) {
678 EXPECT_EQ(*originalStr++, *newStr++);
679 }
680 }
681 // append c-str
682 {
683 BASE_NS::string testString(initialValue);
684 auto const initialSize = testString.size();
685 auto const cnt = strlen(assignedValue);
686
687 testString.append(assignedValue);
688 ASSERT_EQ(initialSize + cnt, testString.size());
689
690 const char* originalStr = initialValue;
691 const char* newStr = testString.c_str();
692 for (size_t i = 0; i < initialSize; ++i) {
693 EXPECT_EQ(*originalStr++, *newStr++);
694 }
695 originalStr = assignedValue;
696 for (size_t i = 0; i < cnt; ++i) {
697 EXPECT_EQ(*originalStr++, *newStr++);
698 }
699 }
700 // append string_view
701 {
702 BASE_NS::string testString(initialValue);
703 BASE_NS::string_view testString2(assignedValue);
704 auto const initialSize = testString.size();
705 auto const cnt = testString2.size();
706
707 testString.append(testString2);
708 ASSERT_EQ(initialSize + cnt, testString.size());
709
710 const char* originalStr = initialValue;
711 const char* newStr = testString.c_str();
712 for (size_t i = 0; i < initialSize; ++i) {
713 EXPECT_EQ(*originalStr++, *newStr++);
714 }
715 originalStr = assignedValue;
716 for (size_t i = 0; i < cnt; ++i) {
717 EXPECT_EQ(*originalStr++, *newStr++);
718 }
719 }
720 // append string_view
721 {
722 BASE_NS::string testString(initialValue);
723 BASE_NS::string_view testString2(assignedValue);
724 auto const initialSize = testString.size();
725 auto const posValue = 1u;
726 auto const cnt = BASE_NS::Math::min(testString2.size(), size_t(2u));
727
728 testString.append(testString2, posValue, cnt);
729
730 ASSERT_EQ(initialSize + cnt, testString.size());
731
732 const char* originalStr = initialValue;
733 const char* newStr = testString.c_str();
734 for (size_t i = 0; i < initialSize; ++i) {
735 EXPECT_EQ(*originalStr++, *newStr++);
736 }
737 originalStr = assignedValue + posValue;
738 for (size_t i = 0; i < cnt; ++i) {
739 EXPECT_EQ(*originalStr++, *newStr++);
740 }
741 }
742 }
743
744 HWTEST_F(StringTest, MemberAppend, TestSize.Level1)
745 {
746 BASE_NS::string testString;
747 BASE_NS::string testString2;
748 testString.append(testString2, 0);
749 testString.append(testString2, 0, 0);
750 testString.append(testString2, 0, 1);
751 testString.append(testString2, 1);
752 testString.append(testString2, 1, 0);
753 testString.append(testString2, 1, 1);
754 testString2 = 'A';
755
756 testString.append(testString2, 0);
757 testString.append(testString2, 0, 0);
758 testString.append(testString2, 0, 1);
759 testString.append(testString2, 1);
760 testString.append(testString2, 1, 0);
761 testString.append(testString2, 1, 1);
762
763 AppendString("", "");
764 AppendString("", SHORT_STRING);
765 AppendString("", LONG_STRING_LOWERCASE);
766
767 AppendString(SHORT_STRING, "");
768 AppendString(SHORT_STRING, SHORT_STRING);
769 AppendString(SHORT_STRING, LONG_STRING_LOWERCASE);
770
771 AppendString(LONG_STRING, "");
772 AppendString(LONG_STRING, SHORT_STRING);
773 AppendString(LONG_STRING, LONG_STRING_LOWERCASE);
774 }
775
VerifyAppendResult(BASE_NS::string const & testString,const char * initialValue,const char * appendValue,const bool result=true)776 void VerifyAppendResult(
777 BASE_NS::string const& testString, const char* initialValue, const char* appendValue, const bool result = true)
778 {
779 auto const initialSize = strlen(initialValue);
780 auto const appendSize = strlen(appendValue);
781 const char* originalStr = initialValue;
782 const char* newStr = testString.c_str();
783 int errCnt = 0;
784 for (size_t i = 0; i < initialSize; ++i) {
785 if (result) {
786 EXPECT_EQ(*originalStr++, *newStr++);
787 } else {
788 errCnt += (*originalStr++ != *newStr++);
789 }
790 }
791 originalStr = appendValue;
792 for (size_t i = 0; i < appendSize; ++i) {
793 if (result) {
794 EXPECT_EQ(*originalStr++, *newStr++);
795 } else {
796 errCnt += (*originalStr++ != *newStr++);
797 }
798 }
799 EXPECT_TRUE((errCnt == 0) == result);
800 }
801
NonMemberAppend(const char * initialValue,const char * appendValue)802 void NonMemberAppend(const char* initialValue, const char* appendValue)
803 {
804 // string lref + string lref
805 {
806 const BASE_NS::string lhs(initialValue);
807 const BASE_NS::string rhs(appendValue);
808 auto const testString = lhs + rhs;
809 VerifyAppendResult(testString, initialValue, appendValue);
810 }
811 // string lref + const char
812 {
813 const BASE_NS::string lhs(initialValue);
814 BASE_NS::string rhs(appendValue);
815 auto testString = lhs;
816 for (const char c : rhs) {
817 testString += c;
818 }
819 VerifyAppendResult(testString, initialValue, appendValue);
820 }
821 // string lref + char pointer
822 {
823 const BASE_NS::string lhs(initialValue);
824 const char* rhs(appendValue);
825 auto testString = lhs;
826 testString += rhs;
827 VerifyAppendResult(testString, initialValue, appendValue);
828 }
829 // string lref + c-str
830 {
831 const BASE_NS::string lhs(initialValue);
832 auto const testString = lhs + appendValue;
833 VerifyAppendResult(testString, initialValue, appendValue);
834 }
835 /*
836 basic_string<CharT> operator+(const basic_string<CharT>& lhs, CharT rhs);
837 basic_string<CharT> operator+(const CharT* lhs, const basic_string<CharT>& rhs);
838 basic_string<CharT> operator+(CharT lhs, const basic_string<CharT>& rhs);
839 */
840 // string rref + string rref
841 {
842 auto const testString = BASE_NS::string(initialValue) + BASE_NS::string(appendValue);
843 VerifyAppendResult(testString, initialValue, appendValue);
844 }
845 // string rref + string lref
846 {
847 const BASE_NS::string rhs(appendValue);
848 auto const testString = BASE_NS::string(initialValue) + rhs;
849 VerifyAppendResult(testString, initialValue, appendValue);
850 }
851 // string rref + c-str
852 {
853 auto const testString = BASE_NS::string(initialValue) + appendValue;
854 VerifyAppendResult(testString, initialValue, appendValue);
855 }
856 // string rref + char
857 {
858 auto const testString = BASE_NS::string(initialValue) + 'A';
859 VerifyAppendResult(testString, initialValue, "A");
860 }
861 /*
862 basic_string<CharT> operator+(const basic_string<CharT>& lhs, basic_string<CharT>&& rhs);
863 basic_string<CharT> operator+(const CharT* lhs, basic_string<CharT>&& rhs);
864 basic_string<CharT> operator+(CharT lhs, basic_string<CharT>&& rhs);
865 */
866 }
867
868 HWTEST_F(StringTest, NonMemberAppend, TestSize.Level1)
869 {
870 NonMemberAppend("", "");
871 NonMemberAppend("", SHORT_STRING);
872 NonMemberAppend("", LONG_STRING);
873
874 NonMemberAppend(SHORT_STRING, "");
875 NonMemberAppend(SHORT_STRING, SHORT_STRING);
876 NonMemberAppend(SHORT_STRING, LONG_STRING);
877
878 NonMemberAppend(LONG_STRING, "");
879 NonMemberAppend(LONG_STRING, SHORT_STRING);
880 NonMemberAppend(LONG_STRING, LONG_STRING);
881 }
882 template<typename AllT>
CustomAllocatorAppend(const char * initialValue,const char * appendValue,BASE_NS::allocator alloc,AllT * customAllocator,bool expectedResult=true)883 void CustomAllocatorAppend(const char* initialValue, const char* appendValue, BASE_NS::allocator alloc,
884 AllT* customAllocator, bool expectedResult = true)
885 {
886 // append
887 {
888 customAllocator->Reset();
889 const BASE_NS::string lhs(initialValue);
890 const BASE_NS::string rhs(appendValue);
891 BASE_NS::string testString = BASE_NS::string(lhs, alloc);
892 testString += rhs;
893 VerifyAppendResult(testString, initialValue, appendValue, expectedResult);
894 }
895 // push_back
896 {
897 if (strlen(appendValue)) {
898 customAllocator->Reset();
899 const BASE_NS::string lhs(initialValue);
900 BASE_NS::string testString = BASE_NS::string(lhs, alloc);
901 testString.push_back('A');
902 VerifyAppendResult(testString, initialValue, "A", expectedResult);
903 }
904 }
905 // append chars
906 {
907 if (strlen(appendValue)) {
908 customAllocator->Reset();
909 const BASE_NS::string lhs(initialValue);
910 BASE_NS::string testString = BASE_NS::string(lhs, alloc);
911 testString.append(5, 'A'); // 5: index
912 VerifyAppendResult(testString, initialValue, "AAAAA", expectedResult);
913 }
914 }
915 }
916
917 HWTEST_F(StringTest, CustomAllocatorAppend, TestSize.Level1)
918 {
919 ShortAllocator customShort;
920 BASE_NS::allocator alloc { &customShort, ShortAllocator::alloc, ShortAllocator::Free };
921 CustomAllocatorAppend("", "", alloc, &customShort);
922 CustomAllocatorAppend("", SHORT_STRING, alloc, &customShort);
923 CustomAllocatorAppend("", LONG_STRING, alloc, &customShort);
924
925 CustomAllocatorAppend(SHORT_STRING, "", alloc, &customShort);
926 CustomAllocatorAppend(SHORT_STRING, SHORT_STRING, alloc, &customShort);
927 CustomAllocatorAppend(SHORT_STRING, LONG_STRING, alloc, &customShort); // 6 + 55 < 64
928
929 CustomAllocatorAppend(LONG_STRING, "", alloc, &customShort);
930 CustomAllocatorAppend(LONG_STRING, SHORT_STRING, alloc, &customShort, false); // 36 + 55 > 64
931 CustomAllocatorAppend(LONG_STRING, LONG_STRING, alloc, &customShort, false); // 36 + 36 + 36 > 64
932 }
933
Compare(BASE_NS::string const & lhs,BASE_NS::string_view rhs)934 void Compare(BASE_NS::string const& lhs, BASE_NS::string_view rhs)
935 {
936 ASSERT_EQ(lhs.size(), rhs.size());
937
938 auto iRhs = rhs.begin();
939
940 for (auto const c : lhs) {
941 EXPECT_EQ(*iRhs++, c);
942 }
943 }
944
945 template<typename Lhs, typename Rhs>
CompareTest(Lhs lhs,Rhs rhs)946 void CompareTest(Lhs lhs, Rhs rhs)
947 {
948 EXPECT_TRUE(lhs == lhs);
949 EXPECT_FALSE(lhs == rhs);
950 EXPECT_TRUE(lhs != rhs);
951 EXPECT_TRUE(lhs < rhs);
952 EXPECT_TRUE(lhs <= lhs);
953 EXPECT_TRUE(lhs <= rhs);
954 EXPECT_TRUE(rhs > lhs);
955 EXPECT_TRUE(rhs >= rhs);
956 EXPECT_TRUE(rhs >= lhs);
957 }
958
959 HWTEST_F(StringTest, ComparisonOperators, TestSize.Level1)
960 {
961 const auto a = BASE_NS::string("A");
962 const auto b = BASE_NS::string("B");
963 // string - string comparison
964 CompareTest(a, b);
965
966 // string - string_view comparison
967 CompareTest(a, BASE_NS::string_view(b));
968 CompareTest(BASE_NS::string_view(a), b);
969
970 // string_view - string_view comparison
971 CompareTest(BASE_NS::string_view(a), BASE_NS::string_view(b));
972
973 // string - c-string comparison
974 CompareTest(a, b.data());
975 CompareTest(a.data(), b);
976
977 // string_view - c-string comparison
978 CompareTest(BASE_NS::string_view(a), b.data());
979 CompareTest(a.data(), BASE_NS::string_view(b));
980 }
981
982 HWTEST_F(StringTest, Compare, TestSize.Level1)
983 {
984 constexpr const char* testStrArr = "ABCDEF";
985 const BASE_NS::string testString(testStrArr);
986
987 const BASE_NS::string copy = testString;
988 const BASE_NS::string prefix = BASE_NS::string(testString.substr(0, 3));
989 const BASE_NS::string suffix = BASE_NS::string(testString.substr(3));
990
991 EXPECT_EQ(testString.compare(copy), 0);
992
993 EXPECT_GT(testString.compare(prefix), 0);
994
995 EXPECT_LT(testString.compare(suffix), 0);
996
997 EXPECT_GT(suffix.compare(testString), 0);
998 EXPECT_GT(suffix.compare(prefix), 0);
999
1000 EXPECT_LT(prefix.compare(testString), 0);
1001 EXPECT_LT(prefix.compare(suffix), 0);
1002
1003 EXPECT_EQ(prefix.compare(0, 3, testString), prefix.compare(testString));
1004 EXPECT_EQ(testString.compare(1, 3, prefix), -prefix.compare("BCD"));
1005 EXPECT_EQ(testString.compare(1, 3, "ABC"), -prefix.compare("BCD"));
1006 EXPECT_GT(suffix.compare("ABC"), 0);
1007 EXPECT_EQ(prefix.compare(0, 3, testString, 0, 3), prefix.compare("ABC"));
1008 EXPECT_EQ(prefix.compare(0, 3, testString, 1, 3), prefix.compare("BCD"));
1009 EXPECT_EQ(prefix.compare(0, 3, "ABCDEF", 6), prefix.compare("ABCDEF"));
1010 EXPECT_EQ(prefix.compare(0, 3, "ABCDEF", 1), prefix.compare("A"));
1011 }
1012
ReplaceString(const char * initialValue,const char * replacedValue,size_t index,size_t count,const char * resultValue)1013 void ReplaceString(
1014 const char* initialValue, const char* replacedValue, size_t index, size_t count, const char* resultValue)
1015 {
1016 BASE_NS::string testString(initialValue);
1017 testString.replace(testString.begin() + static_cast<std::string::iterator::difference_type>(index),
1018 testString.begin() + static_cast<std::string::iterator::difference_type>(index + count), replacedValue);
1019 Compare(testString, resultValue);
1020 }
1021
Replace(const char * initialValue,const char * replacedValue)1022 void Replace(const char* initialValue, const char* replacedValue)
1023 {
1024 const auto initialSize = strlen(initialValue);
1025 const auto replaceSize = strlen(replacedValue);
1026 char result[256];
1027 for (size_t index = 0; index <= initialSize; ++index) {
1028 BASE_NS::CloneData(result, sizeof(result), initialValue, index);
1029 BASE_NS::CloneData(result + index, sizeof(result) - index, replacedValue, replaceSize);
1030
1031 for (size_t count = 0; count <= initialSize - index; ++count) {
1032 BASE_NS::CloneData(result + index + replaceSize, sizeof(result) - index - replaceSize,
1033 initialValue + index + count, initialSize - index - count);
1034 result[initialSize - count + replaceSize] = '\0';
1035 ReplaceString(initialValue, replacedValue, index, count, result);
1036 }
1037 }
1038 }
1039
1040 HWTEST_F(StringTest, Replace, TestSize.Level1)
1041 {
1042 Replace("", SHORT_STRING_LOWERCASE);
1043 Replace("", LONG_STRING_LOWERCASE);
1044
1045 Replace(SHORT_STRING, SHORT_STRING_LOWERCASE);
1046 Replace(SHORT_STRING, LONG_STRING_LOWERCASE);
1047
1048 Replace(LONG_STRING, SHORT_STRING_LOWERCASE);
1049 Replace(LONG_STRING, LONG_STRING_LOWERCASE);
1050 }
1051
1052 HWTEST_F(StringTest, Copy, TestSize.Level1)
1053 {
1054 {
1055 BASE_NS::string testString;
1056 char buffer[256];
1057 EXPECT_EQ(testString.copy(buffer, 0), 0);
1058 EXPECT_EQ(testString.copy(buffer, 1), 0);
1059 }
1060 {
1061 BASE_NS::string testString(SHORT_STRING);
1062 char buffer[256] {};
1063 EXPECT_EQ(testString.copy(buffer, 3), 3);
1064 const char* str = SHORT_STRING;
1065 for (size_t i = 0; i < 3; ++i) {
1066 EXPECT_EQ(*str++, testString[i]);
1067 }
1068 }
1069 {
1070 BASE_NS::string testString(SHORT_STRING);
1071 char buffer[256] {};
1072 EXPECT_EQ(testString.copy(buffer, BASE_NS::countof(buffer)), testString.length());
1073 const char* str = SHORT_STRING;
1074 for (const auto c : testString) {
1075 EXPECT_EQ(*str++, c);
1076 }
1077 }
1078 }
1079
1080 HWTEST_F(StringTest, Search, TestSize.Level1)
1081 {
1082 {
1083 BASE_NS::string checkString(SHORT_STRING);
1084 BASE_NS::string testString("A");
1085 EXPECT_EQ(checkString.find(testString), 0);
1086 EXPECT_EQ(checkString.find(testString, 0), 0);
1087 EXPECT_EQ(checkString.find(testString, 1), -1);
1088 EXPECT_EQ(checkString.find('A'), 0);
1089 EXPECT_EQ(checkString.find("A"), 0);
1090 EXPECT_EQ(checkString.find('A', 1), -1);
1091 EXPECT_EQ(checkString.find("B", 1), 1);
1092
1093 BASE_NS::string testString2("BC");
1094 EXPECT_EQ(checkString.find(testString2), 1);
1095 EXPECT_EQ(checkString.find(testString2, 0), 1);
1096 EXPECT_EQ(checkString.find(testString2, 2), -1);
1097
1098 // ERROR?
1099 EXPECT_EQ(checkString.find(SHORT_STRING), 0);
1100 EXPECT_EQ(checkString.find(SHORT_STRING, 0), 0);
1101 EXPECT_EQ(checkString.find(SHORT_STRING, 2), -1);
1102
1103 EXPECT_EQ(checkString.find(checkString), 0);
1104 EXPECT_EQ(checkString.find(checkString, 0), 0);
1105 EXPECT_EQ(checkString.find(checkString, 2), -1);
1106
1107 EXPECT_EQ(checkString.find("F"), 5);
1108 EXPECT_EQ(checkString.find("F", 0), 5);
1109 EXPECT_EQ(checkString.find("F", 2), 5);
1110
1111 EXPECT_EQ(checkString.find("Z"), -1);
1112 EXPECT_EQ(checkString.find("Z", 0), -1);
1113 EXPECT_EQ(checkString.find("Z", 2), -1);
1114 }
1115 {
1116 BASE_NS::string checkString(SHORT_STRING);
1117 BASE_NS::string testString("A");
1118 EXPECT_EQ(checkString.rfind(testString), 0);
1119 EXPECT_EQ(checkString.rfind(testString, 0), 0);
1120 EXPECT_EQ(checkString.rfind(testString, 1), 0);
1121 EXPECT_EQ(checkString.rfind('A'), 0);
1122 EXPECT_EQ(checkString.rfind("A"), 0);
1123 EXPECT_EQ(checkString.rfind('A', 1), 0);
1124 EXPECT_EQ(checkString.rfind("B", 1), 1);
1125
1126 BASE_NS::string testString2("BC");
1127 EXPECT_EQ(checkString.rfind(testString2), 1);
1128 EXPECT_EQ(checkString.rfind(testString2, 0), -1);
1129 EXPECT_EQ(checkString.rfind(testString2, 2), 1);
1130
1131 EXPECT_EQ(checkString.rfind(SHORT_STRING), 0);
1132 EXPECT_EQ(checkString.rfind(SHORT_STRING, 0), 0);
1133 EXPECT_EQ(checkString.rfind(SHORT_STRING, 2), 0);
1134
1135 EXPECT_EQ(checkString.rfind(checkString), 0);
1136 EXPECT_EQ(checkString.rfind(checkString, 0), 0);
1137 EXPECT_EQ(checkString.rfind(checkString, 2), 0);
1138
1139 EXPECT_EQ(checkString.rfind("F"), 5);
1140 EXPECT_EQ(checkString.rfind("F", 0), -1);
1141 EXPECT_EQ(checkString.rfind("F", 2), -1);
1142
1143 EXPECT_EQ(checkString.rfind("Z"), -1);
1144 EXPECT_EQ(checkString.rfind("Z", 0), -1);
1145 EXPECT_EQ(checkString.rfind("Z", 2), -1);
1146 }
1147 {
1148 BASE_NS::string checkString(SHORT_STRING);
1149 checkString += SHORT_STRING;
1150 BASE_NS::string testString("A");
1151 EXPECT_EQ(checkString.find_first_of(testString), 0);
1152 EXPECT_EQ(checkString.find_first_of(testString, 0), 0);
1153 EXPECT_EQ(checkString.find_first_of(testString, 1), 6);
1154 EXPECT_EQ(checkString.find_first_of('A'), 0);
1155 EXPECT_EQ(checkString.find_first_of("A"), 0);
1156 EXPECT_EQ(checkString.find_first_of('A', 1), 6);
1157 EXPECT_EQ(checkString.find_first_of("B", 1), 1);
1158
1159 BASE_NS::string testString2("BC");
1160 EXPECT_EQ(checkString.find_first_of(testString2), 1);
1161 EXPECT_EQ(checkString.find_first_of(testString2, 0), 1);
1162 EXPECT_EQ(checkString.find_first_of(testString2, 2), 2); // C == C
1163 EXPECT_EQ(checkString.find_first_of(testString2, 3), 7);
1164
1165 // ERROR?
1166 EXPECT_EQ(checkString.find_first_of(SHORT_STRING), 0);
1167 EXPECT_EQ(checkString.find_first_of(SHORT_STRING, 0), 0);
1168 EXPECT_EQ(checkString.find_first_of(SHORT_STRING, 3), 3);
1169
1170 EXPECT_EQ(checkString.find_first_of(checkString), 0);
1171 EXPECT_EQ(checkString.find_first_of(checkString, 0), 0);
1172 EXPECT_EQ(checkString.find_first_of(checkString, 2), 2);
1173
1174 EXPECT_EQ(checkString.find_first_of("F"), 5);
1175 EXPECT_EQ(checkString.find_first_of("F", 0), 5);
1176 EXPECT_EQ(checkString.find_first_of("F", 2), 5);
1177
1178 EXPECT_EQ(checkString.find_first_of("Z"), -1);
1179 EXPECT_EQ(checkString.find_first_of("Z", 0), -1);
1180 EXPECT_EQ(checkString.find_first_of("Z", 2), -1);
1181 }
1182 {
1183 BASE_NS::string checkString(SHORT_STRING);
1184 checkString += SHORT_STRING;
1185 BASE_NS::string testString("A");
1186 EXPECT_EQ(checkString.find_last_of(testString), 6);
1187 EXPECT_EQ(checkString.find_last_of(testString, 0), 0);
1188 EXPECT_EQ(checkString.find_last_of(testString, 1), 0);
1189 EXPECT_EQ(checkString.find_last_of('A'), 6);
1190 EXPECT_EQ(checkString.find_last_of("A"), 6);
1191 EXPECT_EQ(checkString.find_last_of('A', 1), 0);
1192 EXPECT_EQ(checkString.find_last_of("B", 1), 1);
1193
1194 BASE_NS::string testString2("BC");
1195 EXPECT_EQ(checkString.find_last_of(testString2), 8);
1196 EXPECT_EQ(checkString.find_last_of(testString2, 0), -1);
1197 EXPECT_EQ(checkString.find_last_of(testString2, 2), 2);
1198
1199 // ERROR?
1200 EXPECT_EQ(checkString.find_last_of(SHORT_STRING), 11);
1201 EXPECT_EQ(checkString.find_last_of(SHORT_STRING, 0), 0);
1202 EXPECT_EQ(checkString.find_last_of(SHORT_STRING, 2), 2);
1203
1204 EXPECT_EQ(checkString.find_last_of(checkString), 11);
1205 EXPECT_EQ(checkString.find_last_of(checkString, 0), 0);
1206 EXPECT_EQ(checkString.find_last_of(checkString, 2), 2);
1207
1208 EXPECT_EQ(checkString.find_last_of("F"), 11);
1209 EXPECT_EQ(checkString.find_last_of("F", 0), -1);
1210 EXPECT_EQ(checkString.find_last_of("F", 2), -1);
1211
1212 EXPECT_EQ(checkString.find_last_of("AF"), 11);
1213 EXPECT_EQ(checkString.find_last_of("AF", 0), 0);
1214 EXPECT_EQ(checkString.find_last_of("AF", 2), 0);
1215
1216 EXPECT_EQ(checkString.find_last_of("Z"), -1);
1217 EXPECT_EQ(checkString.find_last_of("Z", 0), -1);
1218 EXPECT_EQ(checkString.find_last_of("Z", 2), -1);
1219 }
1220 }
1221
1222 HWTEST_F(StringTest, Upper, TestSize.Level1)
1223 {
1224 {
1225 BASE_NS::string checkString("");
1226 BASE_NS::string testString("");
1227 Compare(testString.toUpper(), checkString);
1228 testString.upper();
1229 Compare(testString, checkString);
1230 }
1231 {
1232 BASE_NS::string checkString(SHORT_STRING);
1233 BASE_NS::string testString(SHORT_STRING);
1234 Compare(testString.toUpper(), checkString);
1235 testString.upper();
1236 Compare(testString, checkString);
1237 }
1238 {
1239 BASE_NS::string checkString(SHORT_STRING);
1240 BASE_NS::string testString(SHORT_STRING_LOWERCASE);
1241 Compare(testString.toUpper(), checkString);
1242 testString.upper();
1243 Compare(testString, checkString);
1244 }
1245 {
1246 BASE_NS::string checkString(LONG_STRING);
1247 BASE_NS::string testString(LONG_STRING);
1248 Compare(testString.toUpper(), checkString);
1249 testString.upper();
1250 Compare(testString, checkString);
1251 }
1252 {
1253 BASE_NS::string checkString(LONG_STRING);
1254 BASE_NS::string testString(LONG_STRING_LOWERCASE);
1255 Compare(testString.toUpper(), checkString);
1256 testString.upper();
1257 Compare(testString, checkString);
1258 }
1259 }
1260
1261 HWTEST_F(StringTest, Lower, TestSize.Level1)
1262 {
1263 {
1264 BASE_NS::string checkString("");
1265 BASE_NS::string testString("");
1266 Compare(testString.toLower(), checkString);
1267 testString.lower();
1268 Compare(testString, checkString);
1269 }
1270 {
1271 BASE_NS::string checkString(SHORT_STRING_LOWERCASE);
1272 BASE_NS::string testString(SHORT_STRING);
1273 Compare(testString.toLower(), checkString);
1274 testString.lower();
1275 Compare(testString, checkString);
1276 }
1277 {
1278 BASE_NS::string checkString(SHORT_STRING_LOWERCASE);
1279 BASE_NS::string testString(SHORT_STRING_LOWERCASE);
1280 Compare(testString.toLower(), checkString);
1281 testString.lower();
1282 Compare(testString, checkString);
1283 }
1284 {
1285 BASE_NS::string checkString(LONG_STRING_LOWERCASE);
1286 BASE_NS::string testString(LONG_STRING);
1287 Compare(testString.toLower(), checkString);
1288 testString.lower();
1289 Compare(testString, checkString);
1290 }
1291 {
1292 BASE_NS::string checkString(LONG_STRING_LOWERCASE);
1293 BASE_NS::string testString(LONG_STRING_LOWERCASE);
1294 Compare(testString.toLower(), checkString);
1295 testString.lower();
1296 Compare(testString, checkString);
1297 }
1298 }
1299
1300 HWTEST_F(StringTest, OperatorPlus, TestSize.Level1)
1301 {
1302 {
1303 BASE_NS::string testString("");
1304 BASE_NS::string checkString("A");
1305 testString = testString + 'A';
1306 Compare(testString, checkString);
1307 }
1308 {
1309 BASE_NS::string testString("");
1310 BASE_NS::string checkString("A");
1311 testString = 'A' + testString;
1312 Compare(testString, checkString);
1313 }
1314 {
1315 BASE_NS::string testString("");
1316 BASE_NS::string checkString(SHORT_STRING);
1317 testString = testString + SHORT_STRING;
1318 Compare(testString, checkString);
1319 }
1320 {
1321 BASE_NS::string testString("");
1322 BASE_NS::string checkString(SHORT_STRING);
1323 testString = SHORT_STRING + testString;
1324 Compare(testString, checkString);
1325 }
1326 {
1327 BASE_NS::string testString("");
1328 BASE_NS::string_view stringViewA("A");
1329 BASE_NS::string_view stringViewB("B");
1330 BASE_NS::string checkString("AB");
1331 testString = stringViewA + stringViewB;
1332 Compare(testString, checkString);
1333 }
1334 {
1335 BASE_NS::string testString("");
1336 BASE_NS::string_view stringViewA("A");
1337 BASE_NS::string checkString("AB");
1338 testString = stringViewA + 'B';
1339 Compare(testString, checkString);
1340 }
1341 {
1342 BASE_NS::string testString("");
1343 BASE_NS::string_view stringViewB("B");
1344 BASE_NS::string checkString("AB");
1345 testString = 'A' + stringViewB;
1346 Compare(testString, checkString);
1347 }
1348 {
1349 BASE_NS::string testString("");
1350 BASE_NS::string stringA("A");
1351 BASE_NS::string stringB("B");
1352 BASE_NS::string checkString("AABB");
1353 testString = (stringA + stringA) + (stringB + stringB);
1354 Compare(testString, checkString);
1355 }
1356 {
1357 BASE_NS::string testString("");
1358 BASE_NS::string stringA("A");
1359 BASE_NS::string checkString("AABB");
1360 testString = (stringA + stringA) + "BB";
1361 Compare(testString, checkString);
1362 }
1363 {
1364 BASE_NS::string testString("");
1365 BASE_NS::string stringA("A");
1366 BASE_NS::string checkString("AABB");
1367 testString = (stringA + stringA) + 'B' + 'B';
1368 Compare(testString, checkString);
1369 }
1370 {
1371 BASE_NS::string testString("");
1372 BASE_NS::string stringB("B");
1373 BASE_NS::string checkString("AABB");
1374 testString = "AA" + (stringB + stringB);
1375 Compare(testString, checkString);
1376 }
1377 {
1378 BASE_NS::string testString("");
1379 BASE_NS::string stringB("B");
1380 BASE_NS::string checkString("AABB");
1381 testString = 'A' + ('A' + (stringB + stringB));
1382 Compare(testString, checkString);
1383 }
1384 }
1385
1386 HWTEST_F(StringTest, Substr, TestSize.Level1)
1387 {
1388 static constexpr BASE_NS::string_view file = "file";
1389 static constexpr BASE_NS::string_view suffix = ".ext";
1390
1391 // substr from beginning
1392 {
1393 BASE_NS::string path = file + suffix;
1394
1395 BASE_NS::string path2;
1396 path2 = path.substr(0, path.length() - suffix.length());
1397 EXPECT_EQ(file, path2);
1398 // BASE_NS::string path3 = path.substr(0, path.length() - suffix.length())); // no go, missing operator..
1399 BASE_NS::string path3(path.substr(0, path.length() - suffix.length()));
1400 EXPECT_EQ(file, path3);
1401 path = path.substr(0, path.length() - suffix.length());
1402 EXPECT_EQ(file, path);
1403 }
1404 // substr from end
1405 {
1406 BASE_NS::string path = file + suffix;
1407
1408 BASE_NS::string path2;
1409 path2 = path.substr(path.length() - suffix.length(), suffix.length());
1410 EXPECT_EQ(suffix, path2);
1411 BASE_NS::string path3(path.substr(path.length() - suffix.length(), suffix.length()));
1412 EXPECT_EQ(suffix, path3);
1413 path = path.substr(path.length() - suffix.length(), suffix.length());
1414 EXPECT_EQ(suffix, path);
1415 }
1416 // substr overlap
1417 {
1418 BASE_NS::string path = file + suffix;
1419
1420 path = path.substr(1, path.length() - suffix.length() - 1);
1421 EXPECT_EQ(file.substr(1, BASE_NS::string_view::npos), path);
1422 }
1423 }
1424
1425 HWTEST_F(StringTest, StartsWith, TestSize.Level1)
1426 {
1427 BASE_NS::string checkString(SHORT_STRING);
1428 EXPECT_TRUE(checkString.starts_with(BASE_NS::string_view("A")));
1429 EXPECT_TRUE(checkString.starts_with("A"));
1430 EXPECT_TRUE(checkString.starts_with('A'));
1431 EXPECT_TRUE(checkString.starts_with(BASE_NS::string_view("ABC")));
1432 EXPECT_TRUE(checkString.starts_with("ABC"));
1433 EXPECT_FALSE(checkString.starts_with(BASE_NS::string_view("ABCDEFG")));
1434 EXPECT_FALSE(checkString.starts_with("ABCDEFG"));
1435 EXPECT_FALSE(checkString.starts_with(BASE_NS::string_view("AbC")));
1436 EXPECT_FALSE(checkString.starts_with("AbC"));
1437 EXPECT_FALSE(checkString.starts_with(BASE_NS::string_view("B")));
1438 EXPECT_FALSE(checkString.starts_with("B"));
1439 EXPECT_FALSE(checkString.starts_with('B'));
1440 }
1441
1442 HWTEST_F(StringTest, EndssWith, TestSize.Level1)
1443 {
1444 BASE_NS::string checkString(SHORT_STRING);
1445 EXPECT_TRUE(checkString.ends_with(BASE_NS::string_view("F")));
1446 EXPECT_TRUE(checkString.ends_with("F"));
1447 EXPECT_TRUE(checkString.ends_with('F'));
1448 EXPECT_TRUE(checkString.ends_with(BASE_NS::string_view("DEF")));
1449 EXPECT_TRUE(checkString.ends_with("DEF"));
1450 EXPECT_FALSE(checkString.ends_with(BASE_NS::string_view("ABCDEFG")));
1451 EXPECT_FALSE(checkString.ends_with("ABCDEFG"));
1452 EXPECT_FALSE(checkString.ends_with(BASE_NS::string_view("DeF")));
1453 EXPECT_FALSE(checkString.ends_with("DeF"));
1454 EXPECT_FALSE(checkString.ends_with(BASE_NS::string_view("E")));
1455 EXPECT_FALSE(checkString.ends_with("E"));
1456 EXPECT_FALSE(checkString.ends_with('E'));
1457 }
1458
1459 HWTEST_F(StringTest, EndsWith_substring, TestSize.Level1)
1460 {
1461 BASE_NS::string fullString = "hello world!";
1462 auto substring = fullString.substr(6, 5);
1463 ASSERT_EQ(substring, "world");
1464
1465 ASSERT_TRUE(substring.ends_with('d'));
1466 ASSERT_FALSE(substring.ends_with('l'));
1467 ASSERT_FALSE(substring.ends_with('!'));
1468
1469 ASSERT_TRUE(substring.ends_with("d"));
1470 ASSERT_FALSE(substring.ends_with("l"));
1471 ASSERT_FALSE(substring.ends_with("!"));
1472 }
1473
1474 HWTEST_F(StringTest, EndsWith_substring_out_of_bounds, TestSize.Level1)
1475 {
1476 BASE_NS::string fullString = "hello world here";
1477 auto substring = fullString.substr(6, 5);
1478 ASSERT_EQ(substring, "world");
1479
1480 ASSERT_TRUE(substring.ends_with("world"));
1481 ASSERT_TRUE(substring.ends_with("rld"));
1482 ASSERT_TRUE(substring.ends_with("d"));
1483 ASSERT_TRUE(substring.ends_with(""));
1484
1485 ASSERT_FALSE(substring.ends_with(" "));
1486 ASSERT_FALSE(substring.ends_with("d "));
1487 ASSERT_FALSE(substring.ends_with("d here"));
1488
1489 ASSERT_FALSE(substring.ends_with(" world"));
1490 ASSERT_FALSE(substring.ends_with("hello world"));
1491 }
1492
1493 HWTEST_F(StringTest, EndsWith_string, TestSize.Level1)
1494 {
1495 BASE_NS::string testString = "world";
1496
1497 ASSERT_TRUE(testString.ends_with('d'));
1498 ASSERT_FALSE(testString.ends_with('l'));
1499 ASSERT_FALSE(testString.ends_with('\0'));
1500
1501 ASSERT_TRUE(testString.ends_with("d"));
1502 ASSERT_FALSE(testString.ends_with("l"));
1503 }
1504 HWTEST_F(StringTest, UserDefinedLiteral_QualifiedNamespace, TestSize.Level1)
1505 {
1506 using namespace BASE_NS::literals::string_literals;
1507 auto myString = "hello"_s;
1508 static_assert(BASE_NS::is_same_v<BASE_NS::string, decltype(myString)>);
1509 ASSERT_STREQ("hello", myString.c_str());
1510 }
1511
1512 HWTEST_F(StringTest, UserDefinedLiteral, TestSize.Level1)
1513 {
1514 using namespace BASE_NS::literals;
1515 auto myString = "hello"_s;
1516 static_assert(BASE_NS::is_same_v<BASE_NS::string, decltype(myString)>);
1517 ASSERT_STREQ("hello", myString.c_str());
1518 }
1519
1520 HWTEST_F(StringTest, UserDefinedLiteral_zeroBytes, TestSize.Level1)
1521 {
1522 using namespace BASE_NS::literals;
1523 auto myString = "hel\0lo"_s;
1524 static_assert(BASE_NS::is_same_v<BASE_NS::string, decltype(myString)>);
1525 ASSERT_EQ(6, myString.size());
1526 ASSERT_EQ(BASE_NS::string("hel\0lo", 6), myString);
1527 ASSERT_STREQ("hel", myString.c_str());
1528 }
1529