1 /* 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 */ 7 8 #include <stdarg.h> 9 #include <stdio.h> 10 #include "SkString.h" 11 #include "Test.h" 12 13 // Windows vsnprintf doesn't 0-terminate safely), but is so far 14 // encapsulated in SkString that we can't test it directly. 15 16 #ifdef SK_BUILD_FOR_WIN 17 #define VSNPRINTF(buffer, size, format, args) \ 18 vsnprintf_s(buffer, size, _TRUNCATE, format, args) 19 #else 20 #define VSNPRINTF vsnprintf 21 #endif 22 23 #define ARGS_TO_BUFFER(format, buffer, size) \ 24 do { \ 25 va_list args; \ 26 va_start(args, format); \ 27 VSNPRINTF(buffer, size, format, args); \ 28 va_end(args); \ 29 } while (0) 30 31 static void printfAnalog(char* buffer, int size, const char format[], ...) { 32 ARGS_TO_BUFFER(format, buffer, size); 33 } 34 35 DEF_TEST(String, reporter) { 36 SkString a; 37 SkString b((size_t)0); 38 SkString c(""); 39 SkString d(nullptr, 0); 40 41 REPORTER_ASSERT(reporter, a.isEmpty()); 42 REPORTER_ASSERT(reporter, a == b && a == c && a == d); 43 44 a.set("hello"); 45 b.set("hellox", 5); 46 c.set(a); 47 d.resize(5); 48 memcpy(d.writable_str(), "helloz", 5); 49 50 REPORTER_ASSERT(reporter, !a.isEmpty()); 51 REPORTER_ASSERT(reporter, a.size() == 5); 52 REPORTER_ASSERT(reporter, a == b && a == c && a == d); 53 REPORTER_ASSERT(reporter, a.equals("hello", 5)); 54 REPORTER_ASSERT(reporter, a.equals("hello")); 55 REPORTER_ASSERT(reporter, !a.equals("help")); 56 57 REPORTER_ASSERT(reporter, a.startsWith("hell")); 58 REPORTER_ASSERT(reporter, a.startsWith('h')); 59 REPORTER_ASSERT(reporter, !a.startsWith( "ell")); 60 REPORTER_ASSERT(reporter, !a.startsWith( 'e')); 61 REPORTER_ASSERT(reporter, a.startsWith("")); 62 REPORTER_ASSERT(reporter, a.endsWith("llo")); 63 REPORTER_ASSERT(reporter, a.endsWith('o')); 64 REPORTER_ASSERT(reporter, !a.endsWith("ll" )); 65 REPORTER_ASSERT(reporter, !a.endsWith('l')); 66 REPORTER_ASSERT(reporter, a.endsWith("")); 67 REPORTER_ASSERT(reporter, a.contains("he")); 68 REPORTER_ASSERT(reporter, a.contains("ll")); 69 REPORTER_ASSERT(reporter, a.contains("lo")); 70 REPORTER_ASSERT(reporter, a.contains("hello")); 71 REPORTER_ASSERT(reporter, !a.contains("hellohello")); 72 REPORTER_ASSERT(reporter, a.contains("")); 73 REPORTER_ASSERT(reporter, a.contains('e')); 74 REPORTER_ASSERT(reporter, !a.contains('z')); 75 76 SkString e(a); 77 SkString f("hello"); 78 SkString g("helloz", 5); 79 80 REPORTER_ASSERT(reporter, a == e && a == f && a == g); 81 82 b.set("world"); 83 c = b; 84 REPORTER_ASSERT(reporter, a != b && a != c && b == c); 85 86 a.append(" world"); 87 e.append("worldz", 5); 88 e.insert(5, " "); 89 f.set("world"); 90 f.prepend("hello "); 91 REPORTER_ASSERT(reporter, a.equals("hello world") && a == e && a == f); 92 93 a.reset(); 94 b.resize(0); 95 REPORTER_ASSERT(reporter, a.isEmpty() && b.isEmpty() && a == b); 96 97 a.set("a"); 98 a.set("ab"); 99 a.set("abc"); 100 a.set("abcd"); 101 102 a.set(""); 103 a.appendS32(0x7FFFFFFFL); 104 REPORTER_ASSERT(reporter, a.equals("2147483647")); 105 a.set(""); 106 a.appendS32(0x80000001L); 107 REPORTER_ASSERT(reporter, a.equals("-2147483647")); 108 a.set(""); 109 a.appendS32(0x80000000L); 110 REPORTER_ASSERT(reporter, a.equals("-2147483648")); 111 112 a.set(""); 113 a.appendU32(0x7FFFFFFFUL); 114 REPORTER_ASSERT(reporter, a.equals("2147483647")); 115 a.set(""); 116 a.appendU32(0x80000001UL); 117 REPORTER_ASSERT(reporter, a.equals("2147483649")); 118 a.set(""); 119 a.appendU32(0xFFFFFFFFUL); 120 REPORTER_ASSERT(reporter, a.equals("4294967295")); 121 122 a.set(""); 123 a.appendS64(0x7FFFFFFFFFFFFFFFLL, 0); 124 REPORTER_ASSERT(reporter, a.equals("9223372036854775807")); 125 a.set(""); 126 a.appendS64(0x8000000000000001LL, 0); 127 REPORTER_ASSERT(reporter, a.equals("-9223372036854775807")); 128 a.set(""); 129 a.appendS64(0x8000000000000000LL, 0); 130 REPORTER_ASSERT(reporter, a.equals("-9223372036854775808")); 131 a.set(""); 132 a.appendS64(0x0000000001000000LL, 15); 133 REPORTER_ASSERT(reporter, a.equals("000000016777216")); 134 a.set(""); 135 a.appendS64(0xFFFFFFFFFF000000LL, 15); 136 REPORTER_ASSERT(reporter, a.equals("-000000016777216")); 137 138 a.set(""); 139 a.appendU64(0x7FFFFFFFFFFFFFFFULL, 0); 140 REPORTER_ASSERT(reporter, a.equals("9223372036854775807")); 141 a.set(""); 142 a.appendU64(0x8000000000000001ULL, 0); 143 REPORTER_ASSERT(reporter, a.equals("9223372036854775809")); 144 a.set(""); 145 a.appendU64(0xFFFFFFFFFFFFFFFFULL, 0); 146 REPORTER_ASSERT(reporter, a.equals("18446744073709551615")); 147 a.set(""); 148 a.appendU64(0x0000000001000000ULL, 15); 149 REPORTER_ASSERT(reporter, a.equals("000000016777216")); 150 151 static const struct { 152 SkScalar fValue; 153 const char* fString; 154 } gRec[] = { 155 { 0, "0" }, 156 { SK_Scalar1, "1" }, 157 { -SK_Scalar1, "-1" }, 158 { SK_Scalar1/2, "0.5" }, 159 #if defined(SK_BUILD_FOR_WIN) && (_MSC_VER < 1900) 160 { 3.4028234e38f, "3.4028235e+038" }, 161 { -3.4028234e38f, "-3.4028235e+038" }, 162 #else 163 { 3.4028234e38f, "3.4028235e+38" }, 164 { -3.4028234e38f, "-3.4028235e+38" }, 165 #endif 166 }; 167 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) { 168 a.reset(); 169 a.appendScalar(gRec[i].fValue); 170 REPORTER_ASSERT(reporter, a.size() <= SkStrAppendScalar_MaxSize); 171 if (!a.equals(gRec[i].fString)) { 172 ERRORF(reporter, "received <%s> expected <%s>\n", a.c_str(), gRec[i].fString); 173 } 174 } 175 176 REPORTER_ASSERT(reporter, SkStringPrintf("%i", 0).equals("0")); 177 178 char buffer [40]; 179 memset(buffer, 'a', 40); 180 REPORTER_ASSERT(reporter, buffer[18] == 'a'); 181 REPORTER_ASSERT(reporter, buffer[19] == 'a'); 182 REPORTER_ASSERT(reporter, buffer[20] == 'a'); 183 printfAnalog(buffer, 20, "%30d", 0); 184 REPORTER_ASSERT(reporter, buffer[18] == ' '); 185 REPORTER_ASSERT(reporter, buffer[19] == 0); 186 REPORTER_ASSERT(reporter, buffer[20] == 'a'); 187 188 } 189 190 DEF_TEST(String_SkStrSplit, r) { 191 SkTArray<SkString> results; 192 193 SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", &results); 194 REPORTER_ASSERT(r, results.count() == 6); 195 REPORTER_ASSERT(r, results[0].equals("a")); 196 REPORTER_ASSERT(r, results[1].equals("b")); 197 REPORTER_ASSERT(r, results[2].equals("c")); 198 REPORTER_ASSERT(r, results[3].equals("dee")); 199 REPORTER_ASSERT(r, results[4].equals("f")); 200 REPORTER_ASSERT(r, results[5].equals("g")); 201 202 results.reset(); 203 SkStrSplit("\n", "\n", &results); 204 REPORTER_ASSERT(r, results.count() == 0); 205 206 results.reset(); 207 SkStrSplit("", "\n", &results); 208 REPORTER_ASSERT(r, results.count() == 0); 209 210 results.reset(); 211 SkStrSplit("a", "\n", &results); 212 REPORTER_ASSERT(r, results.count() == 1); 213 REPORTER_ASSERT(r, results[0].equals("a")); 214 } 215 DEF_TEST(String_SkStrSplit_All, r) { 216 SkTArray<SkString> results; 217 SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", kStrict_SkStrSplitMode, &results); 218 REPORTER_ASSERT(r, results.count() == 13); 219 REPORTER_ASSERT(r, results[0].equals("a")); 220 REPORTER_ASSERT(r, results[1].equals("")); 221 REPORTER_ASSERT(r, results[2].equals("b")); 222 REPORTER_ASSERT(r, results[3].equals("c")); 223 REPORTER_ASSERT(r, results[4].equals("dee")); 224 REPORTER_ASSERT(r, results[5].equals("")); 225 REPORTER_ASSERT(r, results[6].equals("f")); 226 REPORTER_ASSERT(r, results[7].equals("")); 227 REPORTER_ASSERT(r, results[8].equals("")); 228 REPORTER_ASSERT(r, results[9].equals("")); 229 REPORTER_ASSERT(r, results[10].equals("")); 230 REPORTER_ASSERT(r, results[11].equals("g")); 231 REPORTER_ASSERT(r, results[12].equals("")); 232 233 results.reset(); 234 SkStrSplit("\n", "\n", kStrict_SkStrSplitMode, &results); 235 REPORTER_ASSERT(r, results.count() == 2); 236 REPORTER_ASSERT(r, results[0].equals("")); 237 REPORTER_ASSERT(r, results[1].equals("")); 238 239 results.reset(); 240 SkStrSplit("", "\n", kStrict_SkStrSplitMode, &results); 241 REPORTER_ASSERT(r, results.count() == 0); 242 243 results.reset(); 244 SkStrSplit("a", "\n", kStrict_SkStrSplitMode, &results); 245 REPORTER_ASSERT(r, results.count() == 1); 246 REPORTER_ASSERT(r, results[0].equals("a")); 247 248 results.reset(); 249 SkStrSplit(",,", ",", kStrict_SkStrSplitMode, &results); 250 REPORTER_ASSERT(r, results.count() == 3); 251 REPORTER_ASSERT(r, results[0].equals("")); 252 REPORTER_ASSERT(r, results[1].equals("")); 253 REPORTER_ASSERT(r, results[2].equals("")); 254 255 results.reset(); 256 SkStrSplit(",a,b,", ",", kStrict_SkStrSplitMode, &results); 257 REPORTER_ASSERT(r, results.count() == 4); 258 REPORTER_ASSERT(r, results[0].equals("")); 259 REPORTER_ASSERT(r, results[1].equals("a")); 260 REPORTER_ASSERT(r, results[2].equals("b")); 261 REPORTER_ASSERT(r, results[3].equals("")); 262 } 263