1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "Test.h" 9 #include "SkString.h" 10 #include <stdarg.h> 11 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 void printfAnalog(char* buffer, int size, const char format[], ...) { 32 ARGS_TO_BUFFER(format, buffer, size); 33 } 34 35 36 37 static void TestString(skiatest::Reporter* reporter) { 38 SkString a; 39 SkString b((size_t)0); 40 SkString c(""); 41 SkString d(NULL, 0); 42 43 REPORTER_ASSERT(reporter, a.isEmpty()); 44 REPORTER_ASSERT(reporter, a == b && a == c && a == d); 45 46 a.set("hello"); 47 b.set("hellox", 5); 48 c.set(a); 49 d.resize(5); 50 memcpy(d.writable_str(), "helloz", 5); 51 52 REPORTER_ASSERT(reporter, !a.isEmpty()); 53 REPORTER_ASSERT(reporter, a.size() == 5); 54 REPORTER_ASSERT(reporter, a == b && a == c && a == d); 55 REPORTER_ASSERT(reporter, a.equals("hello", 5)); 56 REPORTER_ASSERT(reporter, a.equals("hello")); 57 REPORTER_ASSERT(reporter, !a.equals("help")); 58 59 SkString e(a); 60 SkString f("hello"); 61 SkString g("helloz", 5); 62 63 REPORTER_ASSERT(reporter, a == e && a == f && a == g); 64 65 b.set("world"); 66 c = b; 67 REPORTER_ASSERT(reporter, a != b && a != c && b == c); 68 69 a.append(" world"); 70 e.append("worldz", 5); 71 e.insert(5, " "); 72 f.set("world"); 73 f.prepend("hello "); 74 REPORTER_ASSERT(reporter, a.equals("hello world") && a == e && a == f); 75 76 a.reset(); 77 b.resize(0); 78 REPORTER_ASSERT(reporter, a.isEmpty() && b.isEmpty() && a == b); 79 80 a.set("a"); 81 a.set("ab"); 82 a.set("abc"); 83 a.set("abcd"); 84 85 a.set(""); 86 a.appendS64(72036854775808LL, 0); 87 REPORTER_ASSERT(reporter, a.equals("72036854775808")); 88 89 a.set(""); 90 a.appendS64(-1844674407370LL, 0); 91 REPORTER_ASSERT(reporter, a.equals("-1844674407370")); 92 93 a.set(""); 94 a.appendS64(73709551616LL, 15); 95 REPORTER_ASSERT(reporter, a.equals("000073709551616")); 96 97 a.set(""); 98 a.appendS64(-429496729612LL, 15); 99 REPORTER_ASSERT(reporter, a.equals("-000429496729612")); 100 101 static const struct { 102 SkScalar fValue; 103 const char* fString; 104 } gRec[] = { 105 { 0, "0" }, 106 { SK_Scalar1, "1" }, 107 { -SK_Scalar1, "-1" }, 108 { SK_Scalar1/2, "0.5" }, 109 #ifdef SK_SCALAR_IS_FLOAT 110 #ifdef SK_BUILD_FOR_WIN 111 { 3.4028234e38f, "3.4028235e+038" }, 112 { -3.4028234e38f, "-3.4028235e+038" }, 113 #else 114 { 3.4028234e38f, "3.4028235e+38" }, 115 { -3.4028234e38f, "-3.4028235e+38" }, 116 #endif 117 #endif 118 }; 119 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) { 120 a.reset(); 121 a.appendScalar(gRec[i].fValue); 122 REPORTER_ASSERT(reporter, a.size() <= SkStrAppendScalar_MaxSize); 123 // SkDebugf(" received <%s> expected <%s>\n", a.c_str(), gRec[i].fString); 124 REPORTER_ASSERT(reporter, a.equals(gRec[i].fString)); 125 } 126 127 REPORTER_ASSERT(reporter, SkStringPrintf("%i", 0).equals("0")); 128 129 char buffer [40]; 130 memset(buffer, 'a', 40); 131 REPORTER_ASSERT(reporter, buffer[18] == 'a'); 132 REPORTER_ASSERT(reporter, buffer[19] == 'a'); 133 REPORTER_ASSERT(reporter, buffer[20] == 'a'); 134 printfAnalog(buffer, 20, "%30d", 0); 135 REPORTER_ASSERT(reporter, buffer[18] == ' '); 136 REPORTER_ASSERT(reporter, buffer[19] == 0); 137 REPORTER_ASSERT(reporter, buffer[20] == 'a'); 138 139 } 140 141 #include "TestClassDef.h" 142 DEFINE_TESTCLASS("String", StringTestClass, TestString) 143