aboutsummaryrefslogtreecommitdiff
path: root/tests/re
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2016-11-19 00:31:40 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2016-11-22 16:17:09 +0300
commit96ccbbd113efbfe6a0a300a1971e4a6f12c9249c (patch)
treeb7891daf54e2fceca0ff5832d2573a5e87ef380b /tests/re
parentbe095014187fbe40e91e6b45166e9f2b3530123a (diff)
Add support for Perl regex escape sequences subset to C++11-based implementation
Diffstat (limited to 'tests/re')
-rw-r--r--tests/re/buildfile1
-rw-r--r--tests/re/driver.cxx82
2 files changed, 80 insertions, 3 deletions
diff --git a/tests/re/buildfile b/tests/re/buildfile
index d31eb62..80d077a 100644
--- a/tests/re/buildfile
+++ b/tests/re/buildfile
@@ -5,4 +5,3 @@
import libs = libcutl%lib{cutl}
exe{driver}: cxx{driver} $libs
-exe{driver}: test = false # @@ TMP, fails.
diff --git a/tests/re/driver.cxx b/tests/re/driver.cxx
index 4b070dd..c8b06d2 100644
--- a/tests/re/driver.cxx
+++ b/tests/re/driver.cxx
@@ -51,6 +51,84 @@ main ()
assert (r.replace ("'foofoxbar'", "\\u$1") == "Fox");
}
+ // replace() using escape sequences.
+ //
+ {
+ regex r ("([aA][bB][cC])");
+
+ // $-based escape sequences.
+ //
+ assert (r.replace ("xabcyz", "v$") == "xv$yz");
+ assert (r.replace ("xabcyz", "v$d") == "xv$dyz");
+ assert (r.replace ("xabcyz", "v$1d") == "xvabcdyz");
+ assert (r.replace ("xabcyabcz", "v$2d") == "xvdyvdz");
+ assert (r.replace ("xabcyz", "v$&d") == "xvabcdyz");
+ assert (r.replace ("xabcyz", "$`$$$\'") == "xx$yzyz");
+
+ {
+ regex r ("(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)");
+
+ assert (r.replace ("xabcdefghijy", "$10$9$8$7$6$5$4$3$2$1") ==
+ "xjihgfedcbay");
+ }
+
+ // \-based escape sequences.
+ //
+ assert (r.replace ("xabcyz", "v\\d") == "xvdyz");
+ assert (r.replace ("xabcyz", "v\\1d") == "xvabcdyz");
+ assert (r.replace ("xabcyabcz", "v\\2d") == "xvdyvdz");
+ assert (r.replace ("xabcyz", "v\\\\d") == "xv\\dyz");
+ assert (r.replace ("xabcyz", "v\\$d") == "xv$dyz");
+
+ {
+ regex r ("(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)");
+
+ assert (r.replace ("xabcdefghijy", "\\10\\9\\8\\7\\6\\5\\4\\3\\2\\1") ==
+ "xa0ihgfedcbay");
+ }
+
+ assert (r.replace ("xabcyz", "\\u") == "xyz");
+ assert (r.replace ("xabcyz", "\\uv") == "xVyz");
+ assert (r.replace ("xabcyz", "\\u\\1") == "xAbcyz");
+ assert (r.replace ("xabcyz", "\\lV") == "xvyz");
+ assert (r.replace ("xAbcyz", "\\l\\1") == "xabcyz");
+
+ assert (r.replace ("xabcyz", "\\U") == "xyz");
+ assert (r.replace ("xabcyz", "\\Uv") == "xVyz");
+ assert (r.replace ("xabcyz", "\\U\\1v") == "xABCVyz");
+ assert (r.replace ("xabcyz", "\\U\\1\\Ev") == "xABCvyz");
+
+ assert (r.replace ("xabcyz", "\\L") == "xyz");
+ assert (r.replace ("xabcyz", "\\LV") == "xvyz");
+ assert (r.replace ("xABCyz", "\\L\\1V") == "xabcvyz");
+ assert (r.replace ("xabcyz", "\\L\\1\\EV") == "xabcVyz");
+
+ assert (r.replace ("xabcyz", "\\Uv\\LV") == "xVvyz");
+ assert (r.replace ("xabcyz", "\\U\\1\\LV") == "xABCvyz");
+
+ {
+ regex r ("(b?)-");
+ assert (r.replace ("a-b-", "\\u\\1x") == "aXBx");
+ }
+ }
+
+ // wregex::replace().
+ //
+ {
+ {
+ wregex r (L"['`]foo([^ ]*)bar['`]");
+ assert (r.replace (L"'foofoxbar'", L"\\u$1") == L"Fox");
+ }
+/*
+ {
+ std::locale::global (std::locale ("en_US.utf8"));
+
+ wregex r (L"(a)");
+ assert (r.replace (L"a", L"\\l\u0190") == L"\u025b");
+ }
+*/
+ }
+
// regexsub
//
{
@@ -71,12 +149,12 @@ main ()
//
try
{
- regexsub r ("/['`]foo([^ ]*)bar['`]#\\u$1/");
+ regexsub r ("/['`]foo([^ ]*)bar['`]#$1/");
assert (false);
}
catch (format const& e)
{
- assert (e.regex () == "/['`]foo([^ ]*)bar['`]#\\u$1/");
+ assert (e.regex () == "/['`]foo([^ ]*)bar['`]#$1/");
assert (!e.description ().empty ());
//std::cerr << e.description () << std::endl;
}