diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/regex/pcre/regexp_ut.cpp | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/regex/pcre/regexp_ut.cpp')
-rw-r--r-- | library/cpp/regex/pcre/regexp_ut.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/library/cpp/regex/pcre/regexp_ut.cpp b/library/cpp/regex/pcre/regexp_ut.cpp new file mode 100644 index 0000000000..5184e801cc --- /dev/null +++ b/library/cpp/regex/pcre/regexp_ut.cpp @@ -0,0 +1,103 @@ +#include <library/cpp/testing/unittest/registar.h> + +#include <util/string/strip.h> +#include <library/cpp/regex/pcre/regexp.h> +#include <util/stream/output.h> + +struct TRegTest { + const char* Regexp; + const char* Data; + const char* Result; + int CompileOptions; + int RunOptions; + + TRegTest(const char* re, const char* text, const char* res, int copts = REG_EXTENDED, int ropts = 0) + : Regexp(re) + , Data(text) + , Result(res) + , CompileOptions(copts) + , RunOptions(ropts) + { + } +}; + +struct TSubstTest: public TRegTest { + const char* Replacement; + const char* Replacement2; + + TSubstTest(const char* re, const char* text, const char* res, const char* repl, const char* repl2) + : TRegTest(re, text, res, REG_EXTENDED, REGEXP_GLOBAL) + , Replacement(repl) + , Replacement2(repl2) + { + } +}; + +const TRegTest REGTEST_DATA[] = { + TRegTest("test", "its a test and test string.", "6 10", REG_EXTENDED, 0), + TRegTest("test", "its a test and test string.", "6 10 15 19", REG_EXTENDED, REGEXP_GLOBAL), + TRegTest("test|[an]{0,0}", "test and test an test string tes", "0 4 4 4 5 5 6 6 7 7 8 8 9 13 13 13 14 14 15 15 16 16 17 21 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32", REG_EXTENDED, REGEXP_GLOBAL), + TRegTest("test[an]{1,}", "test and test an test string tes", "NM", REG_EXTENDED, REGEXP_GLOBAL)}; + +const TSubstTest SUBSTTEST_DATA[] = { + TSubstTest("([a-zA-Z]*[0-9]+) (_[a-z]+)", "Xxx123 534 ___124 bsd _A ZXC _L 141 _sd dsfg QWE123 _bbb", "141 XXX/_sd", "$1 XXX/$2", "$2$2$2 YY$1Y/$2")}; + +class TRegexpTest: public TTestBase { +private: + regmatch_t Matches[NMATCHES]; + +private: + UNIT_TEST_SUITE(TRegexpTest); + UNIT_TEST(TestRe) + UNIT_TEST(TestSubst) + UNIT_TEST(TestOffEndOfBuffer); + UNIT_TEST_SUITE_END(); + + inline void TestRe() { + for (const auto& regTest : REGTEST_DATA) { + memset(Matches, 0, sizeof(Matches)); + TString result; + + TRegExBase re(regTest.Regexp, regTest.CompileOptions); + if (re.Exec(regTest.Data, Matches, regTest.RunOptions) == 0) { + for (auto& matche : Matches) { + if (matche.rm_so == -1) { + break; + } + result.append(Sprintf("%i %i ", matche.rm_so, matche.rm_eo)); + } + } else { + result = "NM"; + } + StripInPlace(result); + UNIT_ASSERT_VALUES_EQUAL(result, regTest.Result); + } + } + + inline void TestSubst() { + for (const auto& substTest : SUBSTTEST_DATA) { + TRegExSubst subst(substTest.Regexp, substTest.CompileOptions); + subst.ParseReplacement(substTest.Replacement); + TString result = subst.Replace(substTest.Data, substTest.RunOptions); + UNIT_ASSERT_VALUES_EQUAL(result, substTest.Result); + TRegExSubst substCopy = subst; + subst.ParseReplacement(substTest.Replacement2); + TString newResult = subst.Replace(substTest.Data, substTest.RunOptions); + UNIT_ASSERT_VALUES_UNEQUAL(newResult.c_str(), result.c_str()); + TString copyResult = substCopy.Replace(substTest.Data, substTest.RunOptions); + UNIT_ASSERT_VALUES_EQUAL(copyResult, result); + substCopy = subst; + copyResult = substCopy.Replace(substTest.Data, substTest.RunOptions); + UNIT_ASSERT_VALUES_EQUAL(copyResult, newResult); + } + } + + void TestOffEndOfBuffer() { + const TString needle{".*[^./]gov[.].*"}; + TRegExMatch re{needle, REG_UTF8}; + const TString haystack{"fakty.ictv.ua"}; + UNIT_ASSERT_VALUES_EQUAL(re.Match(haystack.c_str()), false); + } +}; + +UNIT_TEST_SUITE_REGISTRATION(TRegexpTest); |