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