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
TEST(Set,Unanchored)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
TEST(Set,UnanchoredFactored)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
TEST(Set,UnanchoredDollar)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
TEST(Set,UnanchoredWordBoundary)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
TEST(Set,Anchored)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
TEST(Set,EmptyUnanchored)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
TEST(Set,EmptyAnchored)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
TEST(Set,Prefix)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