OLD | NEW |
(Empty) | |
| 1 // Copyright 2009 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 "util/test.h" |
| 6 #include "re2/regexp.h" |
| 7 |
| 8 namespace re2 { |
| 9 |
| 10 struct PrefixTest { |
| 11 const char* regexp; |
| 12 bool return_value; |
| 13 const char* prefix; |
| 14 bool foldcase; |
| 15 const char* suffix; |
| 16 }; |
| 17 |
| 18 static PrefixTest tests[] = { |
| 19 // If the regexp is missing a ^, there's no required prefix. |
| 20 { "abc", false }, |
| 21 { "", false }, |
| 22 { "(?m)^", false }, |
| 23 |
| 24 // If the regexp immediately goes into |
| 25 // something not a literal match, there's no required prefix. |
| 26 { "^(abc)", false }, |
| 27 { "^a*", false }, |
| 28 |
| 29 // Otherwise, it should work. |
| 30 { "^abc$", true, "abc", false, "(?-m:$)" }, |
| 31 { "^abc", "true", "abc", false, "" }, |
| 32 { "^(?i)abc", true, "abc", true, "" }, |
| 33 { "^abcd*", true, "abc", false, "d*" }, |
| 34 { "^[Aa][Bb]cd*", true, "ab", true, "cd*" }, |
| 35 { "^ab[Cc]d*", true, "ab", false, "[Cc]d*" }, |
| 36 { "^☺abc", true, "☺abc", false, "" }, |
| 37 }; |
| 38 |
| 39 TEST(RequiredPrefix, SimpleTests) { |
| 40 for (int i = 0; i < arraysize(tests); i++) { |
| 41 const PrefixTest& t = tests[i]; |
| 42 for (int j = 0; j < 2; j++) { |
| 43 Regexp::ParseFlags flags = Regexp::LikePerl; |
| 44 if (j == 0) |
| 45 flags = flags | Regexp::Latin1; |
| 46 Regexp* re = Regexp::Parse(t.regexp, flags, NULL); |
| 47 CHECK(re) << " " << t.regexp; |
| 48 string p; |
| 49 bool f = false; |
| 50 Regexp* s = NULL; |
| 51 CHECK_EQ(t.return_value, re->RequiredPrefix(&p, &f, &s)) |
| 52 << " " << t.regexp << " " << (j==0 ? "latin1" : "utf") << " " << re->Dum
p(); |
| 53 if (t.return_value) { |
| 54 CHECK_EQ(p, string(t.prefix)) |
| 55 << " " << t.regexp << " " << (j==0 ? "latin1" : "utf"); |
| 56 CHECK_EQ(f, t.foldcase) |
| 57 << " " << t.regexp << " " << (j==0 ? "latin1" : "utf"); |
| 58 CHECK_EQ(s->ToString(), string(t.suffix)) |
| 59 << " " << t.regexp << " " << (j==0 ? "latin1" : "utf"); |
| 60 s->Decref(); |
| 61 } |
| 62 re->Decref(); |
| 63 } |
| 64 } |
| 65 } |
| 66 |
| 67 } // namespace re2 |
OLD | NEW |