# file      : tests/regex/testscript
# license   : MIT; see accompanying LICENSE file

: replace-search
:
{{
  $*      abcbd /b/x/ >axcxd : all
  $* -ffo abcbd /b/x/ >axcbd : first-only
  $* -fnc abcbd /b/x/ >xx    : no-copy

  : ecma-escape
  :
  {{
    $* xay '/a/$b/'      >'x$by'  : none
    $* xay '/a/$/'       >'x$y'   : none-term
    $* xay '/a/$$/'      >'x$y'   : self
    $* xay '/a/b$&c/'    >'xbacy' : match
    $* xay '/a/b$`c/'    >'xbxcy' : match-precede
    $* xay "/a/b\\\$'c/" >'xbycy' : match-follow

    : capture
    :
    {{
      $* abcdefghij '/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/$1$10/'  >aj : matched
      $* a          '/(a)|(b)/$1$2$3/'                        >a  : unmatched
    }}
  }}

  : perl-escape
  :
  {{
    $* xay '/a/\b/' >'xby' : none
    $* xay '/a/\/'  >'xy'  : none-term
    $* xay '/a/\\/' >'x\y' : self

    : newline
    :
    $* xay '/a/\n/' >>EOO
      x
      y
      EOO

    : capture
    :
    {{
      $* abcdefghij '/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\1\10/'  >aa0 : matched
      $* a          '/(a)|(b)/\1\2\3/'                        >a   : unmatched
    }}

    : upper
    :
    {{
      $* xay '/a/\U/'        >xy   : none
      $* xay '/a/\Uvz/'      >xVZy : repl
      $* xay '/a/\Uv\Ez/'    >xVzy : end
      $* aa  '/a/v\Uz/'      >vZvZ : locality
      $* xay '/(a)/\U\1/'    >xAy  : capt
      $* x-y '/(a?)-/\U\1z/' >xZy  : capt-empty
      $* xay '/a/\uvz/'      >xVzy : once
    }}

    : lower
    :
    $* xay '/a/\lVZ/' >xvZy
  }}

  : empty-substring
  :
  : Note that the regex search-based replacement with the match_not_null flag
  : is broken for older versions of libstdc++ and libc++ (may ignore
  : match_not_null for the former and may hang for some string/pattern for the
  : latter).
  :
  if (($cxx.id != 'gcc'   || $cxx.version.major >= 7) && \
      ($cxx.id != 'clang' || $cxx.version.major >= 6))
  {{
    $* '' '/.*/x/' >'x'      : empty
    $* a  '/a*/x/' >'x'      : match
    $* aa '/b*/x/'      == 1 : no-match
  }}
}}

: replace-match
:
{{
  test.options += -m

  $* abc  '/a(b)c/x\1y/'  >xby : match
  $* abcd '/a(b)c/x\1yd/' == 1 : no-match

  : empty-substring
  :
  {{
    $* '' '/.*/x/'          >'x' : empty
    $* a  '/a*/x/'          >'x' : match
    $* ab '/a(c*)(b)/\1\2/' >'b' : match-mid
  }}
}}

: invalid-regex-fmt
:
{{
  test.arguments += '' # Note: we will fail before the matching.

  $* ''        2> 'no leading delimiter'           != 0 : no-leading-delim
  $* '/a'      2> 'no delimiter after regex'       != 0 : no-mid-delim
  $* '//'      2> 'empty regex'                    != 0 : no-regex
  $* '/a[b/c/' 2>~'/invalid regex.*/'              != 0 : regex
  $* '/a/b'    2> 'no delimiter after replacement' != 0 : no-trailing-delim
  $* '/a/b/s'  2> 'junk after trailing delimiter'  != 0 : junk
}}
