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