15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2010 The RE2 Authors.  All Rights Reserved.
2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style
3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// license that can be found in the LICENSE file.
4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <sys/types.h>
6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include <sys/stat.h>
7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include <vector>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "util/test.h"
10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "re2/re2.h"
11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "re2/set.h"
12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace re2 {
14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
15d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTEST(Set, Unanchored) {
16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Add("foo", NULL), 0);
19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Add("(", NULL), -1);
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Add("bar", NULL), 1);
21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Compile(), true);
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  vector<int> v;
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  CHECK_EQ(s.Match("foobar", &v), true);
26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  CHECK_EQ(v.size(), 2);
27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  CHECK_EQ(v[0], 0);
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(v[1], 1);
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  v.clear();
31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  CHECK_EQ(s.Match("fooba", &v), true);
32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(v.size(), 1);
33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(v[0], 0);
34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  v.clear();
36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Match("oobar", &v), true);
37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(v.size(), 1);
38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  CHECK_EQ(v[0], 1);
39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST(Set, UnanchoredFactored) {
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Add("foo", NULL), 0);
45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Add("(", NULL), -1);
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Add("foobar", NULL), 1);
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Compile(), true);
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  vector<int> v;
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Match("foobar", &v), true);
52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(v.size(), 2);
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(v[0], 0);
54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(v[1], 1);
55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  v.clear();
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(s.Match("obarfoobaroo", &v), true);
58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK_EQ(v.size(), 2);
59  CHECK_EQ(v[0], 0);
60  CHECK_EQ(v[1], 1);
61
62  v.clear();
63  CHECK_EQ(s.Match("fooba", &v), true);
64  CHECK_EQ(v.size(), 1);
65  CHECK_EQ(v[0], 0);
66
67  v.clear();
68  CHECK_EQ(s.Match("oobar", &v), false);
69  CHECK_EQ(v.size(), 0);
70}
71
72TEST(Set, UnanchoredDollar) {
73  RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
74
75  CHECK_EQ(s.Add("foo$", NULL), 0);
76  CHECK_EQ(s.Compile(), true);
77
78  vector<int> v;
79  CHECK_EQ(s.Match("foo", &v), true);
80  CHECK_EQ(v.size(), 1);
81  CHECK_EQ(v[0], 0);
82}
83
84TEST(Set, Anchored) {
85  RE2::Set s(RE2::DefaultOptions, RE2::ANCHOR_BOTH);
86
87  CHECK_EQ(s.Add("foo", NULL), 0);
88  CHECK_EQ(s.Add("(", NULL), -1);
89  CHECK_EQ(s.Add("bar", NULL), 1);
90
91  CHECK_EQ(s.Compile(), true);
92
93  vector<int> v;
94  CHECK_EQ(s.Match("foobar", &v), false);
95  CHECK_EQ(v.size(), 0);
96
97  CHECK_EQ(s.Match("fooba", &v), false);
98  CHECK_EQ(v.size(), 0);
99
100  CHECK_EQ(s.Match("oobar", &v), false);
101  CHECK_EQ(v.size(), 0);
102
103  CHECK_EQ(s.Match("foo", &v), true);
104  CHECK_EQ(v.size(), 1);
105  CHECK_EQ(v[0], 0);
106
107  CHECK_EQ(s.Match("bar", &v), true);
108  CHECK_EQ(v.size(), 1);
109  CHECK_EQ(v[0], 1);
110
111}
112
113}  // namespace re2
114
115