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