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