xref: /freebsd/contrib/netbsd-tests/bin/sh/t_fsplit.sh (revision c22165b4f1f5d38b681921797a44b3ba8c13b7e0)
1*640235e2SEnji Cooper# $NetBSD: t_fsplit.sh,v 1.4 2016/03/27 14:50:01 christos Exp $
257718be8SEnji Cooper#
3*640235e2SEnji Cooper# Copyright (c) 2007-2016 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#
2757718be8SEnji Cooper
2857718be8SEnji Cooper# The standard
2957718be8SEnji Cooper# http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
3057718be8SEnji Cooper# explains (section 2.6) that Field splitting should be performed on the
3157718be8SEnji Cooper# result of variable expansions.
3257718be8SEnji Cooper# In particular this means that in ${x-word}, 'word' must be expanded as if
3357718be8SEnji Cooper# the "${x-" and "}" were absent from the input line.
3457718be8SEnji Cooper#
3557718be8SEnji Cooper# So: sh -c 'set ${x-a b c}; echo $#' should give 3.
36*640235e2SEnji Cooper# and: sh -c 'set -- ${x-}' echo $#' shold give 0
3757718be8SEnji Cooper#
3857718be8SEnji Cooper
39*640235e2SEnji Cooper# the implementation of "sh" to test
40*640235e2SEnji Cooper: ${TEST_SH:="/bin/sh"}
41*640235e2SEnji Cooper
4257718be8SEnji Coopernl='
4357718be8SEnji Cooper'
4457718be8SEnji Cooper
4557718be8SEnji Coopercheck()
4657718be8SEnji Cooper{
47*640235e2SEnji Cooper	TEST=$((${TEST} + 1))
48*640235e2SEnji Cooper
49*640235e2SEnji Cooper	case "$#" in
50*640235e2SEnji Cooper	(2)	;;
51*640235e2SEnji Cooper	(*)	atf_fail "Internal test error, $# args to check test ${TEST}";;
52*640235e2SEnji Cooper	esac
53*640235e2SEnji Cooper
54*640235e2SEnji Cooper	result=$( ${TEST_SH} -c "unset x; $1" )
55*640235e2SEnji Cooper	STATUS="$?"
56*640235e2SEnji Cooper
5757718be8SEnji Cooper	# Remove newlines
5857718be8SEnji Cooper	oifs="$IFS"
5957718be8SEnji Cooper	IFS="$nl"
6057718be8SEnji Cooper	result="$(echo $result)"
6157718be8SEnji Cooper	IFS="$oifs"
62*640235e2SEnji Cooper
63*640235e2SEnji Cooper	# trim the test text in case we use it in a message below
64*640235e2SEnji Cooper	case "$1" in
65*640235e2SEnji Cooper	????????????????*)
66*640235e2SEnji Cooper		set -- "$(expr "$1" : '\(............\).*')..." "$2" ;;
67*640235e2SEnji Cooper	esac
68*640235e2SEnji Cooper
6957718be8SEnji Cooper	if [ "$2" != "$result" ]
7057718be8SEnji Cooper	then
71*640235e2SEnji Cooper		if [ "${STATUS}" = "0" ]
72*640235e2SEnji Cooper		then
73*640235e2SEnji Cooper		  atf_fail "Test ${TEST} '$1': expected [$2], found [$result]"
74*640235e2SEnji Cooper		else
75*640235e2SEnji Cooper		  atf_fail \
76*640235e2SEnji Cooper	  "TEST ${TEST} '$1' failed ($STATUS): expected [$2], found [$result]"
77*640235e2SEnji Cooper		fi
78*640235e2SEnji Cooper	elif [ "${STATUS}" != 0 ]
79*640235e2SEnji Cooper	then
80*640235e2SEnji Cooper		  atf_fail "TEST ${TEST} '$1' failed ($STATUS)"
8157718be8SEnji Cooper	fi
8257718be8SEnji Cooper}
8357718be8SEnji Cooper
8457718be8SEnji Cooperatf_test_case for
8557718be8SEnji Cooperfor_head() {
8657718be8SEnji Cooper	atf_set "descr" "Checks field splitting in for loops"
8757718be8SEnji Cooper}
8857718be8SEnji Cooperfor_body() {
8957718be8SEnji Cooper	unset x
9057718be8SEnji Cooper
91*640235e2SEnji Cooper	TEST=0
9257718be8SEnji Cooper	# Since I managed to break this, leave the test in
9357718be8SEnji Cooper	check 'for f in $x; do echo x${f}y; done' ''
9457718be8SEnji Cooper}
9557718be8SEnji Cooper
9657718be8SEnji Cooperatf_test_case default_val
9757718be8SEnji Cooperdefault_val_head() {
9857718be8SEnji Cooper	atf_set "descr" "Checks field splitting in variable default values"
9957718be8SEnji Cooper}
10057718be8SEnji Cooperdefault_val_body() {
101*640235e2SEnji Cooper	TEST=0
10257718be8SEnji Cooper	# Check that IFS is applied to text from ${x-...} unless it is inside
10357718be8SEnji Cooper	# any set of "..."
104*640235e2SEnji Cooper	check 'set -- ${x-a b c};   echo $#'   3
105*640235e2SEnji Cooper
106*640235e2SEnji Cooper	check 'set -- ${x-"a b" c}; echo $#'   2
107*640235e2SEnji Cooper	check 'set -- ${x-a "b c"}; echo $#'   2
108*640235e2SEnji Cooper	check 'set -- ${x-"a b c"}; echo $#'   1
109*640235e2SEnji Cooper
110*640235e2SEnji Cooper	check "set -- \${x-'a b' c}; echo \$#" 2
111*640235e2SEnji Cooper	check "set -- \${x-a 'b c'}; echo \$#" 2
112*640235e2SEnji Cooper	check "set -- \${x-'a b c'}; echo \$#" 1
113*640235e2SEnji Cooper
114*640235e2SEnji Cooper	check 'set -- ${x-a\ b c};  echo $#'   2
115*640235e2SEnji Cooper	check 'set -- ${x-a b\ c};  echo $#'   2
116*640235e2SEnji Cooper	check 'set -- ${x-a\ b\ c}; echo $#'   1
117*640235e2SEnji Cooper
118*640235e2SEnji Cooper	check 'set -- ${x};        echo $#' 0
119*640235e2SEnji Cooper	check 'set -- ${x-};       echo $#' 0
120*640235e2SEnji Cooper	check 'set -- ${x-""};     echo $#' 1
121*640235e2SEnji Cooper	check 'set -- ""${x};      echo $#' 1
122*640235e2SEnji Cooper	check 'set -- ""${x-};     echo $#' 1
123*640235e2SEnji Cooper	check 'set -- ""${x-""};   echo $#' 1
124*640235e2SEnji Cooper	check 'set -- ${x}"";      echo $#' 1
125*640235e2SEnji Cooper	check 'set -- ${x-}"";     echo $#' 1
126*640235e2SEnji Cooper	check 'set -- ${x-""}"";   echo $#' 1
127*640235e2SEnji Cooper	check 'set -- ""${x}"";    echo $#' 1
128*640235e2SEnji Cooper	check 'set -- ""${x-}"";   echo $#' 1
129*640235e2SEnji Cooper	check 'set -- ""${x-""}""; echo $#' 1
130*640235e2SEnji Cooper
131*640235e2SEnji Cooper	check 'for i in ${x-a b c};            do echo "z${i}z"; done' \
132*640235e2SEnji Cooper		'zaz zbz zcz'
133*640235e2SEnji Cooper	check 'for i in ${x-"a b" c};          do echo "z${i}z"; done' \
134*640235e2SEnji Cooper		'za bz zcz'
135*640235e2SEnji Cooper	check 'for i in ${x-"a ${x-b c}" d};   do echo "z${i}z"; done' \
136*640235e2SEnji Cooper		'za b cz zdz'
137*640235e2SEnji Cooper	check 'for i in ${x-a ${x-b c} d};     do echo "z${i}z"; done' \
138*640235e2SEnji Cooper		'zaz zbz zcz zdz'
139*640235e2SEnji Cooper
140*640235e2SEnji Cooper	# I am not sure these two are correct, the rules on quoting word
141*640235e2SEnji Cooper	# in ${var-word} are peculiar, and hard to fathom...
142*640235e2SEnji Cooper	# They are what the NetBSD shell does, and bash, not the freebsd shell
143*640235e2SEnji Cooper	# (as of Mar 1, 2016)
144*640235e2SEnji Cooper
145*640235e2SEnji Cooper	check 'for i in ${x-"a ${x-"b c"}" d}; do echo "z${i}z"; done' \
146*640235e2SEnji Cooper		'za b cz zdz'
147*640235e2SEnji Cooper	check 'for i in ${x-a ${x-"b c"} d};   do echo "z${i}z"; done' \
148*640235e2SEnji Cooper		'zaz zb cz zdz'
149*640235e2SEnji Cooper}
150*640235e2SEnji Cooper
151*640235e2SEnji Cooperatf_test_case replacement_val
152*640235e2SEnji Cooperreplacement_val_head() {
153*640235e2SEnji Cooper	atf_set "descr" "Checks field splitting in variable replacement values"
154*640235e2SEnji Cooper}
155*640235e2SEnji Cooperreplacement_val_body() {
156*640235e2SEnji Cooper	TEST=0
157*640235e2SEnji Cooper
158*640235e2SEnji Cooper	# Check that IFS is applied to text from ${x+...} unless it is inside
159*640235e2SEnji Cooper	# any set of "...", or whole expansion is quoted, or both...
160*640235e2SEnji Cooper
161*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+a b c};   echo $#'   3
162*640235e2SEnji Cooper
163*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+"a b" c}; echo $#'   2
164*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+a "b c"}; echo $#'   2
165*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+"a b c"}; echo $#'   1
166*640235e2SEnji Cooper
167*640235e2SEnji Cooper	check "x=BOGUS; set -- \${x+'a b' c}; echo \$#" 2
168*640235e2SEnji Cooper	check "x=BOGUS; set -- \${x+a 'b c'}; echo \$#" 2
169*640235e2SEnji Cooper	check "x=BOGUS; set -- \${x+'a b c'}; echo \$#" 1
170*640235e2SEnji Cooper
171*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+a\ b c};  echo $#'   2
172*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+a b\ c};  echo $#'   2
173*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+a\ b\ c}; echo $#'   1
174*640235e2SEnji Cooper
175*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+};       echo $#' 0
176*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+""};     echo $#' 1
177*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+};     echo $#' 1
178*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+""};   echo $#' 1
179*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+}"";     echo $#' 1
180*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+""}"";   echo $#' 1
181*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+}"";   echo $#' 1
182*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+""}""; echo $#' 1
183*640235e2SEnji Cooper
184*640235e2SEnji Cooper	# verify that the value of $x does not affecty the value of ${x+...}
185*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+};       echo X$1' X
186*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+""};     echo X$1' X
187*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+};     echo X$1' X
188*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+""};   echo X$1' X
189*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+}"";     echo X$1' X
190*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+""}"";   echo X$1' X
191*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+}"";   echo X$1' X
192*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+""}""; echo X$1' X
193*640235e2SEnji Cooper
194*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+};       echo X${1-:}X' X:X
195*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+""};     echo X${1-:}X' XX
196*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+};     echo X${1-:}X' XX
197*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+""};   echo X${1-:}X' XX
198*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+}"";     echo X${1-:}X' XX
199*640235e2SEnji Cooper	check 'x=BOGUS; set -- ${x+""}"";   echo X${1-:}X' XX
200*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+}"";   echo X${1-:}X' XX
201*640235e2SEnji Cooper	check 'x=BOGUS; set -- ""${x+""}""; echo X${1-:}X' XX
202*640235e2SEnji Cooper
203*640235e2SEnji Cooper	# and validate that the replacement can be used as expected
204*640235e2SEnji Cooper	check 'x=BOGUS; for i in ${x+a b c};            do echo "z${i}z"; done'\
205*640235e2SEnji Cooper		'zaz zbz zcz'
206*640235e2SEnji Cooper	check 'x=BOGUS; for i in ${x+"a b" c};          do echo "z${i}z"; done'\
207*640235e2SEnji Cooper		'za bz zcz'
208*640235e2SEnji Cooper	check 'x=BOGUS; for i in ${x+"a ${x+b c}" d};   do echo "z${i}z"; done'\
209*640235e2SEnji Cooper		'za b cz zdz'
210*640235e2SEnji Cooper	check 'x=BOGUS; for i in ${x+"a ${x+"b c"}" d}; do echo "z${i}z"; done'\
211*640235e2SEnji Cooper		'za b cz zdz'
212*640235e2SEnji Cooper	check 'x=BOGUS; for i in ${x+a ${x+"b c"} d};   do echo "z${i}z"; done'\
213*640235e2SEnji Cooper		'zaz zb cz zdz'
214*640235e2SEnji Cooper	check 'x=BOGUS; for i in ${x+a ${x+b c} d};     do echo "z${i}z"; done'\
215*640235e2SEnji Cooper		'zaz zbz zcz zdz'
21657718be8SEnji Cooper}
21757718be8SEnji Cooper
21857718be8SEnji Cooperatf_test_case ifs_alpha
21957718be8SEnji Cooperifs_alpha_head() {
22057718be8SEnji Cooper	atf_set "descr" "Checks that field splitting works with alphabetic" \
22157718be8SEnji Cooper	                "characters"
22257718be8SEnji Cooper}
22357718be8SEnji Cooperifs_alpha_body() {
22457718be8SEnji Cooper	unset x
22557718be8SEnji Cooper
226*640235e2SEnji Cooper	TEST=0
22757718be8SEnji Cooper	# repeat with an alphabetic in IFS
22857718be8SEnji Cooper	check 'IFS=q; set ${x-aqbqc}; echo $#' 3
229*640235e2SEnji Cooper	check 'IFS=q; for i in ${x-aqbqc};            do echo "z${i}z"; done' \
230*640235e2SEnji Cooper		'zaz zbz zcz'
231*640235e2SEnji Cooper	check 'IFS=q; for i in ${x-"aqb"qc};          do echo "z${i}z"; done' \
232*640235e2SEnji Cooper		'zaqbz zcz'
233*640235e2SEnji Cooper	check 'IFS=q; for i in ${x-"aq${x-bqc}"qd};   do echo "z${i}z"; done' \
234*640235e2SEnji Cooper		'zaqbqcz zdz'
235*640235e2SEnji Cooper	check 'IFS=q; for i in ${x-"aq${x-"bqc"}"qd}; do echo "z${i}z"; done' \
236*640235e2SEnji Cooper		'zaqbqcz zdz'
237*640235e2SEnji Cooper	check 'IFS=q; for i in ${x-aq${x-"bqc"}qd};  do echo "z${i}z"; done' \
238*640235e2SEnji Cooper		'zaz zbqcz zdz'
23957718be8SEnji Cooper}
24057718be8SEnji Cooper
24157718be8SEnji Cooperatf_test_case quote
24257718be8SEnji Cooperquote_head() {
24357718be8SEnji Cooper	atf_set "descr" "Checks that field splitting works with multi-word" \
24457718be8SEnji Cooper	                "fields"
24557718be8SEnji Cooper}
24657718be8SEnji Cooperquote_body() {
24757718be8SEnji Cooper	unset x
24857718be8SEnji Cooper
249*640235e2SEnji Cooper	TEST=0
25057718be8SEnji Cooper	# Some quote propagation checks
25157718be8SEnji Cooper	check 'set "${x-a b c}";   echo $#' 1
25257718be8SEnji Cooper	check 'set "${x-"a b" c}"; echo $1' 'a b c'
25357718be8SEnji Cooper	check 'for i in "${x-a b c}"; do echo "z${i}z"; done' 'za b cz'
25457718be8SEnji Cooper}
25557718be8SEnji Cooper
25657718be8SEnji Cooperatf_test_case dollar_at
25757718be8SEnji Cooperdollar_at_head() {
25857718be8SEnji Cooper	atf_set "descr" "Checks that field splitting works when expanding" \
25957718be8SEnji Cooper	                "\$@"
26057718be8SEnji Cooper}
26157718be8SEnji Cooperdollar_at_body() {
26257718be8SEnji Cooper	unset x
26357718be8SEnji Cooper
264*640235e2SEnji Cooper	TEST=0
26557718be8SEnji Cooper	# Check we get "$@" right
266*640235e2SEnji Cooper
267*640235e2SEnji Cooper	check 'set --;        for i in x"$@"x;  do echo "z${i}z"; done' 'zxxz'
268*640235e2SEnji Cooper	check 'set a;         for i in x"$@"x;  do echo "z${i}z"; done' 'zxaxz'
269*640235e2SEnji Cooper	check 'set a b;       for i in x"$@"x;  do echo "z${i}z"; done' 'zxaz zbxz'
270*640235e2SEnji Cooper
271*640235e2SEnji Cooper	check 'set --;        for i;            do echo "z${i}z"; done' ''
272*640235e2SEnji Cooper	check 'set --;        for i in $@;      do echo "z${i}z"; done' ''
273*640235e2SEnji Cooper	check 'set --;        for i in "$@";    do echo "z${i}z"; done' ''
274*640235e2SEnji Cooper	# atf_expect_fail "PR bin/50834"
275*640235e2SEnji Cooper	check 'set --;        for i in ""$@;    do echo "z${i}z"; done' 'zz'
276*640235e2SEnji Cooper	# atf_expect_pass
277*640235e2SEnji Cooper	check 'set --;        for i in $@"";    do echo "z${i}z"; done' 'zz'
278*640235e2SEnji Cooper	check 'set --;        for i in ""$@"";  do echo "z${i}z"; done' 'zz'
279*640235e2SEnji Cooper	check 'set --;        for i in """$@";  do echo "z${i}z"; done' 'zz'
280*640235e2SEnji Cooper	check 'set --;        for i in "$@""";  do echo "z${i}z"; done' 'zz'
281*640235e2SEnji Cooper	check 'set --;        for i in """$@""";do echo "z${i}z"; done' 'zz'
282*640235e2SEnji Cooper
28357718be8SEnji Cooper	check 'set "";        for i;            do echo "z${i}z"; done' 'zz'
28457718be8SEnji Cooper	check 'set "";        for i in "$@";    do echo "z${i}z"; done' 'zz'
28557718be8SEnji Cooper	check 'set "" "";     for i;            do echo "z${i}z"; done' 'zz zz'
28657718be8SEnji Cooper	check 'set "" "";     for i in "$@";    do echo "z${i}z"; done' 'zz zz'
28757718be8SEnji Cooper	check 'set "" "";     for i in $@;      do echo "z${i}z"; done' ''
288*640235e2SEnji Cooper
289*640235e2SEnji Cooper	check 'set "a b" c;   for i;            do echo "z${i}z"; done' \
290*640235e2SEnji Cooper		'za bz zcz'
291*640235e2SEnji Cooper	check 'set "a b" c;   for i in "$@";    do echo "z${i}z"; done' \
292*640235e2SEnji Cooper		'za bz zcz'
293*640235e2SEnji Cooper	check 'set "a b" c;   for i in $@;      do echo "z${i}z"; done' \
294*640235e2SEnji Cooper		'zaz zbz zcz'
295*640235e2SEnji Cooper	check 'set " a b " c; for i in "$@";    do echo "z${i}z"; done' \
296*640235e2SEnji Cooper		'z a b z zcz'
297*640235e2SEnji Cooper
298*640235e2SEnji Cooper	check 'set a b c;     for i in "$@$@";  do echo "z${i}z"; done' \
299*640235e2SEnji Cooper		'zaz zbz zcaz zbz zcz'
300*640235e2SEnji Cooper	check 'set a b c;     for i in "$@""$@";do echo "z${i}z"; done' \
301*640235e2SEnji Cooper		'zaz zbz zcaz zbz zcz'
30257718be8SEnji Cooper}
30357718be8SEnji Cooper
30457718be8SEnji Cooperatf_test_case ifs
30557718be8SEnji Cooperifs_head() {
30657718be8SEnji Cooper	atf_set "descr" "Checks that IFS correctly configures field" \
30757718be8SEnji Cooper	                "splitting behavior"
30857718be8SEnji Cooper}
30957718be8SEnji Cooperifs_body() {
31057718be8SEnji Cooper	unset x
31157718be8SEnji Cooper
312*640235e2SEnji Cooper	TEST=0
31357718be8SEnji Cooper	# Some IFS tests
31457718be8SEnji Cooper	check 't="-- ";    IFS=" ";  set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '0'
31557718be8SEnji Cooper	check 't=" x";     IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1'
31657718be8SEnji Cooper	check 't=" x ";    IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1'
31757718be8SEnji Cooper	check 't=axb;      IFS="x";  set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 a:b'
31857718be8SEnji Cooper	check 't="a x b";  IFS="x";  set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 a : b'
31957718be8SEnji Cooper	check 't="a xx b"; IFS="x";  set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '3 a :: b'
32057718be8SEnji Cooper	check 't="a xx b"; IFS="x "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '3 a::b'
32157718be8SEnji Cooper	# A recent 'clarification' means that a single trailing IFS non-whitespace
32257718be8SEnji Cooper	# doesn't generate an empty parameter
32357718be8SEnji Cooper	check 't="xax";  IFS="x";     set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 :a'
32457718be8SEnji Cooper	check 't="xax "; IFS="x ";   set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 :a'
32557718be8SEnji Cooper	# Verify that IFS isn't being applied where it shouldn't be.
32657718be8SEnji Cooper	check 'IFS="x";             set axb; IFS=":"; r="$*"; IFS=; echo $# $r' '1 axb'
32757718be8SEnji Cooper}
32857718be8SEnji Cooper
32957718be8SEnji Cooperatf_test_case var_length
33057718be8SEnji Coopervar_length_head() {
33157718be8SEnji Cooper	atf_set "descr" "Checks that field splitting works when expanding" \
33257718be8SEnji Cooper	                "a variable's length"
33357718be8SEnji Cooper}
33457718be8SEnji Coopervar_length_body() {
335*640235e2SEnji Cooper	TEST=0
33657718be8SEnji Cooper
33757718be8SEnji Cooper	long=12345678123456781234567812345678
33857718be8SEnji Cooper	long=$long$long$long$long
339*640235e2SEnji Cooper	export long
340*640235e2SEnji Cooper
341*640235e2SEnji Cooper	# first test that the test method works...
342*640235e2SEnji Cooper	check 'set -u; : ${long}; echo ${#long}' '128'
343*640235e2SEnji Cooper
344*640235e2SEnji Cooper	# Check that we apply IFS to ${#var}
345*640235e2SEnji Cooper	check 'echo ${#long}; IFS=2; echo ${#long}; set 1 ${#long};echo $#' \
346*640235e2SEnji Cooper		'128 1 8 3'
34757718be8SEnji Cooper	check 'IFS=2; set ${x-${#long}};   IFS=" "; echo $* $#'   '1 8 2'
34857718be8SEnji Cooper	check 'IFS=2; set ${x-"${#long}"}; IFS=" "; echo $* $#'   '128 1'
34957718be8SEnji Cooper}
35057718be8SEnji Cooper
35157718be8SEnji Cooperatf_init_test_cases() {
35257718be8SEnji Cooper	atf_add_test_case for
35357718be8SEnji Cooper	atf_add_test_case default_val
354*640235e2SEnji Cooper	atf_add_test_case replacement_val
35557718be8SEnji Cooper	atf_add_test_case ifs_alpha
35657718be8SEnji Cooper	atf_add_test_case quote
35757718be8SEnji Cooper	atf_add_test_case dollar_at
35857718be8SEnji Cooper	atf_add_test_case ifs
35957718be8SEnji Cooper	atf_add_test_case var_length
36057718be8SEnji Cooper}
361