| // Copyright 2009 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. |
| |
| #ifndef RE2_TESTING_EXHAUSTIVE_TESTER_H__ |
| #define RE2_TESTING_EXHAUSTIVE_TESTER_H__ |
| |
| #include <string> |
| #include <vector> |
| #include "util/util.h" |
| #include "re2/testing/regexp_generator.h" |
| #include "re2/testing/string_generator.h" |
| |
| namespace re2 { |
| |
| // Exhaustive regular expression test: generate all regexps within parameters, |
| // then generate all strings of a given length over a given alphabet, |
| // then check that NFA, DFA, and PCRE agree about whether each regexp matches |
| // each possible string, and if so, where the match is. |
| // |
| // Can also be used in a "random" mode that generates a given number |
| // of random regexp and strings, allowing testing of larger expressions |
| // and inputs. |
| class ExhaustiveTester : public RegexpGenerator { |
| public: |
| ExhaustiveTester(int maxatoms, |
| int maxops, |
| const vector<string>& alphabet, |
| const vector<string>& ops, |
| int maxstrlen, |
| const vector<string>& stralphabet, |
| const string& wrapper, |
| const string& topwrapper) |
| : RegexpGenerator(maxatoms, maxops, alphabet, ops), |
| strgen_(maxstrlen, stralphabet), |
| wrapper_(wrapper), |
| topwrapper_(topwrapper), |
| regexps_(0), tests_(0), failures_(0), |
| randomstrings_(0), stringseed_(0), stringcount_(0) { } |
| |
| int regexps() { return regexps_; } |
| int tests() { return tests_; } |
| int failures() { return failures_; } |
| |
| // Needed for RegexpGenerator interface. |
| void HandleRegexp(const string& regexp); |
| |
| // Causes testing to generate random input strings. |
| void RandomStrings(int32 seed, int32 count) { |
| randomstrings_ = true; |
| stringseed_ = seed; |
| stringcount_ = count; |
| } |
| |
| private: |
| StringGenerator strgen_; |
| string wrapper_; // Regexp wrapper - either empty or has one %s. |
| string topwrapper_; // Regexp top-level wrapper. |
| int regexps_; // Number of HandleRegexp calls |
| int tests_; // Number of regexp tests. |
| int failures_; // Number of tests failed. |
| |
| bool randomstrings_; // Whether to use random strings |
| int32 stringseed_; // If so, the seed. |
| int stringcount_; // If so, how many to generate. |
| DISALLOW_EVIL_CONSTRUCTORS(ExhaustiveTester); |
| }; |
| |
| // 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); |
| |
| // 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); |
| |
| } // namespace re2 |
| |
| #endif // RE2_TESTING_EXHAUSTIVE_TESTER_H__ |