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