# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# test suite cribbed from ksh93 nameref tests
typeset -i errors=0
ckval()
{
typeset -n one=$1
if [[ $one != $2 ]]; then
echo "one=$one != 2=$2"
(( errors++ ))
fi
}
ckref()
{
typeset -n one=$1 two=$2
if [[ $one != $two ]]; then
echo "one=$one != two=$two"
(( errors++ ))
fi
}
name=first
ckref name name
func1()
{
typeset -n color=$1
func2 color
}
func2()
{
typeset color=$1
set -- ${color[@]}
printf "<%s>" "$@"
echo
}
typeset -A color
color[apple]=red
color[grape]=purple
color[banana]=yellow
# XXX
#func1 color
unset foo bar
export bar=foo
typeset -n foo=bar
ckval foo foo
# XXX - need to see if we can do checks for self-referencing at assignment
# time
command typeset -n xx=yy
command typeset -n yy=xx
echo $?
unset foo bar
unset -n foo bar
set foo
typeset -n bar=$1
foo=hello
ckval bar hello
# XXX -- another self-referencing error?
# ksh93 makes this another invalid self-reference
unset foo
unset -n bar
bar=123
foobar()
{
typeset -n foo=bar
typeset -n foo=bar
ckval foo 123
}
typeset -n short=long
short=( a b )
echo "expect "
echo ${long[@]}
unset long
unset -n short
# assignment to a previously-unset variable
typeset -n short=long
short=foo
echo "expect "
echo ${long}
unset long
unset -n short
unset foo bar
# simple array references and assignments
typeset -n foo=bar
bar=( 1 3 5 7 9)
echo ${foo[@]}
echo ${foo[4]}
foo[2]=42
echo ${bar[@]}
barfunc()
{
typeset -n v=$1
echo ${v[@]}
echo ${v[4]}
v[2]=44
echo ${bar[@]}
}
barfunc bar
unset -f foobar
unset bar
unset -n foo
# should ref at global scope survive call to foobar()?
unset ref x
typeset -n ref
x=42
foobar()
{
local xxx=3
ref=xxx
return 0
}
echo ${ref-unset}
ref=x
foobar
ckval ref xxx
ckval x xxx
# assignment in a function to something possibly out of scope
assignvar()
{
typeset -n v=$1
shift
v="$@"
}
assignvar lex a b c d e
echo "expect "
recho "${lex}"
unset foo bar short long
typeset -n foo='x[2]'
x=(zero one two three four)
foo=seven
echo "expect "
recho "${x[@]}"
unset ref x
unset -n ref
typeset -n ref
ref=x
# make sure nameref to a previously-unset variable creates the variable
ref=42
ckval x 42
# make sure they work inside arithmetic expressions
unset foo bar ref x xxx
unset -n ref
typeset -i ivar
typeset -n iref=ivar
ivar=4+3
ckval ivar 7
iref+=5
ckval ivar 12
echo $(( iref+4 ))
(( iref=17 ))
ckval ivar 17
typeset +n iref
unset iref ivar
typeset +n foo bar
unset foo bar
# should the reference do immediate evaluation or deferred?
set -- one two three four
bar=4
# XXX - what does foo get set to here?
typeset -n foo='bar[0]'
echo "expect <4>"
echo ${bar[0]}
echo "expect <4>"
echo ${foo}
echo "expect <4>"
echo $foo
ckval foo $bar
# Need to add code and tests for nameref to array subscripts
bar=(one two three four)
typeset -n foo='bar[0]'
typeset -n qux='bar[3]'
echo "expect "
echo ${bar[0]}
echo "expect "
echo ${foo}
echo "expect "
echo $foo
ckval foo $bar
echo "expect "
echo $qux
ckval qux ${bar[3]}
# Need to add code and tests for `for' loop nameref variables
echo errors = $errors
exit $errors