# 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

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

# invalid character class expressions are no longer just characters to be
# matched
case a in
[[:al:])	echo bad 6;;
*)		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
