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
31static void printfAnalog(char* buffer, int size, const char format[], ...) {
32    ARGS_TO_BUFFER(format, buffer, size);
33}
34
35DEF_TEST(String, reporter) {
36    SkString    a;
37    SkString    b((size_t)0);
38    SkString    c("");
39    SkString    d(NULL, 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  #ifdef SK_BUILD_FOR_WIN
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//        SkDebugf(" received <%s> expected <%s>\n", a.c_str(), gRec[i].fString);
172        REPORTER_ASSERT(reporter, a.equals(gRec[i].fString));
173    }
174
175    REPORTER_ASSERT(reporter, SkStringPrintf("%i", 0).equals("0"));
176
177    char buffer [40];
178    memset(buffer, 'a', 40);
179    REPORTER_ASSERT(reporter, buffer[18] == 'a');
180    REPORTER_ASSERT(reporter, buffer[19] == 'a');
181    REPORTER_ASSERT(reporter, buffer[20] == 'a');
182    printfAnalog(buffer, 20, "%30d", 0);
183    REPORTER_ASSERT(reporter, buffer[18] == ' ');
184    REPORTER_ASSERT(reporter, buffer[19] == 0);
185    REPORTER_ASSERT(reporter, buffer[20] == 'a');
186
187}
188
189DEF_TEST(String_SkStrSplit, r) {
190    SkTArray<SkString> results;
191
192    SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", &results);
193    REPORTER_ASSERT(r, results.count() == 6);
194    REPORTER_ASSERT(r, results[0].equals("a"));
195    REPORTER_ASSERT(r, results[1].equals("b"));
196    REPORTER_ASSERT(r, results[2].equals("c"));
197    REPORTER_ASSERT(r, results[3].equals("dee"));
198    REPORTER_ASSERT(r, results[4].equals("f"));
199    REPORTER_ASSERT(r, results[5].equals("g"));
200}
201