15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2009 The RE2 Authors. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// license that can be found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef RE2_TESTING_EXHAUSTIVE_TESTER_H__ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RE2_TESTING_EXHAUSTIVE_TESTER_H__ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "re2/testing/regexp_generator.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "re2/testing/string_generator.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace re2 { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Exhaustive regular expression test: generate all regexps within parameters, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then generate all strings of a given length over a given alphabet, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then check that NFA, DFA, and PCRE agree about whether each regexp matches 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// each possible string, and if so, where the match is. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Can also be used in a "random" mode that generates a given number 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of random regexp and strings, allowing testing of larger expressions 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and inputs. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExhaustiveTester : public RegexpGenerator { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExhaustiveTester(int maxatoms, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maxops, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const vector<string>& alphabet, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const vector<string>& ops, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maxstrlen, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const vector<string>& stralphabet, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& wrapper, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& topwrapper) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : RegexpGenerator(maxatoms, maxops, alphabet, ops), 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strgen_(maxstrlen, stralphabet), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wrapper_(wrapper), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) topwrapper_(topwrapper), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regexps_(0), tests_(0), failures_(0), 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) randomstrings_(0), stringseed_(0), stringcount_(0) { } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regexps() { return regexps_; } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tests() { return tests_; } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int failures() { return failures_; } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Needed for RegexpGenerator interface. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleRegexp(const string& regexp); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Causes testing to generate random input strings. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RandomStrings(int32 seed, int32 count) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) randomstrings_ = true; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stringseed_ = seed; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stringcount_ = count; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringGenerator strgen_; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string wrapper_; // Regexp wrapper - either empty or has one %s. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string topwrapper_; // Regexp top-level wrapper. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regexps_; // Number of HandleRegexp calls 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tests_; // Number of regexp tests. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int failures_; // Number of tests failed. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool randomstrings_; // Whether to use random strings 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 stringseed_; // If so, the seed. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int stringcount_; // If so, how many to generate. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_EVIL_CONSTRUCTORS(ExhaustiveTester); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Runs an exhaustive test on the given parameters. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExhaustiveTest(int maxatoms, int maxops, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const vector<string>& alphabet, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const vector<string>& ops, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maxstrlen, const vector<string>& stralphabet, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& wrapper, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& topwrapper); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Runs an exhaustive test using the given parameters and 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the basic egrep operators. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EgrepTest(int maxatoms, int maxops, const string& alphabet, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maxstrlen, const string& stralphabet, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& wrapper); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace re2 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // RE2_TESTING_EXHAUSTIVE_TESTER_H__ 86