| # This file tests the auxiliary pattern conversion features of the PCRE2 |
| # library, in non-UTF mode. |
| |
| #forbid_utf |
| #newline_default lf any anycrlf |
| |
| # -------- Tests of glob conversion -------- |
| |
| # Set the glob separator explicitly so that different OS defaults are not a |
| # problem. Then test various errors. |
| |
| #pattern convert=glob,convert_glob_escape=\,convert_glob_separator=/ |
| |
| /abc/posix |
| ** The convert and posix modifiers are mutually exclusive |
| |
| # Separator must be / \ or . |
| |
| /a*b/convert_glob_separator=% |
| ** Invalid glob separator '%' |
| |
| # Can't have separator in a class |
| |
| "[ab/cd]" |
| (?s)\A[ab/cd](?<!/)\z |
| |
| "[,-/]" |
| (?s)\A[,-/](?<!/)\z |
| |
| /[ab/ |
| ** Pattern conversion error at offset 3: missing terminating ] for character class |
| |
| # Length check |
| |
| /abc/convert_length=11 |
| ** Pattern conversion error at offset 3: no more memory |
| |
| /abc/convert_length=12 |
| (?s)\Aabc\z |
| |
| # Now some actual tests |
| |
| /a?b[]xy]*c/ |
| (?s)\Aa[^/]b[\]xy](*COMMIT)[^/]*?c\z |
| azb]1234c |
| 0: azb]1234c |
| |
| # Tests from the gitwildmatch list, with some additions |
| |
| /foo/ |
| (?s)\Afoo\z |
| foo |
| 0: foo |
| /= Expect no match |
| No match |
| bar |
| No match |
| |
| // |
| (?s)\A\z |
| \ |
| 0: |
| |
| /???/ |
| (?s)\A[^/][^/][^/]\z |
| foo |
| 0: foo |
| \= Expect no match |
| foobar |
| No match |
| |
| /*/ |
| (?s)\A[^/]*+\z |
| foo |
| 0: foo |
| \ |
| 0: |
| |
| /f*/ |
| (?s)\Af(*COMMIT)[^/]*+\z |
| foo |
| 0: foo |
| f |
| 0: f |
| |
| /*f/ |
| (?s)\A[^/]*?f\z |
| oof |
| 0: oof |
| \= Expect no match |
| foo |
| No match |
| |
| /*foo*/ |
| (?s)\A[^/]*?foo(*COMMIT)[^/]*+\z |
| foo |
| 0: foo |
| food |
| 0: food |
| aprilfool |
| 0: aprilfool |
| |
| /*ob*a*r*/ |
| (?s)\A[^/]*?ob(*COMMIT)[^/]*?a(*COMMIT)[^/]*?r(*COMMIT)[^/]*+\z |
| foobar |
| 0: foobar |
| |
| /*ab/ |
| (?s)\A[^/]*?ab\z |
| aaaaaaabababab |
| 0: aaaaaaabababab |
| |
| /foo\*/ |
| (?s)\Afoo\*\z |
| foo* |
| 0: foo* |
| |
| /foo\*bar/ |
| (?s)\Afoo\*bar\z |
| \= Expect no match |
| foobar |
| No match |
| |
| /f\\oo/ |
| (?s)\Af\\oo\z |
| f\\oo |
| 0: f\oo |
| |
| /*[al]?/ |
| (?s)\A[^/]*?[al][^/]\z |
| ball |
| 0: ball |
| |
| /[ten]/ |
| (?s)\A[ten]\z |
| \= Expect no match |
| ten |
| No match |
| |
| /t[a-g]n/ |
| (?s)\At[a-g]n\z |
| ten |
| 0: ten |
| |
| /a[]]b/ |
| (?s)\Aa[\]]b\z |
| a]b |
| 0: a]b |
| |
| /a[]a-]b/ |
| (?s)\Aa[\]a\-]b\z |
| |
| /a[]-]b/ |
| (?s)\Aa[\]\-]b\z |
| a-b |
| 0: a-b |
| a]b |
| 0: a]b |
| \= Expect no match |
| aab |
| No match |
| |
| /a[]a-z]b/ |
| (?s)\Aa[\]a-z]b\z |
| aab |
| 0: aab |
| |
| /]/ |
| (?s)\A\]\z |
| ] |
| 0: ] |
| |
| /t[!a-g]n/ |
| (?s)\At[^/a-g]n\z |
| ton |
| 0: ton |
| \= Expect no match |
| ten |
| No match |
| |
| '[[:alpha:]][[:digit:]][[:upper:]]' |
| (?s)\A[[:alpha:]][[:digit:]][[:upper:]]\z |
| a1B |
| 0: a1B |
| |
| '[[:digit:][:upper:][:space:]]' |
| (?s)\A[[:digit:][:upper:][:space:]]\z |
| A |
| 0: A |
| 1 |
| 0: 1 |
| \ \= |
| 0: |
| \= Expect no match |
| a |
| No match |
| . |
| No match |
| |
| '[a-c[:digit:]x-z]' |
| (?s)\A[a-c[:digit:]x-z]\z |
| 5 |
| 0: 5 |
| b |
| 0: b |
| y |
| 0: y |
| \= Expect no match |
| q |
| No match |
| |
| # End of gitwildmatch tests |
| |
| /*.j?g/ |
| (?s)\A[^/]*?\.j[^/]g\z |
| pic01.jpg |
| 0: pic01.jpg |
| .jpg |
| 0: .jpg |
| pic02.jxg |
| 0: pic02.jxg |
| \= Expect no match |
| pic03.j/g |
| No match |
| |
| /A[+-0]B/ |
| (?s)\AA[+-0](?<!/)B\z |
| A+B |
| 0: A+B |
| A.B |
| 0: A.B |
| A0B |
| 0: A0B |
| \= Expect no match |
| A/B |
| No match |
| |
| /*x?z/ |
| (?s)\A[^/]*?x[^/]z\z |
| abc.xyz |
| 0: abc.xyz |
| \= Expect no match |
| .xyz |
| 0: .xyz |
| |
| /?x?z/ |
| (?s)\A[^/]x[^/]z\z |
| axyz |
| 0: axyz |
| \= Expect no match |
| .xyz |
| 0: .xyz |
| |
| "[,-0]x?z" |
| (?s)\A[,-0](?<!/)x[^/]z\z |
| ,xyz |
| 0: ,xyz |
| \= Expect no match |
| /xyz |
| No match |
| .xyz |
| 0: .xyz |
| |
| ".x*" |
| (?s)\A\.x(*COMMIT)[^/]*+\z |
| .xabc |
| 0: .xabc |
| |
| /a[--0]z/ |
| (?s)\Aa[\--0](?<!/)z\z |
| a-z |
| 0: a-z |
| a.z |
| 0: a.z |
| a0z |
| 0: a0z |
| \= Expect no match |
| a/z |
| No match |
| a1z |
| No match |
| |
| /<[a-c-d]>/ |
| (?s)\A<[a-c\-d]>\z |
| <a> |
| 0: <a> |
| <b> |
| 0: <b> |
| <c> |
| 0: <c> |
| <d> |
| 0: <d> |
| <-> |
| 0: <-> |
| |
| /a[[:digit:].]z/ |
| (?s)\Aa[[:digit:].]z\z |
| a1z |
| 0: a1z |
| a.z |
| 0: a.z |
| \= Expect no match |
| a:z |
| No match |
| |
| /a[[:digit].]z/ |
| (?s)\Aa[\[:digit]\.\]z\z |
| a[.]z |
| 0: a[.]z |
| a:.]z |
| 0: a:.]z |
| ad.]z |
| 0: ad.]z |
| |
| /<[[:a[:digit:]b]>/ |
| (?s)\A<[\[:a[:digit:]b]>\z |
| <[> |
| 0: <[> |
| <:> |
| 0: <:> |
| <a> |
| 0: <a> |
| <9> |
| 0: <9> |
| <b> |
| 0: <b> |
| \= Expect no match |
| <d> |
| No match |
| |
| /a*b/convert_glob_separator=\ |
| (?s)\Aa(*COMMIT)[^\\]*?b\z |
| |
| /a*b/convert_glob_separator=. |
| (?s)\Aa(*COMMIT)[^\.]*?b\z |
| |
| /a*b/convert_glob_separator=/ |
| (?s)\Aa(*COMMIT)[^/]*?b\z |
| |
| # Non control character checking |
| |
| /A\B\\C\D/ |
| (?s)\AAB\\CD\z |
| |
| /\\{}\?\*+\[\]()|.^$/ |
| (?s)\A\\\{\}\?\*\+\[\]\(\)\|\.\^\$\z |
| |
| /*a*\/*b*/ |
| (?s)\A[^/]*?a(*COMMIT)[^/]*?/(*COMMIT)[^/]*?b(*COMMIT)[^/]*+\z |
| |
| /?a?\/?b?/ |
| (?s)\A[^/]a[^/]/[^/]b[^/]\z |
| |
| /[a\\b\c][]][-][\]\-]/ |
| (?s)\A[a\\bc][\]][\-][\]\-]\z |
| |
| /[^a\\b\c][!]][!-][^\]\-]/ |
| (?s)\A[^/a\\bc][^/\]][^/\-][^/\]\-]\z |
| |
| /[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:word:][:xdigit:]]/ |
| (?s)\A[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:word:][:xdigit:]](?<!/)\z |
| |
| "[/-/]" |
| (?s)\A[/-/](?<!/)\z |
| |
| /[-----]/ |
| (?s)\A[\--\-\-\-]\z |
| |
| /[------]/ |
| (?s)\A[\--\-\--\-]\z |
| |
| /[!------]/ |
| (?s)\A[^/\--\-\--\-]\z |
| |
| /[[:alpha:]-a]/ |
| (?s)\A[[:alpha:]\-a]\z |
| |
| /[[:alpha:]][[:punct:]][[:ascii:]]/ |
| (?s)\A[[:alpha:]][[:punct:]](?<!/)[[:ascii:]](?<!/)\z |
| |
| /[a-[:alpha:]]/ |
| ** Pattern conversion error at offset 4: invalid syntax |
| |
| /[[:alpha:/ |
| ** Pattern conversion error at offset 9: missing terminating ] for character class |
| |
| /[[:alpha:]/ |
| ** Pattern conversion error at offset 10: missing terminating ] for character class |
| |
| /[[:alphaa:]]/ |
| (?s)\A[\[:alphaa:]\]\z |
| |
| /[[:xdigi:]]/ |
| (?s)\A[\[:xdigi:]\]\z |
| |
| /[[:xdigit::]]/ |
| (?s)\A[\[:xdigit::]\]\z |
| |
| /****/ |
| (?s) |
| |
| /**\/abc/ |
| (?s)(?:\A|/)abc\z |
| abc |
| 0: abc |
| x/abc |
| 0: /abc |
| xabc |
| No match |
| |
| /abc\/**/ |
| (?s)\Aabc/ |
| |
| /abc\/**\/abc/ |
| (?s)\Aabc/(*COMMIT)(?:.*?/)??abc\z |
| |
| /**\/*a*b*g*n*t/ |
| (?s)(?:\A|/)(?>[^/]*?a)(?>[^/]*?b)(?>[^/]*?g)(?>[^/]*?n)(?>[^/]*?t\z) |
| abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt |
| 0: /abcdefghijklmnop.txt |
| |
| /**\/*a*\/**/ |
| (?s)(?:\A|/)(?>[^/]*?a)(?>[^/]*?/) |
| xx/xx/xx/xax/xx/xb |
| 0: /xax/ |
| |
| /**\/*a*/ |
| (?s)(?:\A|/)(?>[^/]*?a)(?>[^/]*+\z) |
| xx/xx/xx/xax |
| 0: /xax |
| xx/xx/xx/xax/xx |
| No match |
| |
| /**\/*a*\/**\/*b*/ |
| (?s)(?:\A|/)(?>[^/]*?a)(?>[^/]*?/)(*COMMIT)(?:.*?/)??(?>[^/]*?b)(?>[^/]*+\z) |
| xx/xx/xx/xax/xx/xb |
| 0: /xax/xx/xb |
| xx/xx/xx/xax/xx/x |
| No match |
| |
| "**a"convert=glob |
| (?s)a\z |
| a |
| 0: a |
| c/b/a |
| 0: a |
| c/b/aaa |
| 0: a |
| |
| "a**/b"convert=glob |
| (?s)\Aa(*COMMIT).*?/b\z |
| a/b |
| 0: a/b |
| ab |
| No match |
| |
| "a/**b"convert=glob |
| (?s)\Aa/(*COMMIT).*?b\z |
| a/b |
| 0: a/b |
| ab |
| No match |
| |
| #pattern convert=glob:glob_no_starstar |
| |
| /***/ |
| (?s)\A[^/]*+\z |
| |
| /**a**/ |
| (?s)\A[^/]*?a(*COMMIT)[^/]*+\z |
| |
| #pattern convert=unset |
| #pattern convert=glob:glob_no_wild_separator |
| |
| /*/ |
| (?s) |
| |
| /*a*/ |
| (?s)a |
| |
| /**a**/ |
| (?s)a |
| |
| /a*b/ |
| (?s)\Aa(*COMMIT).*?b\z |
| |
| /*a*b*/ |
| (?s)a(*COMMIT).*?b |
| |
| /??a??/ |
| (?s)\A..a..\z |
| |
| #pattern convert=unset |
| #pattern convert=glob,convert_glob_escape=0 |
| |
| /a\b\cd/ |
| (?s)\Aa\\b\\cd\z |
| |
| /**\/a/ |
| (?s)\\/a\z |
| |
| /a`*b/convert_glob_escape=` |
| (?s)\Aa\*b\z |
| |
| /a`*b/convert_glob_escape=0 |
| (?s)\Aa`(*COMMIT)[^/]*?b\z |
| |
| /a`*b/convert_glob_escape=x |
| ** Invalid glob escape 'x' |
| |
| # -------- Tests of extended POSIX conversion -------- |
| |
| #pattern convert=unset:posix_extended |
| |
| /<[[:a[:digit:]b]>/ |
| (*NUL)<[[:a[:digit:]b]> |
| <[> |
| 0: <[> |
| <:> |
| 0: <:> |
| <a> |
| 0: <a> |
| <9> |
| 0: <9> |
| <b> |
| 0: <b> |
| \= Expect no match |
| <d> |
| No match |
| |
| /a+\1b\\c|d[ab\c]/ |
| (*NUL)a+1b\\c|d[ab\\c] |
| |
| /<[]bc]>/ |
| (*NUL)<[]bc]> |
| <]> |
| 0: <]> |
| <b> |
| 0: <b> |
| <c> |
| 0: <c> |
| |
| /<[^]bc]>/ |
| (*NUL)<[^]bc]> |
| <.> |
| 0: <.> |
| \= Expect no match |
| <]> |
| No match |
| <b> |
| No match |
| |
| /(a)\1b/ |
| (*NUL)(a)1b |
| a1b |
| 0: a1b |
| 1: a |
| \= Expect no match |
| aab |
| No match |
| |
| /(ab)c)d]/ |
| (*NUL)(ab)c\)d\] |
| Xabc)d]Y |
| 0: abc)d] |
| 1: ab |
| |
| /a***b/ |
| (*NUL)a*b |
| |
| # -------- Tests of basic POSIX conversion -------- |
| |
| #pattern convert=unset:posix_basic |
| |
| /a*b+c\+[def](ab)\(cd\)/ |
| (*NUL)a*b\+c\+[def]\(ab\)(cd) |
| |
| /\(a\)\1b/ |
| (*NUL)(a)\1b |
| aab |
| 0: aab |
| 1: a |
| \= Expect no match |
| a1b |
| No match |
| |
| /how.to how\.to/ |
| (*NUL)how.to how\.to |
| how\nto how.to |
| 0: how\x0ato how.to |
| \= Expect no match |
| how\x{0}to how.to |
| No match |
| |
| /^how to \^how to/ |
| (*NUL)^how to \^how to |
| |
| /^*abc/ |
| (*NUL)^\*abc |
| |
| /*abc/ |
| (*NUL)\*abc |
| X*abcY |
| 0: *abc |
| |
| /**abc/ |
| (*NUL)\**abc |
| XabcY |
| 0: abc |
| X*abcY |
| 0: *abc |
| X**abcY |
| 0: **abc |
| |
| /*ab\(*cd\)/ |
| (*NUL)\*ab(\*cd) |
| |
| /^b\(c^d\)\(^e^f\)/ |
| (*NUL)^b(c\^d)(^e\^f) |
| |
| /a***b/ |
| (*NUL)a*b |
| |
| # End of testinput24 |