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