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 #ifndef RE2_TESTING_EXHAUSTIVE_TESTER_H__ 6 #define RE2_TESTING_EXHAUSTIVE_TESTER_H__ 7 8 #include <string> 9 #include <vector> 10 #include "util/util.h" 11 #include "re2/testing/regexp_generator.h" 12 #include "re2/testing/string_generator.h" 13 14 namespace re2 { 15 16 // Exhaustive regular expression test: generate all regexps within parameters, 17 // then generate all strings of a given length over a given alphabet, 18 // then check that NFA, DFA, and PCRE agree about whether each regexp matches 19 // each possible string, and if so, where the match is. 20 // 21 // Can also be used in a "random" mode that generates a given number 22 // of random regexp and strings, allowing testing of larger expressions 23 // and inputs. 24 class ExhaustiveTester : public RegexpGenerator { 25 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)26 ExhaustiveTester(int maxatoms, 27 int maxops, 28 const vector<string>& alphabet, 29 const vector<string>& ops, 30 int maxstrlen, 31 const vector<string>& stralphabet, 32 const string& wrapper, 33 const string& topwrapper) 34 : RegexpGenerator(maxatoms, maxops, alphabet, ops), 35 strgen_(maxstrlen, stralphabet), 36 wrapper_(wrapper), 37 topwrapper_(topwrapper), 38 regexps_(0), tests_(0), failures_(0), 39 randomstrings_(0), stringseed_(0), stringcount_(0) { } 40 regexps()41 int regexps() { return regexps_; } tests()42 int tests() { return tests_; } failures()43 int failures() { return failures_; } 44 45 // Needed for RegexpGenerator interface. 46 void HandleRegexp(const string& regexp); 47 48 // Causes testing to generate random input strings. RandomStrings(int32 seed,int32 count)49 void RandomStrings(int32 seed, int32 count) { 50 randomstrings_ = true; 51 stringseed_ = seed; 52 stringcount_ = count; 53 } 54 55 private: 56 StringGenerator strgen_; 57 string wrapper_; // Regexp wrapper - either empty or has one %s. 58 string topwrapper_; // Regexp top-level wrapper. 59 int regexps_; // Number of HandleRegexp calls 60 int tests_; // Number of regexp tests. 61 int failures_; // Number of tests failed. 62 63 bool randomstrings_; // Whether to use random strings 64 int32 stringseed_; // If so, the seed. 65 int stringcount_; // If so, how many to generate. 66 DISALLOW_EVIL_CONSTRUCTORS(ExhaustiveTester); 67 }; 68 69 // Runs an exhaustive test on the given parameters. 70 void ExhaustiveTest(int maxatoms, int maxops, 71 const vector<string>& alphabet, 72 const vector<string>& ops, 73 int maxstrlen, const vector<string>& stralphabet, 74 const string& wrapper, 75 const string& topwrapper); 76 77 // Runs an exhaustive test using the given parameters and 78 // the basic egrep operators. 79 void EgrepTest(int maxatoms, int maxops, const string& alphabet, 80 int maxstrlen, const string& stralphabet, 81 const string& wrapper); 82 83 } // namespace re2 84 85 #endif // RE2_TESTING_EXHAUSTIVE_TESTER_H__ 86