regexp_test.cc revision 0d4c52358a1af421705c54bd8a9fdd8a30558a2e
1// Copyright 2006 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// Test parse.cc, dump.cc, and tostring.cc.
6
7#include <string>
8#include <vector>
9#include "util/test.h"
10#include "re2/regexp.h"
11
12namespace re2 {
13
14// Test that overflowed ref counts work.
15TEST(Regexp, BigRef) {
16  Regexp* re;
17  re = Regexp::Parse("x", Regexp::NoParseFlags, NULL);
18  for (int i = 0; i < 100000; i++)
19    re->Incref();
20  for (int i = 0; i < 100000; i++)
21    re->Decref();
22  CHECK_EQ(re->Ref(), 1);
23  re->Decref();
24}
25
26// Test that very large Concats work.
27// Depends on overflowed ref counts working.
28TEST(Regexp, BigConcat) {
29  Regexp* x;
30  x = Regexp::Parse("x", Regexp::NoParseFlags, NULL);
31  vector<Regexp*> v(90000, x);  // ToString bails out at 100000
32  for (int i = 0; i < v.size(); i++)
33    x->Incref();
34  CHECK_EQ(x->Ref(), 1 + v.size()) << x->Ref();
35  Regexp* re = Regexp::Concat(&v[0], v.size(), Regexp::NoParseFlags);
36  CHECK_EQ(re->ToString(), string(v.size(), 'x'));
37  re->Decref();
38  CHECK_EQ(x->Ref(), 1) << x->Ref();
39  x->Decref();
40}
41
42TEST(Regexp, NamedCaptures) {
43  Regexp* x;
44  RegexpStatus status;
45  x = Regexp::Parse(
46      "(?P<g1>a+)|(e)(?P<g2>w*)+(?P<g1>b+)", Regexp::PerlX, &status);
47  EXPECT_TRUE(status.ok());
48  EXPECT_EQ(4, x->NumCaptures());
49  const map<string, int>* have = x->NamedCaptures();
50  EXPECT_TRUE(have != NULL);
51  EXPECT_EQ(2, have->size());  // there are only two named groups in
52                               // the regexp: 'g1' and 'g2'.
53  map<string, int> want;
54  want["g1"] = 1;
55  want["g2"] = 3;
56  EXPECT_EQ(want, *have);
57  x->Decref();
58  delete have;
59}
60
61TEST(Regexp, CaptureNames) {
62  Regexp* x;
63  RegexpStatus status;
64  x = Regexp::Parse(
65      "(?P<g1>a+)|(e)(?P<g2>w*)+(?P<g1>b+)", Regexp::PerlX, &status);
66  EXPECT_TRUE(status.ok());
67  EXPECT_EQ(4, x->NumCaptures());
68  const map<int, string>* have = x->CaptureNames();
69  EXPECT_TRUE(have != NULL);
70  EXPECT_EQ(3, have->size());
71  map<int, string> want;
72  want[1] = "g1";
73  want[3] = "g2";
74  want[4] = "g1";
75
76  EXPECT_EQ(want, *have);
77  x->Decref();
78  delete have;
79}
80
81}  // namespace re2
82