1*ccdc9c3eSSadaf Ebrahimi // Copyright 2010 The RE2 Authors. All Rights Reserved.
2*ccdc9c3eSSadaf Ebrahimi // Use of this source code is governed by a BSD-style
3*ccdc9c3eSSadaf Ebrahimi // license that can be found in the LICENSE file.
4*ccdc9c3eSSadaf Ebrahimi
5*ccdc9c3eSSadaf Ebrahimi #include <stddef.h>
6*ccdc9c3eSSadaf Ebrahimi #include <string>
7*ccdc9c3eSSadaf Ebrahimi #include <vector>
8*ccdc9c3eSSadaf Ebrahimi
9*ccdc9c3eSSadaf Ebrahimi #include "util/test.h"
10*ccdc9c3eSSadaf Ebrahimi #include "util/logging.h"
11*ccdc9c3eSSadaf Ebrahimi #include "re2/re2.h"
12*ccdc9c3eSSadaf Ebrahimi #include "re2/set.h"
13*ccdc9c3eSSadaf Ebrahimi
14*ccdc9c3eSSadaf Ebrahimi namespace re2 {
15*ccdc9c3eSSadaf Ebrahimi
TEST(Set,Unanchored)16*ccdc9c3eSSadaf Ebrahimi TEST(Set, Unanchored) {
17*ccdc9c3eSSadaf Ebrahimi RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
18*ccdc9c3eSSadaf Ebrahimi
19*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("foo", NULL), 0);
20*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("(", NULL), -1);
21*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("bar", NULL), 1);
22*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Compile(), true);
23*ccdc9c3eSSadaf Ebrahimi
24*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", NULL), true);
25*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("fooba", NULL), true);
26*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("oobar", NULL), true);
27*ccdc9c3eSSadaf Ebrahimi
28*ccdc9c3eSSadaf Ebrahimi std::vector<int> v;
29*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", &v), true);
30*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 2);
31*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
32*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[1], 1);
33*ccdc9c3eSSadaf Ebrahimi
34*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("fooba", &v), true);
35*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
36*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
37*ccdc9c3eSSadaf Ebrahimi
38*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("oobar", &v), true);
39*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
40*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 1);
41*ccdc9c3eSSadaf Ebrahimi }
42*ccdc9c3eSSadaf Ebrahimi
TEST(Set,UnanchoredFactored)43*ccdc9c3eSSadaf Ebrahimi TEST(Set, UnanchoredFactored) {
44*ccdc9c3eSSadaf Ebrahimi RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
45*ccdc9c3eSSadaf Ebrahimi
46*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("foo", NULL), 0);
47*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("(", NULL), -1);
48*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("foobar", NULL), 1);
49*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Compile(), true);
50*ccdc9c3eSSadaf Ebrahimi
51*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", NULL), true);
52*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("obarfoobaroo", NULL), true);
53*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("fooba", NULL), true);
54*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("oobar", NULL), false);
55*ccdc9c3eSSadaf Ebrahimi
56*ccdc9c3eSSadaf Ebrahimi std::vector<int> v;
57*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", &v), true);
58*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 2);
59*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
60*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[1], 1);
61*ccdc9c3eSSadaf Ebrahimi
62*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("obarfoobaroo", &v), true);
63*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 2);
64*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
65*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[1], 1);
66*ccdc9c3eSSadaf Ebrahimi
67*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("fooba", &v), true);
68*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
69*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
70*ccdc9c3eSSadaf Ebrahimi
71*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("oobar", &v), false);
72*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
73*ccdc9c3eSSadaf Ebrahimi }
74*ccdc9c3eSSadaf Ebrahimi
TEST(Set,UnanchoredDollar)75*ccdc9c3eSSadaf Ebrahimi TEST(Set, UnanchoredDollar) {
76*ccdc9c3eSSadaf Ebrahimi RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
77*ccdc9c3eSSadaf Ebrahimi
78*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("foo$", NULL), 0);
79*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Compile(), true);
80*ccdc9c3eSSadaf Ebrahimi
81*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foo", NULL), true);
82*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", NULL), false);
83*ccdc9c3eSSadaf Ebrahimi
84*ccdc9c3eSSadaf Ebrahimi std::vector<int> v;
85*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foo", &v), true);
86*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
87*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
88*ccdc9c3eSSadaf Ebrahimi
89*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", &v), false);
90*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
91*ccdc9c3eSSadaf Ebrahimi }
92*ccdc9c3eSSadaf Ebrahimi
TEST(Set,UnanchoredWordBoundary)93*ccdc9c3eSSadaf Ebrahimi TEST(Set, UnanchoredWordBoundary) {
94*ccdc9c3eSSadaf Ebrahimi RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
95*ccdc9c3eSSadaf Ebrahimi
96*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("foo\\b", NULL), 0);
97*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Compile(), true);
98*ccdc9c3eSSadaf Ebrahimi
99*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foo", NULL), true);
100*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", NULL), false);
101*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foo bar", NULL), true);
102*ccdc9c3eSSadaf Ebrahimi
103*ccdc9c3eSSadaf Ebrahimi std::vector<int> v;
104*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foo", &v), true);
105*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
106*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
107*ccdc9c3eSSadaf Ebrahimi
108*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", &v), false);
109*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
110*ccdc9c3eSSadaf Ebrahimi
111*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foo bar", &v), true);
112*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
113*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
114*ccdc9c3eSSadaf Ebrahimi }
115*ccdc9c3eSSadaf Ebrahimi
TEST(Set,Anchored)116*ccdc9c3eSSadaf Ebrahimi TEST(Set, Anchored) {
117*ccdc9c3eSSadaf Ebrahimi RE2::Set s(RE2::DefaultOptions, RE2::ANCHOR_BOTH);
118*ccdc9c3eSSadaf Ebrahimi
119*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("foo", NULL), 0);
120*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("(", NULL), -1);
121*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("bar", NULL), 1);
122*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Compile(), true);
123*ccdc9c3eSSadaf Ebrahimi
124*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", NULL), false);
125*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("fooba", NULL), false);
126*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("oobar", NULL), false);
127*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foo", NULL), true);
128*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("bar", NULL), true);
129*ccdc9c3eSSadaf Ebrahimi
130*ccdc9c3eSSadaf Ebrahimi std::vector<int> v;
131*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", &v), false);
132*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
133*ccdc9c3eSSadaf Ebrahimi
134*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("fooba", &v), false);
135*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
136*ccdc9c3eSSadaf Ebrahimi
137*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("oobar", &v), false);
138*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
139*ccdc9c3eSSadaf Ebrahimi
140*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foo", &v), true);
141*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
142*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
143*ccdc9c3eSSadaf Ebrahimi
144*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("bar", &v), true);
145*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
146*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 1);
147*ccdc9c3eSSadaf Ebrahimi }
148*ccdc9c3eSSadaf Ebrahimi
TEST(Set,EmptyUnanchored)149*ccdc9c3eSSadaf Ebrahimi TEST(Set, EmptyUnanchored) {
150*ccdc9c3eSSadaf Ebrahimi RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
151*ccdc9c3eSSadaf Ebrahimi
152*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Compile(), true);
153*ccdc9c3eSSadaf Ebrahimi
154*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("", NULL), false);
155*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", NULL), false);
156*ccdc9c3eSSadaf Ebrahimi
157*ccdc9c3eSSadaf Ebrahimi std::vector<int> v;
158*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("", &v), false);
159*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
160*ccdc9c3eSSadaf Ebrahimi
161*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", &v), false);
162*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
163*ccdc9c3eSSadaf Ebrahimi }
164*ccdc9c3eSSadaf Ebrahimi
TEST(Set,EmptyAnchored)165*ccdc9c3eSSadaf Ebrahimi TEST(Set, EmptyAnchored) {
166*ccdc9c3eSSadaf Ebrahimi RE2::Set s(RE2::DefaultOptions, RE2::ANCHOR_BOTH);
167*ccdc9c3eSSadaf Ebrahimi
168*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Compile(), true);
169*ccdc9c3eSSadaf Ebrahimi
170*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("", NULL), false);
171*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", NULL), false);
172*ccdc9c3eSSadaf Ebrahimi
173*ccdc9c3eSSadaf Ebrahimi std::vector<int> v;
174*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("", &v), false);
175*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
176*ccdc9c3eSSadaf Ebrahimi
177*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("foobar", &v), false);
178*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
179*ccdc9c3eSSadaf Ebrahimi }
180*ccdc9c3eSSadaf Ebrahimi
TEST(Set,Prefix)181*ccdc9c3eSSadaf Ebrahimi TEST(Set, Prefix) {
182*ccdc9c3eSSadaf Ebrahimi RE2::Set s(RE2::DefaultOptions, RE2::ANCHOR_BOTH);
183*ccdc9c3eSSadaf Ebrahimi
184*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add("/prefix/\\d*", NULL), 0);
185*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Compile(), true);
186*ccdc9c3eSSadaf Ebrahimi
187*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("/prefix", NULL), false);
188*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("/prefix/", NULL), true);
189*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("/prefix/42", NULL), true);
190*ccdc9c3eSSadaf Ebrahimi
191*ccdc9c3eSSadaf Ebrahimi std::vector<int> v;
192*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("/prefix", &v), false);
193*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
194*ccdc9c3eSSadaf Ebrahimi
195*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("/prefix/", &v), true);
196*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
197*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
198*ccdc9c3eSSadaf Ebrahimi
199*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match("/prefix/42", &v), true);
200*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 1);
201*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v[0], 0);
202*ccdc9c3eSSadaf Ebrahimi }
203*ccdc9c3eSSadaf Ebrahimi
TEST(Set,OutOfMemory)204*ccdc9c3eSSadaf Ebrahimi TEST(Set, OutOfMemory) {
205*ccdc9c3eSSadaf Ebrahimi RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
206*ccdc9c3eSSadaf Ebrahimi
207*ccdc9c3eSSadaf Ebrahimi string a(10000, 'a');
208*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Add(a, NULL), 0);
209*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Compile(), true);
210*ccdc9c3eSSadaf Ebrahimi
211*ccdc9c3eSSadaf Ebrahimi std::vector<int> v;
212*ccdc9c3eSSadaf Ebrahimi RE2::Set::ErrorInfo ei;
213*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(s.Match(a, &v, &ei), false);
214*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(v.size(), 0);
215*ccdc9c3eSSadaf Ebrahimi ASSERT_EQ(ei.kind, RE2::Set::kOutOfMemory);
216*ccdc9c3eSSadaf Ebrahimi }
217*ccdc9c3eSSadaf Ebrahimi
218*ccdc9c3eSSadaf Ebrahimi } // namespace re2
219