Module Name:    src
Committed By:   kre
Date:           Sun Mar 19 20:29:30 UTC 2017

Modified Files:
        src/tests/bin/sh: t_expand.sh

Log Message:
PR bin/52090

Add 5 new test cases to test various ways that $* can be expanded.
Currently 3 of the 5 are marked as "expected to fail" because of the
bug in this PR.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/tests/bin/sh/t_expand.sh

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/bin/sh/t_expand.sh
diff -u src/tests/bin/sh/t_expand.sh:1.9 src/tests/bin/sh/t_expand.sh:1.10
--- src/tests/bin/sh/t_expand.sh:1.9	Sun Mar 12 00:39:47 2017
+++ src/tests/bin/sh/t_expand.sh	Sun Mar 19 20:29:30 2017
@@ -1,4 +1,4 @@
-# $NetBSD: t_expand.sh,v 1.9 2017/03/12 00:39:47 kre Exp $
+# $NetBSD: t_expand.sh,v 1.10 2017/03/19 20:29:30 kre Exp $
 #
 # Copyright (c) 2007, 2009 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -227,6 +227,8 @@ iteration_on_null_or_missing_parameter_b
 		'N=; set -- ${N:-}; for X; do echo "[$X]"; done'
 }
 
+####### The remaining tests use the following helper functions ...
+
 nl='
 '
 reset()
@@ -311,6 +313,8 @@ check()
 
 results()
 {
+	test -n "$1" && atf_expect_fail "$1"
+
 	test -z "${TEST_ID}" && return 0
 	test -z "${TEST_FAILURES}" && return 0
 
@@ -318,10 +322,13 @@ results()
 	echo >&2 "While testing '${TEST_ID}'"
 	echo >&2 " - - - - - - - - - - - - - - - - -"
 	echo >&2 "${TEST_FAILURES}"
+
 	atf_fail \
  "Test ${TEST_ID}: $TEST_FAIL_COUNT (of $TEST_NUM) subtests failed - see stderr"
 }
 
