1#! test/for/moderni/sh 2# See the file LICENSE in the main modernish directory for the licence. 3 4# These $@ and $* tests are the same as in posparam.t, but with leading and 5# trailing spaces added to the test parameter values. This catches more 6# corner case bugs in shells that modernish should be testing for. 7# 8# The tests with no PPs ($# == 0) from posparam.t are not repeated here. 9 10TEST title='$*, IFS is space' 11 set " abc " " def ghi " " jkl " 12 IFS=' ' 13 set $* 14 IFS= 15 eq $# 4 && str eq "$1|$2|$3|$4" "abc|def|ghi|jkl" 16ENDT 17 18TEST title='$*, IFS is unset' 19 set " a${CCn}b${CCt}c " " de${CCn}f g${CCt}hi${CCn}" "${CCn}j${CCt} kl${CCt}" 20 unset -v IFS 21 set $* 22 IFS= 23 case ${#},${1-},${2-},${3-},${4-NONE},${5-NONE},${6-NONE},${7-NONE},${8-NONE},${9-NONE} in 24 ( "9,a,b,c,de,f,g,hi,j,kl" ) 25 mustNotHave BUG_PP_06A && mustNotHave BUG_PP_07A ;; 26 ( "3, a${CCn}b${CCt}c , de${CCn}f g${CCt}hi${CCn},${CCn}j${CCt} kl${CCt},NONE,NONE,NONE,NONE,NONE,NONE" ) 27 mustNotHave BUG_PP_07A && mustHave BUG_PP_06A ;; 28 ( "5,a${CCn}b${CCt}c,de${CCn}f,g${CCt}hi${CCn},${CCn}j${CCt},kl${CCt},NONE,NONE,NONE,NONE" ) 29 mustNotHave BUG_PP_06A && mustHave BUG_PP_07A ;; 30 ( * ) return 1 ;; 31 esac 32ENDT 33 34TEST title='"$*", IFS is space' 35 set " abc " " def ghi " " jkl " 36 IFS=' ' 37 set "$*" 38 IFS= 39 eq $# 1 && str eq "$1" " abc def ghi jkl " 40ENDT 41 42TEST title='$* concatenated, IFS is space' 43 set " abc " " def ghi " " jkl " 44 IFS=' ' 45 set xx$*yy 46 IFS= 47 eq $# 6 && str eq "$1|$2|$3|$4|$5|$6" "xx|abc|def|ghi|jkl|yy" 48ENDT 49 50TEST title='"$*" concatenated, IFS is space' 51 set " abc " " def ghi " " jkl " 52 IFS=' ' 53 set "xx$*yy" 54 IFS= 55 eq $# 1 && str eq "$1" "xx abc def ghi jkl yy" 56ENDT 57 58TEST title='$@, IFS is space' 59 set " abc " " def ghi " " jkl " 60 IFS=' ' 61 set $@ 62 IFS= 63 case ${#},${1-},${2-},${3-},${4-NONE} in 64 ( 4,abc,def,ghi,jkl ) 65 mustNotHave BUG_PP_06 ;; 66 ( '3, abc , def ghi , jkl ,NONE' ) 67 mustHave BUG_PP_06 ;; 68 ( * ) return 1 ;; 69 esac 70ENDT 71 72TEST title='"$@", IFS set/empty' 73 set " abc " " def ghi " " jkl " 74 IFS= 75 set "$@" 76 eq $# 3 && str eq "$1|$2|$3" " abc | def ghi | jkl " 77ENDT 78 79TEST title='${1+"$@"}, IFS set/empty' 80 set " abc " " def ghi " " jkl " 81 IFS= 82 set ${1+"$@"} 83 case ${#},${1-},${2-NONE},${3-NONE} in 84 ( '3, abc , def ghi , jkl ') 85 mustNotHave BUG_PP_1ARG ;; 86 ( '1, abc def ghi jkl ,NONE,NONE' ) 87 mustHave BUG_PP_1ARG ;; 88 ( * ) return 1 ;; 89 esac 90ENDT 91 92TEST title='${novar-"$@"}, IFS set/empty' 93 set " abc " " def ghi " " jkl " 94 unset -v novar 95 IFS= 96 set ${novar-"$@"} 97 case ${#},${1-},${2-NONE},${3-NONE} in 98 ( '3, abc , def ghi , jkl ') 99 mustNotHave BUG_PP_1ARG ;; 100 ( '1, abc def ghi jkl ,NONE,NONE' ) 101 mustHave BUG_PP_1ARG ;; 102 ( * ) return 1 ;; 103 esac 104ENDT 105 106TEST title='$@ concatenated, IFS is space' 107 set " abc " " def ghi " " jkl " 108 IFS=' ' 109 set xx$@yy 110 IFS= 111 case ${#},${1-},${2-},${3-},${4-NONE},${5-NONE},${6-NONE} in 112 ( '6,xx,abc,def,ghi,jkl,yy' ) 113 mustNotHave BUG_PP_06 ;; 114 ( '3,xx abc , def ghi , jkl yy,NONE,NONE,NONE' ) 115 mustHave BUG_PP_06 ;; 116 ( * ) return 1 ;; 117 esac 118ENDT 119 120TEST title='"$@" concatenated, IFS set/empty' 121 set " abc " " def ghi " " jkl " 122 set "xx$@yy" 123 eq $# 3 && str eq "$1|$2|$3" "xx abc | def ghi | jkl yy" 124ENDT 125 126TEST title='$@$@, IFS is space' 127 set " abc " " def ghi " " jkl " 128 IFS=' ' 129 set $@$@ 130 IFS= 131 case ${#},${1-},${2-},${3-},${4-},${5-},${6-NONE},${7-NONE},${8-NONE} in 132 ( '8,abc,def,ghi,jkl,abc,def,ghi,jkl' ) 133 mustNotHave BUG_PP_06 ;; 134 ( '5, abc , def ghi , jkl abc , def ghi , jkl ,NONE,NONE,NONE' ) 135 mustHave BUG_PP_06 ;; 136 ( * ) return 1 ;; 137 esac 138ENDT 139 140TEST title='"$@$@", IFS set/empty' 141 set " abc " " def ghi " " jkl " 142 set "$@$@" 143 eq $# 5 && str eq "$1|$2|$3|$4|$5" " abc | def ghi | jkl abc | def ghi | jkl " 144ENDT 145 146# ... IFS=":" ... 147 148TEST title='"$*", IFS is ":"' 149 set " abc " " def ghi " " jkl " 150 IFS=':' 151 set "$*" 152 IFS= 153 eq $# 1 && str eq "$1" " abc : def ghi : jkl " 154ENDT 155 156TEST title='var=$*, IFS is ":"' 157 set " abc " " def ghi " " jkl " 158 IFS=':' 159 var=$* 160 IFS= 161 str eq "$var" " abc : def ghi : jkl " 162ENDT 163 164TEST title='var="$*", IFS is ":"' 165 set " abc " " def ghi " " jkl " 166 IFS=':' 167 var="$*" 168 IFS= 169 str eq "$var" " abc : def ghi : jkl " 170ENDT 171 172TEST title='${var-$*}, IFS is ":"' 173 set " abc " " def ghi " " jkl " 174 unset -v var 175 IFS=':' 176 set ${var-$*} 177 IFS= 178 case ${#},${1-},${2-NONE},${3-NONE} in 179 ( '3, abc , def ghi , jkl ' ) 180 mustNotHave BUG_PP_09 ;; 181 ( '1, abc def ghi jkl ,NONE,NONE' ) 182 mustHave BUG_PP_09 ;; # bash 2 183 ( * ) return 1 ;; 184 esac 185ENDT 186 187TEST title='"${var-$*}", IFS is ":"' 188 set " abc " " def ghi " " jkl " 189 unset -v var 190 IFS=':' 191 set "${var-$*}" 192 IFS= 193 eq $# 1 && str eq "$1" " abc : def ghi : jkl " 194ENDT 195 196TEST title='${var-"$*"}, IFS is ":"' 197 set " abc " " def ghi " " jkl " 198 unset -v var 199 IFS=':' 200 set ${var-"$*"} 201 IFS= 202 eq $# 1 && str eq "$1" " abc : def ghi : jkl " 203ENDT 204 205TEST title='${var=$*}, IFS is ":"' 206 set " abc " " def ghi " " jkl " 207 unset -v var 208 IFS=':' 209 set ${var=$*} 210 IFS= 211 case ${#},${1-},${2-NONE},${3-NONE},var=$var in 212 ( '3, abc , def ghi , jkl ,var= abc : def ghi : jkl ' ) 213 mustNotHave BUG_PP_04E ;; 214 ( '1, abc def ghi jkl ,NONE,NONE,var= abc def ghi jkl ' ) 215 mustHave BUG_PP_04E ;; # bash 4.3.30 216 ( * ) return 1 ;; 217 esac 218ENDT 219 220TEST title='"${var=$*}", IFS is ":"' 221 set " abc " " def ghi " " jkl " 222 unset -v var 223 IFS=':' 224 set "${var=$*}" 225 IFS= 226 eq $# 1 && str eq "$1|var=$var" " abc : def ghi : jkl |var= abc : def ghi : jkl " 227ENDT 228 229# ... IFS='' ... 230 231TEST title='var="$*", IFS set/empty' 232 set " abc " " def ghi " " jkl " 233 IFS= 234 var="$*" 235 str eq "$var" " abc def ghi jkl " 236ENDT 237 238TEST title='${var-$*}, IFS set/empty' 239 set " abc " " def ghi " " jkl " 240 unset -v var 241 IFS= 242 set ${var-$*} 243 case ${#},${1-},${2-NONE},${3-NONE} in 244 ( '3, abc , def ghi , jkl ' ) 245 mustNotHave BUG_PP_08B ;; 246 ( '1, abc def ghi jkl ,NONE,NONE' | '1, abc def ghi jkl ,NONE,NONE' ) 247 mustHave BUG_PP_08B ;; # bash | pdksh/bosh 248 ( * ) return 1 ;; 249 esac 250ENDT 251 252TEST title='"${var-$*}", IFS set/empty' 253 set " abc " " def ghi " " jkl " 254 unset -v var 255 IFS= 256 set "${var-$*}" 257 eq $# 1 && str eq "$1" " abc def ghi jkl " 258ENDT 259 260TEST title='${var-"$*"}, IFS set/empty' 261 set " abc " " def ghi " " jkl " 262 unset -v var 263 IFS= 264 set ${var-"$*"} 265 eq $# 1 && str eq "$1" " abc def ghi jkl " 266ENDT 267 268TEST title='${var=$*}, IFS set/empty' 269 set " abc " " def ghi " " jkl " 270 unset -v var 271 IFS= 272 set ${var=$*} 273 case ${#},${1-},${2-NONE},${3-NONE},${4-NONE},var=$var in 274 ( '1, abc def ghi jkl ,NONE,NONE,NONE,var= abc def ghi jkl ' ) 275 mustNotHave BUG_PP_04 && mustNotHave BUG_PP_04_S ;; 276 ( '3, abc , def ghi , jkl ,NONE,var= jkl ' ) 277 mustNotHave BUG_PP_04_S && mustHave BUG_PP_04 ;; # pdksh/mksh 278 ( '4,abc,def,ghi,jkl,var= abc def ghi jkl ' ) 279 mustNotHave BUG_PP_04 && mustHave BUG_PP_04_S ;; # bash 4.2, 4.3 280 ( * ) return 1 ;; 281 esac 282ENDT 283 284TEST title='"${var=$*}", IFS set/empty' 285 set " abc " " def ghi " " jkl " 286 unset -v var 287 IFS= 288 set "${var=$*}" 289 eq $# 1 && str eq "$1|var=$var" " abc def ghi jkl |var= abc def ghi jkl " 290ENDT 291 292# ... IFS unset ... 293 294TEST title='"$*", IFS unset' 295 set " abc " " def ghi " " jkl " 296 unset -v IFS 297 set "$*" 298 IFS= 299 eq $# 1 && str eq "$1" " abc def ghi jkl " 300ENDT 301 302TEST title='var=$*, IFS unset' 303 set " abc " " def ghi " " jkl " 304 unset -v IFS 305 var=$* 306 IFS= 307 case $var in 308 ( ' abc def ghi jkl ' ) 309 # *may* have BUG_PP_03 variant with set & empty IFS (mksh) 310 mustNotHave BUG_PP_03A ;; 311 ( 'abc def ghi jkl' ) # bash 312 mustNotHave BUG_PP_03 && mustHave BUG_PP_03A ;; 313 ( ' abc ' ) # zsh 314 mustNotHave BUG_PP_03A && mustHave BUG_PP_03 ;; 315 ( * ) return 1 ;; 316 esac 317ENDT 318 319TEST title='var=${var-$*}, IFS unset' 320 set " abc " " def ghi " " jkl " 321 unset -v IFS v 322 v=${v-$*} 323 IFS= 324 case $v in 325 ( ' abc def ghi jkl ' ) 326 mustNotHave BUG_PP_03B && mustNotHave BUG_PP_03C ;; 327 ( 'abc def ghi jkl' ) # bash 4.3, 4.4 328 mustNotHave BUG_PP_03C && mustHave BUG_PP_03B ;; 329 ( ' abc ' ) # zsh 5.3, 5.3.1 330 mustNotHave BUG_PP_03B && mustHave BUG_PP_03C ;; 331 ( * ) return 1 ;; 332 esac 333ENDT 334 335TEST title='var="$*", IFS unset' 336 set " abc " " def ghi " " jkl " 337 unset -v IFS 338 var="$*" 339 IFS= 340 str eq "$var" " abc def ghi jkl " 341ENDT 342 343TEST title='${var-$*}, IFS unset' 344 set " abc " " def ghi " " jkl " 345 unset -v var 346 unset -v IFS 347 set ${var-$*} 348 IFS= 349 case ${#},${1-},${2-},${3-},${4-NONE} in 350 ( '4,abc,def,ghi,jkl' ) 351 mustNotHave BUG_PP_07 ;; 352 ( '3, abc , def ghi , jkl ,NONE' ) 353 mustHave BUG_PP_07 ;; # zsh 354 ( * ) return 1 ;; 355 esac 356ENDT 357 358TEST title='"${var-$*}", IFS unset' 359 set " abc " " def ghi " " jkl " 360 unset -v var 361 unset -v IFS 362 set "${var-$*}" 363 IFS= 364 eq $# 1 && str eq "$1" " abc def ghi jkl " 365ENDT 366 367TEST title='${var-"$*"}, IFS unset' 368 set " abc " " def ghi " " jkl " 369 unset -v var 370 unset -v IFS 371 set ${var-"$*"} 372 IFS= 373 eq $# 1 && str eq "$1" " abc def ghi jkl " 374ENDT 375 376TEST title='${var=$*}, IFS unset' 377 set " abc " " def ghi " " jkl " 378 unset -v var 379 unset -v IFS 380 set ${var=$*} 381 IFS= 382 case ${#},${1-},${2-},${3-},${4-},${5-NONE},var=$var in 383 ( '4,abc,def,ghi,jkl,NONE,var= abc def ghi jkl ' ) 384 mustNotHave BUG_PP_04A && mustNotHave BUG_PP_04D ;; 385 ( '4,abc,def,ghi,jkl,NONE,var=abc def ghi jkl' ) # bash 386 mustNotHave BUG_PP_04D && mustHave BUG_PP_04A ;; 387 ( '5,,abc,def,ghi,jkl,var= abc def ghi jkl ' ) # mksh <= R50 388 mustNotHave BUG_PP_04A && mustHave BUG_PP_04D ;; 389 ( * ) return 1 ;; 390 esac 391ENDT 392 393TEST title='"${var=$*}", IFS unset' 394 set " abc " " def ghi " " jkl " 395 unset -v var 396 unset -v IFS 397 set "${var=$*}" 398 IFS= 399 eq $# 1 && str eq "$1|var=$var" " abc def ghi jkl |var= abc def ghi jkl " 400ENDT 401 402TEST title='"$@", IFS unset' 403 set " abc " " def ghi " " jkl " 404 unset -v IFS 405 set "$@" 406 IFS= 407 eq $# 3 && str eq "$1|$2|$3" " abc | def ghi | jkl " 408ENDT 409 410# ...empty fields... 411 412TEST title='$* with empty field, IFS unset' 413 set " one " "" " three " 414 unset -v IFS 415 set $* 416 IFS= 417 case ${#},${1-},${2-},${3-NONE} in 418 ( '2,one,three,NONE' ) 419 mustNotHave BUG_PP_07 && mustNotHave QRK_EMPTPPFLD ;; 420 ( '3,one,,three' ) 421 mustNotHave BUG_PP_07 && mustHave QRK_EMPTPPFLD ;; 422 ( '2, one , three ,NONE' ) 423 mustNotHave QRK_EMPTPPFLD && mustHave BUG_PP_07 ;; 424 ( * ) return 1 ;; 425 esac 426ENDT 427 428TEST title='$@ with empty field, IFS unset' 429 set " one " "" " three " 430 unset -v IFS 431 set $@ 432 IFS= 433 case ${#},${1-},${2-},${3-NONE} in 434 ( '2,one,three,NONE' ) 435 mustNotHave BUG_PP_07 && mustNotHave QRK_EMPTPPFLD ;; 436 ( '3,one,,three' ) 437 mustNotHave BUG_PP_07 && mustHave QRK_EMPTPPFLD ;; 438 ( '2, one , three ,NONE' ) 439 mustNotHave QRK_EMPTPPFLD && mustHave BUG_PP_07 ;; 440 ( * ) return 1 ;; 441 esac 442ENDT 443 444TEST title='quoted "$@" expansion is indep. of IFS' 445 set " one " "" " three " 446 IFS=$CC01 447 set "$@" 448 IFS=, 449 v="$*" 450 IFS= 451 if eq $# 1 && str eq $v " one ${CC7F}${CC01} three "; then 452 mustHave BUG_IFSCC01PP # bash <= 3.2 453 elif eq $# 25 && str eq $v ",, ,,o,,n,,e,, ${CC7F}${CC7F},, ,,t,,h,,r,,e,,e,, "; then 454 mustHave BUG_IFSCC01PP # bash 4.0 - 4.3 455 else 456 eq $# 3 && str eq $1,$2,$3 ' one ,, three ' 457 fi 458ENDT 459 460TEST title='"${1+ foo: $@ bar }", IFS set/empty' 461 set " abc " " def ghi " " jkl " 462 IFS= 463 set "${1+ foo: $@ bar }" 464 case ${#},${1-},${2-NONE},${3-NONE} in 465 ( '3, foo: abc , def ghi , jkl bar ') 466 mustNotHave BUG_PP_1ARG ;; 467 ( '1, foo: abc def ghi jkl bar ,NONE,NONE' ) 468 mustHave BUG_PP_1ARG ;; 469 ( * ) return 1 ;; 470 esac 471ENDT 472