xref: /aosp_15_r20/external/regex-re2/re2/testing/set_test.cc (revision ccdc9c3e24c519bfa4832a66aa2e83a52c19f295)
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