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