Index: third_party/re2/re2/testing/tester.h |
diff --git a/third_party/re2/re2/testing/tester.h b/third_party/re2/re2/testing/tester.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6e16e7757f13c2e888e4f82b09fd865e83148527 |
--- /dev/null |
+++ b/third_party/re2/re2/testing/tester.h |
@@ -0,0 +1,121 @@ |
+// Copyright 2008 The RE2 Authors. All Rights Reserved. |
+// Use of this source code is governed by a BSD-style |
+// license that can be found in the LICENSE file. |
+ |
+// Comparative tester for regular expression matching. |
+// Checks all implementations against each other. |
+ |
+#ifndef RE2_TESTING_TESTER_H__ |
+#define RE2_TESTING_TESTER_H__ |
+ |
+#include "re2/stringpiece.h" |
+#include "re2/prog.h" |
+#include "re2/regexp.h" |
+#include "re2/re2.h" |
+#include "util/pcre.h" |
+ |
+namespace re2 { |
+ |
+class Regexp; |
+ |
+// All the supported regexp engines. |
+enum Engine { |
+ kEngineBacktrack = 0, // Prog::BadSearchBacktrack |
+ kEngineNFA, // Prog::SearchNFA |
+ kEngineDFA, // Prog::SearchDFA, only ask whether it matched |
+ kEngineDFA1, // Prog::SearchDFA, ask for match[0] |
+ kEngineOnePass, // Prog::SearchOnePass, if applicable |
+ kEngineBitState, // Prog::SearchBitState |
+ kEngineRE2, // RE2, all submatches |
+ kEngineRE2a, // RE2, only ask for match[0] |
+ kEngineRE2b, // RE2, only ask whether it matched |
+ kEnginePCRE, // PCRE (util/pcre.h) |
+ |
+ kEngineMax, |
+}; |
+ |
+// Make normal math on the enum preserve the type. |
+// By default, C++ doesn't define ++ on enum, and e+1 has type int. |
+static inline void operator++(Engine& e, int unused) { |
+ e = static_cast<Engine>(e+1); |
+} |
+ |
+static inline Engine operator+(Engine e, int i) { |
+ return static_cast<Engine>(static_cast<int>(e)+i); |
+} |
+ |
+// A TestInstance caches per-regexp state for a given |
+// regular expression in a given configuration |
+// (UTF-8 vs Latin1, longest vs first match, etc.). |
+class TestInstance { |
+ public: |
+ struct Result; |
+ |
+ TestInstance(const StringPiece& regexp, Prog::MatchKind kind, |
+ Regexp::ParseFlags flags); |
+ ~TestInstance(); |
+ Regexp::ParseFlags flags() { return flags_; } |
+ bool error() { return error_; } |
+ |
+ // Runs a single test case: search in text, which is in context, |
+ // using the given anchoring. |
+ bool RunCase(const StringPiece& text, const StringPiece& context, |
+ Prog::Anchor anchor); |
+ |
+ private: |
+ // Runs a single search using the named engine type. |
+ void RunSearch(Engine type, |
+ const StringPiece& text, const StringPiece& context, |
+ Prog::Anchor anchor, |
+ Result *result); |
+ |
+ void LogMatch(const char* prefix, Engine e, const StringPiece& text, |
+ const StringPiece& context, Prog::Anchor anchor); |
+ |
+ const StringPiece& regexp_str_; // regexp being tested |
+ Prog::MatchKind kind_; // kind of match |
+ Regexp::ParseFlags flags_; // flags for parsing regexp_str_ |
+ bool error_; // error during constructor? |
+ |
+ Regexp* regexp_; // parsed regexp |
+ int num_captures_; // regexp_->NumCaptures() cached |
+ Prog* prog_; // compiled program |
+ Prog* rprog_; // compiled reverse program |
+ PCRE* re_; // PCRE implementation |
+ RE2* re2_; // RE2 implementation |
+ |
+ DISALLOW_EVIL_CONSTRUCTORS(TestInstance); |
+}; |
+ |
+// A group of TestInstances for all possible configurations. |
+class Tester { |
+ public: |
+ explicit Tester(const StringPiece& regexp); |
+ ~Tester(); |
+ |
+ bool error() { return error_; } |
+ |
+ // Runs a single test case: search in text, which is in context, |
+ // using the given anchoring. |
+ bool TestCase(const StringPiece& text, const StringPiece& context, |
+ Prog::Anchor anchor); |
+ |
+ // Run TestCase(text, text, anchor) for all anchoring modes. |
+ bool TestInput(const StringPiece& text); |
+ |
+ // Run TestCase(text, context, anchor) for all anchoring modes. |
+ bool TestInputInContext(const StringPiece& text, const StringPiece& context); |
+ |
+ private: |
+ bool error_; |
+ vector<TestInstance*> v_; |
+ |
+ DISALLOW_EVIL_CONSTRUCTORS(Tester); |
+}; |
+ |
+// Run all possible tests using regexp and text. |
+bool TestRegexpOnText(const StringPiece& regexp, const StringPiece& text); |
+ |
+} // namespace re2 |
+ |
+#endif // RE2_TESTING_TESTER_H__ |