1 /*
2 * Copyright (c) 2015-2017, Intel Corporation
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * * Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of Intel Corporation nor the names of its contributors
13 * may be used to endorse or promote products derived from this software
14 * without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "gtest/gtest.h"
30
31 #include "config.h"
32 #include "ue2common.h"
33 #include "util/ue2string.h"
34
35 using namespace ue2;
36
37 #if defined(DUMP_SUPPORT)
38
39 namespace ue2 {
40
PrintTo(const ue2_literal & lit,::std::ostream * os)41 static void PrintTo(const ue2_literal &lit, ::std::ostream *os) {
42 *os << dumpString(lit);
43 }
44
45 } // namespace ue2
46
47 #endif // DUMP_SUPPORT
48
TEST(string,case_iter1)49 TEST(string, case_iter1) {
50 const char * const expected[] = {
51 "3FOO-BAR",
52 "3FOO-BAr",
53 "3FOO-BaR",
54 "3FOO-Bar",
55 "3FOO-bAR",
56 "3FOO-bAr",
57 "3FOO-baR",
58 "3FOO-bar",
59 "3FOo-BAR",
60 "3FOo-BAr",
61 "3FOo-BaR",
62 "3FOo-Bar",
63 "3FOo-bAR",
64 "3FOo-bAr",
65 "3FOo-baR",
66 "3FOo-bar",
67 "3FoO-BAR",
68 "3FoO-BAr",
69 "3FoO-BaR",
70 "3FoO-Bar",
71 "3FoO-bAR",
72 "3FoO-bAr",
73 "3FoO-baR",
74 "3FoO-bar",
75 "3Foo-BAR",
76 "3Foo-BAr",
77 "3Foo-BaR",
78 "3Foo-Bar",
79 "3Foo-bAR",
80 "3Foo-bAr",
81 "3Foo-baR",
82 "3Foo-bar",
83 "3fOO-BAR",
84 "3fOO-BAr",
85 "3fOO-BaR",
86 "3fOO-Bar",
87 "3fOO-bAR",
88 "3fOO-bAr",
89 "3fOO-baR",
90 "3fOO-bar",
91 "3fOo-BAR",
92 "3fOo-BAr",
93 "3fOo-BaR",
94 "3fOo-Bar",
95 "3fOo-bAR",
96 "3fOo-bAr",
97 "3fOo-baR",
98 "3fOo-bar",
99 "3foO-BAR",
100 "3foO-BAr",
101 "3foO-BaR",
102 "3foO-Bar",
103 "3foO-bAR",
104 "3foO-bAr",
105 "3foO-baR",
106 "3foO-bar",
107 "3foo-BAR",
108 "3foo-BAr",
109 "3foo-BaR",
110 "3foo-Bar",
111 "3foo-bAR",
112 "3foo-bAr",
113 "3foo-baR",
114 "3foo-bar",
115 };
116
117 case_iter it = caseIterateBegin(ue2_literal(expected[17], true));
118 case_iter ite = caseIterateEnd();
119
120 u32 i = 0;
121 for(; it != ite; ++it, ++i) {
122 EXPECT_EQ(expected[i], *it);
123 }
124 EXPECT_EQ(ARRAY_LENGTH(expected), i);
125 }
126
TEST(string,case_iter2)127 TEST(string, case_iter2) {
128 case_iter it = caseIterateBegin(ue2_literal("4A", true));
129 case_iter ite = caseIterateEnd();
130
131 EXPECT_TRUE(ite != it);
132 EXPECT_EQ("4A", *it);
133 ++it;
134 EXPECT_TRUE(ite != it);
135 EXPECT_EQ("4a", *it);
136 ++it;
137 EXPECT_TRUE(!(ite != it));
138 }
139
TEST(string,case_iter3a)140 TEST(string, case_iter3a) {
141 ue2_literal src;
142 src.push_back('a', false);
143 src.push_back('B', true);
144 src.push_back('c', false);
145
146 case_iter it = caseIterateBegin(src);
147 case_iter ite = caseIterateEnd();
148
149 EXPECT_TRUE(ite != it);
150 EXPECT_EQ("aBc", *it);
151 ++it;
152 EXPECT_TRUE(ite != it);
153 EXPECT_EQ("abc", *it);
154 ++it;
155 EXPECT_TRUE(!(ite != it));
156 }
157
TEST(string,case_iter3b)158 TEST(string, case_iter3b) {
159 ue2_literal src;
160 src.push_back('A', false);
161 src.push_back('B', true);
162 src.push_back('C', false);
163
164 case_iter it = caseIterateBegin(src);
165 case_iter ite = caseIterateEnd();
166
167 EXPECT_TRUE(ite != it);
168 EXPECT_EQ("ABC", *it);
169 ++it;
170 EXPECT_TRUE(ite != it);
171 EXPECT_EQ("AbC", *it);
172 ++it;
173 EXPECT_TRUE(!(ite != it));
174 }
175
TEST(string,case_iter3c)176 TEST(string, case_iter3c) {
177 ue2_literal src;
178 src.push_back('A', false);
179 src.push_back('B', true);
180 src.push_back('C', true);
181
182 case_iter it = caseIterateBegin(src);
183 case_iter ite = caseIterateEnd();
184
185 EXPECT_TRUE(ite != it);
186 EXPECT_EQ("ABC", *it);
187 ++it;
188 EXPECT_TRUE(ite != it);
189 EXPECT_EQ("ABc", *it);
190 ++it;
191 EXPECT_TRUE(ite != it);
192 EXPECT_EQ("AbC", *it);
193 ++it;
194 EXPECT_TRUE(ite != it);
195 EXPECT_EQ("Abc", *it);
196 ++it;
197 EXPECT_TRUE(!(ite != it));
198 }
199
TEST(string,selfOverlap)200 TEST(string, selfOverlap) {
201 EXPECT_EQ(0U, maxStringSelfOverlap("abc", 0));
202 EXPECT_EQ(0U, maxStringSelfOverlap("abc", 1));
203 EXPECT_EQ(0U, maxStringSelfOverlap("abcA", 0));
204 EXPECT_EQ(1U, maxStringSelfOverlap("abcA", 1));
205 EXPECT_EQ(3U, maxStringSelfOverlap("aaaa", 0));
206 EXPECT_EQ(1U, maxStringSelfOverlap("aaAa", 0));
207 EXPECT_EQ(3U, maxStringSelfOverlap("aaAa", 1));
208 EXPECT_EQ(1U, maxStringSelfOverlap("aaba", 0));
209 EXPECT_EQ(2U, maxStringSelfOverlap("aabaa", 0));
210 EXPECT_EQ(3U, maxStringSelfOverlap("aabaab", 0));
211 }
212
TEST(string,reverse0)213 TEST(string, reverse0) {
214 ue2_literal empty;
215 EXPECT_TRUE(empty == reverse_literal(empty));
216 }
217
TEST(string,reverse1)218 TEST(string, reverse1) {
219 ue2_literal fwd("0123456789", false);
220 ue2_literal bwd("9876543210", false);
221
222 EXPECT_TRUE(bwd == reverse_literal(fwd));
223 }
224
TEST(string,reverse2)225 TEST(string, reverse2) {
226 ue2_literal fwd;
227 fwd.push_back('0', false);
228 fwd.push_back('a', false);
229 fwd.push_back('b', true);
230 fwd.push_back('c', true);
231
232 ue2_literal bwd;
233 bwd.push_back('c', true);
234 bwd.push_back('b', true);
235 bwd.push_back('a', false);
236 bwd.push_back('0', false);
237
238 EXPECT_TRUE(bwd == reverse_literal(fwd));
239 }
240
TEST(string,iterator_op1)241 TEST(string, iterator_op1) {
242 ue2_literal abcdef("abcdef", false);
243 ue2_literal::const_iterator b = abcdef.begin();
244 ue2_literal::const_iterator e = abcdef.end();
245
246 EXPECT_TRUE(b < e);
247 EXPECT_FALSE(b > e);
248 EXPECT_TRUE(e > b);
249 EXPECT_FALSE(e < b);
250 EXPECT_TRUE(e == e);
251 EXPECT_TRUE(b == b);
252 EXPECT_FALSE(e == b);
253 EXPECT_TRUE(b != e);
254 EXPECT_FALSE(b != b);
255 EXPECT_FALSE(e != e);
256 }
257
TEST(string,iterator_op2)258 TEST(string, iterator_op2) {
259 ue2_literal empty;
260 ue2_literal::const_iterator b = empty.begin();
261 ue2_literal::const_iterator e = empty.end();
262
263 EXPECT_FALSE(b > e);
264 EXPECT_FALSE(b < e);
265 EXPECT_TRUE(e == e);
266 EXPECT_TRUE(b == b);
267 EXPECT_FALSE(e != b);
268 }
269
TEST(string,eq)270 TEST(string, eq) {
271 ue2_literal empty1;
272 ue2_literal empty2;
273 ue2_literal abc_cs("abc", false);
274 ue2_literal abc_nc("abc", true);
275 ue2_literal abc_ucs("ABC", false);
276 ue2_literal abc_unc("ABC", true);
277
278 EXPECT_TRUE(empty1 == empty2);
279 EXPECT_FALSE(empty1 != empty2);
280
281 EXPECT_TRUE(abc_cs != abc_nc);
282 EXPECT_TRUE(abc_cs != empty1);
283 EXPECT_TRUE(abc_cs != abc_nc);
284 EXPECT_TRUE(abc_cs != abc_ucs);
285 EXPECT_TRUE(abc_cs != abc_unc);
286 EXPECT_FALSE(abc_cs == abc_nc);
287 EXPECT_FALSE(abc_cs == empty1);
288 EXPECT_FALSE(abc_cs == abc_nc);
289 EXPECT_FALSE(abc_cs == abc_ucs);
290 EXPECT_FALSE(abc_cs == abc_unc);
291
292 EXPECT_TRUE(abc_nc != abc_ucs);
293 EXPECT_TRUE(abc_nc == abc_unc);
294 EXPECT_FALSE(abc_nc == abc_ucs);
295 EXPECT_FALSE(abc_nc != abc_unc);
296
297 EXPECT_TRUE(abc_ucs != abc_unc);
298 EXPECT_FALSE(abc_ucs == abc_unc);
299 }
300
TEST(string,contains_cs)301 TEST(string, contains_cs) {
302 ue2_literal abc123("abc123", false);
303 EXPECT_TRUE(contains(abc123, CharReach('a')));
304 EXPECT_TRUE(contains(abc123, CharReach('b')));
305 EXPECT_TRUE(contains(abc123, CharReach('c')));
306 EXPECT_TRUE(contains(abc123, CharReach('1')));
307 EXPECT_TRUE(contains(abc123, CharReach('2')));
308 EXPECT_TRUE(contains(abc123, CharReach('3')));
309 EXPECT_TRUE(!contains(abc123, CharReach('A')));
310 EXPECT_TRUE(!contains(abc123, CharReach('B')));
311 EXPECT_TRUE(!contains(abc123, CharReach('C')));
312 EXPECT_TRUE(!contains(abc123, CharReach(0x11)));
313 EXPECT_TRUE(!contains(abc123, CharReach(0x12)));
314 EXPECT_TRUE(!contains(abc123, CharReach(0x13)));
315 EXPECT_TRUE(!contains(abc123, CharReach(0)));
316 EXPECT_TRUE(!contains(abc123, CharReach('X')));
317 EXPECT_TRUE(!contains(abc123, CharReach('\n')));
318 EXPECT_TRUE(contains(abc123, CharReach::dot()));
319 EXPECT_TRUE(contains(abc123, CharReach("Aa")));
320 EXPECT_TRUE(contains(abc123, CharReach("Bb")));
321 EXPECT_TRUE(contains(abc123, CharReach("XYZ1")));
322 EXPECT_TRUE(contains(abc123, CharReach("3~")));
323 EXPECT_TRUE(!contains(abc123, CharReach("45X")));
324 EXPECT_TRUE(!contains(abc123, CharReach("Bx")));
325 }
326
TEST(string,contains_nc)327 TEST(string, contains_nc) {
328 ue2_literal abc123("abc123", true);
329 EXPECT_TRUE(contains(abc123, CharReach('a')));
330 EXPECT_TRUE(contains(abc123, CharReach('b')));
331 EXPECT_TRUE(contains(abc123, CharReach('c')));
332 EXPECT_TRUE(contains(abc123, CharReach('1')));
333 EXPECT_TRUE(contains(abc123, CharReach('2')));
334 EXPECT_TRUE(contains(abc123, CharReach('3')));
335 EXPECT_TRUE(contains(abc123, CharReach('A')));
336 EXPECT_TRUE(contains(abc123, CharReach('B')));
337 EXPECT_TRUE(contains(abc123, CharReach('C')));
338 EXPECT_TRUE(!contains(abc123, CharReach(0x11)));
339 EXPECT_TRUE(!contains(abc123, CharReach(0x12)));
340 EXPECT_TRUE(!contains(abc123, CharReach(0x13)));
341 EXPECT_TRUE(!contains(abc123, CharReach(0)));
342 EXPECT_TRUE(!contains(abc123, CharReach('X')));
343 EXPECT_TRUE(!contains(abc123, CharReach('\n')));
344 EXPECT_TRUE(contains(abc123, CharReach::dot()));
345 EXPECT_TRUE(contains(abc123, CharReach("Aa")));
346 EXPECT_TRUE(contains(abc123, CharReach("Bb")));
347 EXPECT_TRUE(contains(abc123, CharReach("XYZ1")));
348 EXPECT_TRUE(contains(abc123, CharReach("3~")));
349 EXPECT_TRUE(!contains(abc123, CharReach("45X")));
350 EXPECT_TRUE(contains(abc123, CharReach("Bx")));
351 }
352
TEST(string,contains_empty)353 TEST(string, contains_empty) {
354 ue2_literal empty;
355 EXPECT_TRUE(!contains(empty, CharReach('a')));
356 EXPECT_TRUE(!contains(empty, CharReach::dot()));
357 }
358
TEST(string,cat)359 TEST(string, cat) {
360 ue2_literal abc("abc", false);
361 ue2_literal empty;
362 ue2_literal def("def", true);
363
364 ue2_literal abcdef;
365 abcdef.push_back('a', false);
366 abcdef.push_back('b', false);
367 abcdef.push_back('c', false);
368 abcdef.push_back('D', true);
369 abcdef.push_back('e', true);
370 abcdef.push_back('f', true);
371
372 EXPECT_EQ(empty, empty + empty);
373 EXPECT_EQ(abc, abc + empty);
374 EXPECT_EQ(abc, empty + abc);
375 EXPECT_EQ(abcdef, abc + def);
376 }
377
TEST(string,erase)378 TEST(string, erase) {
379 ue2_literal abcdefghi("abcdefghi", false);
380
381 ue2_literal abc = abcdefghi;
382 abc.erase(3, 10);
383 EXPECT_EQ(ue2_literal("abc", false), abc);
384
385 ue2_literal def = abcdefghi;
386 def.erase(0, 3);
387 def.erase(3);
388 EXPECT_EQ(ue2_literal("def", false), def);
389
390 ue2_literal bcdefghi = abcdefghi;
391 bcdefghi.erase(0, 1);
392 EXPECT_EQ(ue2_literal("bcdefghi", false), bcdefghi);
393 }
394
TEST(string,erase_nc)395 TEST(string, erase_nc) {
396 ue2_literal abcdef;
397 abcdef.push_back('a', false);
398 abcdef.push_back('b', false);
399 abcdef.push_back('c', false);
400 abcdef.push_back('D', true);
401 abcdef.push_back('e', true);
402 abcdef.push_back('f', true);
403
404
405 ue2_literal abc = abcdef;
406 abc.erase(3, 6);
407 EXPECT_EQ(ue2_literal("abc", false), abc);
408
409 ue2_literal def = abcdef;
410 def.erase(0, 3);
411 EXPECT_EQ(ue2_literal("def", true), def);
412 }
413