xref: /freebsd/contrib/netbsd-tests/bin/sh/t_expand.sh (revision c22165b4f1f5d38b681921797a44b3ba8c13b7e0)
1*640235e2SEnji Cooper# $NetBSD: t_expand.sh,v 1.8 2016/04/29 18:29:17 christos Exp $
257718be8SEnji Cooper#
357718be8SEnji Cooper# Copyright (c) 2007, 2009 The NetBSD Foundation, Inc.
457718be8SEnji Cooper# All rights reserved.
557718be8SEnji Cooper#
657718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without
757718be8SEnji Cooper# modification, are permitted provided that the following conditions
857718be8SEnji Cooper# are met:
957718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright
1057718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer.
1157718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
1257718be8SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
1357718be8SEnji Cooper#    documentation and/or other materials provided with the distribution.
1457718be8SEnji Cooper#
1557718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1657718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1757718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1857718be8SEnji Cooper# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
1957718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2057718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2157718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2257718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2357718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2457718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2557718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE.
2657718be8SEnji Cooper#
27*640235e2SEnji Cooper# the implementation of "sh" to test
28*640235e2SEnji Cooper: ${TEST_SH:="/bin/sh"}
2957718be8SEnji Cooper
3057718be8SEnji Cooper#
3157718be8SEnji Cooper# This file tests the functions in expand.c.
3257718be8SEnji Cooper#
3357718be8SEnji Cooper
3457718be8SEnji Cooperdelim_argv() {
3557718be8SEnji Cooper	str=
3657718be8SEnji Cooper	while [ $# -gt 0 ]; do
3757718be8SEnji Cooper		if [ -z "${str}" ]; then
3857718be8SEnji Cooper			str=">$1<"
3957718be8SEnji Cooper		else
4057718be8SEnji Cooper			str="${str} >$1<"
4157718be8SEnji Cooper		fi
4257718be8SEnji Cooper		shift
4357718be8SEnji Cooper	done
4457718be8SEnji Cooper	echo ${str}
4557718be8SEnji Cooper}
4657718be8SEnji Cooper
4757718be8SEnji Cooperatf_test_case dollar_at
4857718be8SEnji Cooperdollar_at_head() {
4957718be8SEnji Cooper	atf_set "descr" "Somewhere between 2.0.2 and 3.0 the expansion" \
5057718be8SEnji Cooper	                "of the \$@ variable had been broken.  Check for" \
5157718be8SEnji Cooper			"this behavior."
5257718be8SEnji Cooper}
5357718be8SEnji Cooperdollar_at_body() {
5457718be8SEnji Cooper	# This one should work everywhere.
55*640235e2SEnji Cooper	atf_check -s exit:0 -o inline:' EOL\n' -e empty \
56*640235e2SEnji Cooper		${TEST_SH} -c 'echo "" "" | '" sed 's,\$,EOL,'"
5757718be8SEnji Cooper
5857718be8SEnji Cooper	# This code triggered the bug.
59*640235e2SEnji Cooper	atf_check -s exit:0 -o inline:' EOL\n' -e empty \
60*640235e2SEnji Cooper		${TEST_SH} -c 'set -- "" ""; echo "$@" | '" sed 's,\$,EOL,'"
6157718be8SEnji Cooper
62*640235e2SEnji Cooper	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
63*640235e2SEnji Cooper		'set -- -; shift; n_arg() { echo $#; }; n_arg "$@"'
6457718be8SEnji Cooper}
6557718be8SEnji Cooper
6657718be8SEnji Cooperatf_test_case dollar_at_with_text
6757718be8SEnji Cooperdollar_at_with_text_head() {
6857718be8SEnji Cooper	atf_set "descr" "Test \$@ expansion when it is surrounded by text" \
6957718be8SEnji Cooper	                "within the quotes.  PR bin/33956."
7057718be8SEnji Cooper}
7157718be8SEnji Cooperdollar_at_with_text_body() {
7257718be8SEnji Cooper
73*640235e2SEnji Cooper	cat <<'EOF' > h-f1
74*640235e2SEnji Cooper
75*640235e2SEnji Cooperdelim_argv() {
76*640235e2SEnji Cooper	str=
77*640235e2SEnji Cooper	while [ $# -gt 0 ]; do
78*640235e2SEnji Cooper		if [ -z "${str}" ]; then
79*640235e2SEnji Cooper			str=">$1<"
80*640235e2SEnji Cooper		else
81*640235e2SEnji Cooper			str="${str} >$1<"
82*640235e2SEnji Cooper		fi
83*640235e2SEnji Cooper		shift
84*640235e2SEnji Cooper	done
85*640235e2SEnji Cooper	echo "${str}"
86*640235e2SEnji Cooper}
87*640235e2SEnji Cooper
88*640235e2SEnji CooperEOF
89*640235e2SEnji Cooper	cat <<'EOF' > h-f2
90*640235e2SEnji Cooper
91*640235e2SEnji Cooperdelim_argv() {
92*640235e2SEnji Cooper	str=
93*640235e2SEnji Cooper	while [ $# -gt 0 ]; do
94*640235e2SEnji Cooper
95*640235e2SEnji Cooper		str="${str}${str:+ }>$1<"
96*640235e2SEnji Cooper		shift
97*640235e2SEnji Cooper
98*640235e2SEnji Cooper	done
99*640235e2SEnji Cooper	echo "${str}"
100*640235e2SEnji Cooper}
101*640235e2SEnji Cooper
102*640235e2SEnji CooperEOF
103*640235e2SEnji Cooper
104*640235e2SEnji Cooper	chmod +x h-f1 h-f2
105*640235e2SEnji Cooper
106*640235e2SEnji Cooper	for f in 1 2
107*640235e2SEnji Cooper	do
108*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'\n' -e empty ${TEST_SH} -c \
109*640235e2SEnji Cooper			". ./h-f${f}; "'set -- ; delim_argv "$@"'
110*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'>foobar<\n' -e empty \
111*640235e2SEnji Cooper			${TEST_SH} -c \
112*640235e2SEnji Cooper			". ./h-f${f}; "'set -- ; delim_argv "foo$@bar"'
113*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'>foo  bar<\n' -e empty \
114*640235e2SEnji Cooper			${TEST_SH} -c \
115*640235e2SEnji Cooper			". ./h-f${f}; "'set -- ; delim_argv "foo $@ bar"'
116*640235e2SEnji Cooper
117*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'>a< >b< >c<\n' -e empty \
118*640235e2SEnji Cooper			${TEST_SH} -c \
119*640235e2SEnji Cooper			". ./h-f${f}; "'set -- a b c; delim_argv "$@"'
120*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'>fooa< >b< >cbar<\n' -e empty \
121*640235e2SEnji Cooper			${TEST_SH} -c \
122*640235e2SEnji Cooper			". ./h-f${f}; "'set -- a b c; delim_argv "foo$@bar"'
123*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'>foo a< >b< >c bar<\n' -e empty \
124*640235e2SEnji Cooper			${TEST_SH} -c \
125*640235e2SEnji Cooper			". ./h-f${f}; "'set -- a b c; delim_argv "foo $@ bar"'
126*640235e2SEnji Cooper	done
12757718be8SEnji Cooper}
12857718be8SEnji Cooper
12957718be8SEnji Cooperatf_test_case strip
13057718be8SEnji Cooperstrip_head() {
13157718be8SEnji Cooper	atf_set "descr" "Checks that the %% operator works and strips" \
13257718be8SEnji Cooper	                "the contents of a variable from the given point" \
13357718be8SEnji Cooper			"to the end"
13457718be8SEnji Cooper}
13557718be8SEnji Cooperstrip_body() {
13657718be8SEnji Cooper	line='#define bindir "/usr/bin" /* comment */'
13757718be8SEnji Cooper	stripped='#define bindir "/usr/bin" '
138*640235e2SEnji Cooper
139*640235e2SEnji Cooper	# atf_expect_fail "PR bin/43469" -- now fixed
140*640235e2SEnji Cooper	for exp in 				\
141*640235e2SEnji Cooper		'${line%%/\**}'			\
142*640235e2SEnji Cooper		'${line%%"/*"*}'		\
143*640235e2SEnji Cooper		'${line%%'"'"'/*'"'"'*}'	\
144*640235e2SEnji Cooper		'"${line%%/\**}"'		\
145*640235e2SEnji Cooper		'"${line%%"/*"*}"'		\
146*640235e2SEnji Cooper		'"${line%%'"'"'/*'"'"'*}"'	\
147*640235e2SEnji Cooper		'${line%/\**}'			\
148*640235e2SEnji Cooper		'${line%"/*"*}'			\
149*640235e2SEnji Cooper		'${line%'"'"'/*'"'"'*}'		\
150*640235e2SEnji Cooper		'"${line%/\**}"'		\
151*640235e2SEnji Cooper		'"${line%"/*"*}"'		\
152*640235e2SEnji Cooper		'"${line%'"'"'/*'"'"'*}"'
153*640235e2SEnji Cooper	do
154*640235e2SEnji Cooper		atf_check -o inline:":$stripped:\n" -e empty ${TEST_SH} -c \
155*640235e2SEnji Cooper			"line='${line}'; echo :${exp}:"
156*640235e2SEnji Cooper	done
15757718be8SEnji Cooper}
15857718be8SEnji Cooper
15957718be8SEnji Cooperatf_test_case varpattern_backslashes
16057718be8SEnji Coopervarpattern_backslashes_head() {
16157718be8SEnji Cooper	atf_set "descr" "Tests that protecting wildcards with backslashes" \
16257718be8SEnji Cooper	                "works in variable patterns."
16357718be8SEnji Cooper}
16457718be8SEnji Coopervarpattern_backslashes_body() {
16557718be8SEnji Cooper	line='/foo/bar/*/baz'
16657718be8SEnji Cooper	stripped='/foo/bar/'
167*640235e2SEnji Cooper	atf_check -o inline:'/foo/bar/\n' -e empty ${TEST_SH} -c \
168*640235e2SEnji Cooper		'line="/foo/bar/*/baz"; echo ${line%%\**}'
16957718be8SEnji Cooper}
17057718be8SEnji Cooper
17157718be8SEnji Cooperatf_test_case arithmetic
17257718be8SEnji Cooperarithmetic_head() {
17357718be8SEnji Cooper	atf_set "descr" "POSIX requires shell arithmetic to use signed" \
17457718be8SEnji Cooper	                "long or a wider type.  We use intmax_t, so at" \
17557718be8SEnji Cooper			"least 64 bits should be available.  Make sure" \
17657718be8SEnji Cooper			"this is true."
17757718be8SEnji Cooper}
17857718be8SEnji Cooperarithmetic_body() {
179*640235e2SEnji Cooper
180*640235e2SEnji Cooper	atf_check -o inline:'3' -e empty ${TEST_SH} -c \
181*640235e2SEnji Cooper		'printf %s $((1 + 2))'
182*640235e2SEnji Cooper	atf_check -o inline:'2147483647' -e empty ${TEST_SH} -c \
183*640235e2SEnji Cooper		'printf %s $((0x7fffffff))'
184*640235e2SEnji Cooper	atf_check -o inline:'9223372036854775807' -e empty ${TEST_SH} -c \
185*640235e2SEnji Cooper		'printf %s $(((1 << 63) - 1))'
18657718be8SEnji Cooper}
18757718be8SEnji Cooper
18857718be8SEnji Cooperatf_test_case iteration_on_null_parameter
18957718be8SEnji Cooperiteration_on_null_parameter_head() {
19057718be8SEnji Cooper	atf_set "descr" "Check iteration of \$@ in for loop when set to null;" \
19157718be8SEnji Cooper	                "the error \"sh: @: parameter not set\" is incorrect." \
19257718be8SEnji Cooper	                "PR bin/48202."
19357718be8SEnji Cooper}
19457718be8SEnji Cooperiteration_on_null_parameter_body() {
195*640235e2SEnji Cooper	atf_check -o empty -e empty ${TEST_SH} -c \
196*640235e2SEnji Cooper		'N=; set -- ${N};   for X; do echo "[$X]"; done'
197*640235e2SEnji Cooper}
198*640235e2SEnji Cooper
199*640235e2SEnji Cooperatf_test_case iteration_on_quoted_null_parameter
200*640235e2SEnji Cooperiteration_on_quoted_null_parameter_head() {
201*640235e2SEnji Cooper	atf_set "descr" \
202*640235e2SEnji Cooper		'Check iteration of "$@" in for loop when set to null;'
203*640235e2SEnji Cooper}
204*640235e2SEnji Cooperiteration_on_quoted_null_parameter_body() {
205*640235e2SEnji Cooper	atf_check -o inline:'[]\n' -e empty ${TEST_SH} -c \
206*640235e2SEnji Cooper		'N=; set -- "${N}"; for X; do echo "[$X]"; done'
207*640235e2SEnji Cooper}
208*640235e2SEnji Cooper
209*640235e2SEnji Cooperatf_test_case iteration_on_null_or_null_parameter
210*640235e2SEnji Cooperiteration_on_null_or_null_parameter_head() {
211*640235e2SEnji Cooper	atf_set "descr" \
212*640235e2SEnji Cooper		'Check expansion of null parameter as default for another null'
213*640235e2SEnji Cooper}
214*640235e2SEnji Cooperiteration_on_null_or_null_parameter_body() {
215*640235e2SEnji Cooper	atf_check -o empty -e empty ${TEST_SH} -c \
216*640235e2SEnji Cooper		'N=; E=; set -- ${N:-${E}}; for X; do echo "[$X]"; done'
217*640235e2SEnji Cooper}
218*640235e2SEnji Cooper
219*640235e2SEnji Cooperatf_test_case iteration_on_null_or_missing_parameter
220*640235e2SEnji Cooperiteration_on_null_or_missing_parameter_head() {
221*640235e2SEnji Cooper	atf_set "descr" \
222*640235e2SEnji Cooper	    'Check expansion of missing parameter as default for another null'
223*640235e2SEnji Cooper}
224*640235e2SEnji Cooperiteration_on_null_or_missing_parameter_body() {
225*640235e2SEnji Cooper	# atf_expect_fail 'PR bin/50834'
226*640235e2SEnji Cooper	atf_check -o empty -e empty ${TEST_SH} -c \
227*640235e2SEnji Cooper		'N=; set -- ${N:-}; for X; do echo "[$X]"; done'
228*640235e2SEnji Cooper}
229*640235e2SEnji Cooper
230*640235e2SEnji Coopernl='
231*640235e2SEnji Cooper'
232*640235e2SEnji Cooperreset()
233*640235e2SEnji Cooper{
234*640235e2SEnji Cooper	TEST_NUM=0
235*640235e2SEnji Cooper	TEST_FAILURES=''
236*640235e2SEnji Cooper	TEST_FAIL_COUNT=0
237*640235e2SEnji Cooper	TEST_ID="$1"
238*640235e2SEnji Cooper}
239*640235e2SEnji Cooper
240*640235e2SEnji Coopercheck()
241*640235e2SEnji Cooper{
242*640235e2SEnji Cooper	fail=false
243*640235e2SEnji Cooper	TEMP_FILE=$( mktemp OUT.XXXXXX )
244*640235e2SEnji Cooper	TEST_NUM=$(( $TEST_NUM + 1 ))
245*640235e2SEnji Cooper	MSG=
246*640235e2SEnji Cooper
247*640235e2SEnji Cooper	# our local shell (ATF_SHELL) better do quoting correctly...
248*640235e2SEnji Cooper	# some of the tests expect us to expand $nl internally...
249*640235e2SEnji Cooper	CMD="$1"
250*640235e2SEnji Cooper
251*640235e2SEnji Cooper	result="$( ${TEST_SH} -c "${CMD}" 2>"${TEMP_FILE}" )"
252*640235e2SEnji Cooper	STATUS=$?
253*640235e2SEnji Cooper
254*640235e2SEnji Cooper	if [ "${STATUS}" -ne "$3" ]; then
255*640235e2SEnji Cooper		MSG="${MSG}${MSG:+${nl}}[$TEST_NUM]"
256*640235e2SEnji Cooper		MSG="${MSG} expected exit code $3, got ${STATUS}"
257*640235e2SEnji Cooper
258*640235e2SEnji Cooper		# don't actually fail just because of wrong exit code
259*640235e2SEnji Cooper		# unless we either expected, or received "good"
260*640235e2SEnji Cooper		case "$3/${STATUS}" in
261*640235e2SEnji Cooper		(*/0|0/*) fail=true;;
262*640235e2SEnji Cooper		esac
263*640235e2SEnji Cooper	fi
264*640235e2SEnji Cooper
265*640235e2SEnji Cooper	if [ "$3" -eq 0 ]; then
266*640235e2SEnji Cooper		if [ -s "${TEMP_FILE}" ]; then
267*640235e2SEnji Cooper			MSG="${MSG}${MSG:+${nl}}[$TEST_NUM]"
268*640235e2SEnji Cooper			MSG="${MSG} Messages produced on stderr unexpected..."
269*640235e2SEnji Cooper			MSG="${MSG}${nl}$( cat "${TEMP_FILE}" )"
270*640235e2SEnji Cooper			fail=true
271*640235e2SEnji Cooper		fi
272*640235e2SEnji Cooper	else
273*640235e2SEnji Cooper		if ! [ -s "${TEMP_FILE}" ]; then
274*640235e2SEnji Cooper			MSG="${MSG}${MSG:+${nl}}[$TEST_NUM]"
275*640235e2SEnji Cooper			MSG="${MSG} Expected messages on stderr,"
276*640235e2SEnji Cooper			MSG="${MSG} nothing produced"
277*640235e2SEnji Cooper			fail=true
278*640235e2SEnji Cooper		fi
279*640235e2SEnji Cooper	fi
280*640235e2SEnji Cooper	rm -f "${TEMP_FILE}"
281*640235e2SEnji Cooper
282*640235e2SEnji Cooper	# Remove newlines (use local shell for this)
283*640235e2SEnji Cooper	oifs="$IFS"
284*640235e2SEnji Cooper	IFS="$nl"
285*640235e2SEnji Cooper	result="$(echo $result)"
286*640235e2SEnji Cooper	IFS="$oifs"
287*640235e2SEnji Cooper	if [ "$2" != "$result" ]
288*640235e2SEnji Cooper	then
289*640235e2SEnji Cooper		MSG="${MSG}${MSG:+${nl}}[$TEST_NUM]"
290*640235e2SEnji Cooper		MSG="${MSG} Expected output '$2', received '$result'"
291*640235e2SEnji Cooper		fail=true
292*640235e2SEnji Cooper	fi
293*640235e2SEnji Cooper
294*640235e2SEnji Cooper	if $fail
295*640235e2SEnji Cooper	then
296*640235e2SEnji Cooper		MSG="${MSG}${MSG:+${nl}}[$TEST_NUM]"
297*640235e2SEnji Cooper		MSG="${MSG} Full command: <<${CMD}>>"
298*640235e2SEnji Cooper	fi
299*640235e2SEnji Cooper
300*640235e2SEnji Cooper	$fail && test -n "$TEST_ID" && {
301*640235e2SEnji Cooper		TEST_FAILURES="${TEST_FAILURES}${TEST_FAILURES:+${nl}}"
302*640235e2SEnji Cooper		TEST_FAILURES="${TEST_FAILURES}${TEST_ID}[$TEST_NUM]:"
303*640235e2SEnji Cooper		TEST_FAILURES="${TEST_FAILURES} Test of '$1' failed.";
304*640235e2SEnji Cooper		TEST_FAILURES="${TEST_FAILURES}${nl}${MSG}"
305*640235e2SEnji Cooper		TEST_FAIL_COUNT=$(( $TEST_FAIL_COUNT + 1 ))
306*640235e2SEnji Cooper		return 0
307*640235e2SEnji Cooper	}
308*640235e2SEnji Cooper	$fail && atf_fail "Test[$TEST_NUM] of '$1' failed${nl}${MSG}"
309*640235e2SEnji Cooper	return 0
310*640235e2SEnji Cooper}
311*640235e2SEnji Cooper
312*640235e2SEnji Cooperresults()
313*640235e2SEnji Cooper{
314*640235e2SEnji Cooper	test -z "${TEST_ID}" && return 0
315*640235e2SEnji Cooper	test -z "${TEST_FAILURES}" && return 0
316*640235e2SEnji Cooper
317*640235e2SEnji Cooper	echo >&2 "=========================================="
318*640235e2SEnji Cooper	echo >&2 "While testing '${TEST_ID}'"
319*640235e2SEnji Cooper	echo >&2 " - - - - - - - - - - - - - - - - -"
320*640235e2SEnji Cooper	echo >&2 "${TEST_FAILURES}"
321*640235e2SEnji Cooper	atf_fail \
322*640235e2SEnji Cooper "Test ${TEST_ID}: $TEST_FAIL_COUNT subtests (of $TEST_NUM) failed - see stderr"
323*640235e2SEnji Cooper}
324*640235e2SEnji Cooper
325*640235e2SEnji Cooperatf_test_case shell_params
326*640235e2SEnji Coopershell_params_head() {
327*640235e2SEnji Cooper	atf_set "descr" "Test correct operation of the numeric parameters"
328*640235e2SEnji Cooper}
329*640235e2SEnji Coopershell_params_body() {
330*640235e2SEnji Cooper	atf_require_prog mktemp
331*640235e2SEnji Cooper
332*640235e2SEnji Cooper	reset shell_params
333*640235e2SEnji Cooper
334*640235e2SEnji Cooper	check 'set -- a b c; echo "$#: $1 $2 $3"' '3: a b c' 0
335*640235e2SEnji Cooper	check 'set -- a b c d e f g h i j k l m; echo "$#: ${1}0 ${10} $10"' \
336*640235e2SEnji Cooper		'13: a0 j a0' 0
337*640235e2SEnji Cooper	check 'x="$0"; set -- a b; y="$0";
338*640235e2SEnji Cooper	      [ "x${x}y" = "x${y}y" ] && echo OK || echo x="$x" y="$y"' \
339*640235e2SEnji Cooper		'OK' 0
340*640235e2SEnji Cooper	check "${TEST_SH} -c 'echo 0=\$0 1=\$1 2=\$2' a b c" '0=a 1=b 2=c' 0
341*640235e2SEnji Cooper
342*640235e2SEnji Cooper	echo 'echo 0="$0" 1="$1" 2="$2"' > helper.sh
343*640235e2SEnji Cooper	check "${TEST_SH} helper.sh a b c" '0=helper.sh 1=a 2=b' 0
344*640235e2SEnji Cooper
345*640235e2SEnji Cooper	check 'set -- a bb ccc dddd eeeee ffffff ggggggg hhhhhhhh \
346*640235e2SEnji Cooper		iiiiiiiii jjjjjjjjjj kkkkkkkkkkk
347*640235e2SEnji Cooper	       echo "${#}: ${#1} ${#2} ${#3} ${#4} ... ${#9} ${#10} ${#11}"' \
348*640235e2SEnji Cooper		 '11: 1 2 3 4 ... 9 10 11' 0
349*640235e2SEnji Cooper
350*640235e2SEnji Cooper	check 'set -- a b c; echo "$#: ${1-A} ${2-B} ${3-C} ${4-D} ${5-E}"' \
351*640235e2SEnji Cooper		'3: a b c D E' 0
352*640235e2SEnji Cooper	check 'set -- a "" c "" e
353*640235e2SEnji Cooper	       echo "$#: ${1:-A} ${2:-B} ${3:-C} ${4:-D} ${5:-E}"' \
354*640235e2SEnji Cooper		'5: a B c D e' 0
355*640235e2SEnji Cooper	check 'set -- a "" c "" e
356*640235e2SEnji Cooper	       echo "$#: ${1:+A} ${2:+B} ${3:+C} ${4:+D} ${5:+E}"' \
357*640235e2SEnji Cooper		'5: A  C  E' 0
358*640235e2SEnji Cooper	check 'set -- "abab*cbb"
359*640235e2SEnji Cooper	       echo "${1} ${1#a} ${1%b} ${1##ab} ${1%%b} ${1#*\*} ${1%\**}"' \
360*640235e2SEnji Cooper	       'abab*cbb bab*cbb abab*cb ab*cbb abab*cb cbb abab' 0
361*640235e2SEnji Cooper	check 'set -- "abab?cbb"
362*640235e2SEnji Cooper    echo "${1}:${1#*a}+${1%b*}-${1##*a}_${1%%b*}%${1#[ab]}=${1%?*}/${1%\?*}"' \
363*640235e2SEnji Cooper	       'abab?cbb:bab?cbb+abab?cb-b?cbb_a%bab?cbb=abab?cb/abab' 0
364*640235e2SEnji Cooper	check 'set -- a "" c "" e; echo "${2:=b}"' '' 1
365*640235e2SEnji Cooper
366*640235e2SEnji Cooper	results
36757718be8SEnji Cooper}
36857718be8SEnji Cooper
36957718be8SEnji Cooperatf_init_test_cases() {
37057718be8SEnji Cooper	atf_add_test_case dollar_at
37157718be8SEnji Cooper	atf_add_test_case dollar_at_with_text
37257718be8SEnji Cooper	atf_add_test_case strip
37357718be8SEnji Cooper	atf_add_test_case varpattern_backslashes
37457718be8SEnji Cooper	atf_add_test_case arithmetic
37557718be8SEnji Cooper	atf_add_test_case iteration_on_null_parameter
376*640235e2SEnji Cooper	atf_add_test_case iteration_on_quoted_null_parameter
377*640235e2SEnji Cooper	atf_add_test_case iteration_on_null_or_null_parameter
378*640235e2SEnji Cooper	atf_add_test_case iteration_on_null_or_missing_parameter
379*640235e2SEnji Cooper	atf_add_test_case shell_params
38057718be8SEnji Cooper}
381