| Index: third_party/re2/re2/testing/random_test.cc
|
| diff --git a/third_party/re2/re2/testing/random_test.cc b/third_party/re2/re2/testing/random_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..91d2b3277e85edb80ff73279c75d536179e8aec2
|
| --- /dev/null
|
| +++ b/third_party/re2/re2/testing/random_test.cc
|
| @@ -0,0 +1,95 @@
|
| +// 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.
|
| +
|
| +// Random testing of regular expression matching.
|
| +
|
| +#include <stdio.h>
|
| +#include "util/test.h"
|
| +#include "re2/testing/exhaustive_tester.h"
|
| +
|
| +DEFINE_int32(regexpseed, 404, "Random regexp seed.");
|
| +DEFINE_int32(regexpcount, 100, "How many random regexps to generate.");
|
| +DEFINE_int32(stringseed, 200, "Random string seed.");
|
| +DEFINE_int32(stringcount, 100, "How many random strings to generate.");
|
| +
|
| +namespace re2 {
|
| +
|
| +// Runs a random test on the given parameters.
|
| +// (Always uses the same random seeds for reproducibility.
|
| +// Can give different seeds on command line.)
|
| +static void RandomTest(int maxatoms, int maxops,
|
| + const vector<string>& alphabet,
|
| + const vector<string>& ops,
|
| + int maxstrlen, const vector<string>& stralphabet,
|
| + const string& wrapper) {
|
| + // Limit to smaller test cases in debug mode,
|
| + // because everything is so much slower.
|
| + if (DEBUG_MODE) {
|
| + maxatoms--;
|
| + maxops--;
|
| + maxstrlen /= 2;
|
| + }
|
| +
|
| + ExhaustiveTester t(maxatoms, maxops, alphabet, ops,
|
| + maxstrlen, stralphabet, wrapper, "");
|
| + t.RandomStrings(FLAGS_stringseed, FLAGS_stringcount);
|
| + t.GenerateRandom(FLAGS_regexpseed, FLAGS_regexpcount);
|
| + 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());
|
| +}
|
| +
|
| +// Tests random small regexps involving literals and egrep operators.
|
| +TEST(Random, SmallEgrepLiterals) {
|
| + RandomTest(5, 5, Explode("abc."), RegexpGenerator::EgrepOps(),
|
| + 15, Explode("abc"),
|
| + "");
|
| +}
|
| +
|
| +// Tests random bigger regexps involving literals and egrep operators.
|
| +TEST(Random, BigEgrepLiterals) {
|
| + RandomTest(10, 10, Explode("abc."), RegexpGenerator::EgrepOps(),
|
| + 15, Explode("abc"),
|
| + "");
|
| +}
|
| +
|
| +// Tests random small regexps involving literals, capturing parens,
|
| +// and egrep operators.
|
| +TEST(Random, SmallEgrepCaptures) {
|
| + RandomTest(5, 5, Split(" ", "a (b) ."), RegexpGenerator::EgrepOps(),
|
| + 15, Explode("abc"),
|
| + "");
|
| +}
|
| +
|
| +// Tests random bigger regexps involving literals, capturing parens,
|
| +// and egrep operators.
|
| +TEST(Random, BigEgrepCaptures) {
|
| + RandomTest(10, 10, Split(" ", "a (b) ."), RegexpGenerator::EgrepOps(),
|
| + 15, Explode("abc"),
|
| + "");
|
| +}
|
| +
|
| +// Tests random large complicated expressions, using all the possible
|
| +// operators, some literals, some parenthesized literals, and predefined
|
| +// character classes like \d. (Adding larger character classes would
|
| +// make for too many possibilities.)
|
| +TEST(Random, Complicated) {
|
| + vector<string> ops = Split(" ",
|
| + "%s%s %s|%s %s* %s*? %s+ %s+? %s? %s?? "
|
| + "%s{0} %s{0,} %s{1} %s{1,} %s{0,1} %s{0,2} %s{1,2} "
|
| + "%s{2} %s{2,} %s{3,4} %s{4,5}");
|
| +
|
| + // Use (?:\b) and (?:\B) instead of \b and \B,
|
| + // because PCRE rejects \b* but accepts (?:\b)*.
|
| + // Ditto ^ and $.
|
| + vector<string> atoms = Split(" ",
|
| + ". (?:^) (?:$) \\a \\f \\n \\r \\t \\v "
|
| + "\\d \\D \\s \\S \\w \\W (?:\\b) (?:\\B) "
|
| + "a (a) b c - \\\\");
|
| + vector<string> alphabet = Explode("abc123\001\002\003\t\r\n\v\f\a");
|
| + RandomTest(10, 10, atoms, ops, 20, alphabet, "");
|
| +}
|
| +
|
| +} // namespace re2
|
| +
|
|
|