1#! test/for/moderni/sh
2# See the file LICENSE in the main modernish directory for the licence.
3
4# Tests for the positional parameters ($@ and $*). This is to discover any
5# shell bugs that modernish doesn't know about yet; the fact that modernish
6# doesn't know about it should be considered a bug in modernish.
7#
8# Most of these tests were inspired by the examples in the POSIX rationale,
9# section 2.5.2, Special Parameters:
10# http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html#tag_23_02_05_02
11# which is a supplement to the main spec:
12# http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02
13
14# bug patterns for some bash bugs with control characters...
15CTRLs=$CC01$CC02$CC03$CC7F  # no bug
16CTRLs_BUG_PP_10=$CC02$CC03
17CTRLs_BUG_PP_10A=$CC01$CC01$CC02$CC03$CC01$CC7F
18CTRLs_BUG_PSUBASNCC_unquoted=$CC02$CC03
19CTRLs_BUG_PSUBASNCC_quoted=$CC02$CC03$CC7F
20
21TEST title='$*, IFS is space'
22	set "abc" "def ghi" "$CTRLs"
23	IFS=' '
24	set $*
25	IFS=
26	eq $# 4 && str eq "$1|$2|$3|$4" "abc|def|ghi|$CTRLs"
27ENDT
28
29TEST title='"$*", IFS is space'
30	set "abc" "def ghi" "$CTRLs"
31	IFS=' '
32	set "$*"
33	IFS=
34	eq $# 1 && str eq "$1" "abc def ghi $CTRLs"
35ENDT
36
37TEST title='$* concatenated, IFS is space'
38	set "abc" "def ghi" "$CTRLs"
39	IFS=' '
40	set xx$*yy
41	IFS=
42	eq $# 4 && str eq "$1|$2|$3|$4" "xxabc|def|ghi|${CTRLs}yy"
43ENDT
44
45TEST title='"$*" concatenated, IFS is space'
46	set "abc" "def ghi" "$CTRLs"
47	IFS=' '
48	set "xx$*yy"
49	IFS=
50	eq $# 1 && str eq "$1" "xxabc def ghi ${CTRLs}yy"
51ENDT
52
53TEST title='$@, IFS is space'
54	set "abc" "def ghi" "$CTRLs"
55	IFS=' '
56	set $@
57	IFS=
58	case ${#},${1-},${2-},${3-},${4-NONE} in
59	( "4,abc,def,ghi,$CTRLs" )
60		mustNotHave BUG_PP_06 ;;
61	( "3,abc,def ghi,$CTRLs,NONE" )
62		mustHave BUG_PP_06 ;;
63	( * )	return 1 ;;
64	esac
65ENDT
66
67TEST title='$@, IFS set/empty'
68	set "abc" "def ghi" "$CTRLs"
69	IFS=
70	set $@
71	case ${#},${1-},${2-NONE},${3-NONE} in
72	( "3,abc,def ghi,$CTRLs" )
73		mustNotHave BUG_PP_08 ;;
74	( "1,abcdef ghi$CTRLs,NONE,NONE" )
75		mustHave BUG_PP_08 ;;
76	( * )	return 1 ;;
77	esac
78ENDT
79
80TEST title='"$@", IFS set/empty'
81	set "abc" "def ghi" "$CTRLs"
82	IFS=
83	set "$@"
84	eq $# 3 && str eq "$1|$2|$3" "abc|def ghi|$CTRLs"
85ENDT
86
87TEST title='${1+"$@"}, IFS set/empty'
88	set "abc" "def ghi" "$CTRLs"
89	IFS=
90	set ${1+"$@"}
91	failmsg="$#|${1-}|${2-}|${3-}"
92	case ${#},${1-},${2-NONE},${3-NONE} in
93	( "3,abc,def ghi,$CTRLs")
94		mustNotHave BUG_PP_1ARG ;;
95	( "1,abcdef ghi$CTRLs,NONE,NONE" )
96		mustHave BUG_PP_1ARG ;;
97	( * )	return 1 ;;
98	esac
99ENDT
100
101
102TEST title='"${1+$@}", IFS set/empty'
103	set "abc" "def ghi" "$CTRLs"
104	IFS=
105	set "${1+$@}"
106	failmsg="$#|${1-}|${2-}|${3-}"
107	case ${#},${1-},${2-NONE},${3-NONE} in
108	( "3,abc,def ghi,$CTRLs" )
109		mustNotHave BUG_PP_1ARG ;;
110	( "1,abcdef ghi$CTRLs,NONE,NONE" )
111		mustHave BUG_PP_1ARG ;;
112	( * )	return 1 ;;
113	esac
114ENDT
115
116TEST title='${novar-"$@"}, IFS set/empty'
117	set "abc" "def ghi" "$CTRLs"
118	unset -v novar
119	IFS=
120	set ${novar-"$@"}
121	case ${#},${1-},${2-NONE},${3-NONE} in
122	( "3,abc,def ghi,$CTRLs")
123		mustNotHave BUG_PP_1ARG ;;
124	( "1,abcdef ghi$CTRLs,NONE,NONE" )
125		mustHave BUG_PP_1ARG ;;
126	( * )	return 1 ;;
127	esac
128ENDT
129
130TEST title='$@ concatenated, IFS is space'
131	set "abc" "def ghi" "$CTRLs"
132	IFS=' '
133	set xx$@yy
134	IFS=
135	case ${#},${1-},${2-},${3-},${4-NONE} in
136	( "4,xxabc,def,ghi,${CTRLs}yy" )
137		mustNotHave BUG_PP_06 ;;
138	( "3,xxabc,def ghi,${CTRLs}yy,NONE" )
139		mustHave BUG_PP_06 ;;
140	( * )	return 1 ;;
141	esac
142ENDT
143
144TEST title='"$@" concatenated, IFS set/empty'
145	set "abc" "def ghi" "$CTRLs"
146	set "xx$@yy"
147	eq $# 3 && str eq "$1|$2|$3" "xxabc|def ghi|${CTRLs}yy"
148ENDT
149
150TEST title='$@$@, IFS is space'
151	set "abc" "def ghi" "$CTRLs"
152	IFS=' '
153	set $@$@
154	IFS=
155	case ${#},${1-},${2-},${3-},${4-},${5-},${6-NONE},${7-NONE} in
156	( "7,abc,def,ghi,${CTRLs}abc,def,ghi,$CTRLs" )
157		mustNotHave BUG_PP_06 ;;
158	( "5,abc,def ghi,${CTRLs}abc,def ghi,$CTRLs,NONE,NONE" )
159		mustHave BUG_PP_06 ;;
160	( * )	return 1 ;;
161	esac
162ENDT
163
164TEST title='"$@$@", IFS set/empty'
165	set "abc" "def ghi" "$CTRLs"
166	set "$@$@"
167	eq $# 5 && str eq "$1|$2|$3|$4|$5" "abc|def ghi|${CTRLs}abc|def ghi|$CTRLs"
168ENDT
169
170# ... IFS=":" ...
171
172TEST title='"$*", IFS is ":"'
173	set "abc" "def ghi" "$CTRLs"
174	IFS=':'
175	set "$*"
176	IFS=
177	eq $# 1 && str eq "$1" "abc:def ghi:$CTRLs"
178ENDT
179
180TEST title='var=$*, IFS is ":"'
181	set "abc" "def ghi" "jkl"
182	IFS=':'
183	var=$*
184	IFS=
185	str eq "$var" "abc:def ghi:jkl" || return
186
187	set -- "$ASCIICHARS" "$ASCIICHARS" "$ASCIICHARS"
188	IFS=':'
189	var=$*
190	IFS=
191	v=$CC01${CONTROLCHARS%$CC7F}$CC01$CC7F${ASCIICHARS#$CONTROLCHARS}
192	case $var in
193	( "$v:$v:$v" )
194		mustHave BUG_PP_10A ;;
195	( "$ASCIICHARS:$ASCIICHARS:$ASCIICHARS" )
196		mustNotHave BUG_PP_10A ;;
197	( * )	return 1 ;;
198	esac
199ENDT
200
201TEST title='var="$*", IFS is ":"'
202	set "abc" "def ghi" "$CTRLs"
203	IFS=':'
204	var="$*"
205	IFS=
206	str eq "$var" "abc:def ghi:$CTRLs"
207ENDT
208
209TEST title='${var-$*}, IFS is ":"'
210	set "abc" "def ghi" "$CTRLs"
211	unset -v var
212	IFS=':'
213	set ${var-$*}
214	IFS=
215	case ${#},${1-},${2-NONE},${3-NONE} in
216	( "3,abc,def ghi,$CTRLs" )
217		mustNotHave BUG_PP_09 ;;
218	( "1,abc def ghi $CTRLs,NONE,NONE" )
219		mustHave BUG_PP_09 ;;	# bash 4.3
220	( * )	return 1 ;;
221	esac
222ENDT
223
224TEST title='"${var-$*}", IFS is ":"'
225	set "abc" "def ghi" "$CTRLs"
226	unset -v var
227	IFS=':'
228	set "${var-$*}"
229	IFS=
230	eq $# 1 && str eq "$1" "abc:def ghi:$CTRLs"
231ENDT
232
233TEST title='${var-"$*"}, IFS is ":"'
234	set "abc" "def ghi" "$CTRLs"
235	unset -v var
236	IFS=':'
237	set ${var-"$*"}
238	IFS=
239	eq $# 1 && str eq "$1" "abc:def ghi:$CTRLs"
240ENDT
241
242TEST title='${var=$*}, IFS is ":"'
243	set "abc" "def ghi" "$CTRLs"
244	unset -v var
245	IFS=':'
246	set ${var=$*}
247	IFS=
248	case ${#},${1-},${2-NONE},${3-NONE},var=$var in
249	( "3,abc,def ghi,$CTRLs,var=abc:def ghi:$CTRLs" )
250		mustNotHave BUG_PP_04E && mustNotHave BUG_PSUBASNCC ;;
251	( "3,abc,def ghi,$CTRLs_BUG_PSUBASNCC_unquoted,var=abc:def ghi:$CTRLs" )
252		mustNotHave BUG_PP_04E && mustHave BUG_PSUBASNCC ;;	# bash 4.2, 4.4
253	( "1,abc def ghi $CTRLs_BUG_PSUBASNCC_unquoted,NONE,NONE,var=abc def ghi $CTRLs" )
254		mustHave BUG_PP_04E
255		eq $? 2 && mustHave BUG_PSUBASNCC ;;			# bash 4.3
256	( * )	return 1 ;;
257	esac
258ENDT
259
260TEST title='"${var=$*}", IFS is ":"'
261	set "abc" "def ghi" "$CTRLs"
262	unset -v var
263	IFS=':'
264	set "${var=$*}"
265	IFS=
266	case ${#},$1\|var=$var in
267	( "1,abc:def ghi:$CTRLs|var=abc:def ghi:$CTRLs" )
268		mustNotHave BUG_PSUBASNCC ;;
269	( "3,abc:def ghi:$CTRLs_BUG_PSUBASNCC_quoted|var=abc:def ghi:$CTRLs" )
270		mustHave BUG_PSUBASNCC ;;
271	esac
272ENDT
273
274# ... IFS='' ...
275
276TEST title='var=$*, IFS set/empty'
277	set "abc" "$ASCIICHARS" "def ghi" "$ASCIICHARS" "jkl"
278	IFS=
279	var=$*
280	v=${CONTROLCHARS#$CC01}
281	v=${v%$CC7F}${ASCIICHARS#$CONTROLCHARS}
282	case $var in
283	( "abc${ASCIICHARS}def ghi${ASCIICHARS}jkl" )
284		mustNotHave BUG_PP_03 && mustNotHave BUG_PP_10 ;;
285	( "abc${v}def ghi${v}jkl" )
286		mustNotHave BUG_PP_03 && mustHave BUG_PP_10 ;;
287	( "abc" )
288		mustNotHave BUG_PP_10 && mustHave BUG_PP_03 ;;
289	( * )	return 1 ;;
290	esac
291ENDT
292
293TEST title='var="$*", IFS set/empty'
294	set "abc" "$ASCIICHARS" "def ghi" "$ASCIICHARS" "jkl"
295	IFS=
296	var="$*"
297	str eq "$var" "abc${ASCIICHARS}def ghi${ASCIICHARS}jkl"
298ENDT
299
300TEST title='${var-$*}, IFS set/empty'
301	set "abc" "def ghi" "$CTRLs"
302	unset -v var
303	IFS=
304	set ${var-$*}
305	case ${#},${1-},${2-NONE},${3-NONE} in
306	( "3,abc,def ghi,$CTRLs" )
307		mustNotHave BUG_PP_08B && mustNotHave BUG_PSUBEMIFS ;;
308	( "1,abcdef ghi$CC02$CC03,NONE,NONE" )
309		mustHave BUG_PP_08B					# bash 4.4
310		eq $? 2 && mustHave BUG_PSUBEMIFS ;;
311	( "1,abcdef ghi$CTRLs,NONE,NONE" | "1,abc def ghi $CTRLs,NONE,NONE" )
312		mustNotHave BUG_PSUBEMIFS && mustHave BUG_PP_08B ;;	# bash | pdksh/bosh
313	( * )	return 1 ;;
314	esac
315ENDT
316
317TEST title='"${var-$*}", IFS set/empty'
318	set "abc" "def ghi" "$CTRLs"
319	unset -v var
320	IFS=
321	set "${var-$*}"
322	eq $# 1 && str eq "$1" "abcdef ghi$CTRLs"
323ENDT
324
325TEST title='${var-"$*"}, IFS set/empty'
326	set "abc" "def ghi" "$CTRLs"
327	unset -v var
328	IFS=
329	set ${var-"$*"}
330	eq $# 1 && str eq "$1" "abcdef ghi$CTRLs"
331ENDT
332
333TEST title='${var=$*}, IFS set/empty'
334	set "abc" "def ghi" "$CTRLs"
335	unset -v var
336	IFS=
337	set ${var=$*}
338	v=${#},${1-},${2-NONE},${3-NONE},var=$var
339	case $v in
340	( "1,abcdef ghi$CTRLs,NONE,NONE,var=abcdef ghi$CTRLs" )
341		mustNotHave BUG_PP_04 && mustNotHave BUG_PP_04_S && mustNotHave BUG_PSUBASNCC ;;
342	( "3,abc,def ghi,$CTRLs,var=$CTRLs" )
343		mustNotHave BUG_PP_04_S && mustNotHave BUG_PSUBASNCC && mustHave BUG_PP_04 ;;	# pdksh/mksh
344	( "2,abcdef,ghi$CTRLs_BUG_PSUBASNCC_unquoted,NONE,var=abcdef ghi$CTRLs" )
345		mustNotHave BUG_PP_04 && mustHave BUG_PP_04_S					# bash 4.2, 4.3
346		eq $? 2 && mustHave BUG_PSUBASNCC ;;
347	( "1,abcdef ghi$CTRLs_BUG_PSUBASNCC_unquoted,NONE,NONE,var=abcdef ghi$CTRLs_BUG_PSUBASNCC_quoted" )
348		mustNotHave BUG_PP_04 && mustNotHave BUG_PP_04_S && mustHave BUG_PSUBASNCC ;;	# bash 4.4
349	( * )	return 1 ;;
350	esac
351ENDT
352
353TEST title='"${var=$*}", IFS set/empty'
354	set "abc" "def ghi" "$CTRLs"
355	unset -v var
356	IFS=
357	set "${var=$*}"
358	case $#,$1\|var=$var in
359	( "1,abcdef ghi$CTRLs|var=abcdef ghi$CTRLs" )
360		mustNotHave BUG_PSUBASNCC ;;
361	( "1,abcdef ghi$CTRLs_BUG_PSUBASNCC_quoted|var=abcdef ghi$CTRLs" )
362		mustHave BUG_PSUBASNCC ;;
363	esac
364ENDT
365
366# ... IFS unset ...
367
368TEST title='"$*", IFS unset'
369	set "abc" "def ghi" "$CTRLs"
370	unset -v IFS
371	set "$*"
372	IFS=
373	eq $# 1 && str eq "$1" "abc def ghi $CTRLs"
374ENDT
375
376TEST title='var=$*, IFS unset'
377	set "abc" "def ghi" "$CTRLs"
378	unset -v IFS
379	var=$*
380	IFS=
381	case $var in
382	( "abc def ghi $CTRLs" )
383		# *may* have BUG_PP_03 variant with set & empty IFS (mksh)
384		;;
385	( 'abc' )
386		mustHave BUG_PP_03 ;;
387	( * )	return 1 ;;
388	esac
389ENDT
390
391TEST title='var="$*", IFS unset'
392	set "abc" "def ghi" "$CTRLs"
393	unset -v IFS
394	var="$*"
395	IFS=
396	str eq "$var" "abc def ghi $CTRLs"
397ENDT
398
399TEST title='${var-$*}, IFS unset'
400	set "abc" "def ghi" "$CTRLs"
401	unset -v var
402	unset -v IFS
403	set ${var-$*}
404	IFS=
405	case ${#},${1-},${2-},${3-},${4-NONE} in
406	( "4,abc,def,ghi,$CTRLs" )
407		mustNotHave BUG_PP_07 ;;
408	( "3,abc,def ghi,$CTRLs,NONE" )
409		mustHave BUG_PP_07 ;;	# zsh
410	( * )	return 1 ;;
411	esac
412ENDT
413
414TEST title='"${var-$*}", IFS unset'
415	set "abc" "def ghi" "$CTRLs"
416	unset -v var
417	unset -v IFS
418	set "${var-$*}"
419	IFS=
420	eq $# 1 && str eq "$1" "abc def ghi $CTRLs"
421ENDT
422
423TEST title='${var-"$*"}, IFS unset'
424	set "abc" "def ghi" "$CTRLs"
425	unset -v var
426	unset -v IFS
427	set ${var-"$*"}
428	IFS=
429	eq $# 1 && str eq "$1" "abc def ghi $CTRLs"
430ENDT
431
432TEST title='${var=$*}, IFS unset'
433	set "abc" "def ghi" "$CTRLs"
434	unset -v var
435	unset -v IFS
436	set ${var=$*}
437	IFS=
438	case $#,$1\|$2\|$3\|$4\|var=$var in
439	( "4,abc|def|ghi|$CTRLs|var=abc def ghi $CTRLs" )
440		mustNotHave BUG_PSUBASNCC ;;
441	( "4,abc|def|ghi|$CTRLs_BUG_PSUBASNCC_unquoted|var=abc def ghi $CTRLs" )
442		mustHave BUG_PSUBASNCC ;;
443	esac
444ENDT
445
446TEST title='"${var=$*}", IFS unset'
447	set "abc" "def ghi" "$CTRLs"
448	unset -v var
449	unset -v IFS
450	set "${var=$*}"
451	IFS=
452	case $#,$1\|var=$var in
453	( "1,abc def ghi $CTRLs|var=abc def ghi $CTRLs" )
454		mustNotHave BUG_PSUBASNCC ;;
455	( "1,abc def ghi $CTRLs_BUG_PSUBASNCC_quoted|var=abc def ghi $CTRLs" )
456		mustHave BUG_PSUBASNCC ;;
457	esac
458ENDT
459
460TEST title='"$@", IFS unset'
461	set "abc" "def ghi" "$CTRLs"
462	unset -v IFS
463	set "$@"
464	IFS=
465	eq $# 3 && str eq "$1|$2|$3" "abc|def ghi|$CTRLs"
466ENDT
467
468# ...empty fields...
469
470TEST title='$* with empty field, IFS unset'
471	set "one" "" "three"
472	unset -v IFS
473	set $*
474	IFS=
475	case ${#},${1-},${2-},${3-NONE} in
476	( '2,one,three,NONE' )
477		mustNotHave QRK_EMPTPPFLD ;;
478	( '3,one,,three' )
479		mustHave QRK_EMPTPPFLD ;;
480	( * )	return 1 ;;
481	esac
482ENDT
483
484TEST title='$@ with empty field, IFS unset'
485	set "one" "" "three"
486	unset -v IFS
487	set $@
488	IFS=
489	case ${#},${1-},${2-},${3-NONE} in
490	( '2,one,three,NONE' )
491		mustNotHave QRK_EMPTPPFLD ;;
492	( '3,one,,three' )
493		mustHave QRK_EMPTPPFLD ;;
494	( * )	return 1 ;;
495	esac
496ENDT
497
498# ...concatenating empty PPs...
499
500TEST title='empty "$*", IFS set/empty'
501	set --
502	IFS=
503	set foo "$*"
504	eq $# 2 && str eq "$1|$2" "foo|"
505ENDT
506
507TEST title='empty "${novar-}$*$(:)", IFS set/empty'
508	set --
509	unset -v novar
510	IFS=
511	set foo "${novar-}$*$(:)"
512	eq $# 2 && str eq "$1|$2" "foo|"
513ENDT
514
515TEST title='empty $@ and $*, IFS set/empty'
516	set --
517	IFS=
518	set foo $@ $*
519	set $@ $*
520	set $@ $*
521	case ${#},${1-},${2-U},${3-U},${4-U},${5-U},${6-U},${7-U},${8-U},${9-U},${10-U},${11-U},${12-U} in
522	( '4,foo,foo,foo,foo,U,U,U,U,U,U,U,U' )
523		mustNotHave BUG_PP_05 && mustNotHave BUG_PP_08 ;;
524	( '12,foo,,,foo,,,foo,,,foo,,' )
525		mustNotHave BUG_PP_08 && mustHave BUG_PP_05 ;;
526	( '2,foofoo,foofoo,U,U,U,U,U,U,U,U,U,U' )
527		mustNotHave BUG_PP_05 && mustHave BUG_PP_08 ;;
528	( * )	return 1 ;;
529	esac
530ENDT
531
532TEST title='empty "$@", IFS set/empty'
533	set --
534	IFS=
535	set foo "$@"
536	eq $# 1
537ENDT
538
539TEST title="empty ''\$@, IFS set/empty"
540	set --
541	IFS=
542	set foo ''$@
543	case ${#},${1-},${2-NONE} in
544	( '2,foo,' )
545		mustNotHave BUG_PP_02 ;;
546	( '1,foo,NONE' )
547		mustHave BUG_PP_02 ;;
548	( * )	return 1 ;;
549	esac
550ENDT
551
552TEST title="empty ''\"\$@\", IFS set/empty"
553	set --
554	IFS=
555	set foo ''"$@"
556	case ${#},${1-},${2-NONE} in
557	( '2,foo,' )
558		mustNotHave BUG_PP_01 ;;
559	( '1,foo,NONE' )
560		mustHave BUG_PP_01 ;;
561	( * )	return 1 ;;
562	esac
563ENDT
564
565TEST title='empty "${novar-}$@$(:)", IFS set/empty'
566	set --
567	unset -v novar
568	IFS=
569	set foo "${novar-}$@$(:)"
570	case ${#},${1-},${2-NONE} in
571	( '2,foo,' )
572		mustNotHave QRK_EMPTPPWRD ;;
573	( '1,foo,NONE' )
574		mustHave QRK_EMPTPPWRD ;;
575	( * )	return 1 ;;
576	esac
577ENDT
578
579TEST title='empty '\'\''"${novar-}$@$(:)", IFS set/empty'
580	set --
581	unset -v novar
582	IFS=
583	set foo ''"${novar-}$@$(:)"
584	case ${#},${1-},${2-NONE} in
585	( '2,foo,' )
586		mustNotHave BUG_PP_01 ;;
587	( '1,foo,NONE' )
588		mustHave BUG_PP_01 ;;
589	( * )	return 1 ;;
590	esac
591ENDT
592
593# ... shell grammar parsing ...
594
595TEST title='correct parsing of $#'
596	set 1 2 3
597	foo=$$
598	case $#$foo,$(($#-1+1)) in
599	( "3$foo,3" )
600		;;
601	( "${#foo}foo,${#-}2" | "${#foo}foo,2" )
602		failmsg=FTL_HASHVAR; return 1 ;;
603	( * )	return 1 ;;
604	esac
605ENDT
606
607TEST title='quoting $* quotes IFS wildcards (1)'
608	IFS=*	# on bash < 4.4, BUG_IFSGLOBC now breaks 'case' and hence all of modernish
609	set "abc" "def ghi" "$CTRLs"
610	case abcFOOBARdef\ ghiBAZQUX$CTRLs in
611	("$*")	IFS=; mustHave BUG_IFSGLOBS; return ;;	# ksh93
612	( * )	IFS=; mustNotHave BUG_IFSGLOBS; return ;;
613	esac
614	# if not even '*' matched, we've got BUG_IFSGLOBC
615	IFS=	# unbreak modernish on bash < 4.4
616	mustNotHave BUG_IFSGLOBS && mustHave BUG_IFSGLOBC
617ENDT
618
619TEST title='quoting $* quotes IFS wildcards (2)'
620	IFS=*	# on bash < 4.4, BUG_IFSGLOBC now breaks 'case' and hence all of modernish
621	set "abc" "def ghi" "$CTRLs"
622	v=abcFOOBARdef\ ghiBAZQUX${CTRLs}BUG
623	v=${v#"$*"}
624	IFS=	# unbreak modernish on bash < 4.4
625	case $v in
626	( BUG )	mustHave BUG_IFSGLOBS; return ;;
627	( abcFOOBARdef\ ghiBAZQUX${CTRLs}BUG )
628		mustNotHave BUG_IFSGLOBS; return ;;
629	esac
630	return 1
631ENDT
632
633TEST title='quoted "$@" expansion is indep. of IFS'
634	set "abc" "def ghi" "jkl"
635	IFS=$CC01
636	set "$@"
637	IFS=,
638	v="$*"
639	IFS=
640	if eq $# 1 && str eq $v "abc${CC01}def ghi${CC01}jkl"; then
641		mustHave BUG_IFSCC01PP	# bash <= 3.2
642	elif eq $# 27 && str eq $v ",,a,,b,,c${CC7F},,d,,e,,f,, ,,g,,h,,i${CC7F},,j,,k,,l"; then
643		mustHave BUG_IFSCC01PP	# bash 4.0 - 4.3
644	else
645		eq $# 3 && str eq $v "abc,def ghi,jkl"
646	fi
647ENDT
648
649TEST title='empty removal of unqoted nonexistent PPs'
650	set "a" ""
651	set +u
652	IFS=
653	# test nonempty (1), empty (2), and unset (3) PPs
654	set $1 ${1-} ${1:-} ${1+$1} ${1:+$1} $2 ${2-} ${2:-} ${2+$2} ${2:+$2} $3 ${3-} ${3:-} ${3+$3} ${3:+$3}
655	IFS=,
656	v="$*"
657	IFS=
658	set -u
659	case $v in
660	( 'a,a,a,a,a' )
661		mustNotHave BUG_PSUBEMPT ;;
662	( 'a,a,a,a,a,,,' )
663		mustHave BUG_PSUBEMPT ;;
664	( * )	return 1 ;;
665	esac
666ENDT
667
668TEST title='multi-digit PPs require expansion braces'
669	set one 2 3 4 5 6 7 8 9 10 11 twelve
670	v=$12
671	case $v in
672	( 'one2' )
673		mustNotHave BUG_PP_MDIGIT ;;
674	( 'twelve' )
675		mustHave BUG_PP_MDIGIT ;;
676	( * )	return 1 ;;
677	esac
678ENDT
679