# 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
