1 /*
2 * unittests/core/StringBuffer.cc
3 * Apto
4 *
5 * Created by David on 2/14/11.
6 * Copyright 2011 David Michael Bryson. All rights reserved.
7 * http://programerror.com/software/apto
8 *
9 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
10 * following conditions are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
13 * following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
15 * following disclaimer in the documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of David Michael Bryson, nor the names of contributors may be used to endorse or promote
17 * products derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY DAVID MICHAEL BRYSON AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL DAVID MICHAEL BRYSON OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
25 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
27 * Authors: David M. Bryson <david@programerror.com>
28 *
29 */
30
31 #include "apto/core/String.h"
32 #include "apto/core/StringBuffer.h"
33
34 #include "gtest/gtest.h"
35
36
37
TEST(CoreStringBuffer,Construction)38 TEST(CoreStringBuffer, Construction) {
39 Apto::StringBuffer s1;
40 EXPECT_EQ(0, s1.GetSize());
41
42 // Test Construction with strings
43 const char* teststr = "Foo Bar Baz";
44 Apto::StringBuffer s2(teststr);
45 EXPECT_EQ(11, s2.GetSize());
46 Apto::StringBuffer s3(3, teststr);
47 EXPECT_EQ(3, s3.GetSize());
48
49 Apto::String s4(s3);
50 Apto::StringBuffer s5(s4);
51 }
52
53
TEST(CoreStringBuffer,Indexing)54 TEST(CoreStringBuffer, Indexing) {
55 Apto::StringBuffer s1("foo");
56 EXPECT_EQ('f', s1[0]);
57 EXPECT_EQ('o', s1[1]);
58 EXPECT_EQ('o', s1[2]);
59
60 s1[0] = 'b';
61 s1[1] = 'a';
62 s1[2] = 'r';
63
64 EXPECT_EQ('b', s1[0]);
65 EXPECT_EQ('a', s1[1]);
66 EXPECT_EQ('r', s1[2]);
67
68 // Make a copy (shared backing buffer)
69 Apto::StringBuffer s2(s1);
70 s2[2] = 'z';
71
72 EXPECT_EQ('b', s1[0]);
73 EXPECT_EQ('a', s1[1]);
74 EXPECT_EQ('r', s1[2]);
75
76 EXPECT_EQ('b', s2[0]);
77 EXPECT_EQ('a', s2[1]);
78 EXPECT_EQ('z', s2[2]);
79 }
80
81
TEST(CoreStringBuffer,Assignment)82 TEST(CoreStringBuffer, Assignment) {
83 Apto::StringBuffer s1("foo");
84 EXPECT_EQ('f', s1[0]);
85 EXPECT_EQ('o', s1[1]);
86 EXPECT_EQ('o', s1[2]);
87 Apto::StringBuffer s2("bar");
88 EXPECT_EQ('b', s2[0]);
89 EXPECT_EQ('a', s2[1]);
90 EXPECT_EQ('r', s2[2]);
91
92 Apto::StringBuffer s3(s1);
93 EXPECT_EQ('f', s3[0]);
94 EXPECT_EQ('o', s3[1]);
95 EXPECT_EQ('o', s3[2]);
96
97 s2 = s1;
98 EXPECT_EQ('f', s2[0]);
99 EXPECT_EQ('o', s2[1]);
100 EXPECT_EQ('o', s2[2]);
101
102 s3 = "baz";
103 EXPECT_EQ('b', s3[0]);
104 EXPECT_EQ('a', s3[1]);
105 EXPECT_EQ('z', s3[2]);
106 }
107
108
TEST(CoreStringBuffer,Iterators)109 TEST(CoreStringBuffer, Iterators) {
110 Apto::StringBuffer s1("abcdef");
111
112 Apto::StringBuffer::Iterator it = s1.Begin();
113 for (int i = 0; it.Next(); i++) EXPECT_EQ('a' + i, *it.Get());
114
115 const Apto::StringBuffer& cs1 = s1;
116 Apto::StringBuffer::ConstIterator cit = cs1.Begin();
117 for (int i = 0; cit.Next(); i++) EXPECT_EQ('a' + i, *cit.Get());
118 }
119
120
TEST(CoreStringBuffer,Comparison)121 TEST(CoreStringBuffer, Comparison) {
122 Apto::StringBuffer s1("bar");
123 Apto::StringBuffer s2("baz");
124
125 EXPECT_TRUE(s1 == s1);
126 EXPECT_TRUE(s2 == s2);
127 EXPECT_FALSE(s1 == s2);
128 EXPECT_FALSE(s2 == s1);
129 EXPECT_TRUE(s1 == "bar");
130 EXPECT_TRUE("bar" == s1);
131 EXPECT_FALSE(s1 == "baz");
132 EXPECT_FALSE("baz" == s1);
133 EXPECT_TRUE(s2 == "baz");
134 EXPECT_TRUE("baz" == s2);
135 EXPECT_FALSE(s2 == "bar");
136 EXPECT_FALSE("bar" == s2);
137
138 EXPECT_FALSE(s1 != s1);
139 EXPECT_FALSE(s2 != s2);
140 EXPECT_TRUE(s1 != s2);
141 EXPECT_TRUE(s2 != s1);
142 EXPECT_FALSE(s1 != "bar");
143 EXPECT_FALSE("bar" != s1);
144 EXPECT_TRUE(s1 != "baz");
145 EXPECT_TRUE("baz" != s1);
146 EXPECT_FALSE(s2 != "baz");
147 EXPECT_FALSE("baz" != s2);
148 EXPECT_TRUE(s2 != "bar");
149 EXPECT_TRUE("bar" != s2);
150
151 EXPECT_FALSE(s1 < s1);
152 EXPECT_FALSE(s2 < s2);
153 EXPECT_TRUE(s1 < s2);
154 EXPECT_FALSE(s2 < s1);
155 EXPECT_FALSE(s1 < "bar");
156 EXPECT_FALSE("bar" < s1);
157 EXPECT_TRUE(s1 < "baz");
158 EXPECT_FALSE("baz" < s1);
159 EXPECT_FALSE(s2 < "bar");
160 EXPECT_TRUE("bar" < s2);
161 EXPECT_FALSE(s2 < "baz");
162 EXPECT_FALSE("baz" < s2);
163
164 EXPECT_FALSE(s1 > s1);
165 EXPECT_FALSE(s2 > s2);
166 EXPECT_FALSE(s1 > s2);
167 EXPECT_TRUE(s2 > s1);
168 EXPECT_FALSE(s1 > "bar");
169 EXPECT_FALSE("bar" > s1);
170 EXPECT_FALSE(s1 > "baz");
171 EXPECT_TRUE("baz" > s1);
172 EXPECT_TRUE(s2 > "bar");
173 EXPECT_FALSE("bar" > s2);
174 EXPECT_FALSE(s2 > "baz");
175 EXPECT_FALSE("baz" > s2);
176
177 EXPECT_TRUE(s1 <= s1);
178 EXPECT_TRUE(s2 <= s2);
179 EXPECT_TRUE(s1 <= s2);
180 EXPECT_FALSE(s2 <= s1);
181 EXPECT_TRUE(s1 <= "bar");
182 EXPECT_TRUE("bar" <= s1);
183 EXPECT_TRUE(s1 <= "baz");
184 EXPECT_FALSE("baz" <= s1);
185 EXPECT_FALSE(s2 <= "bar");
186 EXPECT_TRUE("bar" <= s2);
187 EXPECT_TRUE(s2 <= "baz");
188 EXPECT_TRUE("baz" <= s2);
189
190 EXPECT_TRUE(s1 >= s1);
191 EXPECT_TRUE(s2 >= s2);
192 EXPECT_FALSE(s1 >= s2);
193 EXPECT_TRUE(s2 >= s1);
194 EXPECT_TRUE(s1 >= "bar");
195 EXPECT_TRUE("bar" >= s1);
196 EXPECT_FALSE(s1 >= "baz");
197 EXPECT_TRUE("baz" >= s1);
198 EXPECT_TRUE(s2 >= "bar");
199 EXPECT_FALSE("bar" >= s2);
200 EXPECT_TRUE(s2 >= "baz");
201 EXPECT_TRUE("baz" >= s2);
202 }
203
204
TEST(CoreStringBuffer,Concatenation)205 TEST(CoreStringBuffer, Concatenation) {
206 Apto::StringBuffer s1("foo");
207 EXPECT_EQ(3, s1.GetSize());
208 EXPECT_EQ('f', s1[0]);
209 EXPECT_EQ('o', s1[1]);
210 EXPECT_EQ('o', s1[2]);
211
212 s1 += 'b';
213 EXPECT_EQ(4, s1.GetSize());
214 EXPECT_EQ('f', s1[0]);
215 EXPECT_EQ('o', s1[1]);
216 EXPECT_EQ('o', s1[2]);
217 EXPECT_EQ('b', s1[3]);
218
219 s1 += "ar";
220 EXPECT_EQ(6, s1.GetSize());
221 EXPECT_EQ('f', s1[0]);
222 EXPECT_EQ('o', s1[1]);
223 EXPECT_EQ('o', s1[2]);
224 EXPECT_EQ('b', s1[3]);
225 EXPECT_EQ('a', s1[4]);
226 EXPECT_EQ('r', s1[5]);
227
228 s1 += Apto::StringBuffer("baz");
229 EXPECT_EQ(9, s1.GetSize());
230 EXPECT_EQ('f', s1[0]);
231 EXPECT_EQ('o', s1[1]);
232 EXPECT_EQ('o', s1[2]);
233 EXPECT_EQ('b', s1[3]);
234 EXPECT_EQ('a', s1[4]);
235 EXPECT_EQ('r', s1[5]);
236 EXPECT_EQ('b', s1[6]);
237 EXPECT_EQ('a', s1[7]);
238 EXPECT_EQ('z', s1[8]);
239
240 s1 = s1 + ' ';
241 EXPECT_EQ(10, s1.GetSize());
242 EXPECT_EQ('f', s1[0]);
243 EXPECT_EQ('o', s1[1]);
244 EXPECT_EQ('o', s1[2]);
245 EXPECT_EQ('b', s1[3]);
246 EXPECT_EQ('a', s1[4]);
247 EXPECT_EQ('r', s1[5]);
248 EXPECT_EQ('b', s1[6]);
249 EXPECT_EQ('a', s1[7]);
250 EXPECT_EQ('z', s1[8]);
251 EXPECT_EQ(' ', s1[9]);
252
253
254 s1 = s1 + "- ";
255 EXPECT_EQ(12, s1.GetSize());
256 EXPECT_EQ('f', s1[0]);
257 EXPECT_EQ('o', s1[1]);
258 EXPECT_EQ('o', s1[2]);
259 EXPECT_EQ('b', s1[3]);
260 EXPECT_EQ('a', s1[4]);
261 EXPECT_EQ('r', s1[5]);
262 EXPECT_EQ('b', s1[6]);
263 EXPECT_EQ('a', s1[7]);
264 EXPECT_EQ('z', s1[8]);
265 EXPECT_EQ(' ', s1[9]);
266 EXPECT_EQ('-', s1[10]);
267 EXPECT_EQ(' ', s1[11]);
268
269
270
271 s1 = s1 + s1;
272 EXPECT_EQ(24, s1.GetSize());
273 EXPECT_EQ('f', s1[0]);
274 EXPECT_EQ('o', s1[1]);
275 EXPECT_EQ('o', s1[2]);
276 EXPECT_EQ('b', s1[3]);
277 EXPECT_EQ('a', s1[4]);
278 EXPECT_EQ('r', s1[5]);
279 EXPECT_EQ('b', s1[6]);
280 EXPECT_EQ('a', s1[7]);
281 EXPECT_EQ('z', s1[8]);
282 EXPECT_EQ(' ', s1[9]);
283 EXPECT_EQ('-', s1[10]);
284 EXPECT_EQ(' ', s1[11]);
285 EXPECT_EQ('f', s1[12]);
286 EXPECT_EQ('o', s1[13]);
287 EXPECT_EQ('o', s1[14]);
288 EXPECT_EQ('b', s1[15]);
289 EXPECT_EQ('a', s1[16]);
290 EXPECT_EQ('r', s1[17]);
291 EXPECT_EQ('b', s1[18]);
292 EXPECT_EQ('a', s1[19]);
293 EXPECT_EQ('z', s1[20]);
294 EXPECT_EQ(' ', s1[21]);
295 EXPECT_EQ('-', s1[22]);
296 EXPECT_EQ(' ', s1[23]);
297 }
298
299
TEST(CoreStringBuffer,Substring)300 TEST(CoreStringBuffer, Substring) {
301 Apto::StringBuffer s1("foobarbaz");
302 Apto::StringBuffer s2 = s1.Substring(3, 3);
303 EXPECT_EQ(3, s2.GetSize());
304 EXPECT_EQ('b', s2[0]);
305 EXPECT_EQ('a', s2[1]);
306 EXPECT_EQ('r', s2[2]);
307 }
308
309
TEST(CoreStringBuffer,CharacterInstpection)310 TEST(CoreStringBuffer, CharacterInstpection) {
311 Apto::StringBuffer s1("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 \f\n\r\t\v.");
312 for (int i = 0; i < s1.GetSize(); i++) {
313 if (i < 26 ) EXPECT_TRUE(s1.IsUpper(i)); else EXPECT_FALSE(s1.IsUpper(i));
314 if (i >= 26 && i < 52) EXPECT_TRUE(s1.IsLower(i)); else EXPECT_FALSE(s1.IsLower(i));
315 if (i < 52 ) EXPECT_TRUE(s1.IsLetter(i)); else EXPECT_FALSE(s1.IsLetter(i));
316 if (i >= 52 && i < 62) EXPECT_TRUE(s1.IsNumber(i)); else EXPECT_FALSE(s1.IsNumber(i));
317 if (i >= 62 && i < 68) EXPECT_TRUE(s1.IsWhitespace(i)); else EXPECT_FALSE(s1.IsWhitespace(i));
318 }
319 }
320