1# This program is free software: you can redistribute it and/or modify 2# it under the terms of the GNU General Public License as published by 3# the Free Software Foundation, either version 3 of the License, or 4# (at your option) any later version. 5# 6# This program is distributed in the hope that it will be useful, 7# but WITHOUT ANY WARRANTY; without even the implied warranty of 8# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9# GNU General Public License for more details. 10# 11# You should have received a copy of the GNU General Public License 12# along with this program. If not, see <http://www.gnu.org/licenses/>. 13# 14# test suite cribbed from ksh93 nameref tests 15typeset -i errors=0 16ckval() 17{ 18 typeset -n one=$1 19 20 if [[ $one != $2 ]]; then 21 echo "one=$one != 2=$2" 22 (( errors++ )) 23 fi 24} 25 26ckref() 27{ 28 typeset -n one=$1 two=$2 29 30 if [[ $one != $two ]]; then 31 echo "one=$one != two=$two" 32 (( errors++ )) 33 fi 34} 35 36name=first 37 38ckref name name 39 40func1() 41{ 42 typeset -n color=$1 43 func2 color 44} 45 46func2() 47{ 48 typeset color=$1 49 set -- ${color[@]} 50 printf "<%s>" "$@" 51 echo 52} 53 54typeset -A color 55color[apple]=red 56color[grape]=purple 57color[banana]=yellow 58 59# XXX 60#func1 color 61 62unset foo bar 63export bar=foo 64typeset -n foo=bar 65ckval foo foo 66 67# XXX - need to see if we can do checks for self-referencing at assignment 68# time 69command typeset -n xx=yy 70command typeset -n yy=xx 71echo $? 72 73unset foo bar 74unset -n foo bar 75set foo 76typeset -n bar=$1 77foo=hello 78ckval bar hello 79 80# XXX -- another self-referencing error? 81# ksh93 makes this another invalid self-reference 82unset foo 83unset -n bar 84 85bar=123 86foobar() 87{ 88 typeset -n foo=bar 89 typeset -n foo=bar 90 91 ckval foo 123 92} 93 94typeset -n short=long 95short=( a b ) 96echo "expect <a b>" 97echo ${long[@]} 98unset long 99unset -n short 100 101# assignment to a previously-unset variable 102typeset -n short=long 103short=foo 104echo "expect <foo>" 105echo ${long} 106unset long 107unset -n short 108 109unset foo bar 110 111# simple array references and assignments 112typeset -n foo=bar 113bar=( 1 3 5 7 9) 114echo ${foo[@]} 115echo ${foo[4]} 116foo[2]=42 117echo ${bar[@]} 118 119barfunc() 120{ 121 typeset -n v=$1 122 echo ${v[@]} 123 echo ${v[4]} 124 v[2]=44 125 echo ${bar[@]} 126} 127barfunc bar 128 129unset -f foobar 130unset bar 131unset -n foo 132 133# should ref at global scope survive call to foobar()? 134unset ref x 135typeset -n ref 136x=42 137foobar() 138{ 139 local xxx=3 140 ref=xxx 141 return 0 142} 143echo ${ref-unset} 144ref=x 145foobar 146ckval ref xxx 147ckval x xxx 148 149# assignment in a function to something possibly out of scope 150assignvar() 151{ 152 typeset -n v=$1 153 shift 154 v="$@" 155} 156 157assignvar lex a b c d e 158echo "expect <a b c d e>" 159recho "${lex}" 160 161unset foo bar short long 162 163typeset -n foo='x[2]' 164 165x=(zero one two three four) 166foo=seven 167 168echo "expect <zero> <one> <seven> <three> <four>" 169recho "${x[@]}" 170 171unset ref x 172unset -n ref 173 174typeset -n ref 175ref=x 176# make sure nameref to a previously-unset variable creates the variable 177ref=42 178ckval x 42 179 180# make sure they work inside arithmetic expressions 181unset foo bar ref x xxx 182unset -n ref 183 184typeset -i ivar 185typeset -n iref=ivar 186 187ivar=4+3 188ckval ivar 7 189iref+=5 190ckval ivar 12 191echo $(( iref+4 )) 192(( iref=17 )) 193ckval ivar 17 194 195typeset +n iref 196unset iref ivar 197 198typeset +n foo bar 199unset foo bar 200 201# should the reference do immediate evaluation or deferred? 202set -- one two three four 203bar=4 204# XXX - what does foo get set to here? 205typeset -n foo='bar[0]' 206echo "expect <4>" 207echo ${bar[0]} 208echo "expect <4>" 209echo ${foo} 210echo "expect <4>" 211echo $foo 212ckval foo $bar 213 214# Need to add code and tests for nameref to array subscripts 215bar=(one two three four) 216 217typeset -n foo='bar[0]' 218typeset -n qux='bar[3]' 219echo "expect <one>" 220echo ${bar[0]} 221echo "expect <one>" 222echo ${foo} 223echo "expect <one>" 224echo $foo 225ckval foo $bar 226 227echo "expect <four>" 228echo $qux 229ckval qux ${bar[3]} 230 231# Need to add code and tests for `for' loop nameref variables 232 233echo errors = $errors 234exit $errors 235