• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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