xref: /aosp_15_r20/external/openthread/tests/unit/test_string.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2018, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker  *  All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker  *
5*cfb92d14SAndroid Build Coastguard Worker  *  Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker  *  modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker  *  1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker  *  2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker  *     documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker  *  3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker  *     names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker  *     derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker  *
16*cfb92d14SAndroid Build Coastguard Worker  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker  *  POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker  */
28*cfb92d14SAndroid Build Coastguard Worker 
29*cfb92d14SAndroid Build Coastguard Worker #include "test_platform.h"
30*cfb92d14SAndroid Build Coastguard Worker 
31*cfb92d14SAndroid Build Coastguard Worker #include <openthread/config.h>
32*cfb92d14SAndroid Build Coastguard Worker 
33*cfb92d14SAndroid Build Coastguard Worker #include "test_util.h"
34*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
35*cfb92d14SAndroid Build Coastguard Worker #include "common/string.hpp"
36*cfb92d14SAndroid Build Coastguard Worker 
37*cfb92d14SAndroid Build Coastguard Worker namespace ot {
38*cfb92d14SAndroid Build Coastguard Worker 
39*cfb92d14SAndroid Build Coastguard Worker enum
40*cfb92d14SAndroid Build Coastguard Worker {
41*cfb92d14SAndroid Build Coastguard Worker     kStringSize = 10,
42*cfb92d14SAndroid Build Coastguard Worker };
43*cfb92d14SAndroid Build Coastguard Worker 
PrintString(const char * aName,const String<kSize> aString)44*cfb92d14SAndroid Build Coastguard Worker template <uint16_t kSize> void PrintString(const char *aName, const String<kSize> aString)
45*cfb92d14SAndroid Build Coastguard Worker {
46*cfb92d14SAndroid Build Coastguard Worker     printf("\t%s = [%zu] \"%s\"\n", aName, strlen(aString.AsCString()), aString.AsCString());
47*cfb92d14SAndroid Build Coastguard Worker }
48*cfb92d14SAndroid Build Coastguard Worker 
TestStringWriter(void)49*cfb92d14SAndroid Build Coastguard Worker void TestStringWriter(void)
50*cfb92d14SAndroid Build Coastguard Worker {
51*cfb92d14SAndroid Build Coastguard Worker     String<kStringSize> str;
52*cfb92d14SAndroid Build Coastguard Worker     const char          kLongString[] = "abcdefghijklmnopqratuvwxyzabcdefghijklmnopqratuvwxyz";
53*cfb92d14SAndroid Build Coastguard Worker 
54*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 1: StringWriter constructor\n");
55*cfb92d14SAndroid Build Coastguard Worker 
56*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(str.GetSize() == kStringSize);
57*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(str.GetLength() == 0, "failed for empty string");
58*cfb92d14SAndroid Build Coastguard Worker 
59*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(str.AsCString(), "") == 0);
60*cfb92d14SAndroid Build Coastguard Worker 
61*cfb92d14SAndroid Build Coastguard Worker     PrintString("str", str);
62*cfb92d14SAndroid Build Coastguard Worker 
63*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
64*cfb92d14SAndroid Build Coastguard Worker 
65*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 2: StringWriter::Append() method\n");
66*cfb92d14SAndroid Build Coastguard Worker 
67*cfb92d14SAndroid Build Coastguard Worker     str.Append("Hi");
68*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(str.GetLength() == 2);
69*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(str.AsCString(), "Hi") == 0);
70*cfb92d14SAndroid Build Coastguard Worker     PrintString("str", str);
71*cfb92d14SAndroid Build Coastguard Worker 
72*cfb92d14SAndroid Build Coastguard Worker     str.Append("%s%d", "!", 12);
73*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(str.GetLength() == 5);
74*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(str.AsCString(), "Hi!12") == 0);
75*cfb92d14SAndroid Build Coastguard Worker     PrintString("str", str);
76*cfb92d14SAndroid Build Coastguard Worker 
77*cfb92d14SAndroid Build Coastguard Worker     str.Append(kLongString);
78*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(str.IsTruncated() && str.GetLength() == 5 + sizeof(kLongString) - 1,
79*cfb92d14SAndroid Build Coastguard Worker                  "String::Append() did not handle overflow buffer correctly");
80*cfb92d14SAndroid Build Coastguard Worker     PrintString("str", str);
81*cfb92d14SAndroid Build Coastguard Worker 
82*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 3: StringWriter::Clear() method\n");
83*cfb92d14SAndroid Build Coastguard Worker 
84*cfb92d14SAndroid Build Coastguard Worker     str.Clear();
85*cfb92d14SAndroid Build Coastguard Worker     str.Append("Hello");
86*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(str.GetLength() == 5);
87*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(str.AsCString(), "Hello") == 0);
88*cfb92d14SAndroid Build Coastguard Worker     PrintString("str", str);
89*cfb92d14SAndroid Build Coastguard Worker 
90*cfb92d14SAndroid Build Coastguard Worker     str.Clear();
91*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(str.GetLength() == 0, "failed after Clear()");
92*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(str.AsCString(), "") == 0);
93*cfb92d14SAndroid Build Coastguard Worker 
94*cfb92d14SAndroid Build Coastguard Worker     str.Append("%d", 12);
95*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(str.GetLength() == 2);
96*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(str.AsCString(), "12") == 0);
97*cfb92d14SAndroid Build Coastguard Worker     PrintString("str", str);
98*cfb92d14SAndroid Build Coastguard Worker 
99*cfb92d14SAndroid Build Coastguard Worker     str.Clear();
100*cfb92d14SAndroid Build Coastguard Worker     str.Append(kLongString);
101*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(str.IsTruncated() && str.GetLength() == sizeof(kLongString) - 1,
102*cfb92d14SAndroid Build Coastguard Worker                  "String::Clear() + String::Append() did not handle overflow buffer correctly");
103*cfb92d14SAndroid Build Coastguard Worker     PrintString("str", str);
104*cfb92d14SAndroid Build Coastguard Worker 
105*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
106*cfb92d14SAndroid Build Coastguard Worker }
107*cfb92d14SAndroid Build Coastguard Worker 
TestStringLength(void)108*cfb92d14SAndroid Build Coastguard Worker void TestStringLength(void)
109*cfb92d14SAndroid Build Coastguard Worker {
110*cfb92d14SAndroid Build Coastguard Worker     char string_a[5] = "\0foo";
111*cfb92d14SAndroid Build Coastguard Worker     char string_b[8] = "foo\0bar";
112*cfb92d14SAndroid Build Coastguard Worker 
113*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 4: String::StringLength() method\n");
114*cfb92d14SAndroid Build Coastguard Worker 
115*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_a, 0) == 0);
116*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_a, 1) == 0);
117*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_a, 2) == 0);
118*cfb92d14SAndroid Build Coastguard Worker 
119*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_b, 0) == 0);
120*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_b, 1) == 1);
121*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_b, 2) == 2);
122*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_b, 3) == 3);
123*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_b, 4) == 3);
124*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_b, 5) == 3);
125*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringLength(string_b, 6) == 3);
126*cfb92d14SAndroid Build Coastguard Worker 
127*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
128*cfb92d14SAndroid Build Coastguard Worker }
129*cfb92d14SAndroid Build Coastguard Worker 
TestUtf8(void)130*cfb92d14SAndroid Build Coastguard Worker void TestUtf8(void)
131*cfb92d14SAndroid Build Coastguard Worker {
132*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 5: IsValidUtf8String() function\n");
133*cfb92d14SAndroid Build Coastguard Worker 
134*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(IsValidUtf8String("An ASCII string"));
135*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(IsValidUtf8String(u8"Строка UTF-8"));
136*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsValidUtf8String("\xbf"));
137*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsValidUtf8String("\xdf"));
138*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsValidUtf8String("\xef\x80"));
139*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsValidUtf8String("\xf7\x80\x80"));
140*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsValidUtf8String("\xff"));
141*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsValidUtf8String("NUL\x00NUL", 7)); // UTF-8 NUL
142*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsValidUtf8String("abcde\x11"));     // control character
143*cfb92d14SAndroid Build Coastguard Worker 
144*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
145*cfb92d14SAndroid Build Coastguard Worker }
146*cfb92d14SAndroid Build Coastguard Worker 
TestStringFind(void)147*cfb92d14SAndroid Build Coastguard Worker void TestStringFind(void)
148*cfb92d14SAndroid Build Coastguard Worker {
149*cfb92d14SAndroid Build Coastguard Worker     char emptyString[1] = {'\0'};
150*cfb92d14SAndroid Build Coastguard Worker     char testString[]   = "Foo.bar.bar\\.";
151*cfb92d14SAndroid Build Coastguard Worker     char testString2[]  = "abcabcabcdabc";
152*cfb92d14SAndroid Build Coastguard Worker 
153*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 6: StringFind() function\n");
154*cfb92d14SAndroid Build Coastguard Worker 
155*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, 'F') == testString);
156*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, 'o') == &testString[1]);
157*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, '.') == &testString[3]);
158*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, 'r') == &testString[6]);
159*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, '\\') == &testString[11]);
160*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, 'x') == nullptr);
161*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, ',') == nullptr);
162*cfb92d14SAndroid Build Coastguard Worker 
163*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(emptyString, 'F') == nullptr);
164*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(emptyString, '.') == nullptr);
165*cfb92d14SAndroid Build Coastguard Worker 
166*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "Foo") == &testString[0]);
167*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "oo") == &testString[1]);
168*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "bar") == &testString[4]);
169*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "bar\\") == &testString[8]);
170*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "\\.") == &testString[11]);
171*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, testString) == testString);
172*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "Fooo") == nullptr);
173*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "Far") == nullptr);
174*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "FOO") == nullptr);
175*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "BAR") == nullptr);
176*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "bar\\..") == nullptr);
177*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "") == &testString[0]);
178*cfb92d14SAndroid Build Coastguard Worker 
179*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(emptyString, "foo") == nullptr);
180*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(emptyString, "bar") == nullptr);
181*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(emptyString, "") == &emptyString[0]);
182*cfb92d14SAndroid Build Coastguard Worker 
183*cfb92d14SAndroid Build Coastguard Worker     // Verify when sub-string has repeated patterns
184*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString2, "abcabc") == &testString2[0]);
185*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString2, "abcabcd") == &testString2[3]);
186*cfb92d14SAndroid Build Coastguard Worker 
187*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "FOO", kStringCaseInsensitiveMatch) == &testString[0]);
188*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "OO", kStringCaseInsensitiveMatch) == &testString[1]);
189*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "BAR", kStringCaseInsensitiveMatch) == &testString[4]);
190*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "BAR\\", kStringCaseInsensitiveMatch) == &testString[8]);
191*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "\\.", kStringCaseInsensitiveMatch) == &testString[11]);
192*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, testString) == testString);
193*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "FOOO", kStringCaseInsensitiveMatch) == nullptr);
194*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "FAR", kStringCaseInsensitiveMatch) == nullptr);
195*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "BAR\\..", kStringCaseInsensitiveMatch) == nullptr);
196*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString, "", kStringCaseInsensitiveMatch) == &testString[0]);
197*cfb92d14SAndroid Build Coastguard Worker 
198*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(emptyString, "FOO", kStringCaseInsensitiveMatch) == nullptr);
199*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(emptyString, "BAR", kStringCaseInsensitiveMatch) == nullptr);
200*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(emptyString, "", kStringCaseInsensitiveMatch) == &emptyString[0]);
201*cfb92d14SAndroid Build Coastguard Worker 
202*cfb92d14SAndroid Build Coastguard Worker     // Verify when sub-string has repeated patterns
203*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString2, "ABCABC", kStringCaseInsensitiveMatch) == &testString2[0]);
204*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringFind(testString2, "ABCABCD", kStringCaseInsensitiveMatch) == &testString2[3]);
205*cfb92d14SAndroid Build Coastguard Worker 
206*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
207*cfb92d14SAndroid Build Coastguard Worker }
208*cfb92d14SAndroid Build Coastguard Worker 
TestStringStartsWith(void)209*cfb92d14SAndroid Build Coastguard Worker void TestStringStartsWith(void)
210*cfb92d14SAndroid Build Coastguard Worker {
211*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 7: StringStartsWith() function\n");
212*cfb92d14SAndroid Build Coastguard Worker 
213*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringStartsWith("FooBar", "Foo"));
214*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringStartsWith("FooBar", "Ba"));
215*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringStartsWith("FooBar", "FooBar"));
216*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringStartsWith("FooBar", "FooBarr"));
217*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringStartsWith("FooBar", "foo"));
218*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringStartsWith("FooBar", "FoO"));
219*cfb92d14SAndroid Build Coastguard Worker 
220*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringStartsWith("", "foo"));
221*cfb92d14SAndroid Build Coastguard Worker 
222*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringStartsWith("FooBar", "FOO", kStringCaseInsensitiveMatch));
223*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringStartsWith("FooBar", "BA", kStringCaseInsensitiveMatch));
224*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringStartsWith("FooBar", "FOOBAR", kStringCaseInsensitiveMatch));
225*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringStartsWith("FooBar", "FooBarr", kStringCaseInsensitiveMatch));
226*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringStartsWith("FooBar", "foO", kStringCaseInsensitiveMatch));
227*cfb92d14SAndroid Build Coastguard Worker 
228*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringStartsWith("", "foo", kStringCaseInsensitiveMatch));
229*cfb92d14SAndroid Build Coastguard Worker 
230*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
231*cfb92d14SAndroid Build Coastguard Worker }
232*cfb92d14SAndroid Build Coastguard Worker 
TestStringEndsWith(void)233*cfb92d14SAndroid Build Coastguard Worker void TestStringEndsWith(void)
234*cfb92d14SAndroid Build Coastguard Worker {
235*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 8: StringEndsWith() function\n");
236*cfb92d14SAndroid Build Coastguard Worker 
237*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringEndsWith("FooBar", 'r'));
238*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("FooBar", 'a'));
239*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("FooBar", '\0'));
240*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringEndsWith("a", 'a'));
241*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("a", 'b'));
242*cfb92d14SAndroid Build Coastguard Worker 
243*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringEndsWith("FooBar", "Bar"));
244*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("FooBar", "Ba"));
245*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringEndsWith("FooBar", "FooBar"));
246*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("FooBar", "FooBarr"));
247*cfb92d14SAndroid Build Coastguard Worker 
248*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("", 'a'));
249*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("", "foo"));
250*cfb92d14SAndroid Build Coastguard Worker 
251*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringEndsWith("FooBar", "baR", kStringCaseInsensitiveMatch));
252*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("FooBar", "bA", kStringCaseInsensitiveMatch));
253*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringEndsWith("FooBar", "fOOBar", kStringCaseInsensitiveMatch));
254*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("FooBar", "Foobarr", kStringCaseInsensitiveMatch));
255*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringEndsWith("", "Foo", kStringCaseInsensitiveMatch));
256*cfb92d14SAndroid Build Coastguard Worker 
257*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
258*cfb92d14SAndroid Build Coastguard Worker }
259*cfb92d14SAndroid Build Coastguard Worker 
TestStringMatch(void)260*cfb92d14SAndroid Build Coastguard Worker void TestStringMatch(void)
261*cfb92d14SAndroid Build Coastguard Worker {
262*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 9: StringMatch() function\n");
263*cfb92d14SAndroid Build Coastguard Worker 
264*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch("", ""));
265*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch("FooBar", "FooBar"));
266*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringMatch("FooBar", "FooBa"));
267*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringMatch("FooBa", "FooBar"));
268*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringMatch("FooBa", "FooBar"));
269*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringMatch("FooBar", "fooBar"));
270*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringMatch("FooBaR", "FooBar"));
271*cfb92d14SAndroid Build Coastguard Worker 
272*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch("", "", kStringCaseInsensitiveMatch));
273*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch("FooBar", "fOObAR", kStringCaseInsensitiveMatch));
274*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringMatch("FooBar", "fOObA", kStringCaseInsensitiveMatch));
275*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringMatch("FooBa", "FooBar", kStringCaseInsensitiveMatch));
276*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringMatch("FooBa", "FooBar", kStringCaseInsensitiveMatch));
277*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!StringMatch("Fooba", "fooBar", kStringCaseInsensitiveMatch));
278*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch("FooBar", "FOOBAR", kStringCaseInsensitiveMatch));
279*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch("FoobaR", "FooBar", kStringCaseInsensitiveMatch));
280*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch("FOOBAR", "foobar", kStringCaseInsensitiveMatch));
281*cfb92d14SAndroid Build Coastguard Worker 
282*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
283*cfb92d14SAndroid Build Coastguard Worker }
284*cfb92d14SAndroid Build Coastguard Worker 
TestStringToLowercase(void)285*cfb92d14SAndroid Build Coastguard Worker void TestStringToLowercase(void)
286*cfb92d14SAndroid Build Coastguard Worker {
287*cfb92d14SAndroid Build Coastguard Worker     const uint16_t kMaxSize = 100;
288*cfb92d14SAndroid Build Coastguard Worker 
289*cfb92d14SAndroid Build Coastguard Worker     const char kTestString[]      = "!@#$%^&*()_+=[].,<>//;:\"'`~ \t\r\n";
290*cfb92d14SAndroid Build Coastguard Worker     const char kUppercaseString[] = "ABCDEFGHIJKLMNOPQRATUVWXYZABCDEFGHIJKLMNOPQRATUVWXYZ";
291*cfb92d14SAndroid Build Coastguard Worker     const char kLowercaseString[] = "abcdefghijklmnopqratuvwxyzabcdefghijklmnopqratuvwxyz";
292*cfb92d14SAndroid Build Coastguard Worker 
293*cfb92d14SAndroid Build Coastguard Worker     char string[kMaxSize];
294*cfb92d14SAndroid Build Coastguard Worker 
295*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 10: StringConvertToLowercase() function\n");
296*cfb92d14SAndroid Build Coastguard Worker 
297*cfb92d14SAndroid Build Coastguard Worker     memcpy(string, kTestString, sizeof(kTestString));
298*cfb92d14SAndroid Build Coastguard Worker     StringConvertToLowercase(string);
299*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(string, kTestString, sizeof(kTestString)) == 0);
300*cfb92d14SAndroid Build Coastguard Worker     StringConvertToUppercase(string);
301*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(string, kTestString, sizeof(kTestString)) == 0);
302*cfb92d14SAndroid Build Coastguard Worker 
303*cfb92d14SAndroid Build Coastguard Worker     memcpy(string, kUppercaseString, sizeof(kUppercaseString));
304*cfb92d14SAndroid Build Coastguard Worker     StringConvertToLowercase(string);
305*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(string, kLowercaseString, sizeof(kLowercaseString)) == 0);
306*cfb92d14SAndroid Build Coastguard Worker     StringConvertToUppercase(string);
307*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(string, kUppercaseString, sizeof(kUppercaseString)) == 0);
308*cfb92d14SAndroid Build Coastguard Worker 
309*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
310*cfb92d14SAndroid Build Coastguard Worker }
311*cfb92d14SAndroid Build Coastguard Worker 
TestStringParseUint8(void)312*cfb92d14SAndroid Build Coastguard Worker void TestStringParseUint8(void)
313*cfb92d14SAndroid Build Coastguard Worker {
314*cfb92d14SAndroid Build Coastguard Worker     struct TestCase
315*cfb92d14SAndroid Build Coastguard Worker     {
316*cfb92d14SAndroid Build Coastguard Worker         const char *mString;
317*cfb92d14SAndroid Build Coastguard Worker         Error       mError;
318*cfb92d14SAndroid Build Coastguard Worker         uint8_t     mExpectedValue;
319*cfb92d14SAndroid Build Coastguard Worker         uint16_t    mParsedLength;
320*cfb92d14SAndroid Build Coastguard Worker     };
321*cfb92d14SAndroid Build Coastguard Worker 
322*cfb92d14SAndroid Build Coastguard Worker     static const TestCase kTestCases[] = {
323*cfb92d14SAndroid Build Coastguard Worker         {"0", kErrorNone, 0, 1},
324*cfb92d14SAndroid Build Coastguard Worker         {"1", kErrorNone, 1, 1},
325*cfb92d14SAndroid Build Coastguard Worker         {"12", kErrorNone, 12, 2},
326*cfb92d14SAndroid Build Coastguard Worker         {"91", kErrorNone, 91, 2},
327*cfb92d14SAndroid Build Coastguard Worker         {"200", kErrorNone, 200, 3},
328*cfb92d14SAndroid Build Coastguard Worker         {"00000", kErrorNone, 0, 5},
329*cfb92d14SAndroid Build Coastguard Worker         {"00000255", kErrorNone, 255, 8},
330*cfb92d14SAndroid Build Coastguard Worker         {"2 00", kErrorNone, 2, 1},
331*cfb92d14SAndroid Build Coastguard Worker         {"77a12", kErrorNone, 77, 2},
332*cfb92d14SAndroid Build Coastguard Worker         {"", kErrorParse},     // Does not start with digit char ['0'-'9']
333*cfb92d14SAndroid Build Coastguard Worker         {"a12", kErrorParse},  // Does not start with digit char ['0'-'9']
334*cfb92d14SAndroid Build Coastguard Worker         {" 12", kErrorParse},  // Does not start with digit char ['0'-'9']
335*cfb92d14SAndroid Build Coastguard Worker         {"256", kErrorParse},  // Larger than max `uint8_t`
336*cfb92d14SAndroid Build Coastguard Worker         {"1000", kErrorParse}, // Larger than max `uint8_t`
337*cfb92d14SAndroid Build Coastguard Worker         {"0256", kErrorParse}, // Larger than max `uint8_t`
338*cfb92d14SAndroid Build Coastguard Worker     };
339*cfb92d14SAndroid Build Coastguard Worker 
340*cfb92d14SAndroid Build Coastguard Worker     uint8_t digit;
341*cfb92d14SAndroid Build Coastguard Worker 
342*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 11: TestStringParseUint8() function\n");
343*cfb92d14SAndroid Build Coastguard Worker 
344*cfb92d14SAndroid Build Coastguard Worker     for (const TestCase &testCase : kTestCases)
345*cfb92d14SAndroid Build Coastguard Worker     {
346*cfb92d14SAndroid Build Coastguard Worker         const char *string = testCase.mString;
347*cfb92d14SAndroid Build Coastguard Worker         Error       error;
348*cfb92d14SAndroid Build Coastguard Worker         uint8_t     u8;
349*cfb92d14SAndroid Build Coastguard Worker 
350*cfb92d14SAndroid Build Coastguard Worker         error = StringParseUint8(string, u8);
351*cfb92d14SAndroid Build Coastguard Worker 
352*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(error == testCase.mError);
353*cfb92d14SAndroid Build Coastguard Worker 
354*cfb92d14SAndroid Build Coastguard Worker         if (testCase.mError == kErrorNone)
355*cfb92d14SAndroid Build Coastguard Worker         {
356*cfb92d14SAndroid Build Coastguard Worker             printf("\n%-10s -> %-3u (expect: %-3u), len:%u (expect:%u)", testCase.mString, u8, testCase.mExpectedValue,
357*cfb92d14SAndroid Build Coastguard Worker                    static_cast<uint8_t>(string - testCase.mString), testCase.mParsedLength);
358*cfb92d14SAndroid Build Coastguard Worker 
359*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(u8 == testCase.mExpectedValue);
360*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(string - testCase.mString == testCase.mParsedLength);
361*cfb92d14SAndroid Build Coastguard Worker         }
362*cfb92d14SAndroid Build Coastguard Worker         else
363*cfb92d14SAndroid Build Coastguard Worker         {
364*cfb92d14SAndroid Build Coastguard Worker             printf("\n%-10s -> kErrorParse", testCase.mString);
365*cfb92d14SAndroid Build Coastguard Worker         }
366*cfb92d14SAndroid Build Coastguard Worker     }
367*cfb92d14SAndroid Build Coastguard Worker 
368*cfb92d14SAndroid Build Coastguard Worker     for (char c = '0'; c <= '9'; c++)
369*cfb92d14SAndroid Build Coastguard Worker     {
370*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(IsDigit(c));
371*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!IsUppercase(c));
372*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!IsLowercase(c));
373*cfb92d14SAndroid Build Coastguard Worker 
374*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(ParseDigit(c, digit));
375*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(digit == (c - '0'));
376*cfb92d14SAndroid Build Coastguard Worker 
377*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(ParseHexDigit(c, digit));
378*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(digit == (c - '0'));
379*cfb92d14SAndroid Build Coastguard Worker     }
380*cfb92d14SAndroid Build Coastguard Worker 
381*cfb92d14SAndroid Build Coastguard Worker     for (char c = 'A'; c <= 'Z'; c++)
382*cfb92d14SAndroid Build Coastguard Worker     {
383*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!IsDigit(c));
384*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(IsUppercase(c));
385*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!IsLowercase(c));
386*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(ParseDigit(c, digit) != kErrorNone);
387*cfb92d14SAndroid Build Coastguard Worker 
388*cfb92d14SAndroid Build Coastguard Worker         if (c <= 'F')
389*cfb92d14SAndroid Build Coastguard Worker         {
390*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(ParseHexDigit(c, digit));
391*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(digit == (c - 'A' + 10));
392*cfb92d14SAndroid Build Coastguard Worker         }
393*cfb92d14SAndroid Build Coastguard Worker         else
394*cfb92d14SAndroid Build Coastguard Worker         {
395*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(ParseHexDigit(c, digit) != kErrorNone);
396*cfb92d14SAndroid Build Coastguard Worker         }
397*cfb92d14SAndroid Build Coastguard Worker     }
398*cfb92d14SAndroid Build Coastguard Worker 
399*cfb92d14SAndroid Build Coastguard Worker     for (char c = 'a'; c <= 'z'; c++)
400*cfb92d14SAndroid Build Coastguard Worker     {
401*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!IsDigit(c));
402*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!IsUppercase(c));
403*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(IsLowercase(c));
404*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(ParseDigit(c, digit) != kErrorNone);
405*cfb92d14SAndroid Build Coastguard Worker 
406*cfb92d14SAndroid Build Coastguard Worker         if (c <= 'f')
407*cfb92d14SAndroid Build Coastguard Worker         {
408*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(ParseHexDigit(c, digit));
409*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(digit == (c - 'a' + 10));
410*cfb92d14SAndroid Build Coastguard Worker         }
411*cfb92d14SAndroid Build Coastguard Worker         else
412*cfb92d14SAndroid Build Coastguard Worker         {
413*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(ParseHexDigit(c, digit) != kErrorNone);
414*cfb92d14SAndroid Build Coastguard Worker         }
415*cfb92d14SAndroid Build Coastguard Worker     }
416*cfb92d14SAndroid Build Coastguard Worker 
417*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsDigit(static_cast<char>('0' - 1)));
418*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsDigit(static_cast<char>('9' + 1)));
419*cfb92d14SAndroid Build Coastguard Worker 
420*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsUppercase(static_cast<char>('A' - 1)));
421*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsUppercase(static_cast<char>('Z' + 1)));
422*cfb92d14SAndroid Build Coastguard Worker 
423*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsLowercase(static_cast<char>('a' - 1)));
424*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!IsLowercase(static_cast<char>('z' + 1)));
425*cfb92d14SAndroid Build Coastguard Worker 
426*cfb92d14SAndroid Build Coastguard Worker     printf("\n\n -- PASS\n");
427*cfb92d14SAndroid Build Coastguard Worker }
428*cfb92d14SAndroid Build Coastguard Worker 
TestStringCopy(void)429*cfb92d14SAndroid Build Coastguard Worker void TestStringCopy(void)
430*cfb92d14SAndroid Build Coastguard Worker {
431*cfb92d14SAndroid Build Coastguard Worker     char buffer[10];
432*cfb92d14SAndroid Build Coastguard Worker     char smallBuffer[1];
433*cfb92d14SAndroid Build Coastguard Worker 
434*cfb92d14SAndroid Build Coastguard Worker     printf("\nTest 11: StringCopy() function\n");
435*cfb92d14SAndroid Build Coastguard Worker 
436*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(StringCopy(buffer, "foo", kStringCheckUtf8Encoding));
437*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch(buffer, "foo"));
438*cfb92d14SAndroid Build Coastguard Worker 
439*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(StringCopy(buffer, nullptr, kStringCheckUtf8Encoding));
440*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch(buffer, ""));
441*cfb92d14SAndroid Build Coastguard Worker 
442*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(StringCopy(buffer, "", kStringCheckUtf8Encoding));
443*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch(buffer, ""));
444*cfb92d14SAndroid Build Coastguard Worker 
445*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(StringCopy(buffer, "123456789", kStringCheckUtf8Encoding));
446*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch(buffer, "123456789"));
447*cfb92d14SAndroid Build Coastguard Worker 
448*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringCopy(buffer, "1234567890") == kErrorInvalidArgs);
449*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringCopy(buffer, "1234567890abcdef") == kErrorInvalidArgs);
450*cfb92d14SAndroid Build Coastguard Worker 
451*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(StringCopy(smallBuffer, "", kStringCheckUtf8Encoding));
452*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringMatch(smallBuffer, ""));
453*cfb92d14SAndroid Build Coastguard Worker 
454*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(StringCopy(smallBuffer, "a") == kErrorInvalidArgs);
455*cfb92d14SAndroid Build Coastguard Worker 
456*cfb92d14SAndroid Build Coastguard Worker     printf(" -- PASS\n");
457*cfb92d14SAndroid Build Coastguard Worker }
458*cfb92d14SAndroid Build Coastguard Worker 
459*cfb92d14SAndroid Build Coastguard Worker // gcc-4 does not support constexpr function
460*cfb92d14SAndroid Build Coastguard Worker #if __GNUC__ > 4
461*cfb92d14SAndroid Build Coastguard Worker static_assert(ot::AreStringsInOrder("a", "b"), "AreStringsInOrder() failed");
462*cfb92d14SAndroid Build Coastguard Worker static_assert(ot::AreStringsInOrder("aa", "aaa"), "AreStringsInOrder() failed");
463*cfb92d14SAndroid Build Coastguard Worker static_assert(ot::AreStringsInOrder("", "a"), "AreStringsInOrder() failed");
464*cfb92d14SAndroid Build Coastguard Worker static_assert(!ot::AreStringsInOrder("cd", "cd"), "AreStringsInOrder() failed");
465*cfb92d14SAndroid Build Coastguard Worker static_assert(!ot::AreStringsInOrder("z", "abcd"), "AreStringsInOrder() failed");
466*cfb92d14SAndroid Build Coastguard Worker static_assert(!ot::AreStringsInOrder("0", ""), "AreStringsInOrder() failed");
467*cfb92d14SAndroid Build Coastguard Worker #endif
468*cfb92d14SAndroid Build Coastguard Worker 
469*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
470*cfb92d14SAndroid Build Coastguard Worker 
main(void)471*cfb92d14SAndroid Build Coastguard Worker int main(void)
472*cfb92d14SAndroid Build Coastguard Worker {
473*cfb92d14SAndroid Build Coastguard Worker     ot::TestStringWriter();
474*cfb92d14SAndroid Build Coastguard Worker     ot::TestStringLength();
475*cfb92d14SAndroid Build Coastguard Worker     ot::TestUtf8();
476*cfb92d14SAndroid Build Coastguard Worker     ot::TestStringFind();
477*cfb92d14SAndroid Build Coastguard Worker     ot::TestStringStartsWith();
478*cfb92d14SAndroid Build Coastguard Worker     ot::TestStringEndsWith();
479*cfb92d14SAndroid Build Coastguard Worker     ot::TestStringMatch();
480*cfb92d14SAndroid Build Coastguard Worker     ot::TestStringToLowercase();
481*cfb92d14SAndroid Build Coastguard Worker     ot::TestStringParseUint8();
482*cfb92d14SAndroid Build Coastguard Worker     ot::TestStringCopy();
483*cfb92d14SAndroid Build Coastguard Worker     printf("\nAll tests passed.\n");
484*cfb92d14SAndroid Build Coastguard Worker     return 0;
485*cfb92d14SAndroid Build Coastguard Worker }
486