| 1 | # A test suite for the POSIX.2 (BRE) pattern matching code
|
|---|
| 2 | LC_ALL=C
|
|---|
| 3 | LANG=C
|
|---|
| 4 |
|
|---|
| 5 | # First, test POSIX.2 character classes
|
|---|
| 6 |
|
|---|
| 7 | case e in
|
|---|
| 8 | [[:xdigit:]]) echo ok 1;;
|
|---|
| 9 | esac
|
|---|
| 10 |
|
|---|
| 11 | case a in
|
|---|
| 12 | [[:alpha:]123]) echo ok 2;;
|
|---|
| 13 | esac
|
|---|
| 14 |
|
|---|
| 15 | case 1 in
|
|---|
| 16 | [[:alpha:]123]) echo ok 3;;
|
|---|
| 17 | esac
|
|---|
| 18 |
|
|---|
| 19 | case 9 in
|
|---|
| 20 | [![:alpha:]]) echo ok 4;;
|
|---|
| 21 | esac
|
|---|
| 22 |
|
|---|
| 23 | # invalid character class expressions are just characters to be matched
|
|---|
| 24 | case a in
|
|---|
| 25 | [:al:]) echo ok 5;;
|
|---|
| 26 | esac
|
|---|
| 27 |
|
|---|
| 28 | case a in
|
|---|
| 29 | [[:al:]) echo ok 6;;
|
|---|
| 30 | esac
|
|---|
| 31 |
|
|---|
| 32 | case '!' in
|
|---|
| 33 | [abc[:punct:][0-9]) echo ok 7;;
|
|---|
| 34 | esac
|
|---|
| 35 |
|
|---|
| 36 | # let's try to match the start of a valid sh identifier
|
|---|
| 37 | case 'PATH' in
|
|---|
| 38 | [_[:alpha:]]*) echo ok 8;;
|
|---|
| 39 | esac
|
|---|
| 40 |
|
|---|
| 41 | # let's try to match the first two characters of a valid sh identifier
|
|---|
| 42 | case PATH in
|
|---|
| 43 | [_[:alpha:]][_[:alnum:]]*) echo ok 9;;
|
|---|
| 44 | esac
|
|---|
| 45 |
|
|---|
| 46 | # is ^C a cntrl character?
|
|---|
| 47 | case $'\003' in
|
|---|
| 48 | [[:cntrl:]]) echo ok 10;;
|
|---|
| 49 | esac
|
|---|
| 50 |
|
|---|
| 51 | # how about A?
|
|---|
| 52 | case A in
|
|---|
| 53 | [[:cntrl:]]) echo oops -- cntrl ;;
|
|---|
| 54 | *) echo ok 11;;
|
|---|
| 55 | esac
|
|---|
| 56 |
|
|---|
| 57 | case 9 in
|
|---|
| 58 | [[:digit:]]) echo ok 12;;
|
|---|
| 59 | esac
|
|---|
| 60 |
|
|---|
| 61 | case X in
|
|---|
| 62 | [[:digit:]]) echo oops -- digit;;
|
|---|
| 63 | *) echo ok 13;;
|
|---|
| 64 | esac
|
|---|
| 65 |
|
|---|
| 66 | case $'\033' in
|
|---|
| 67 | [[:graph:]]) echo oops -- graph;;
|
|---|
| 68 | *) echo ok 14;;
|
|---|
| 69 | esac
|
|---|
| 70 |
|
|---|
| 71 | case $'\040' in
|
|---|
| 72 | [[:graph:]]) echo oops -- graph 2;;
|
|---|
| 73 | *) echo ok 15;;
|
|---|
| 74 | esac
|
|---|
| 75 |
|
|---|
| 76 | case ' ' in
|
|---|
| 77 | [[:graph:]]) echo oops -- graph 3;;
|
|---|
| 78 | *) echo ok 16;;
|
|---|
| 79 | esac
|
|---|
| 80 |
|
|---|
| 81 | case 'aB' in
|
|---|
| 82 | [[:lower:]][[:upper:]]) echo ok 17;;
|
|---|
| 83 | esac
|
|---|
| 84 |
|
|---|
| 85 | case $'\040' in
|
|---|
| 86 | [[:print:]]) echo ok 18;;
|
|---|
| 87 | *) echo oops -- print;;
|
|---|
| 88 | esac
|
|---|
| 89 |
|
|---|
| 90 | case PS3 in
|
|---|
| 91 | [_[:alpha:]][_[:alnum:]][_[:alnum:]]*) echo ok 19;;
|
|---|
| 92 | esac
|
|---|
| 93 |
|
|---|
| 94 | case a in
|
|---|
| 95 | [[:alpha:][:digit:]]) echo ok 20;;
|
|---|
| 96 | *) echo oops - skip brackpat ;;
|
|---|
| 97 | esac
|
|---|
| 98 |
|
|---|
| 99 | case a in
|
|---|
| 100 | [[:alpha:]\]) echo oops -- dangling backslash in brackpat ;;
|
|---|
| 101 | *) echo ok 21 ;;
|
|---|
| 102 | esac
|
|---|
| 103 |
|
|---|
| 104 | # what's a newline? is it a blank? a space?
|
|---|
| 105 | case $'\n' in
|
|---|
| 106 | [[:blank:]]) echo ok -- blank ;;
|
|---|
| 107 | [[:space:]]) echo ok -- space ;;
|
|---|
| 108 | *) echo oops newline ;;
|
|---|
| 109 | esac
|
|---|
| 110 |
|
|---|
| 111 | # OK, what's a tab? is it a blank? a space?
|
|---|
| 112 | case $'\t' in
|
|---|
| 113 | [[:blank:]]) echo ok -- blank ;;
|
|---|
| 114 | [[:space:]]) echo ok -- space ;;
|
|---|
| 115 | *) echo oops newline ;;
|
|---|
| 116 | esac
|
|---|
| 117 |
|
|---|
| 118 | # let's check out characters in the ASCII range
|
|---|
| 119 | case $'\377' in
|
|---|
| 120 | [[:ascii:]]) echo oops -- ascii\?;;
|
|---|
| 121 | esac
|
|---|
| 122 |
|
|---|
| 123 | case 9 in
|
|---|
| 124 | [1[:alpha:]123]) echo oops 1;;
|
|---|
| 125 | esac
|
|---|
| 126 |
|
|---|
| 127 | # however, an unterminated brace expression containing a valid char class
|
|---|
| 128 | # that matches had better fail
|
|---|
| 129 | case a in
|
|---|
| 130 | [[:alpha:]) echo oops 2;;
|
|---|
| 131 | esac
|
|---|
| 132 |
|
|---|
| 133 | case $'\b' in
|
|---|
| 134 | [[:graph:]]) echo oops 3;;
|
|---|
| 135 | esac
|
|---|
| 136 |
|
|---|
| 137 | case $'\b' in
|
|---|
| 138 | [[:print:]]) echo oops 4;;
|
|---|
| 139 | esac
|
|---|
| 140 |
|
|---|
| 141 | case $' ' in
|
|---|
| 142 | [[:punct:]]) echo oops 5;;
|
|---|
| 143 | esac
|
|---|
| 144 |
|
|---|
| 145 | # Next, test POSIX.2 collating symbols
|
|---|
| 146 |
|
|---|
| 147 | case 'a' in
|
|---|
| 148 | [[.a.]]) echo ok 1;;
|
|---|
| 149 | esac
|
|---|
| 150 |
|
|---|
| 151 | case '-' in
|
|---|
| 152 | [[.hyphen.]-9]) echo ok 2;;
|
|---|
| 153 | esac
|
|---|
| 154 |
|
|---|
| 155 | case 'p' in
|
|---|
| 156 | [[.a.]-[.z.]]) echo ok 3;;
|
|---|
| 157 | esac
|
|---|
| 158 |
|
|---|
| 159 | case '-' in
|
|---|
| 160 | [[.-.]]) echo ok 4;;
|
|---|
| 161 | esac
|
|---|
| 162 |
|
|---|
| 163 | case ' ' in
|
|---|
| 164 | [[.space.]]) echo ok 5;;
|
|---|
| 165 | esac
|
|---|
| 166 |
|
|---|
| 167 | case ' ' in
|
|---|
| 168 | [[.grave-accent.]]) echo oops - grave;;
|
|---|
| 169 | *) echo ok 6;;
|
|---|
| 170 | esac
|
|---|
| 171 |
|
|---|
| 172 | case '4' in
|
|---|
| 173 | [[.-.]-9]) echo ok 7;;
|
|---|
| 174 | esac
|
|---|
| 175 |
|
|---|
| 176 | # an invalid collating symbol cannot be the first part of a range
|
|---|
| 177 | case 'c' in
|
|---|
| 178 | [[.yyz.]-[.z.]]) echo oops - yyz;;
|
|---|
| 179 | *) echo ok 8;;
|
|---|
| 180 | esac
|
|---|
| 181 |
|
|---|
| 182 | case 'c' in
|
|---|
| 183 | [[.yyz.][.a.]-z]) echo ok 9;;
|
|---|
| 184 | esac
|
|---|
| 185 |
|
|---|
| 186 | # but when not part of a range is not an error
|
|---|
| 187 | case 'c' in
|
|---|
| 188 | [[.yyz.][.a.]-[.z.]]) echo ok 10 ;;
|
|---|
| 189 | esac
|
|---|
| 190 |
|
|---|
| 191 | case 'p' in
|
|---|
| 192 | [[.a.]-[.Z.]]) echo oops -- bad range ;;
|
|---|
| 193 | *) echo ok 11;;
|
|---|
| 194 | esac
|
|---|
| 195 |
|
|---|
| 196 | case p in
|
|---|
| 197 | [[.a.]-[.zz.]p]) echo ok 12;;
|
|---|
| 198 | *) echo oops -- bad range 2;;
|
|---|
| 199 | esac
|
|---|
| 200 |
|
|---|
| 201 | case p in
|
|---|
| 202 | [[.aa.]-[.z.]p]) echo ok 13;;
|
|---|
| 203 | *) echo oops -- bad range 3;;
|
|---|
| 204 | esac
|
|---|
| 205 |
|
|---|
| 206 | case c in
|
|---|
| 207 | [[.yyz.]cde]) echo ok 14;;
|
|---|
| 208 | esac
|
|---|
| 209 |
|
|---|
| 210 | case abc in
|
|---|
| 211 | [[.cb.]a-Za]*) echo ok 15;;
|
|---|
| 212 | esac
|
|---|
| 213 |
|
|---|
| 214 | case $'\t' in
|
|---|
| 215 | [[.space.][.tab.][.newline.]]) echo ok 16;;
|
|---|
| 216 | esac
|
|---|
| 217 |
|
|---|
| 218 | # and finally, test POSIX.2 equivalence classes
|
|---|
| 219 |
|
|---|
| 220 | case "abc" in
|
|---|
| 221 | [[:alpha:]][[=b=]][[:ascii:]]) echo ok 1;;
|
|---|
| 222 | esac
|
|---|
| 223 |
|
|---|
| 224 | case "abc" in
|
|---|
| 225 | [[:alpha:]][[=B=]][[:ascii:]]) echo oops -- =B=;;
|
|---|
| 226 | *) echo ok 2 ;;
|
|---|
| 227 | esac
|
|---|
| 228 |
|
|---|
| 229 | case a in
|
|---|
| 230 | [[=b=]) echo oops;; # an incomplete equiv class is just a string
|
|---|
| 231 | *) echo ok 3;;
|
|---|
| 232 | esac
|
|---|
| 233 |
|
|---|