re2/re2/testing/set_test.cc
Go to the documentation of this file.
1 // Copyright 2010 The RE2 Authors. All Rights Reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4 
5 #include <stddef.h>
6 #include <string>
7 #include <vector>
8 #include <utility>
9 
10 #include "util/test.h"
11 #include "util/logging.h"
12 #include "re2/re2.h"
13 #include "re2/set.h"
14 
15 namespace re2 {
16 
17 TEST(Set, Unanchored) {
19 
20  ASSERT_EQ(s.Add("foo", NULL), 0);
21  ASSERT_EQ(s.Add("(", NULL), -1);
22  ASSERT_EQ(s.Add("bar", NULL), 1);
23  ASSERT_EQ(s.Compile(), true);
24 
25  ASSERT_EQ(s.Match("foobar", NULL), true);
26  ASSERT_EQ(s.Match("fooba", NULL), true);
27  ASSERT_EQ(s.Match("oobar", NULL), true);
28 
29  std::vector<int> v;
30  ASSERT_EQ(s.Match("foobar", &v), true);
31  ASSERT_EQ(v.size(), 2);
32  ASSERT_EQ(v[0], 0);
33  ASSERT_EQ(v[1], 1);
34 
35  ASSERT_EQ(s.Match("fooba", &v), true);
36  ASSERT_EQ(v.size(), 1);
37  ASSERT_EQ(v[0], 0);
38 
39  ASSERT_EQ(s.Match("oobar", &v), true);
40  ASSERT_EQ(v.size(), 1);
41  ASSERT_EQ(v[0], 1);
42 }
43 
44 TEST(Set, UnanchoredFactored) {
46 
47  ASSERT_EQ(s.Add("foo", NULL), 0);
48  ASSERT_EQ(s.Add("(", NULL), -1);
49  ASSERT_EQ(s.Add("foobar", NULL), 1);
50  ASSERT_EQ(s.Compile(), true);
51 
52  ASSERT_EQ(s.Match("foobar", NULL), true);
53  ASSERT_EQ(s.Match("obarfoobaroo", NULL), true);
54  ASSERT_EQ(s.Match("fooba", NULL), true);
55  ASSERT_EQ(s.Match("oobar", NULL), false);
56 
57  std::vector<int> v;
58  ASSERT_EQ(s.Match("foobar", &v), true);
59  ASSERT_EQ(v.size(), 2);
60  ASSERT_EQ(v[0], 0);
61  ASSERT_EQ(v[1], 1);
62 
63  ASSERT_EQ(s.Match("obarfoobaroo", &v), true);
64  ASSERT_EQ(v.size(), 2);
65  ASSERT_EQ(v[0], 0);
66  ASSERT_EQ(v[1], 1);
67 
68  ASSERT_EQ(s.Match("fooba", &v), true);
69  ASSERT_EQ(v.size(), 1);
70  ASSERT_EQ(v[0], 0);
71 
72  ASSERT_EQ(s.Match("oobar", &v), false);
73  ASSERT_EQ(v.size(), 0);
74 }
75 
76 TEST(Set, UnanchoredDollar) {
78 
79  ASSERT_EQ(s.Add("foo$", NULL), 0);
80  ASSERT_EQ(s.Compile(), true);
81 
82  ASSERT_EQ(s.Match("foo", NULL), true);
83  ASSERT_EQ(s.Match("foobar", NULL), false);
84 
85  std::vector<int> v;
86  ASSERT_EQ(s.Match("foo", &v), true);
87  ASSERT_EQ(v.size(), 1);
88  ASSERT_EQ(v[0], 0);
89 
90  ASSERT_EQ(s.Match("foobar", &v), false);
91  ASSERT_EQ(v.size(), 0);
92 }
93 
94 TEST(Set, UnanchoredWordBoundary) {
96 
97  ASSERT_EQ(s.Add("foo\\b", NULL), 0);
98  ASSERT_EQ(s.Compile(), true);
99 
100  ASSERT_EQ(s.Match("foo", NULL), true);
101  ASSERT_EQ(s.Match("foobar", NULL), false);
102  ASSERT_EQ(s.Match("foo bar", NULL), true);
103 
104  std::vector<int> v;
105  ASSERT_EQ(s.Match("foo", &v), true);
106  ASSERT_EQ(v.size(), 1);
107  ASSERT_EQ(v[0], 0);
108 
109  ASSERT_EQ(s.Match("foobar", &v), false);
110  ASSERT_EQ(v.size(), 0);
111 
112  ASSERT_EQ(s.Match("foo bar", &v), true);
113  ASSERT_EQ(v.size(), 1);
114  ASSERT_EQ(v[0], 0);
115 }
116 
117 TEST(Set, Anchored) {
119 
120  ASSERT_EQ(s.Add("foo", NULL), 0);
121  ASSERT_EQ(s.Add("(", NULL), -1);
122  ASSERT_EQ(s.Add("bar", NULL), 1);
123  ASSERT_EQ(s.Compile(), true);
124 
125  ASSERT_EQ(s.Match("foobar", NULL), false);
126  ASSERT_EQ(s.Match("fooba", NULL), false);
127  ASSERT_EQ(s.Match("oobar", NULL), false);
128  ASSERT_EQ(s.Match("foo", NULL), true);
129  ASSERT_EQ(s.Match("bar", NULL), true);
130 
131  std::vector<int> v;
132  ASSERT_EQ(s.Match("foobar", &v), false);
133  ASSERT_EQ(v.size(), 0);
134 
135  ASSERT_EQ(s.Match("fooba", &v), false);
136  ASSERT_EQ(v.size(), 0);
137 
138  ASSERT_EQ(s.Match("oobar", &v), false);
139  ASSERT_EQ(v.size(), 0);
140 
141  ASSERT_EQ(s.Match("foo", &v), true);
142  ASSERT_EQ(v.size(), 1);
143  ASSERT_EQ(v[0], 0);
144 
145  ASSERT_EQ(s.Match("bar", &v), true);
146  ASSERT_EQ(v.size(), 1);
147  ASSERT_EQ(v[0], 1);
148 }
149 
150 TEST(Set, EmptyUnanchored) {
152 
153  ASSERT_EQ(s.Compile(), true);
154 
155  ASSERT_EQ(s.Match("", NULL), false);
156  ASSERT_EQ(s.Match("foobar", NULL), false);
157 
158  std::vector<int> v;
159  ASSERT_EQ(s.Match("", &v), false);
160  ASSERT_EQ(v.size(), 0);
161 
162  ASSERT_EQ(s.Match("foobar", &v), false);
163  ASSERT_EQ(v.size(), 0);
164 }
165 
166 TEST(Set, EmptyAnchored) {
168 
169  ASSERT_EQ(s.Compile(), true);
170 
171  ASSERT_EQ(s.Match("", NULL), false);
172  ASSERT_EQ(s.Match("foobar", NULL), false);
173 
174  std::vector<int> v;
175  ASSERT_EQ(s.Match("", &v), false);
176  ASSERT_EQ(v.size(), 0);
177 
178  ASSERT_EQ(s.Match("foobar", &v), false);
179  ASSERT_EQ(v.size(), 0);
180 }
181 
182 TEST(Set, Prefix) {
184 
185  ASSERT_EQ(s.Add("/prefix/\\d*", NULL), 0);
186  ASSERT_EQ(s.Compile(), true);
187 
188  ASSERT_EQ(s.Match("/prefix", NULL), false);
189  ASSERT_EQ(s.Match("/prefix/", NULL), true);
190  ASSERT_EQ(s.Match("/prefix/42", NULL), true);
191 
192  std::vector<int> v;
193  ASSERT_EQ(s.Match("/prefix", &v), false);
194  ASSERT_EQ(v.size(), 0);
195 
196  ASSERT_EQ(s.Match("/prefix/", &v), true);
197  ASSERT_EQ(v.size(), 1);
198  ASSERT_EQ(v[0], 0);
199 
200  ASSERT_EQ(s.Match("/prefix/42", &v), true);
201  ASSERT_EQ(v.size(), 1);
202  ASSERT_EQ(v[0], 0);
203 }
204 
205 TEST(Set, MoveSemantics) {
207  ASSERT_EQ(s1.Add("foo\\d+", NULL), 0);
208  ASSERT_EQ(s1.Compile(), true);
209  ASSERT_EQ(s1.Match("abc foo1 xyz", NULL), true);
210  ASSERT_EQ(s1.Match("abc bar2 xyz", NULL), false);
211 
212  // The moved-to object should do what the moved-from object did.
213  RE2::Set s2 = std::move(s1);
214  ASSERT_EQ(s2.Match("abc foo1 xyz", NULL), true);
215  ASSERT_EQ(s2.Match("abc bar2 xyz", NULL), false);
216 
217  // The moved-from object should have been reset and be reusable.
218  ASSERT_EQ(s1.Add("bar\\d+", NULL), 0);
219  ASSERT_EQ(s1.Compile(), true);
220  ASSERT_EQ(s1.Match("abc foo1 xyz", NULL), false);
221  ASSERT_EQ(s1.Match("abc bar2 xyz", NULL), true);
222 
223  // Verify that "overwriting" works and also doesn't leak memory.
224  // (The latter will need a leak detector such as LeakSanitizer.)
225  s1 = std::move(s2);
226  ASSERT_EQ(s1.Match("abc foo1 xyz", NULL), true);
227  ASSERT_EQ(s1.Match("abc bar2 xyz", NULL), false);
228 }
229 
230 } // namespace re2
re2::RE2::Set
Definition: bloaty/third_party/re2/re2/set.h:23
re2::RE2::Set::Match
bool Match(const StringPiece &text, std::vector< int > *v) const
Definition: bloaty/third_party/re2/re2/set.cc:105
re2::RE2::ANCHOR_BOTH
@ ANCHOR_BOTH
Definition: bloaty/third_party/re2/re2/re2.h:475
re2::RE2::UNANCHORED
@ UNANCHORED
Definition: bloaty/third_party/re2/re2/re2.h:473
re2
Definition: bloaty/third_party/re2/re2/bitmap256.h:17
absl::FormatConversionChar::s
@ s
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
re2::RE2::DefaultOptions
@ DefaultOptions
Definition: bloaty/third_party/re2/re2/re2.h:248
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
re2::RE2::Set::Compile
bool Compile()
Definition: bloaty/third_party/re2/re2/set.cc:75
re2::RE2::Set::Add
int Add(const StringPiece &pattern, std::string *error)
Definition: bloaty/third_party/re2/re2/set.cc:36
re2::TEST
TEST(TestCharClassBuilder, Adds)
Definition: bloaty/third_party/re2/re2/testing/charclass_test.cc:198
ASSERT_EQ
#define ASSERT_EQ(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2056


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:12