blob: 4bf7ca1bb812f4d7240a9d2c926e7d758ea9fe67 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +00007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "tests/Test.h"
Hal Canaryee08b4a2018-03-01 15:56:37 -05009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "include/core/SkString.h"
11#include "src/core/SkStringUtils.h"
Hal Canary8a001442018-09-19 11:31:27 -040012
John Stilesc23c8c72021-01-05 21:38:35 -050013#include <math.h>
bungeman@google.comfab44db2013-10-11 18:50:45 +000014#include <stdio.h>
Mike Klein03141d22017-10-30 11:57:15 -040015#include <thread>
tomhudson@google.com47e0a092011-07-08 17:49:22 +000016
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +000017DEF_TEST(String, reporter) {
reed@android.comd8730ea2009-02-27 22:06:06 +000018 SkString a;
19 SkString b((size_t)0);
20 SkString c("");
halcanary96fcdcc2015-08-27 07:41:13 -070021 SkString d(nullptr, 0);
reed@android.comd8730ea2009-02-27 22:06:06 +000022
23 REPORTER_ASSERT(reporter, a.isEmpty());
24 REPORTER_ASSERT(reporter, a == b && a == c && a == d);
25
26 a.set("hello");
27 b.set("hellox", 5);
28 c.set(a);
29 d.resize(5);
30 memcpy(d.writable_str(), "helloz", 5);
31
32 REPORTER_ASSERT(reporter, !a.isEmpty());
33 REPORTER_ASSERT(reporter, a.size() == 5);
34 REPORTER_ASSERT(reporter, a == b && a == c && a == d);
35 REPORTER_ASSERT(reporter, a.equals("hello", 5));
36 REPORTER_ASSERT(reporter, a.equals("hello"));
37 REPORTER_ASSERT(reporter, !a.equals("help"));
38
epoger@google.comc4ae9742012-04-27 17:11:31 +000039 REPORTER_ASSERT(reporter, a.startsWith("hell"));
epoger@google.come8ebeb12012-10-29 16:42:11 +000040 REPORTER_ASSERT(reporter, a.startsWith('h'));
epoger@google.comc4ae9742012-04-27 17:11:31 +000041 REPORTER_ASSERT(reporter, !a.startsWith( "ell"));
epoger@google.come8ebeb12012-10-29 16:42:11 +000042 REPORTER_ASSERT(reporter, !a.startsWith( 'e'));
epoger@google.comc4ae9742012-04-27 17:11:31 +000043 REPORTER_ASSERT(reporter, a.startsWith(""));
44 REPORTER_ASSERT(reporter, a.endsWith("llo"));
epoger@google.come8ebeb12012-10-29 16:42:11 +000045 REPORTER_ASSERT(reporter, a.endsWith('o'));
epoger@google.comc4ae9742012-04-27 17:11:31 +000046 REPORTER_ASSERT(reporter, !a.endsWith("ll" ));
epoger@google.come8ebeb12012-10-29 16:42:11 +000047 REPORTER_ASSERT(reporter, !a.endsWith('l'));
epoger@google.comc4ae9742012-04-27 17:11:31 +000048 REPORTER_ASSERT(reporter, a.endsWith(""));
49 REPORTER_ASSERT(reporter, a.contains("he"));
50 REPORTER_ASSERT(reporter, a.contains("ll"));
51 REPORTER_ASSERT(reporter, a.contains("lo"));
52 REPORTER_ASSERT(reporter, a.contains("hello"));
53 REPORTER_ASSERT(reporter, !a.contains("hellohello"));
54 REPORTER_ASSERT(reporter, a.contains(""));
epoger@google.come8ebeb12012-10-29 16:42:11 +000055 REPORTER_ASSERT(reporter, a.contains('e'));
56 REPORTER_ASSERT(reporter, !a.contains('z'));
rmistry@google.comd6176b02012-08-23 18:14:13 +000057
reed@android.comd8730ea2009-02-27 22:06:06 +000058 SkString e(a);
59 SkString f("hello");
60 SkString g("helloz", 5);
61
62 REPORTER_ASSERT(reporter, a == e && a == f && a == g);
63
64 b.set("world");
65 c = b;
66 REPORTER_ASSERT(reporter, a != b && a != c && b == c);
67
68 a.append(" world");
69 e.append("worldz", 5);
70 e.insert(5, " ");
71 f.set("world");
72 f.prepend("hello ");
73 REPORTER_ASSERT(reporter, a.equals("hello world") && a == e && a == f);
74
75 a.reset();
76 b.resize(0);
77 REPORTER_ASSERT(reporter, a.isEmpty() && b.isEmpty() && a == b);
78
79 a.set("a");
80 a.set("ab");
81 a.set("abc");
82 a.set("abcd");
vandebo@chromium.orgd877fdb2010-10-12 23:08:13 +000083
84 a.set("");
epoger@google.comd88a3d82013-06-19 18:27:20 +000085 a.appendS32(0x7FFFFFFFL);
86 REPORTER_ASSERT(reporter, a.equals("2147483647"));
87 a.set("");
88 a.appendS32(0x80000001L);
89 REPORTER_ASSERT(reporter, a.equals("-2147483647"));
90 a.set("");
91 a.appendS32(0x80000000L);
92 REPORTER_ASSERT(reporter, a.equals("-2147483648"));
vandebo@chromium.orgd877fdb2010-10-12 23:08:13 +000093
94 a.set("");
epoger@google.comd88a3d82013-06-19 18:27:20 +000095 a.appendU32(0x7FFFFFFFUL);
96 REPORTER_ASSERT(reporter, a.equals("2147483647"));
97 a.set("");
98 a.appendU32(0x80000001UL);
99 REPORTER_ASSERT(reporter, a.equals("2147483649"));
100 a.set("");
101 a.appendU32(0xFFFFFFFFUL);
102 REPORTER_ASSERT(reporter, a.equals("4294967295"));
vandebo@chromium.orgd877fdb2010-10-12 23:08:13 +0000103
104 a.set("");
epoger@google.comd88a3d82013-06-19 18:27:20 +0000105 a.appendS64(0x7FFFFFFFFFFFFFFFLL, 0);
106 REPORTER_ASSERT(reporter, a.equals("9223372036854775807"));
107 a.set("");
108 a.appendS64(0x8000000000000001LL, 0);
109 REPORTER_ASSERT(reporter, a.equals("-9223372036854775807"));
110 a.set("");
111 a.appendS64(0x8000000000000000LL, 0);
112 REPORTER_ASSERT(reporter, a.equals("-9223372036854775808"));
113 a.set("");
114 a.appendS64(0x0000000001000000LL, 15);
115 REPORTER_ASSERT(reporter, a.equals("000000016777216"));
116 a.set("");
117 a.appendS64(0xFFFFFFFFFF000000LL, 15);
118 REPORTER_ASSERT(reporter, a.equals("-000000016777216"));
vandebo@chromium.orgd877fdb2010-10-12 23:08:13 +0000119
120 a.set("");
epoger@google.comd88a3d82013-06-19 18:27:20 +0000121 a.appendU64(0x7FFFFFFFFFFFFFFFULL, 0);
122 REPORTER_ASSERT(reporter, a.equals("9223372036854775807"));
123 a.set("");
124 a.appendU64(0x8000000000000001ULL, 0);
125 REPORTER_ASSERT(reporter, a.equals("9223372036854775809"));
126 a.set("");
127 a.appendU64(0xFFFFFFFFFFFFFFFFULL, 0);
128 REPORTER_ASSERT(reporter, a.equals("18446744073709551615"));
129 a.set("");
130 a.appendU64(0x0000000001000000ULL, 15);
131 REPORTER_ASSERT(reporter, a.equals("000000016777216"));
reed@google.comfa06e522011-02-28 21:29:58 +0000132
halcanaryd51bdae2016-04-25 09:25:35 -0700133 a.printf("%i", 0);
134 REPORTER_ASSERT(reporter, a.equals("0"));
135 a.printf("%g", 3.14);
136 REPORTER_ASSERT(reporter, a.equals("3.14"));
137 a.printf("hello %s", "skia");
138 REPORTER_ASSERT(reporter, a.equals("hello skia"));
139
reed@google.comfa06e522011-02-28 21:29:58 +0000140 static const struct {
141 SkScalar fValue;
142 const char* fString;
143 } gRec[] = {
John Stilesc23c8c72021-01-05 21:38:35 -0500144 { 0, "0" },
145 { SK_Scalar1, "1" },
146 { -SK_Scalar1, "-1" },
147 { SK_Scalar1/2, "0.5" },
148 { INFINITY, "inf" },
149 { -INFINITY, "-inf" },
150 { NAN, "nan" },
151 { -NAN, "nan" },
mtkleincc334b32015-09-22 11:43:53 -0700152 #if defined(SK_BUILD_FOR_WIN) && (_MSC_VER < 1900)
tomhudson@google.com47e0a092011-07-08 17:49:22 +0000153 { 3.4028234e38f, "3.4028235e+038" },
154 { -3.4028234e38f, "-3.4028235e+038" },
155 #else
reed@google.com8072e4f2011-03-01 15:44:08 +0000156 { 3.4028234e38f, "3.4028235e+38" },
157 { -3.4028234e38f, "-3.4028235e+38" },
tomhudson@google.com47e0a092011-07-08 17:49:22 +0000158 #endif
reed@google.comfa06e522011-02-28 21:29:58 +0000159 };
160 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) {
161 a.reset();
162 a.appendScalar(gRec[i].fValue);
John Stiles91196252020-07-28 09:23:54 -0400163 REPORTER_ASSERT(reporter, a.size() <= kSkStrAppendScalar_MaxSize);
bsalomon9bca5262015-08-06 17:56:13 -0700164 if (!a.equals(gRec[i].fString)) {
165 ERRORF(reporter, "received <%s> expected <%s>\n", a.c_str(), gRec[i].fString);
166 }
reed@google.comfa06e522011-02-28 21:29:58 +0000167 }
tomhudson@google.com3a1f6a02011-06-30 14:39:52 +0000168
169 REPORTER_ASSERT(reporter, SkStringPrintf("%i", 0).equals("0"));
John Stiles75c9c5b2020-06-18 15:49:38 -0400170}
tomhudson@google.com47e0a092011-07-08 17:49:22 +0000171
John Stiles75c9c5b2020-06-18 15:49:38 -0400172static void assert_2000_spaces(skiatest::Reporter* reporter, const SkString& str) {
173 REPORTER_ASSERT(reporter, str.size() == 2000);
174 for (size_t i = 0; i < str.size(); ++i) {
175 REPORTER_ASSERT(reporter, str[i] == ' ');
176 }
177}
178
179DEF_TEST(String_overflow, reporter) {
halcanaryd51bdae2016-04-25 09:25:35 -0700180 // 2000 is larger than the static buffer size inside SkString.cpp
John Stiles75c9c5b2020-06-18 15:49:38 -0400181 SkString a = SkStringPrintf("%2000s", " ");
182 assert_2000_spaces(reporter, a);
183
184 a = "X";
halcanaryd51bdae2016-04-25 09:25:35 -0700185 a.printf("%2000s", " ");
John Stiles75c9c5b2020-06-18 15:49:38 -0400186 assert_2000_spaces(reporter, a);
187
188 a = "X";
189 a.appendf("%1999s", " ");
190 REPORTER_ASSERT(reporter, a[0] == 'X');
191 a[0] = ' ';
192 assert_2000_spaces(reporter, a);
193
194 a = "X";
195 a.prependf("%1999s", " ");
196 REPORTER_ASSERT(reporter, a[1999] == 'X');
197 a[1999] = ' ';
198 assert_2000_spaces(reporter, a);
reed@android.comd8730ea2009-02-27 22:06:06 +0000199}
200
rmistry@google.comd6bab022013-12-02 13:50:38 +0000201DEF_TEST(String_SkStrSplit, r) {
202 SkTArray<SkString> results;
203
204 SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", &results);
205 REPORTER_ASSERT(r, results.count() == 6);
206 REPORTER_ASSERT(r, results[0].equals("a"));
207 REPORTER_ASSERT(r, results[1].equals("b"));
208 REPORTER_ASSERT(r, results[2].equals("c"));
209 REPORTER_ASSERT(r, results[3].equals("dee"));
210 REPORTER_ASSERT(r, results[4].equals("f"));
211 REPORTER_ASSERT(r, results[5].equals("g"));
mtkleincc334b32015-09-22 11:43:53 -0700212
213 results.reset();
214 SkStrSplit("\n", "\n", &results);
kkinnunen3e980c32015-12-23 01:33:00 -0800215 REPORTER_ASSERT(r, results.count() == 0);
mtkleincc334b32015-09-22 11:43:53 -0700216
217 results.reset();
218 SkStrSplit("", "\n", &results);
219 REPORTER_ASSERT(r, results.count() == 0);
kkinnunen3e980c32015-12-23 01:33:00 -0800220
221 results.reset();
222 SkStrSplit("a", "\n", &results);
223 REPORTER_ASSERT(r, results.count() == 1);
224 REPORTER_ASSERT(r, results[0].equals("a"));
225}
226DEF_TEST(String_SkStrSplit_All, r) {
227 SkTArray<SkString> results;
228 SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", kStrict_SkStrSplitMode, &results);
229 REPORTER_ASSERT(r, results.count() == 13);
230 REPORTER_ASSERT(r, results[0].equals("a"));
231 REPORTER_ASSERT(r, results[1].equals(""));
232 REPORTER_ASSERT(r, results[2].equals("b"));
233 REPORTER_ASSERT(r, results[3].equals("c"));
234 REPORTER_ASSERT(r, results[4].equals("dee"));
235 REPORTER_ASSERT(r, results[5].equals(""));
236 REPORTER_ASSERT(r, results[6].equals("f"));
237 REPORTER_ASSERT(r, results[7].equals(""));
238 REPORTER_ASSERT(r, results[8].equals(""));
239 REPORTER_ASSERT(r, results[9].equals(""));
240 REPORTER_ASSERT(r, results[10].equals(""));
241 REPORTER_ASSERT(r, results[11].equals("g"));
242 REPORTER_ASSERT(r, results[12].equals(""));
243
244 results.reset();
245 SkStrSplit("\n", "\n", kStrict_SkStrSplitMode, &results);
246 REPORTER_ASSERT(r, results.count() == 2);
247 REPORTER_ASSERT(r, results[0].equals(""));
248 REPORTER_ASSERT(r, results[1].equals(""));
249
250 results.reset();
251 SkStrSplit("", "\n", kStrict_SkStrSplitMode, &results);
252 REPORTER_ASSERT(r, results.count() == 0);
253
254 results.reset();
255 SkStrSplit("a", "\n", kStrict_SkStrSplitMode, &results);
256 REPORTER_ASSERT(r, results.count() == 1);
257 REPORTER_ASSERT(r, results[0].equals("a"));
258
259 results.reset();
260 SkStrSplit(",,", ",", kStrict_SkStrSplitMode, &results);
261 REPORTER_ASSERT(r, results.count() == 3);
262 REPORTER_ASSERT(r, results[0].equals(""));
263 REPORTER_ASSERT(r, results[1].equals(""));
264 REPORTER_ASSERT(r, results[2].equals(""));
265
266 results.reset();
267 SkStrSplit(",a,b,", ",", kStrict_SkStrSplitMode, &results);
268 REPORTER_ASSERT(r, results.count() == 4);
269 REPORTER_ASSERT(r, results[0].equals(""));
270 REPORTER_ASSERT(r, results[1].equals("a"));
271 REPORTER_ASSERT(r, results[2].equals("b"));
272 REPORTER_ASSERT(r, results[3].equals(""));
rmistry@google.comd6bab022013-12-02 13:50:38 +0000273}
Ben Wagneraf893662017-10-03 11:08:14 -0400274
275// https://bugs.chromium.org/p/skia/issues/detail?id=7107
276DEF_TEST(String_Threaded, r) {
Mike Klein03141d22017-10-30 11:57:15 -0400277 SkString str("foo");
278
279 std::thread threads[5];
280 for (auto& thread : threads) {
281 thread = std::thread([&] {
John Stiles31954bf2020-08-07 17:35:54 -0400282 SkString copy = str; // NOLINT(performance-unnecessary-copy-initialization)
Mike Klein03141d22017-10-30 11:57:15 -0400283 (void)copy.equals("test");
284 });
Ben Wagneraf893662017-10-03 11:08:14 -0400285 }
Mike Klein03141d22017-10-30 11:57:15 -0400286 for (auto& thread : threads) {
Ben Wagneraf893662017-10-03 11:08:14 -0400287 thread.join();
288 }
289}
Mike Reed33f38b02018-02-14 13:58:06 -0500290
291// Ensure that the string allocate doesn't internally overflow any calculations, and accidentally
292// let us create a string with a requested length longer than we can manage.
293DEF_TEST(String_huge, r) {
294 // start testing slightly below max 32
Ben Wagnerb0897652018-06-15 15:37:57 +0000295 size_t size = UINT32_MAX - 16;
Mike Reed33f38b02018-02-14 13:58:06 -0500296 // See where we crash, and manually check that its at the right point.
297 //
298 // To test, change the false to true
John Stiles4250eff2022-02-04 16:09:04 -0500299 if ((false)) {
300 for (;;) {
301 // On a 64bit build, this should crash when size == 1 << 32, since we can't store
302 // that length in the string's header (which has a u32 slot for the length).
303 //
304 // On a 32bit build, this should crash the first time around, since we can't allocate
305 // anywhere near this amount.
306 //
307 SkString str(size);
308 size += 1;
309 }
Mike Reed33f38b02018-02-14 13:58:06 -0500310 }
311}
312
Hal Canary2d0e1242018-03-01 12:32:18 -0500313DEF_TEST(String_fromUTF16, r) {
314 // test data produced with `iconv`.
315 const uint16_t test1[] = {
316 0xD835, 0xDCD0, 0xD835, 0xDCD1, 0xD835, 0xDCD2, 0xD835, 0xDCD3, 0xD835, 0xDCD4, 0x0020,
317 0xD835, 0xDCD5, 0xD835, 0xDCD6, 0xD835, 0xDCD7, 0xD835, 0xDCD8, 0xD835, 0xDCD9
318 };
Hal Canaryee08b4a2018-03-01 15:56:37 -0500319 REPORTER_ASSERT(r, SkStringFromUTF16(test1, SK_ARRAY_COUNT(test1)).equals("𝓐𝓑𝓒𝓓𝓔 𝓕𝓖𝓗𝓘𝓙"));
Hal Canary2d0e1242018-03-01 12:32:18 -0500320
321 const uint16_t test2[] = {
322 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0020, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,
323 };
Hal Canaryee08b4a2018-03-01 15:56:37 -0500324 REPORTER_ASSERT(r, SkStringFromUTF16(test2, SK_ARRAY_COUNT(test2)).equals("ABCDE FGHIJ"));
Hal Canary2d0e1242018-03-01 12:32:18 -0500325
326 const uint16_t test3[] = {
327 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x0020, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA,
328 };
Hal Canaryee08b4a2018-03-01 15:56:37 -0500329 REPORTER_ASSERT(r, SkStringFromUTF16(test3, SK_ARRAY_COUNT(test3)).equals("αβγδε ζηθικ"));
Hal Canary2d0e1242018-03-01 12:32:18 -0500330}
331
John Stiles87aa7a92022-02-04 18:17:59 -0500332static void test_va_list_print(skiatest::Reporter* r, const char format[], ...)
333 SK_PRINTF_LIKE(2, 3);
334
John Stiles75c9c5b2020-06-18 15:49:38 -0400335static void test_va_list_print(skiatest::Reporter* r, const char format[], ...) {
336 va_list args;
337 va_start(args, format);
338
339 SkString str("123");
340 str.printVAList(format, args);
341 REPORTER_ASSERT(r, str.equals("hello world"));
342
343 va_end(args);
344}
345
John Stiles87aa7a92022-02-04 18:17:59 -0500346static void test_va_list_append(skiatest::Reporter* r, const char format[], ...)
347 SK_PRINTF_LIKE(2, 3);
348
John Stiles75c9c5b2020-06-18 15:49:38 -0400349static void test_va_list_append(skiatest::Reporter* r, const char format[], ...) {
350 va_list args;
351 va_start(args, format);
352
353 SkString str("123");
354 str.appendVAList(format, args);
355 REPORTER_ASSERT(r, str.equals("123hello world"));
356
357 va_end(args);
358}
359
John Stiles87aa7a92022-02-04 18:17:59 -0500360static void test_va_list_prepend(skiatest::Reporter* r, const char format[], ...)
361 SK_PRINTF_LIKE(2, 3);
362
John Stiles75c9c5b2020-06-18 15:49:38 -0400363static void test_va_list_prepend(skiatest::Reporter* r, const char format[], ...) {
364 va_list args;
365 va_start(args, format);
366
367 SkString str("123");
368 str.prependVAList(format, args);
369 REPORTER_ASSERT(r, str.equals("hello world123"));
370
371 va_end(args);
372}
373
374DEF_TEST(String_VAList, r) {
375 test_va_list_print(r, "%s %c%c%c%c%c", "hello", 'w', 'o', 'r', 'l', 'd');
376 test_va_list_append(r, "%s %c%c%c%c%c", "hello", 'w', 'o', 'r', 'l', 'd');
377 test_va_list_prepend(r, "%s %c%c%c%c%c", "hello", 'w', 'o', 'r', 'l', 'd');
378}
379
John Stiles87aa7a92022-02-04 18:17:59 -0500380static void test_va_list_overflow_print(skiatest::Reporter* r, const char format[], ...)
381 SK_PRINTF_LIKE(2, 3);
382
John Stiles75c9c5b2020-06-18 15:49:38 -0400383static void test_va_list_overflow_print(skiatest::Reporter* r, const char format[], ...) {
384 va_list args;
385 va_start(args, format);
386
387 SkString str("X");
388 str.printVAList(format, args);
389 assert_2000_spaces(r, str);
390
391 va_end(args);
392}
393
John Stiles87aa7a92022-02-04 18:17:59 -0500394static void test_va_list_overflow_append(skiatest::Reporter* r, const char format[], ...)
395 SK_PRINTF_LIKE(2, 3);
396
John Stiles75c9c5b2020-06-18 15:49:38 -0400397static void test_va_list_overflow_append(skiatest::Reporter* r, const char format[], ...) {
398 va_list args;
399 va_start(args, format);
400
401 SkString str("X");
402 str.appendVAList(format, args);
403 REPORTER_ASSERT(r, str[0] == 'X');
404 str[0] = ' ';
405 assert_2000_spaces(r, str);
406
407 va_end(args);
408}
409
John Stiles87aa7a92022-02-04 18:17:59 -0500410static void test_va_list_overflow_prepend(skiatest::Reporter* r, const char format[], ...)
411 SK_PRINTF_LIKE(2, 3);
412
John Stiles75c9c5b2020-06-18 15:49:38 -0400413static void test_va_list_overflow_prepend(skiatest::Reporter* r, const char format[], ...) {
414 va_list args;
415 va_start(args, format);
416
417 SkString str("X");
418 str.prependVAList(format, args);
419 REPORTER_ASSERT(r, str[1999] == 'X');
420 str[1999] = ' ';
421 assert_2000_spaces(r, str);
422
423 va_end(args);
424}
425
426DEF_TEST(String_VAList_overflow, r) {
427 test_va_list_overflow_print(r, "%2000s", " ");
428 test_va_list_overflow_append(r, "%1999s", " ");
429 test_va_list_overflow_prepend(r, "%1999s", " ");
430}
John Stilesb4449432020-06-22 17:54:05 -0400431
432DEF_TEST(String_resize_to_nothing, r) {
433 SkString s("hello world!");
434 REPORTER_ASSERT(r, s.equals("hello world!"));
435 s.resize(0);
436 REPORTER_ASSERT(r, s.equals(""));
437}
438
439DEF_TEST(String_resize_shrink, r) {
440 SkString s("hello world!");
441 REPORTER_ASSERT(r, s.equals("hello world!"));
442 s.resize(5);
443 REPORTER_ASSERT(r, s.equals("hello"));
444}
445
446DEF_TEST(String_resize_grow, r) {
447 SkString s("hello world!");
448 REPORTER_ASSERT(r, s.equals("hello world!"));
449 s.resize(25);
450 REPORTER_ASSERT(r, 0 == strcmp(s.c_str(), "hello world!")); // no promises about data past \0
451 REPORTER_ASSERT(r, s.size() == 25);
452}
453
454DEF_TEST(String_resize_after_assignment, r) {
455 SkString s("hello world!");
456 SkString t;
457 t = s;
458 REPORTER_ASSERT(r, s.equals("hello world!"));
459 s.resize(25);
460 REPORTER_ASSERT(r, 0 == strcmp(s.c_str(), "hello world!"));
461 REPORTER_ASSERT(r, s.size() == 25);
462 s.resize(5);
463 REPORTER_ASSERT(r, s.equals("hello"));
464}
465
466static void resize_helper_function(skiatest::Reporter* r, SkString s) {
467 REPORTER_ASSERT(r, s.equals("hello world!"));
468 s.resize(5);
469 REPORTER_ASSERT(r, s.equals("hello"));
470 s.resize(25);
471 REPORTER_ASSERT(r, 0 == strcmp(s.c_str(), "hello"));
472 REPORTER_ASSERT(r, s.size() == 25);
473}
474
475DEF_TEST(String_resize_after_copy_construction, r) {
476 SkString s("hello world!");
477 resize_helper_function(r, s);
478}