# A test suite for the POSIX.2 (BRE) pattern matching code
LC_ALL=C
LANG=C

# First, test POSIX.2 character classes

case e in
[[:xdigit:]]) echo ok 1;;
esac

case a in
[[:alpha:]123]) echo ok 2;;
esac

case 1 in
[[:alpha:]123]) echo ok 3;;
esac

case 9 in
[![:alpha:]]) echo ok 4;;
esac

# invalid character class expressions are just characters to be matched
case a in
[:al:])   echo ok 5;;
esac

case a in
[[:al:])  echo ok 6;;
esac

case '!' in
[abc[:punct:][0-9]) echo ok 7;;
esac

# let's try to match the start of a valid sh identifier
case 'PATH' in
[_[:alpha:]]*)  echo ok 8;;
esac

# let's try to match the first two characters of a valid sh identifier
case PATH in
[_[:alpha:]][_[:alnum:]]*)  echo ok 9;;
esac

# is ^C a cntrl character?
case $'\003' in
[[:cntrl:]])  echo ok 10;;
esac

# how about A?
case A in
[[:cntrl:]])  echo oops -- cntrl ;;
*)    echo ok 11;;
esac

case 9 in
[[:digit:]])  echo ok 12;;
esac

case X in
[[:digit:]])  echo oops -- digit;;
*)    echo ok 13;;
esac

case $'\033' in
[[:graph:]])  echo oops -- graph;;
*)    echo ok 14;;
esac

case $'\040' in
[[:graph:]])  echo oops -- graph 2;;
*)    echo ok 15;;
esac

case ' ' in
[[:graph:]])  echo oops -- graph 3;;
*)    echo ok 16;;
esac

case 'aB' in
[[:lower:]][[:upper:]]) echo ok 17;;
esac

case $'\040' in
[[:print:]])  echo ok 18;;
*)    echo oops -- print;;
esac

case PS3 in
[_[:alpha:]][_[:alnum:]][_[:alnum:]]*)  echo ok 19;;
esac

case a in
[[:alpha:][:digit:]]) echo ok 20;;
*)      echo oops - skip brackpat ;;
esac

case a in
[[:alpha:]\]) echo oops -- dangling backslash in brackpat ;;
*)    echo ok 21 ;;
esac

# what's a newline?  is it a blank? a space?
case $'\n' in
[[:blank:]])  echo ok -- blank ;;
[[:space:]])  echo ok -- space ;;
*)    echo oops newline ;;
esac

# OK, what's a tab?  is it a blank? a space?
case $'\t' in
[[:blank:]])  echo ok -- blank ;;
[[:space:]])  echo ok -- space ;;
*)    echo oops newline ;;
esac

# let's check out characters in the ASCII range
case $'\377' in
[[:ascii:]])  echo oops -- ascii\?;;
esac

case 9 in
[1[:alpha:]123]) echo oops 1;;
esac

# however, an unterminated brace expression containing a valid char class
# that matches had better fail
case a in
[[:alpha:]) echo oops 2;;
esac

case $'\b' in
[[:graph:]])  echo oops 3;;
esac

case $'\b' in
[[:print:]])  echo oops 4;;
esac

case $' ' in
[[:punct:]])  echo oops 5;;
esac

# Next, test POSIX.2 collating symbols

case 'a' in
[[.a.]])  echo ok 1;;
esac

case '-' in
[[.hyphen.]-9]) echo ok 2;;
esac

case 'p' in
[[.a.]-[.z.]])  echo ok 3;;
esac

case '-' in
[[.-.]])  echo ok 4;;
esac

case ' ' in
[[.space.]])  echo ok 5;;
esac

case ' ' in
[[.grave-accent.]]) echo oops - grave;;
*)    echo ok 6;;
esac

case '4' in
[[.-.]-9])  echo ok 7;;
esac

# an invalid collating symbol cannot be the first part of a range
case 'c' in
[[.yyz.]-[.z.]])  echo oops - yyz;;
*)    echo ok 8;;
esac

case 'c' in
[[.yyz.][.a.]-z])   echo ok 9;;
esac

# but when not part of a range is not an error
case 'c' in
[[.yyz.][.a.]-[.z.]])   echo ok 10 ;;
esac

case 'p' in
[[.a.]-[.Z.]])    echo oops -- bad range ;;
*)      echo ok 11;;
esac

case p in
[[.a.]-[.zz.]p])  echo ok 12;;
*)      echo oops -- bad range 2;;
esac

case p in
[[.aa.]-[.z.]p])  echo ok 13;;
*)      echo oops -- bad range 3;;
esac

case c in
[[.yyz.]cde])   echo ok 14;;
esac

case abc in
[[.cb.]a-Za]*)    echo ok 15;;
esac

case $'\t' in
[[.space.][.tab.][.newline.]])  echo ok 16;;
esac

# and finally, test POSIX.2 equivalence classes

case "abc" in
[[:alpha:]][[=b=]][[:ascii:]])  echo ok 1;;
esac

case "abc" in
[[:alpha:]][[=B=]][[:ascii:]])  echo oops -- =B=;;
*)  echo ok 2 ;;
esac

case a in
[[=b=])   echo oops;; # an incomplete equiv class is just a string
*)    echo ok 3;;
esac

