• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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