1*57718be8SEnji Cooper# $NetBSD: t_fsplit.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $ 2*57718be8SEnji Cooper# 3*57718be8SEnji Cooper# Copyright (c) 2007 The NetBSD Foundation, Inc. 4*57718be8SEnji Cooper# All rights reserved. 5*57718be8SEnji Cooper# 6*57718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without 7*57718be8SEnji Cooper# modification, are permitted provided that the following conditions 8*57718be8SEnji Cooper# are met: 9*57718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright 10*57718be8SEnji Cooper# notice, this list of conditions and the following disclaimer. 11*57718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 12*57718be8SEnji Cooper# notice, this list of conditions and the following disclaimer in the 13*57718be8SEnji Cooper# documentation and/or other materials provided with the distribution. 14*57718be8SEnji Cooper# 15*57718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16*57718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17*57718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18*57718be8SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19*57718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20*57718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21*57718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22*57718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23*57718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24*57718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25*57718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 26*57718be8SEnji Cooper# 27*57718be8SEnji Cooper 28*57718be8SEnji Cooper# The standard 29*57718be8SEnji Cooper# http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html 30*57718be8SEnji Cooper# explains (section 2.6) that Field splitting should be performed on the 31*57718be8SEnji Cooper# result of variable expansions. 32*57718be8SEnji Cooper# In particular this means that in ${x-word}, 'word' must be expanded as if 33*57718be8SEnji Cooper# the "${x-" and "}" were absent from the input line. 34*57718be8SEnji Cooper# 35*57718be8SEnji Cooper# So: sh -c 'set ${x-a b c}; echo $#' should give 3. 36*57718be8SEnji Cooper# 37*57718be8SEnji Cooper 38*57718be8SEnji Coopernl=' 39*57718be8SEnji Cooper' 40*57718be8SEnji Cooper 41*57718be8SEnji Coopercheck() 42*57718be8SEnji Cooper{ 43*57718be8SEnji Cooper result="$(eval $1)" 44*57718be8SEnji Cooper # Remove newlines 45*57718be8SEnji Cooper oifs="$IFS" 46*57718be8SEnji Cooper IFS="$nl" 47*57718be8SEnji Cooper result="$(echo $result)" 48*57718be8SEnji Cooper IFS="$oifs" 49*57718be8SEnji Cooper if [ "$2" != "$result" ] 50*57718be8SEnji Cooper then 51*57718be8SEnji Cooper atf_fail "expected [$2], found [$result]" 52*57718be8SEnji Cooper fi 53*57718be8SEnji Cooper} 54*57718be8SEnji Cooper 55*57718be8SEnji Cooperatf_test_case for 56*57718be8SEnji Cooperfor_head() { 57*57718be8SEnji Cooper atf_set "descr" "Checks field splitting in for loops" 58*57718be8SEnji Cooper} 59*57718be8SEnji Cooperfor_body() { 60*57718be8SEnji Cooper unset x 61*57718be8SEnji Cooper 62*57718be8SEnji Cooper # Since I managed to break this, leave the test in 63*57718be8SEnji Cooper check 'for f in $x; do echo x${f}y; done' '' 64*57718be8SEnji Cooper} 65*57718be8SEnji Cooper 66*57718be8SEnji Cooperatf_test_case default_val 67*57718be8SEnji Cooperdefault_val_head() { 68*57718be8SEnji Cooper atf_set "descr" "Checks field splitting in variable default values" 69*57718be8SEnji Cooper} 70*57718be8SEnji Cooperdefault_val_body() { 71*57718be8SEnji Cooper unset x 72*57718be8SEnji Cooper 73*57718be8SEnji Cooper # Check that IFS is applied to text from ${x-...} unless it is inside 74*57718be8SEnji Cooper # any set of "..." 75*57718be8SEnji Cooper check 'set ${x-a b c}; echo $#' 3 76*57718be8SEnji Cooper check 'for i in ${x-a b c}; do echo "z${i}z"; done' 'zaz zbz zcz' 77*57718be8SEnji Cooper check 'for i in ${x-"a b" c}; do echo "z${i}z"; done' 'za bz zcz' 78*57718be8SEnji Cooper check 'for i in ${x-"a ${x-b c}" d}; do echo "z${i}z"; done' 'za b cz zdz' 79*57718be8SEnji Cooper check 'for i in ${x-"a ${x-"b c"}" d}; do echo "z${i}z"; done' 'za b cz zdz' 80*57718be8SEnji Cooper check 'for i in ${x-a ${x-"b c"} d}; do echo "z${i}z"; done' 'zaz zb cz zdz' 81*57718be8SEnji Cooper check 'for i in ${x-a ${x-b c} d}; do echo "z${i}z"; done' 'zaz zbz zcz zdz' 82*57718be8SEnji Cooper} 83*57718be8SEnji Cooper 84*57718be8SEnji Cooperatf_test_case ifs_alpha 85*57718be8SEnji Cooperifs_alpha_head() { 86*57718be8SEnji Cooper atf_set "descr" "Checks that field splitting works with alphabetic" \ 87*57718be8SEnji Cooper "characters" 88*57718be8SEnji Cooper} 89*57718be8SEnji Cooperifs_alpha_body() { 90*57718be8SEnji Cooper unset x 91*57718be8SEnji Cooper 92*57718be8SEnji Cooper # repeat with an alphabetic in IFS 93*57718be8SEnji Cooper check 'IFS=q; set ${x-aqbqc}; echo $#' 3 94*57718be8SEnji Cooper check 'IFS=q; for i in ${x-aqbqc}; do echo "z${i}z"; done' 'zaz zbz zcz' 95*57718be8SEnji Cooper check 'IFS=q; for i in ${x-"aqb"qc}; do echo "z${i}z"; done' 'zaqbz zcz' 96*57718be8SEnji Cooper check 'IFS=q; for i in ${x-"aq${x-bqc}"qd}; do echo "z${i}z"; done' 'zaqbqcz zdz' 97*57718be8SEnji Cooper check 'IFS=q; for i in ${x-"aq${x-"bqc"}"qd}; do echo "z${i}z"; done' 'zaqbqcz zdz' 98*57718be8SEnji Cooper check 'IFS=q; for i in ${x-aq${x-"bqc"}qd}; do echo "z${i}z"; done' 'zaz zbqcz zdz' 99*57718be8SEnji Cooper} 100*57718be8SEnji Cooper 101*57718be8SEnji Cooperatf_test_case quote 102*57718be8SEnji Cooperquote_head() { 103*57718be8SEnji Cooper atf_set "descr" "Checks that field splitting works with multi-word" \ 104*57718be8SEnji Cooper "fields" 105*57718be8SEnji Cooper} 106*57718be8SEnji Cooperquote_body() { 107*57718be8SEnji Cooper unset x 108*57718be8SEnji Cooper 109*57718be8SEnji Cooper # Some quote propagation checks 110*57718be8SEnji Cooper check 'set "${x-a b c}"; echo $#' 1 111*57718be8SEnji Cooper check 'set "${x-"a b" c}"; echo $1' 'a b c' 112*57718be8SEnji Cooper check 'for i in "${x-a b c}"; do echo "z${i}z"; done' 'za b cz' 113*57718be8SEnji Cooper} 114*57718be8SEnji Cooper 115*57718be8SEnji Cooperatf_test_case dollar_at 116*57718be8SEnji Cooperdollar_at_head() { 117*57718be8SEnji Cooper atf_set "descr" "Checks that field splitting works when expanding" \ 118*57718be8SEnji Cooper "\$@" 119*57718be8SEnji Cooper} 120*57718be8SEnji Cooperdollar_at_body() { 121*57718be8SEnji Cooper unset x 122*57718be8SEnji Cooper 123*57718be8SEnji Cooper # Check we get "$@" right 124*57718be8SEnji Cooper check 'set ""; for i; do echo "z${i}z"; done' 'zz' 125*57718be8SEnji Cooper check 'set ""; for i in "$@"; do echo "z${i}z"; done' 'zz' 126*57718be8SEnji Cooper check 'set "" ""; for i; do echo "z${i}z"; done' 'zz zz' 127*57718be8SEnji Cooper check 'set "" ""; for i in "$@"; do echo "z${i}z"; done' 'zz zz' 128*57718be8SEnji Cooper check 'set "" ""; for i in $@; do echo "z${i}z"; done' '' 129*57718be8SEnji Cooper check 'set "a b" c; for i; do echo "z${i}z"; done' 'za bz zcz' 130*57718be8SEnji Cooper check 'set "a b" c; for i in "$@"; do echo "z${i}z"; done' 'za bz zcz' 131*57718be8SEnji Cooper check 'set "a b" c; for i in $@; do echo "z${i}z"; done' 'zaz zbz zcz' 132*57718be8SEnji Cooper check 'set " a b " c; for i in "$@"; do echo "z${i}z"; done' 'z a b z zcz' 133*57718be8SEnji Cooper check 'set --; for i in x"$@"x; do echo "z${i}z"; done' 'zxxz' 134*57718be8SEnji Cooper check 'set a; for i in x"$@"x; do echo "z${i}z"; done' 'zxaxz' 135*57718be8SEnji Cooper check 'set a b; for i in x"$@"x; do echo "z${i}z"; done' 'zxaz zbxz' 136*57718be8SEnji Cooper} 137*57718be8SEnji Cooper 138*57718be8SEnji Cooperatf_test_case ifs 139*57718be8SEnji Cooperifs_head() { 140*57718be8SEnji Cooper atf_set "descr" "Checks that IFS correctly configures field" \ 141*57718be8SEnji Cooper "splitting behavior" 142*57718be8SEnji Cooper} 143*57718be8SEnji Cooperifs_body() { 144*57718be8SEnji Cooper unset x 145*57718be8SEnji Cooper 146*57718be8SEnji Cooper # Some IFS tests 147*57718be8SEnji Cooper check 't="-- "; IFS=" "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '0' 148*57718be8SEnji Cooper check 't=" x"; IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1' 149*57718be8SEnji Cooper check 't=" x "; IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1' 150*57718be8SEnji Cooper check 't=axb; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 a:b' 151*57718be8SEnji Cooper check 't="a x b"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 a : b' 152*57718be8SEnji Cooper check 't="a xx b"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '3 a :: b' 153*57718be8SEnji Cooper check 't="a xx b"; IFS="x "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '3 a::b' 154*57718be8SEnji Cooper # A recent 'clarification' means that a single trailing IFS non-whitespace 155*57718be8SEnji Cooper # doesn't generate an empty parameter 156*57718be8SEnji Cooper check 't="xax"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 :a' 157*57718be8SEnji Cooper check 't="xax "; IFS="x "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 :a' 158*57718be8SEnji Cooper # Verify that IFS isn't being applied where it shouldn't be. 159*57718be8SEnji Cooper check 'IFS="x"; set axb; IFS=":"; r="$*"; IFS=; echo $# $r' '1 axb' 160*57718be8SEnji Cooper} 161*57718be8SEnji Cooper 162*57718be8SEnji Cooperatf_test_case var_length 163*57718be8SEnji Coopervar_length_head() { 164*57718be8SEnji Cooper atf_set "descr" "Checks that field splitting works when expanding" \ 165*57718be8SEnji Cooper "a variable's length" 166*57718be8SEnji Cooper} 167*57718be8SEnji Coopervar_length_body() { 168*57718be8SEnji Cooper unset x 169*57718be8SEnji Cooper 170*57718be8SEnji Cooper # Check that we apply IFS to ${#var} 171*57718be8SEnji Cooper long=12345678123456781234567812345678 172*57718be8SEnji Cooper long=$long$long$long$long 173*57718be8SEnji Cooper check 'echo ${#long}; IFS=2; echo ${#long}; set 1 ${#long};echo $#' '128 1 8 3' 174*57718be8SEnji Cooper check 'IFS=2; set ${x-${#long}}; IFS=" "; echo $* $#' '1 8 2' 175*57718be8SEnji Cooper check 'IFS=2; set ${x-"${#long}"}; IFS=" "; echo $* $#' '128 1' 176*57718be8SEnji Cooper} 177*57718be8SEnji Cooper 178*57718be8SEnji Cooperatf_init_test_cases() { 179*57718be8SEnji Cooper atf_add_test_case for 180*57718be8SEnji Cooper atf_add_test_case default_val 181*57718be8SEnji Cooper atf_add_test_case ifs_alpha 182*57718be8SEnji Cooper atf_add_test_case quote 183*57718be8SEnji Cooper atf_add_test_case dollar_at 184*57718be8SEnji Cooper atf_add_test_case ifs 185*57718be8SEnji Cooper atf_add_test_case var_length 186*57718be8SEnji Cooper} 187