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
14namespace re2 {
15
16TEST(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
43TEST(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
75TEST(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
93TEST(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
116TEST(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
149TEST(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
165TEST(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
181TEST(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