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