public void RegexTransform1() {
TestCorrectPatternTranslation(@"", @"");
// escapes
TestCorrectPatternTranslation(@"\\", @"\\");
TestCorrectPatternTranslation(@"\_", @"_");
TestCorrectPatternTranslation(@"abc\0\01\011", "abc\\0\\01\\011");
TestCorrectPatternTranslation(@"\n\t\r\f\v\a\e\b\A\B\Z\z", "\\\n\\\t\\\r\f\v\a\u001B\\b\\A\\B\\Z\\z");
TestCorrectPatternTranslation(@"[\n\t\r\f\v\a\e\b\A\B\Z\z]", "[\\\n\\\t\\\r\f\v\a\u001B\bABZz]");
TestCorrectPatternTranslation(@"\G", RubyRegexOptions.NONE, @"\G", true);
// meta-characters
TestCorrectPatternTranslation(@"\xd", "\\\u000d");
TestCorrectPatternTranslation(@"\xdz", "\\\u000dz");
TestCorrectPatternTranslation(@"\*", @"\*");
TestCorrectPatternTranslation(@"\[", @"\[");
TestCorrectPatternTranslation(@"\#", @"\#");
TestCorrectPatternTranslation(@"\0", @"\0");
TestCorrectPatternTranslation(@"\x09\x0a\x0d\x20\u0009\u000a\u000d\u0020\u{9 a d 20}",
"\\\u0009\\\u000a\\\u000d\\\u0020\\\u0009\\\u000a\\\u000d\\\u0020\\\u0009\\\u000a\\\u000d\\\u0020");
TestCorrectPatternTranslation(@"[a\-z]", @"[a\-z]");
// Unicode escapes
TestCorrectPatternTranslation(@"\u002a", @"\*");
TestCorrectPatternTranslation(@"\u005b", @"\[");
TestCorrectPatternTranslation(@"\u{005b}", @"\[");
TestCorrectPatternTranslation(@"\u{5b 2a}", @"\[\*");
// Posix categories
TestCorrectPatternTranslation(@"[x[:alnum:]y]", @"[x\p{L}\p{N}\p{M}y]");
TestCorrectPatternTranslation(@"[a[^:alnum:]b]", @"[a\P{L}b-[\p{N}\p{M}-[ab]]]");
TestCorrectPatternTranslation(@"[[:alpha:]]", @"[\p{L}\p{M}]");
TestCorrectPatternTranslation(@"[[^:alpha:]]", @"[\P{L}-[\p{M}]]");
TestCorrectPatternTranslation(@"[[:ascii:]]", @"[\p{IsBasicLatin}]");
TestCorrectPatternTranslation(@"[[^:ascii:]]", @"[\P{IsBasicLatin}]");
TestCorrectPatternTranslation(@"[[:blank:]]", "[\\p{Zs}\t]");
TestCorrectPatternTranslation(@"[[^:blank:]]", "[\\P{Zs}-[\t]]");
TestCorrectPatternTranslation(@"[[:cntrl:]]", @"[\p{Cc}]");
TestCorrectPatternTranslation(@"[[^:cntrl:]]", @"[\P{Cc}]");
TestCorrectPatternTranslation(@"[[:digit:]]", @"[\p{Nd}]");
TestCorrectPatternTranslation(@"[[^:digit:]]", @"[\P{Nd}]");
TestCorrectPatternTranslation(@"[[:lower:]]", @"[\p{Ll}]");
TestCorrectPatternTranslation(@"[[^:lower:]]", @"[\P{Ll}]");
TestCorrectPatternTranslation(@"[[:punct:]]", @"[\p{P}]");
TestCorrectPatternTranslation(@"[[^:punct:]]", @"[\P{P}]");
TestCorrectPatternTranslation(@"[[:space:]]", "[\\p{Z}\u0085\u0009-\u000d]");
TestCorrectPatternTranslation(@"[[^:space:]]", "[\\P{Z}-[\u0085\u0009-\u000d]]");
TestCorrectPatternTranslation(@"[[:upper:]]", @"[\p{Lu}]");
TestCorrectPatternTranslation(@"[[^:upper:]]", @"[\P{Lu}]");
TestCorrectPatternTranslation(@"[[:xdigit:]]", "[a-fA-F0-9]");
TestCorrectPatternTranslation(@"[[^:xdigit:]]", "[\0-\uffff-[a-fA-F0-9]]");
// Unicode categories
TestCorrectPatternTranslation(@"\p{L}", @"[\p{L}]");
TestCorrectPatternTranslation(@"\p{Alnum}", @"[\p{L}\p{N}\p{M}]");
TestCorrectPatternTranslation(@"\P{Alnum}*", @"[\P{L}-[\p{N}\p{M}]]*");
TestCorrectPatternTranslation(@"\P{^Alnum}", @"[\p{L}\p{N}\p{M}]");
TestCorrectPatternTranslation(@"[a\p{Alnum}b]", @"[a\p{L}\p{N}\p{M}b]");
TestCorrectPatternTranslation(@"[^\p{Alnum}]", "[\0-\uffff-[\\p{L}\\p{N}\\p{M}]]");
TestCorrectPatternTranslation(@"[\P{Alnum}]", @"[\P{L}-[\p{N}\p{M}]]");
TestCorrectPatternTranslation(@"\P{^Alnum}", @"[\p{L}\p{N}\p{M}]");
TestCorrectPatternTranslation(@"\p{^Alnum}", @"[\P{L}-[\p{N}\p{M}]]");
TestCorrectPatternTranslation(@"\p{Alnum}", @"[\p{L}\p{N}\p{M}]");
TestCorrectPatternTranslation(@"\P{Alnum}", @"[\P{L}-[\p{N}\p{M}]]");
TestCorrectPatternTranslation(@"\p{Alpha}", @"[\p{L}\p{M}]");
TestCorrectPatternTranslation(@"\P{Alpha}", @"[\P{L}-[\p{M}]]");
TestCorrectPatternTranslation(@"\p{ASCII}", "[\\p{IsBasicLatin}]");
TestCorrectPatternTranslation(@"\P{ASCII}", "[\\P{IsBasicLatin}]");
TestCorrectPatternTranslation(@"\p{Blank}", "[\\p{Zs}\t]");
TestCorrectPatternTranslation(@"\P{Blank}", "[\\P{Zs}-[\t]]");
TestCorrectPatternTranslation(@"\p{Cntrl}", @"[\p{Cc}]");
TestCorrectPatternTranslation(@"\P{Cntrl}", @"[\P{Cc}]");
TestCorrectPatternTranslation(@"\p{Digit}", @"[\p{Nd}]");
TestCorrectPatternTranslation(@"\P{Digit}", @"[\P{Nd}]");
TestCorrectPatternTranslation(@"\p{Lower}", @"[\p{Ll}]");
TestCorrectPatternTranslation(@"\P{Lower}", @"[\P{Ll}]");
TestCorrectPatternTranslation(@"\p{Punct}", @"[\p{P}]");
TestCorrectPatternTranslation(@"\P{Punct}", @"[\P{P}]");
TestCorrectPatternTranslation(@"\p{Space}", "[\\p{Z}\u0085\u0009-\u000d]");
TestCorrectPatternTranslation(@"\P{Space}", "[\\P{Z}-[\u0085\u0009-\u000d]]");
TestCorrectPatternTranslation(@"\p{Upper}", @"[\p{Lu}]");
TestCorrectPatternTranslation(@"\P{Upper}", @"[\P{Lu}]");
TestCorrectPatternTranslation(@"\p{XDigit}", "[a-fA-F0-9]");
TestCorrectPatternTranslation(@"\P{XDigit}", "[\0-\uffff-[a-fA-F0-9]]");
// possessive quantifiers
TestCorrectPatternTranslation(@"xyza*+", @"xyz(?>a*)");
TestCorrectPatternTranslation(@"x[a-b]*+", @"x(?>[a-b]*)");
TestCorrectPatternTranslation(@"x[a-b]*+*+", @"x(?>(?>[a-b]*)*)");
TestCorrectPatternTranslation(@"x[a-b]{1,2}+", @"x(?:[a-b]{1,2})+");
TestCorrectPatternTranslation(@"x{1,2,*+", @"x{1,2(?>,*)");
TestCorrectPatternTranslation(@"x{1,2*+", @"x{1,(?>2*)");
TestCorrectPatternTranslation(@"x{1,*+", @"x{1(?>,*)");
TestCorrectPatternTranslation(@"x{,*+", @"x{(?>,*)");
TestCorrectPatternTranslation(@"x{1*+", @"x{(?>1*)");
TestCorrectPatternTranslation(@"x{*+", @"x(?>{*)");
// ranges
TestCorrectPatternTranslation("[a-z]", "[a-z]");
TestCorrectPatternTranslation(@"[\u{40}-z]", "[\u0040-z]");
TestCorrectPatternTranslation(@"[\u{40}-\u{60}]", "[\u0040-\u0060]");
TestCorrectPatternTranslation(@"[\x40-\x60]", "[\u0040-\u0060]");
TestCorrectPatternTranslation(@"[\001-\7]", "[\u0001-\u0007]");
TestCorrectPatternTranslation(@"[\u{2a}-\u{2b}]", "[\\*-\\+]");
TestCorrectPatternTranslation(@"[x-]", @"[x\-]");
TestCorrectPatternTranslation(@"[---]", @"[\--\-]");
TestCorrectPatternTranslation(@"[\u{1 2 40}-\u{60 3 4}]", "[\u0001\u0002\u0040-\u0060\u0003\u0004]");
TestCorrectPatternTranslation(@"[\u{1 2 40}-\u0060]", "[\u0001\u0002\u0040-\u0060]");
TestCorrectPatternTranslation(@"[\u{1 2 40}-z]", "[\u0001\u0002\u0040-z]");
TestCorrectPatternTranslation(@"[\x3f-\u{40 1 2}]", "[\\\u003f-\u0040\u0001\u0002]");
TestCorrectPatternTranslation(@"[\w-]", @"[\w\-]");
TestCorrectPatternTranslation(@"[\p{Alnum}-]", @"[\p{L}\p{N}\p{M}\-]");
// character set operations
TestCorrectPatternTranslation("[a-z&&d-e]", "[a-z-[\0-\uffff-[d-e]]]");
TestCorrectPatternTranslation("[a-z&&[d-e&&e-f]]", "[a-z-[\0-\uffff-[d-e-[\0-\uffff-[e-f]]]]]");
TestCorrectPatternTranslation("[a-z&&^[b[^c]]]", "[a-z-[c-[b^]]]");
TestCorrectPatternTranslation("[a-z&&[^b[^c]]]", "[a-z-[\0-\uffff-[c-[b]]]]");
TestCorrectPatternTranslation("[[^a-z][e-f][^b-q]]", "[\0-\uffff-[a-z-[\0-\uffff-[b-q-[e-f]]]]]");
TestCorrectPatternTranslation("[&&d-e]", "[a-[a]]");
TestCorrectPatternTranslation("[a-z&&[d-e&&e-f]x&&^[b[^c]]]", "[a-z-[\0-\uffff-[d-ex-[\0-\uffff-[e-fx-[c-[b^]]]]]]]");
TestCorrectPatternTranslation("[^[a-b][c-d][^e-f]&&[a-z&&[^d-e]]]", "[\0-\uffff-[a-z-[d-ee-f-[a-bc-d-[d-e]]]]]");
// groups
TestCorrectPatternTranslation("((((a))))", "((((a))))");
TestCorrectPatternTranslation("(?<name>a)", "(?<name>a)");
TestCorrectPatternTranslation("(?:a)", "(?:a)");
TestCorrectPatternTranslation("(?:a)", "(?:a)");
TestCorrectPatternTranslation("(?mix-mix)", "(?six-six)");
TestCorrectPatternTranslation("(?mix-mix:)", "(?six-six:)");
TestCorrectPatternTranslation("(?mix-mix:a)", "(?six-six:a)");
TestCorrectPatternTranslation("(?-mix:a)", "(?-six:a)");
TestCorrectPatternTranslation("(?m:a)", "(?s:a)");
TestCorrectPatternTranslation("(?mi:a)", "(?si:a)");
TestCorrectPatternTranslation("(?m)", "(?s)");
TestCorrectPatternTranslation("(?<name2>)(?<name1-name2>a)", "(?<name2>)(?<name1-name2>a)");
TestCorrectPatternTranslation("(?'name2')(?'name1-name2'a)", "(?'name2')(?'name1-name2'a)");
TestCorrectPatternTranslation("(?=)", "(?=)");
TestCorrectPatternTranslation("(?=x)", "(?=x)");
TestCorrectPatternTranslation("(?<=)", "(?<=)");
TestCorrectPatternTranslation("(?<=x)", "(?<=x)");
TestCorrectPatternTranslation("(?<!)", "(?<!)");
TestCorrectPatternTranslation("(?<!x)", "(?<!x)");
TestCorrectPatternTranslation("(?>)", "(?>)");
TestCorrectPatternTranslation("(?>x)", "(?>x)");
TestCorrectPatternTranslation("(?>(?=(?<!f)(o)(o))(?<bar>))", "(?>(?=(?<!f)(o)(o))(?<bar>))");
// backreferences:
TestCorrectPatternTranslation(@"(x) (?'name') \k<1> \k<name> \k'1' \k<name>", @"(x) (?'name') \k<1> \k<name> \k'1' \k<name>");
// error: TestCorrectPatternTranslation("(?<a)b>c)", "(?<a)b>c)");
}