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