StringTest.cpp revision c4ae974db67977e766b66fb42e58e088c6381e29
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 31void printfAnalog(char* buffer, int size, const char format[], ...) { 32 ARGS_TO_BUFFER(format, buffer, size); 33} 34 35 36 37static 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 REPORTER_ASSERT(reporter, a.startsWith("hell")); 60 REPORTER_ASSERT(reporter, !a.startsWith( "ell")); 61 REPORTER_ASSERT(reporter, a.startsWith("")); 62 REPORTER_ASSERT(reporter, a.endsWith("llo")); 63 REPORTER_ASSERT(reporter, !a.endsWith("ll" )); 64 REPORTER_ASSERT(reporter, a.endsWith("")); 65 REPORTER_ASSERT(reporter, a.contains("he")); 66 REPORTER_ASSERT(reporter, a.contains("ll")); 67 REPORTER_ASSERT(reporter, a.contains("lo")); 68 REPORTER_ASSERT(reporter, a.contains("hello")); 69 REPORTER_ASSERT(reporter, !a.contains("hellohello")); 70 REPORTER_ASSERT(reporter, a.contains("")); 71 72 SkString e(a); 73 SkString f("hello"); 74 SkString g("helloz", 5); 75 76 REPORTER_ASSERT(reporter, a == e && a == f && a == g); 77 78 b.set("world"); 79 c = b; 80 REPORTER_ASSERT(reporter, a != b && a != c && b == c); 81 82 a.append(" world"); 83 e.append("worldz", 5); 84 e.insert(5, " "); 85 f.set("world"); 86 f.prepend("hello "); 87 REPORTER_ASSERT(reporter, a.equals("hello world") && a == e && a == f); 88 89 a.reset(); 90 b.resize(0); 91 REPORTER_ASSERT(reporter, a.isEmpty() && b.isEmpty() && a == b); 92 93 a.set("a"); 94 a.set("ab"); 95 a.set("abc"); 96 a.set("abcd"); 97 98 a.set(""); 99 a.appendS64(72036854775808LL, 0); 100 REPORTER_ASSERT(reporter, a.equals("72036854775808")); 101 102 a.set(""); 103 a.appendS64(-1844674407370LL, 0); 104 REPORTER_ASSERT(reporter, a.equals("-1844674407370")); 105 106 a.set(""); 107 a.appendS64(73709551616LL, 15); 108 REPORTER_ASSERT(reporter, a.equals("000073709551616")); 109 110 a.set(""); 111 a.appendS64(-429496729612LL, 15); 112 REPORTER_ASSERT(reporter, a.equals("-000429496729612")); 113 114 static const struct { 115 SkScalar fValue; 116 const char* fString; 117 } gRec[] = { 118 { 0, "0" }, 119 { SK_Scalar1, "1" }, 120 { -SK_Scalar1, "-1" }, 121 { SK_Scalar1/2, "0.5" }, 122#ifdef SK_SCALAR_IS_FLOAT 123 #ifdef SK_BUILD_FOR_WIN 124 { 3.4028234e38f, "3.4028235e+038" }, 125 { -3.4028234e38f, "-3.4028235e+038" }, 126 #else 127 { 3.4028234e38f, "3.4028235e+38" }, 128 { -3.4028234e38f, "-3.4028235e+38" }, 129 #endif 130#endif 131 }; 132 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) { 133 a.reset(); 134 a.appendScalar(gRec[i].fValue); 135 REPORTER_ASSERT(reporter, a.size() <= SkStrAppendScalar_MaxSize); 136// SkDebugf(" received <%s> expected <%s>\n", a.c_str(), gRec[i].fString); 137 REPORTER_ASSERT(reporter, a.equals(gRec[i].fString)); 138 } 139 140 REPORTER_ASSERT(reporter, SkStringPrintf("%i", 0).equals("0")); 141 142 char buffer [40]; 143 memset(buffer, 'a', 40); 144 REPORTER_ASSERT(reporter, buffer[18] == 'a'); 145 REPORTER_ASSERT(reporter, buffer[19] == 'a'); 146 REPORTER_ASSERT(reporter, buffer[20] == 'a'); 147 printfAnalog(buffer, 20, "%30d", 0); 148 REPORTER_ASSERT(reporter, buffer[18] == ' '); 149 REPORTER_ASSERT(reporter, buffer[19] == 0); 150 REPORTER_ASSERT(reporter, buffer[20] == 'a'); 151 152} 153 154#include "TestClassDef.h" 155DEFINE_TESTCLASS("String", StringTestClass, TestString) 156