+####### End helpers
+
 atf_test_case shell_params
 shell_params_head() {
 	atf_set "descr" "Test correct operation of the numeric parameters"
@@ -423,16 +430,255 @@ var_with_embedded_cmdsub_body() {
 	results
 }
 
+atf_test_case dollar_star
+dollar_star_head() {
+	atf_set "descr" 'Test expansion of various aspects of $*'
+}
+dollar_star_body() {
+
+	reset # dollar_star
+
+	check 'set -- a b c; echo $# $*'		'3 a b c'	0  # 1
+	check 'set -- a b c; echo $# "$*"'		'3 a b c'	0  # 2
+	check 'set -- a "b c"; echo $# $*'		'2 a b c'	0  # 3
+	check 'set -- a "b c"; echo $# "$*"'		'2 a b c'	0  # 4
+	check 'set -- a b c; set -- $* ; echo $# $*'	'3 a b c'	0  # 5
+	check 'set -- a b c; set -- "$*" ; echo $# $*'	'1 a b c'	0  # 6
+	check 'set -- a "b c"; set -- $* ; echo $# $*'	'3 a b c'	0  # 7
+	check 'set -- a "b c"; set -- "$*" ; echo $# $*' \
+							'1 a b c'	0  # 8
+
+	check 'IFS=". "; set -- a b c; echo $# $*'	'3 a b c'	0  # 9
+	check 'IFS=". "; set -- a b c; echo $# "$*"'	'3 a.b.c'	0  #10
+	check 'IFS=". "; set -- a "b c"; echo $# $*'	'2 a b c'	0  #11
+	check 'IFS=". "; set -- a "b c"; echo $# "$*"'	'2 a.b c'	0  #12
+	check 'IFS=". "; set -- a "b.c"; echo $# $*'	'2 a b c'	0  #13
+	check 'IFS=". "; set -- a "b.c"; echo $# "$*"'	'2 a.b.c'	0  #14
+	check 'IFS=". "; set -- a b c; set -- $* ; echo $# $*' \
+							'3 a b c'	0  #15
+	check 'IFS=". "; set -- a b c; set -- "$*" ; echo $# $*' \
+							'1 a b c'	0  #16
+	check 'IFS=". "; set -- a "b c"; set -- $* ; echo $# $*' \
+							'3 a b c'	0  #17
+	check 'IFS=". "; set -- a "b c"; set -- "$*" ; echo $# $*' \
+							'1 a b c'	0  #18
+	check 'IFS=". "; set -- a b c; set -- $* ; echo $# "$*"' \
+							'3 a.b.c'	0  #19
+	check 'IFS=". "; set -- a b c; set -- "$*" ; echo $# "$*"' \
+							'1 a.b.c'	0  #20
+	check 'IFS=". "; set -- a "b c"; set -- $* ; echo $# "$*"' \
+							'3 a.b.c'	0  #21
+	check 'IFS=". "; set -- a "b c"; set -- "$*" ; echo $# "$*"' \
+							'1 a.b c'	0  #22
+
+	results
+}
+
+atf_test_case dollar_star_in_word
+dollar_star_in_word_head() {
+	atf_set "descr" 'Test expansion $* occurring in word of ${var:-word}'
+}
+dollar_star_in_word_body() {
+
+	reset dollar_star_in_word
+
+	unset xXx			; # just in case!
+
+	# Note that the expected results for these tests are identical
+	# to those from the dollar_star test.   It should never make
+	# a difference whether we expand $* or ${unset:-$*}
+
+	# (note expanding ${unset:-"$*"} is different, that is not tested here)
+
+	check 'set -- a b c; echo $# ${xXx:-$*}'		'3 a b c' 0  # 1
+	check 'set -- a b c; echo $# "${xXx:-$*}"'		'3 a b c' 0  # 2
+	check 'set -- a "b c"; echo $# ${xXx:-$*}'		'2 a b c' 0  # 3
+	check 'set -- a "b c"; echo $# "${xXx:-$*}"'		'2 a b c' 0  # 4
+	check 'set -- a b c; set -- ${xXx:-$*} ; echo $# $*'	'3 a b c' 0  # 5
+	check 'set -- a b c; set -- "${xXx:-$*}" ; echo $# $*'	'1 a b c' 0  # 6
+	check 'set -- a "b c"; set -- ${xXx:-$*} ; echo $# $*'	'3 a b c' 0  # 7
+	check 'set -- a "b c"; set -- "${xXx:-$*}" ; echo $# $*' \
+								'1 a b c' 0  # 8
+
+	check 'IFS=". "; set -- a b c; echo $# ${xXx:-$*}'	'3 a b c' 0  # 9
+	check 'IFS=". "; set -- a b c; echo $# "${xXx:-$*}"'	'3 a.b.c' 0  #10
+	check 'IFS=". "; set -- a "b c"; echo $# ${xXx:-$*}'	'2 a b c' 0  #11
+	check 'IFS=". "; set -- a "b c"; echo $# "${xXx:-$*}"'	'2 a.b c' 0  #12
+	check 'IFS=". "; set -- a "b.c"; echo $# ${xXx:-$*}'	'2 a b c' 0  #13
+	check 'IFS=". "; set -- a "b.c"; echo $# "${xXx:-$*}"'	'2 a.b.c' 0  #14
+	check 'IFS=". ";set -- a b c;set -- ${xXx:-$*};echo $# ${xXx:-$*}' \
+								'3 a b c' 0  #15
+	check 'IFS=". ";set -- a b c;set -- "${xXx:-$*}";echo $# ${xXx:-$*}' \
+								'1 a b c' 0  #16
+	check 'IFS=". ";set -- a "b c";set -- ${xXx:-$*};echo $# ${xXx:-$*}' \
+								'3 a b c' 0  #17
+	check 'IFS=". ";set -- a "b c";set -- "${xXx:-$*}";echo $# ${xXx:-$*}' \
+								'1 a b c' 0  #18
+	check 'IFS=". ";set -- a b c;set -- ${xXx:-$*};echo $# "${xXx:-$*}"' \
+								'3 a.b.c' 0  #19
+	check 'IFS=". ";set -- a b c;set -- "$*";echo $# "$*"' \
+								'1 a.b.c' 0  #20
+	check 'IFS=". ";set -- a "b c";set -- $*;echo $# "$*"' \
+								'3 a.b.c' 0  #21
+	check 'IFS=". ";set -- a "b c";set -- "$*";echo $# "$*"' \
+								'1 a.b c' 0  #22
+
+	results
+}
+
+atf_test_case dollar_star_with_empty_ifs
+dollar_star_with_empty_ifs_head() {
+	atf_set "descr" 'Test expansion of $* with IFS=""'
+}
+dollar_star_with_empty_ifs_body() {
+
+	reset dollar_star_with_empty_ifs
+
+	check 'IFS=""; set -- a b c; echo $# $*'	'3 a b c'	0  # 1
+	check 'IFS=""; set -- a b c; echo $# "$*"'	'3 abc'		0  # 2
+	check 'IFS=""; set -- a "b c"; echo $# $*'	'2 a b c'	0  # 3
+	check 'IFS=""; set -- a "b c"; echo $# "$*"'	'2 ab c'	0  # 4
+	check 'IFS=""; set -- a "b.c"; echo $# $*'	'2 a b.c'	0  # 5
+	check 'IFS=""; set -- a "b.c"; echo $# "$*"'	'2 ab.c'	0  # 6
+	check 'IFS=""; set -- a b c; set -- $* ; echo $# $*' \
+							'3 a b c'	0  # 7
+	check 'IFS=""; set -- a b c; set -- "$*" ; echo $# $*' \
+							'1 abc'		0  # 8
+	check 'IFS=""; set -- a "b c"; set -- $* ; echo $# $*' \
+							'2 a b c'	0  # 9
+	check 'IFS=""; set -- a "b c"; set -- "$*" ; echo $# $*' \
+							'1 ab c'	0  #10
+	check 'IFS=""; set -- a b c; set -- $* ; echo $# "$*"' \
+							'3 abc'		0  #11
+	check 'IFS=""; set -- a b c; set -- "$*" ; echo $# "$*"' \
+							'1 abc'		0  #12
+	check 'IFS=""; set -- a "b c"; set -- $* ; echo $# "$*"' \
+							'2 ab c'	0  #13
+	check 'IFS=""; set -- a "b c"; set -- "$*" ; echo $# "$*"' \
+							'1 ab c'	0  #14
+
+	results			'PR bin/52090 expect 7 of 14 subtests to fail'
+}
+
+atf_test_case dollar_star_in_word_empty_ifs
+dollar_star_in_word_empty_ifs_head() {
+	atf_set "descr" 'Test expansion of ${unset:-$*} with IFS=""'
+}
+dollar_star_in_word_empty_ifs_body() {
+
+	reset dollar_star_in_word_empty_ifs
+
+	unset xXx			; # just in case
+
+	# Note that the expected results for these tests are identical
+	# to those from the dollar_star_with_empty_ifs test.   It should
+	# never make a difference whether we expand $* or ${unset:-$*}
+
+	# (note expanding ${unset:-"$*"} is different, that is not tested here)
+
+	check 'IFS="";set -- a b c;echo $# ${xXx:-$*}'		'3 a b c' 0  # 1
+	check 'IFS="";set -- a b c;echo $# "${xXx:-$*}"'	'3 abc'	  0  # 2
+	check 'IFS="";set -- a "b c";echo $# ${xXx:-$*}'	'2 a b c' 0  # 3
+	check 'IFS="";set -- a "b c";echo $# "${xXx:-$*}"'	'2 ab c'  0  # 4
+	check 'IFS="";set -- a "b.c";echo $# ${xXx:-$*}'	'2 a b.c' 0  # 5
+	check 'IFS="";set -- a "b.c";echo $# "${xXx:-$*}"'	'2 ab.c'  0  # 6
+	check 'IFS="";set -- a b c;set -- ${xXx:-$*};echo $# ${xXx:-$*}' \
+								'3 a b c' 0  # 7
+	check 'IFS="";set -- a b c;set -- "${xXx:-$*}";echo $# ${xXx:-$*}' \
+								'1 abc'   0  # 8
+	check 'IFS="";set -- a "b c";set -- ${xXx:-$*};echo $# ${xXx:-$*}' \
+								'2 a b c' 0  # 9
+	check 'IFS="";set -- a "b c";set -- "${xXx:-$*}";echo $# ${xXx:-$*}' \
+								'1 ab c'  0  #10
+	check 'IFS="";set -- a b c;set -- ${xXx:-$*};echo $# "${xXx:-$*}"' \
+								'3 abc'	  0  #11
+	check 'IFS="";set -- a b c;set -- "${xXx:-$*}";echo $# "${xXx:-$*}"' \
+								'1 abc'	  0  #12
+	check 'IFS="";set -- a "b c";set -- ${xXx:-$*};echo $# "${xXx:-$*}"' \
+								'2 ab c'  0  #13
+	check 'IFS="";set -- a "b c";set -- "${xXx:-$*}";echo $# "${xXx:-$*}"' \
+								'1 ab c'  0  #14
+
+	results		'PR bin/52090 expect 7 of 14 subtests to fail'
+}
+
+atf_test_case dollar_star_in_quoted_word
+dollar_star_in_quoted_word_head() {
+	atf_set "descr" 'Test expansion $* occurring in word of ${var:-"word"}'
+}
+dollar_star_in_quoted_word_body() {
+
+	reset dollar_star_in_quoted_word
+
+	unset xXx			; # just in case!
+
+	check 'set -- a b c; echo $# ${xXx:-"$*"}'		'3 a b c' 0  # 1
+	check 'set -- a "b c"; echo $# ${xXx:-"$*"}'		'2 a b c' 0  # 2
+	check 'set -- a b c; set -- ${xXx:-"$*"} ; echo $# ${xXx-"$*"}' \
+								'1 a b c' 0  # 3
+	check 'set -- a "b c"; set -- ${xXx:-"$*"} ; echo $# ${xXx-"$*"}' \
+								'1 a b c' 0  # 4
+	check 'set -- a b c; set -- ${xXx:-"$*"} ; echo $# ${xXx-"$*"}' \
+								'1 a b c' 0  # 5
+	check 'set -- a "b c"; set -- ${xXx:-"$*"} ; echo $# ${xXx-$*}' \
+								'1 a b c' 0  # 6
+	check 'set -- a b c; set -- ${xXx:-$*} ; echo $# ${xXx-"$*"}' \
+								'3 a b c' 0  # 7
+	check 'set -- a "b c"; set -- ${xXx:-$*} ; echo $# ${xXx-"$*"}' \
+								'3 a b c' 0  # 8
+
+	check 'IFS=". "; set -- a b c; echo $# ${xXx:-"$*"}'	'3 a.b.c' 0  # 9
+	check 'IFS=". "; set -- a "b c"; echo $# ${xXx:-"$*"}'	'2 a.b c' 0  #10
+	check 'IFS=". "; set -- a "b.c"; echo $# ${xXx:-"$*"}'	'2 a.b.c' 0  #11
+	check 'IFS=". ";set -- a b c;set -- ${xXx:-"$*"};echo $# ${xXx:-"$*"}' \
+								'1 a.b.c' 0  #12
+      check 'IFS=". ";set -- a "b c";set -- ${xXx:-"$*"};echo $# ${xXx:-"$*"}' \
+								'1 a.b c' 0  #13
+	check 'IFS=". ";set -- a b c;set -- ${xXx:-$*};echo $# ${xXx:-"$*"}' \
+								'3 a.b.c' 0  #14
+	check 'IFS=". ";set -- a "b c";set -- ${xXx:-$*};echo $# ${xXx:-"$*"}' \
+								'3 a.b.c' 0  #15
+	check 'IFS=". ";set -- a b c;set -- ${xXx:-"$*"};echo $# ${xXx:-$*}' \
+								'1 a b c' 0  #16
+	check 'IFS=". ";set -- a "b c";set -- ${xXx:-"$*"};echo $# ${xXx:-$*}' \
+								'1 a b c' 0  #17
+
+	check 'IFS="";set -- a b c;echo $# ${xXx:-"$*"}'	'3 abc'   0  #18
+	check 'IFS="";set -- a "b c";echo $# ${xXx:-"$*"}'	'2 ab c'  0  #19
+	check 'IFS="";set -- a "b.c";echo $# ${xXx:-"$*"}'	'2 ab.c'  0  #20
+	check 'IFS="";set -- a b c;set -- ${xXx:-"$*"};echo $# ${xXx:-"$*"}' \
+								'1 abc'   0  #21
+	check 'IFS="";set -- a "b c";set -- ${xXx:-"$*"};echo $# ${xXx:-"$*"}' \
+								'1 ab c'  0  #22
+	check 'IFS="";set -- a b c;set -- ${xXx:-$*};echo $# ${xXx:-"$*"}' \
+								'3 abc'   0  #23
+	check 'IFS="";set -- a "b c";set -- ${xXx:-$*};echo $# ${xXx:-"$*"}' \
+								'2 ab c'  0  #24
+	check 'IFS="";set -- a b c;set -- ${xXx:-"$*"};echo $# ${xXx:-$*}' \
+								'1 abc'   0  #25
+	check 'IFS="";set -- a "b c";set -- ${xXx:-"$*"};echo $# ${xXx:-$*}' \
+								'1 ab c'  0  #26
+
+	results		 'PR bin/52090 - 2 of 26 subtests expected to fail'
+}
+
 atf_init_test_cases() {
+	# Listed here in the order ATF runs them, not the order from above
+
+	atf_add_test_case arithmetic
 	atf_add_test_case dollar_at
 	atf_add_test_case dollar_at_with_text
-	atf_add_test_case strip
-	atf_add_test_case varpattern_backslashes
-	atf_add_test_case arithmetic
+	atf_add_test_case dollar_star
+	atf_add_test_case dollar_star_in_quoted_word
+	atf_add_test_case dollar_star_in_word
+	atf_add_test_case dollar_star_in_word_empty_ifs
+	atf_add_test_case dollar_star_with_empty_ifs
 	atf_add_test_case iteration_on_null_parameter
 	atf_add_test_case iteration_on_quoted_null_parameter
 	atf_add_test_case iteration_on_null_or_null_parameter
 	atf_add_test_case iteration_on_null_or_missing_parameter
 	atf_add_test_case shell_params
+	atf_add_test_case strip
 	atf_add_test_case var_with_embedded_cmdsub
+	atf_add_test_case varpattern_backslashes
 }

Reply via email to