1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "tests/Test.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "include/core/SkString.h"
11cb93a386Sopenharmony_ci#include "src/core/SkStringUtils.h"
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_ci#include <math.h>
14cb93a386Sopenharmony_ci#include <stdio.h>
15cb93a386Sopenharmony_ci#include <thread>
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ciDEF_TEST(String, reporter) {
18cb93a386Sopenharmony_ci    SkString    a;
19cb93a386Sopenharmony_ci    SkString    b((size_t)0);
20cb93a386Sopenharmony_ci    SkString    c("");
21cb93a386Sopenharmony_ci    SkString    d(nullptr, 0);
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.isEmpty());
24cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a == b && a == c && a == d);
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_ci    a.set("hello");
27cb93a386Sopenharmony_ci    b.set("hellox", 5);
28cb93a386Sopenharmony_ci    c.set(a);
29cb93a386Sopenharmony_ci    d.resize(5);
30cb93a386Sopenharmony_ci    memcpy(d.writable_str(), "helloz", 5);
31cb93a386Sopenharmony_ci
32cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !a.isEmpty());
33cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.size() == 5);
34cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a == b && a == c && a == d);
35cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("hello", 5));
36cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("hello"));
37cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !a.equals("help"));
38cb93a386Sopenharmony_ci
39cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.startsWith("hell"));
40cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.startsWith('h'));
41cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !a.startsWith( "ell"));
42cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !a.startsWith( 'e'));
43cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.startsWith(""));
44cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.endsWith("llo"));
45cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.endsWith('o'));
46cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !a.endsWith("ll" ));
47cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !a.endsWith('l'));
48cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.endsWith(""));
49cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.contains("he"));
50cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.contains("ll"));
51cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.contains("lo"));
52cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.contains("hello"));
53cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !a.contains("hellohello"));
54cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.contains(""));
55cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter,  a.contains('e'));
56cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !a.contains('z'));
57cb93a386Sopenharmony_ci
58cb93a386Sopenharmony_ci    SkString    e(a);
59cb93a386Sopenharmony_ci    SkString    f("hello");
60cb93a386Sopenharmony_ci    SkString    g("helloz", 5);
61cb93a386Sopenharmony_ci
62cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a == e && a == f && a == g);
63cb93a386Sopenharmony_ci
64cb93a386Sopenharmony_ci    b.set("world");
65cb93a386Sopenharmony_ci    c = b;
66cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a != b && a != c && b == c);
67cb93a386Sopenharmony_ci
68cb93a386Sopenharmony_ci    a.append(" world");
69cb93a386Sopenharmony_ci    e.append("worldz", 5);
70cb93a386Sopenharmony_ci    e.insert(5, " ");
71cb93a386Sopenharmony_ci    f.set("world");
72cb93a386Sopenharmony_ci    f.prepend("hello ");
73cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("hello world") && a == e && a == f);
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ci    a.reset();
76cb93a386Sopenharmony_ci    b.resize(0);
77cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.isEmpty() && b.isEmpty() && a == b);
78cb93a386Sopenharmony_ci
79cb93a386Sopenharmony_ci    a.set("a");
80cb93a386Sopenharmony_ci    a.set("ab");
81cb93a386Sopenharmony_ci    a.set("abc");
82cb93a386Sopenharmony_ci    a.set("abcd");
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci    a.set("");
85cb93a386Sopenharmony_ci    a.appendS32(0x7FFFFFFFL);
86cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("2147483647"));
87cb93a386Sopenharmony_ci    a.set("");
88cb93a386Sopenharmony_ci    a.appendS32(0x80000001L);
89cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("-2147483647"));
90cb93a386Sopenharmony_ci    a.set("");
91cb93a386Sopenharmony_ci    a.appendS32(0x80000000L);
92cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("-2147483648"));
93cb93a386Sopenharmony_ci
94cb93a386Sopenharmony_ci    a.set("");
95cb93a386Sopenharmony_ci    a.appendU32(0x7FFFFFFFUL);
96cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("2147483647"));
97cb93a386Sopenharmony_ci    a.set("");
98cb93a386Sopenharmony_ci    a.appendU32(0x80000001UL);
99cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("2147483649"));
100cb93a386Sopenharmony_ci    a.set("");
101cb93a386Sopenharmony_ci    a.appendU32(0xFFFFFFFFUL);
102cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("4294967295"));
103cb93a386Sopenharmony_ci
104cb93a386Sopenharmony_ci    a.set("");
105cb93a386Sopenharmony_ci    a.appendS64(0x7FFFFFFFFFFFFFFFLL, 0);
106cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("9223372036854775807"));
107cb93a386Sopenharmony_ci    a.set("");
108cb93a386Sopenharmony_ci    a.appendS64(0x8000000000000001LL, 0);
109cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("-9223372036854775807"));
110cb93a386Sopenharmony_ci    a.set("");
111cb93a386Sopenharmony_ci    a.appendS64(0x8000000000000000LL, 0);
112cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("-9223372036854775808"));
113cb93a386Sopenharmony_ci    a.set("");
114cb93a386Sopenharmony_ci    a.appendS64(0x0000000001000000LL, 15);
115cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("000000016777216"));
116cb93a386Sopenharmony_ci    a.set("");
117cb93a386Sopenharmony_ci    a.appendS64(0xFFFFFFFFFF000000LL, 15);
118cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("-000000016777216"));
119cb93a386Sopenharmony_ci
120cb93a386Sopenharmony_ci    a.set("");
121cb93a386Sopenharmony_ci    a.appendU64(0x7FFFFFFFFFFFFFFFULL, 0);
122cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("9223372036854775807"));
123cb93a386Sopenharmony_ci    a.set("");
124cb93a386Sopenharmony_ci    a.appendU64(0x8000000000000001ULL, 0);
125cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("9223372036854775809"));
126cb93a386Sopenharmony_ci    a.set("");
127cb93a386Sopenharmony_ci    a.appendU64(0xFFFFFFFFFFFFFFFFULL, 0);
128cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("18446744073709551615"));
129cb93a386Sopenharmony_ci    a.set("");
130cb93a386Sopenharmony_ci    a.appendU64(0x0000000001000000ULL, 15);
131cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("000000016777216"));
132cb93a386Sopenharmony_ci
133cb93a386Sopenharmony_ci    a.printf("%i", 0);
134cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("0"));
135cb93a386Sopenharmony_ci    a.printf("%g", 3.14);
136cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("3.14"));
137cb93a386Sopenharmony_ci    a.printf("hello %s", "skia");
138cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a.equals("hello skia"));
139cb93a386Sopenharmony_ci
140cb93a386Sopenharmony_ci    static const struct {
141cb93a386Sopenharmony_ci        SkScalar    fValue;
142cb93a386Sopenharmony_ci        const char* fString;
143cb93a386Sopenharmony_ci    } gRec[] = {
144cb93a386Sopenharmony_ci        { 0,             "0" },
145cb93a386Sopenharmony_ci        { SK_Scalar1,    "1" },
146cb93a386Sopenharmony_ci        { -SK_Scalar1,   "-1" },
147cb93a386Sopenharmony_ci        { SK_Scalar1/2,  "0.5" },
148cb93a386Sopenharmony_ci        { INFINITY,      "inf" },
149cb93a386Sopenharmony_ci        { -INFINITY,     "-inf" },
150cb93a386Sopenharmony_ci        { NAN,           "nan" },
151cb93a386Sopenharmony_ci        { -NAN,          "nan" },
152cb93a386Sopenharmony_ci  #if defined(SK_BUILD_FOR_WIN) && (_MSC_VER < 1900)
153cb93a386Sopenharmony_ci        { 3.4028234e38f,   "3.4028235e+038" },
154cb93a386Sopenharmony_ci        { -3.4028234e38f, "-3.4028235e+038" },
155cb93a386Sopenharmony_ci  #else
156cb93a386Sopenharmony_ci        { 3.4028234e38f,   "3.4028235e+38" },
157cb93a386Sopenharmony_ci        { -3.4028234e38f, "-3.4028235e+38" },
158cb93a386Sopenharmony_ci  #endif
159cb93a386Sopenharmony_ci    };
160cb93a386Sopenharmony_ci    for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) {
161cb93a386Sopenharmony_ci        a.reset();
162cb93a386Sopenharmony_ci        a.appendScalar(gRec[i].fValue);
163cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, a.size() <= kSkStrAppendScalar_MaxSize);
164cb93a386Sopenharmony_ci        if (!a.equals(gRec[i].fString)) {
165cb93a386Sopenharmony_ci            ERRORF(reporter, "received <%s> expected <%s>\n", a.c_str(), gRec[i].fString);
166cb93a386Sopenharmony_ci        }
167cb93a386Sopenharmony_ci    }
168cb93a386Sopenharmony_ci
169cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, SkStringPrintf("%i", 0).equals("0"));
170cb93a386Sopenharmony_ci}
171cb93a386Sopenharmony_ci
172cb93a386Sopenharmony_cistatic void assert_2000_spaces(skiatest::Reporter* reporter, const SkString& str) {
173cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, str.size() == 2000);
174cb93a386Sopenharmony_ci    for (size_t i = 0; i < str.size(); ++i) {
175cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, str[i] == ' ');
176cb93a386Sopenharmony_ci    }
177cb93a386Sopenharmony_ci}
178cb93a386Sopenharmony_ci
179cb93a386Sopenharmony_ciDEF_TEST(String_overflow, reporter) {
180cb93a386Sopenharmony_ci    // 2000 is larger than the static buffer size inside SkString.cpp
181cb93a386Sopenharmony_ci    SkString a = SkStringPrintf("%2000s", " ");
182cb93a386Sopenharmony_ci    assert_2000_spaces(reporter, a);
183cb93a386Sopenharmony_ci
184cb93a386Sopenharmony_ci    a = "X";
185cb93a386Sopenharmony_ci    a.printf("%2000s", " ");
186cb93a386Sopenharmony_ci    assert_2000_spaces(reporter, a);
187cb93a386Sopenharmony_ci
188cb93a386Sopenharmony_ci    a = "X";
189cb93a386Sopenharmony_ci    a.appendf("%1999s", " ");
190cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a[0] == 'X');
191cb93a386Sopenharmony_ci    a[0] = ' ';
192cb93a386Sopenharmony_ci    assert_2000_spaces(reporter, a);
193cb93a386Sopenharmony_ci
194cb93a386Sopenharmony_ci    a = "X";
195cb93a386Sopenharmony_ci    a.prependf("%1999s", " ");
196cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, a[1999] == 'X');
197cb93a386Sopenharmony_ci    a[1999] = ' ';
198cb93a386Sopenharmony_ci    assert_2000_spaces(reporter, a);
199cb93a386Sopenharmony_ci}
200cb93a386Sopenharmony_ci
201cb93a386Sopenharmony_ciDEF_TEST(String_SkStrSplit, r) {
202cb93a386Sopenharmony_ci    SkTArray<SkString> results;
203cb93a386Sopenharmony_ci
204cb93a386Sopenharmony_ci    SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", &results);
205cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 6);
206cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[0].equals("a"));
207cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[1].equals("b"));
208cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[2].equals("c"));
209cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[3].equals("dee"));
210cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[4].equals("f"));
211cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[5].equals("g"));
212cb93a386Sopenharmony_ci
213cb93a386Sopenharmony_ci    results.reset();
214cb93a386Sopenharmony_ci    SkStrSplit("\n", "\n", &results);
215cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 0);
216cb93a386Sopenharmony_ci
217cb93a386Sopenharmony_ci    results.reset();
218cb93a386Sopenharmony_ci    SkStrSplit("", "\n", &results);
219cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 0);
220cb93a386Sopenharmony_ci
221cb93a386Sopenharmony_ci    results.reset();
222cb93a386Sopenharmony_ci    SkStrSplit("a", "\n", &results);
223cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 1);
224cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[0].equals("a"));
225cb93a386Sopenharmony_ci}
226cb93a386Sopenharmony_ciDEF_TEST(String_SkStrSplit_All, r) {
227cb93a386Sopenharmony_ci    SkTArray<SkString> results;
228cb93a386Sopenharmony_ci    SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", kStrict_SkStrSplitMode, &results);
229cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 13);
230cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[0].equals("a"));
231cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[1].equals(""));
232cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[2].equals("b"));
233cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[3].equals("c"));
234cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[4].equals("dee"));
235cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[5].equals(""));
236cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[6].equals("f"));
237cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[7].equals(""));
238cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[8].equals(""));
239cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[9].equals(""));
240cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[10].equals(""));
241cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[11].equals("g"));
242cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[12].equals(""));
243cb93a386Sopenharmony_ci
244cb93a386Sopenharmony_ci    results.reset();
245cb93a386Sopenharmony_ci    SkStrSplit("\n", "\n", kStrict_SkStrSplitMode, &results);
246cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 2);
247cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[0].equals(""));
248cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[1].equals(""));
249cb93a386Sopenharmony_ci
250cb93a386Sopenharmony_ci    results.reset();
251cb93a386Sopenharmony_ci    SkStrSplit("", "\n", kStrict_SkStrSplitMode, &results);
252cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 0);
253cb93a386Sopenharmony_ci
254cb93a386Sopenharmony_ci    results.reset();
255cb93a386Sopenharmony_ci    SkStrSplit("a", "\n", kStrict_SkStrSplitMode, &results);
256cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 1);
257cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[0].equals("a"));
258cb93a386Sopenharmony_ci
259cb93a386Sopenharmony_ci    results.reset();
260cb93a386Sopenharmony_ci    SkStrSplit(",,", ",", kStrict_SkStrSplitMode, &results);
261cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 3);
262cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[0].equals(""));
263cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[1].equals(""));
264cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[2].equals(""));
265cb93a386Sopenharmony_ci
266cb93a386Sopenharmony_ci    results.reset();
267cb93a386Sopenharmony_ci    SkStrSplit(",a,b,", ",", kStrict_SkStrSplitMode, &results);
268cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results.count() == 4);
269cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[0].equals(""));
270cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[1].equals("a"));
271cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[2].equals("b"));
272cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, results[3].equals(""));
273cb93a386Sopenharmony_ci}
274cb93a386Sopenharmony_ci
275cb93a386Sopenharmony_ci// https://bugs.chromium.org/p/skia/issues/detail?id=7107
276cb93a386Sopenharmony_ciDEF_TEST(String_Threaded, r) {
277cb93a386Sopenharmony_ci    SkString str("foo");
278cb93a386Sopenharmony_ci
279cb93a386Sopenharmony_ci    std::thread threads[5];
280cb93a386Sopenharmony_ci    for (auto& thread : threads) {
281cb93a386Sopenharmony_ci        thread = std::thread([&] {
282cb93a386Sopenharmony_ci            SkString copy = str;  // NOLINT(performance-unnecessary-copy-initialization)
283cb93a386Sopenharmony_ci            (void)copy.equals("test");
284cb93a386Sopenharmony_ci        });
285cb93a386Sopenharmony_ci    }
286cb93a386Sopenharmony_ci    for (auto& thread : threads) {
287cb93a386Sopenharmony_ci        thread.join();
288cb93a386Sopenharmony_ci    }
289cb93a386Sopenharmony_ci}
290cb93a386Sopenharmony_ci
291cb93a386Sopenharmony_ci// Ensure that the string allocate doesn't internally overflow any calculations, and accidentally
292cb93a386Sopenharmony_ci// let us create a string with a requested length longer than we can manage.
293cb93a386Sopenharmony_ciDEF_TEST(String_huge, r) {
294cb93a386Sopenharmony_ci    // start testing slightly below max 32
295cb93a386Sopenharmony_ci    size_t size = UINT32_MAX - 16;
296cb93a386Sopenharmony_ci    // See where we crash, and manually check that its at the right point.
297cb93a386Sopenharmony_ci    //
298cb93a386Sopenharmony_ci    //  To test, change the false to true
299cb93a386Sopenharmony_ci    while (false) {
300cb93a386Sopenharmony_ci        // On a 64bit build, this should crash when size == 1 << 32, since we can't store
301cb93a386Sopenharmony_ci        // that length in the string's header (which has a u32 slot for the length).
302cb93a386Sopenharmony_ci        //
303cb93a386Sopenharmony_ci        // On a 32bit build, this should crash the first time around, since we can't allocate
304cb93a386Sopenharmony_ci        // anywhere near this amount.
305cb93a386Sopenharmony_ci        //
306cb93a386Sopenharmony_ci        SkString str(size);
307cb93a386Sopenharmony_ci        size += 1;
308cb93a386Sopenharmony_ci    }
309cb93a386Sopenharmony_ci}
310cb93a386Sopenharmony_ci
311cb93a386Sopenharmony_ciDEF_TEST(String_fromUTF16, r) {
312cb93a386Sopenharmony_ci    // test data produced with `iconv`.
313cb93a386Sopenharmony_ci    const uint16_t test1[] = {
314cb93a386Sopenharmony_ci        0xD835, 0xDCD0, 0xD835, 0xDCD1, 0xD835, 0xDCD2, 0xD835, 0xDCD3, 0xD835, 0xDCD4, 0x0020,
315cb93a386Sopenharmony_ci        0xD835, 0xDCD5, 0xD835, 0xDCD6, 0xD835, 0xDCD7, 0xD835, 0xDCD8, 0xD835, 0xDCD9
316cb93a386Sopenharmony_ci    };
317cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, SkStringFromUTF16(test1, SK_ARRAY_COUNT(test1)).equals("����� �����"));
318cb93a386Sopenharmony_ci
319cb93a386Sopenharmony_ci    const uint16_t test2[] = {
320cb93a386Sopenharmony_ci        0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0020, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,
321cb93a386Sopenharmony_ci    };
322cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, SkStringFromUTF16(test2, SK_ARRAY_COUNT(test2)).equals("ABCDE FGHIJ"));
323cb93a386Sopenharmony_ci
324cb93a386Sopenharmony_ci    const uint16_t test3[] = {
325cb93a386Sopenharmony_ci        0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x0020, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA,
326cb93a386Sopenharmony_ci    };
327cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, SkStringFromUTF16(test3, SK_ARRAY_COUNT(test3)).equals("αβγδε ζηθικ"));
328cb93a386Sopenharmony_ci}
329cb93a386Sopenharmony_ci
330cb93a386Sopenharmony_cistatic void test_va_list_print(skiatest::Reporter* r, const char format[], ...) {
331cb93a386Sopenharmony_ci    va_list args;
332cb93a386Sopenharmony_ci    va_start(args, format);
333cb93a386Sopenharmony_ci
334cb93a386Sopenharmony_ci    SkString str("123");
335cb93a386Sopenharmony_ci    str.printVAList(format, args);
336cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, str.equals("hello world"));
337cb93a386Sopenharmony_ci
338cb93a386Sopenharmony_ci    va_end(args);
339cb93a386Sopenharmony_ci}
340cb93a386Sopenharmony_ci
341cb93a386Sopenharmony_cistatic void test_va_list_append(skiatest::Reporter* r, const char format[], ...) {
342cb93a386Sopenharmony_ci    va_list args;
343cb93a386Sopenharmony_ci    va_start(args, format);
344cb93a386Sopenharmony_ci
345cb93a386Sopenharmony_ci    SkString str("123");
346cb93a386Sopenharmony_ci    str.appendVAList(format, args);
347cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, str.equals("123hello world"));
348cb93a386Sopenharmony_ci
349cb93a386Sopenharmony_ci    va_end(args);
350cb93a386Sopenharmony_ci}
351cb93a386Sopenharmony_ci
352cb93a386Sopenharmony_cistatic void test_va_list_prepend(skiatest::Reporter* r, const char format[], ...) {
353cb93a386Sopenharmony_ci    va_list args;
354cb93a386Sopenharmony_ci    va_start(args, format);
355cb93a386Sopenharmony_ci
356cb93a386Sopenharmony_ci    SkString str("123");
357cb93a386Sopenharmony_ci    str.prependVAList(format, args);
358cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, str.equals("hello world123"));
359cb93a386Sopenharmony_ci
360cb93a386Sopenharmony_ci    va_end(args);
361cb93a386Sopenharmony_ci}
362cb93a386Sopenharmony_ci
363cb93a386Sopenharmony_ciDEF_TEST(String_VAList, r) {
364cb93a386Sopenharmony_ci    test_va_list_print(r, "%s %c%c%c%c%c", "hello", 'w', 'o', 'r', 'l', 'd');
365cb93a386Sopenharmony_ci    test_va_list_append(r, "%s %c%c%c%c%c", "hello", 'w', 'o', 'r', 'l', 'd');
366cb93a386Sopenharmony_ci    test_va_list_prepend(r, "%s %c%c%c%c%c", "hello", 'w', 'o', 'r', 'l', 'd');
367cb93a386Sopenharmony_ci}
368cb93a386Sopenharmony_ci
369cb93a386Sopenharmony_cistatic void test_va_list_overflow_print(skiatest::Reporter* r, const char format[], ...) {
370cb93a386Sopenharmony_ci    va_list args;
371cb93a386Sopenharmony_ci    va_start(args, format);
372cb93a386Sopenharmony_ci
373cb93a386Sopenharmony_ci    SkString str("X");
374cb93a386Sopenharmony_ci    str.printVAList(format, args);
375cb93a386Sopenharmony_ci    assert_2000_spaces(r, str);
376cb93a386Sopenharmony_ci
377cb93a386Sopenharmony_ci    va_end(args);
378cb93a386Sopenharmony_ci}
379cb93a386Sopenharmony_ci
380cb93a386Sopenharmony_cistatic void test_va_list_overflow_append(skiatest::Reporter* r, const char format[], ...) {
381cb93a386Sopenharmony_ci    va_list args;
382cb93a386Sopenharmony_ci    va_start(args, format);
383cb93a386Sopenharmony_ci
384cb93a386Sopenharmony_ci    SkString str("X");
385cb93a386Sopenharmony_ci    str.appendVAList(format, args);
386cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, str[0] == 'X');
387cb93a386Sopenharmony_ci    str[0] = ' ';
388cb93a386Sopenharmony_ci    assert_2000_spaces(r, str);
389cb93a386Sopenharmony_ci
390cb93a386Sopenharmony_ci    va_end(args);
391cb93a386Sopenharmony_ci}
392cb93a386Sopenharmony_ci
393cb93a386Sopenharmony_cistatic void test_va_list_overflow_prepend(skiatest::Reporter* r, const char format[], ...) {
394cb93a386Sopenharmony_ci    va_list args;
395cb93a386Sopenharmony_ci    va_start(args, format);
396cb93a386Sopenharmony_ci
397cb93a386Sopenharmony_ci    SkString str("X");
398cb93a386Sopenharmony_ci    str.prependVAList(format, args);
399cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, str[1999] == 'X');
400cb93a386Sopenharmony_ci    str[1999] = ' ';
401cb93a386Sopenharmony_ci    assert_2000_spaces(r, str);
402cb93a386Sopenharmony_ci
403cb93a386Sopenharmony_ci    va_end(args);
404cb93a386Sopenharmony_ci}
405cb93a386Sopenharmony_ci
406cb93a386Sopenharmony_ciDEF_TEST(String_VAList_overflow, r) {
407cb93a386Sopenharmony_ci    test_va_list_overflow_print(r, "%2000s", " ");
408cb93a386Sopenharmony_ci    test_va_list_overflow_append(r, "%1999s", " ");
409cb93a386Sopenharmony_ci    test_va_list_overflow_prepend(r, "%1999s", " ");
410cb93a386Sopenharmony_ci}
411cb93a386Sopenharmony_ci
412cb93a386Sopenharmony_ciDEF_TEST(String_resize_to_nothing, r) {
413cb93a386Sopenharmony_ci    SkString s("hello world!");
414cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.equals("hello world!"));
415cb93a386Sopenharmony_ci    s.resize(0);
416cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.equals(""));
417cb93a386Sopenharmony_ci}
418cb93a386Sopenharmony_ci
419cb93a386Sopenharmony_ciDEF_TEST(String_resize_shrink, r) {
420cb93a386Sopenharmony_ci    SkString s("hello world!");
421cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.equals("hello world!"));
422cb93a386Sopenharmony_ci    s.resize(5);
423cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.equals("hello"));
424cb93a386Sopenharmony_ci}
425cb93a386Sopenharmony_ci
426cb93a386Sopenharmony_ciDEF_TEST(String_resize_grow, r) {
427cb93a386Sopenharmony_ci    SkString s("hello world!");
428cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.equals("hello world!"));
429cb93a386Sopenharmony_ci    s.resize(25);
430cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, 0 == strcmp(s.c_str(), "hello world!"));  // no promises about data past \0
431cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.size() == 25);
432cb93a386Sopenharmony_ci}
433cb93a386Sopenharmony_ci
434cb93a386Sopenharmony_ciDEF_TEST(String_resize_after_assignment, r) {
435cb93a386Sopenharmony_ci    SkString s("hello world!");
436cb93a386Sopenharmony_ci    SkString t;
437cb93a386Sopenharmony_ci    t = s;
438cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.equals("hello world!"));
439cb93a386Sopenharmony_ci    s.resize(25);
440cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, 0 == strcmp(s.c_str(), "hello world!"));
441cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.size() == 25);
442cb93a386Sopenharmony_ci    s.resize(5);
443cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.equals("hello"));
444cb93a386Sopenharmony_ci}
445cb93a386Sopenharmony_ci
446cb93a386Sopenharmony_cistatic void resize_helper_function(skiatest::Reporter* r, SkString s) {
447cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.equals("hello world!"));
448cb93a386Sopenharmony_ci    s.resize(5);
449cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.equals("hello"));
450cb93a386Sopenharmony_ci    s.resize(25);
451cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, 0 == strcmp(s.c_str(), "hello"));
452cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, s.size() == 25);
453cb93a386Sopenharmony_ci}
454cb93a386Sopenharmony_ci
455cb93a386Sopenharmony_ciDEF_TEST(String_resize_after_copy_construction, r) {
456cb93a386Sopenharmony_ci    SkString s("hello world!");
457cb93a386Sopenharmony_ci    resize_helper_function(r, s);
458cb93a386Sopenharmony_ci}
459