| Index: third_party/re2/re2/testing/exhaustive_tester.cc
|
| diff --git a/third_party/re2/re2/testing/exhaustive_tester.cc b/third_party/re2/re2/testing/exhaustive_tester.cc
|
| deleted file mode 100644
|
| index 0e90f33aa0e3719694e253506df341b0895520a8..0000000000000000000000000000000000000000
|
| --- a/third_party/re2/re2/testing/exhaustive_tester.cc
|
| +++ /dev/null
|
| @@ -1,188 +0,0 @@
|
| -// 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.
|
| -
|
| -// Exhaustive testing of regular expression matching.
|
| -
|
| -// Each test picks an alphabet (e.g., "abc"), a maximum string length,
|
| -// a maximum regular expression length, and a maximum number of letters
|
| -// that can appear in the regular expression. Given these parameters,
|
| -// it tries every possible regular expression and string, verifying that
|
| -// the NFA, DFA, and a trivial backtracking implementation agree about
|
| -// the location of the match.
|
| -
|
| -#include <stdlib.h>
|
| -#include <stdio.h>
|
| -
|
| -#ifndef LOGGING
|
| -#define LOGGING 0
|
| -#endif
|
| -
|
| -#include "util/test.h"
|
| -#include "re2/testing/exhaustive_tester.h"
|
| -#include "re2/testing/tester.h"
|
| -
|
| -DEFINE_bool(show_regexps, false, "show regexps during testing");
|
| -
|
| -DEFINE_int32(max_bad_regexp_inputs, 1,
|
| - "Stop testing a regular expression after finding this many "
|
| - "strings that break it.");
|
| -
|
| -// Compiled in debug mode, the usual tests run for over an hour.
|
| -// Have to cut it down to make the unit test machines happy.
|
| -DEFINE_bool(quick_debug_mode, true, "Run fewer tests in debug mode.");
|
| -
|
| -namespace re2 {
|
| -
|
| -static char* escape(const StringPiece& sp) {
|
| - static char buf[512];
|
| - char* p = buf;
|
| - *p++ = '\"';
|
| - for (int i = 0; i < sp.size(); i++) {
|
| - if(p+5 >= buf+sizeof buf)
|
| - LOG(FATAL) << "ExhaustiveTester escape: too long";
|
| - if(sp[i] == '\\' || sp[i] == '\"') {
|
| - *p++ = '\\';
|
| - *p++ = sp[i];
|
| - } else if(sp[i] == '\n') {
|
| - *p++ = '\\';
|
| - *p++ = 'n';
|
| - } else {
|
| - *p++ = sp[i];
|
| - }
|
| - }
|
| - *p++ = '\"';
|
| - *p = '\0';
|
| - return buf;
|
| -}
|
| -
|
| -static void PrintResult(const RE2& re, const StringPiece& input, RE2::Anchor anchor, StringPiece *m, int n) {
|
| - if (!re.Match(input, 0, input.size(), anchor, m, n)) {
|
| - printf("-");
|
| - return;
|
| - }
|
| - for (int i = 0; i < n; i++) {
|
| - if (i > 0)
|
| - printf(" ");
|
| - if (m[i].begin() == NULL)
|
| - printf("-");
|
| - else
|
| - printf("%d-%d", static_cast<int>(m[i].begin() - input.begin()), static_cast<int>(m[i].end() - input.begin()));
|
| - }
|
| -}
|
| -
|
| -// Processes a single generated regexp.
|
| -// Compiles it using Regexp interface and PCRE, and then
|
| -// checks that NFA, DFA, and PCRE all return the same results.
|
| -void ExhaustiveTester::HandleRegexp(const string& const_regexp) {
|
| - regexps_++;
|
| - string regexp = const_regexp;
|
| - if (!topwrapper_.empty())
|
| - regexp = StringPrintf(topwrapper_.c_str(), regexp.c_str());
|
| -
|
| - if (FLAGS_show_regexps) {
|
| - printf("\r%s", regexp.c_str());
|
| - fflush(stdout);
|
| - }
|
| -
|
| - if (LOGGING) {
|
| - // Write out test cases and answers for use in testing
|
| - // other implementations, such as Go's regexp package.
|
| - if (randomstrings_)
|
| - LOG(ERROR) << "Cannot log with random strings.";
|
| - if (regexps_ == 1) { // first
|
| - printf("strings\n");
|
| - strgen_.Reset();
|
| - while (strgen_.HasNext())
|
| - printf("%s\n", escape(strgen_.Next()));
|
| - printf("regexps\n");
|
| - }
|
| - printf("%s\n", escape(regexp));
|
| -
|
| - RE2 re(regexp);
|
| - RE2::Options longest;
|
| - longest.set_longest_match(true);
|
| - RE2 relongest(regexp, longest);
|
| - int ngroup = re.NumberOfCapturingGroups()+1;
|
| - StringPiece* group = new StringPiece[ngroup];
|
| -
|
| - strgen_.Reset();
|
| - while (strgen_.HasNext()) {
|
| - StringPiece input = strgen_.Next();
|
| - PrintResult(re, input, RE2::ANCHOR_BOTH, group, ngroup);
|
| - printf(";");
|
| - PrintResult(re, input, RE2::UNANCHORED, group, ngroup);
|
| - printf(";");
|
| - PrintResult(relongest, input, RE2::ANCHOR_BOTH, group, ngroup);
|
| - printf(";");
|
| - PrintResult(relongest, input, RE2::UNANCHORED, group, ngroup);
|
| - printf("\n");
|
| - }
|
| - delete[] group;
|
| - return;
|
| - }
|
| -
|
| - Tester tester(regexp);
|
| - if (tester.error())
|
| - return;
|
| -
|
| - strgen_.Reset();
|
| - strgen_.GenerateNULL();
|
| - if (randomstrings_)
|
| - strgen_.Random(stringseed_, stringcount_);
|
| - int bad_inputs = 0;
|
| - while (strgen_.HasNext()) {
|
| - tests_++;
|
| - if (!tester.TestInput(strgen_.Next())) {
|
| - failures_++;
|
| - if (++bad_inputs >= FLAGS_max_bad_regexp_inputs)
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -// Runs an exhaustive test on the given parameters.
|
| -void ExhaustiveTest(int maxatoms, int maxops,
|
| - const vector<string>& alphabet,
|
| - const vector<string>& ops,
|
| - int maxstrlen, const vector<string>& stralphabet,
|
| - const string& wrapper,
|
| - const string& topwrapper) {
|
| - if (RE2_DEBUG_MODE && FLAGS_quick_debug_mode) {
|
| - if (maxatoms > 1)
|
| - maxatoms--;
|
| - if (maxops > 1)
|
| - maxops--;
|
| - if (maxstrlen > 1)
|
| - maxstrlen--;
|
| - }
|
| - ExhaustiveTester t(maxatoms, maxops, alphabet, ops,
|
| - maxstrlen, stralphabet, wrapper,
|
| - topwrapper);
|
| - t.Generate();
|
| - if (!LOGGING) {
|
| - printf("%d regexps, %d tests, %d failures [%d/%d str]\n",
|
| - t.regexps(), t.tests(), t.failures(), maxstrlen, (int)stralphabet.size());
|
| - }
|
| - EXPECT_EQ(0, t.failures());
|
| -}
|
| -
|
| -// Runs an exhaustive test using the given parameters and
|
| -// the basic egrep operators.
|
| -void EgrepTest(int maxatoms, int maxops, const string& alphabet,
|
| - int maxstrlen, const string& stralphabet,
|
| - const string& wrapper) {
|
| - const char* tops[] = { "", "^(?:%s)", "(?:%s)$", "^(?:%s)$" };
|
| -
|
| - for (int i = 0; i < arraysize(tops); i++) {
|
| - ExhaustiveTest(maxatoms, maxops,
|
| - Split("", alphabet),
|
| - RegexpGenerator::EgrepOps(),
|
| - maxstrlen,
|
| - Split("", stralphabet),
|
| - wrapper,
|
| - tops[i]);
|
| - }
|
| -}
|
| -
|
| -} // namespace re2
|
|
|