Blame src/cmd/ksh93/tests/arrays.sh

Packit Service a8c26c
########################################################################
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
#               This software is part of the ast package               #
Packit Service a8c26c
#          Copyright (c) 1982-2012 AT&T Intellectual Property          #
Packit Service a8c26c
#                      and is licensed under the                       #
Packit Service a8c26c
#                 Eclipse Public License, Version 1.0                  #
Packit Service a8c26c
#                    by AT&T Intellectual Property                     #
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
#                A copy of the License is available at                 #
Packit Service a8c26c
#          http://www.eclipse.org/org/documents/epl-v10.html           #
Packit Service a8c26c
#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
#              Information and Software Systems Research               #
Packit Service a8c26c
#                            AT&T Research                             #
Packit Service a8c26c
#                           Florham Park NJ                            #
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
#                  David Korn <dgk@research.att.com>                   #
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
########################################################################
Packit Service a8c26c
function err_exit
Packit Service a8c26c
{
Packit Service a8c26c
	print -u2 -n "\t"
Packit Service a8c26c
	print -u2 -r ${Command}[$1]: "${@:2}"
Packit Service a8c26c
	let Errors+=1
Packit Service a8c26c
}
Packit Service a8c26c
alias err_exit='err_exit $LINENO'
Packit Service a8c26c
Packit Service a8c26c
Command=${0##*/}
Packit Service a8c26c
integer Errors=0
Packit Service a8c26c
Packit Service a8c26c
tmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
Packit Service a8c26c
trap "cd /; rm -rf $tmp" EXIT
Packit Service a8c26c
Packit Service a8c26c
function fun
Packit Service a8c26c
{
Packit Service a8c26c
	integer i
Packit Service a8c26c
	unset xxx
Packit Service a8c26c
	for i in 0 1
Packit Service a8c26c
	do	xxx[$i]=$i
Packit Service a8c26c
	done
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
set -A x zero one two three four 'five six'
Packit Service a8c26c
if	[[ $x != zero ]]
Packit Service a8c26c
then	err_exit '$x is not element 0'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${x[0]} != zero ]]
Packit Service a8c26c
then	err_exit '${x[0] is not element 0'
Packit Service a8c26c
fi
Packit Service a8c26c
if	(( ${#x[0]} != 4 ))
Packit Service a8c26c
then	err_exit "length of ${x[0]} is not 4"
Packit Service a8c26c
fi
Packit Service a8c26c
if	(( ${#x[@]} != 6  ))
Packit Service a8c26c
then	err_exit 'number of elements of x is not 6'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${x[2]} != two  ]]
Packit Service a8c26c
then	err_exit ' element two is not 2'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${x[@]:2:1} != two  ]]
Packit Service a8c26c
then	err_exit ' ${x[@]:2:1} is not two'
Packit Service a8c26c
fi
Packit Service a8c26c
set -A y -- ${x[*]}
Packit Service a8c26c
if	[[ $y != zero ]]
Packit Service a8c26c
then	err_exit '$x is not element 0'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${y[0]} != zero ]]
Packit Service a8c26c
then	err_exit '${y[0] is not element 0'
Packit Service a8c26c
fi
Packit Service a8c26c
if	(( ${#y[@]} != 7  ))
Packit Service a8c26c
then	err_exit 'number of elements of y is not 7'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${y[2]} != two  ]]
Packit Service a8c26c
then	err_exit ' element two is not 2'
Packit Service a8c26c
fi
Packit Service a8c26c
set +A y nine ten
Packit Service a8c26c
if	[[ ${y[2]} != two  ]]
Packit Service a8c26c
then	err_exit ' element two is not 2'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${y[0]} != nine ]]
Packit Service a8c26c
then	err_exit '${y[0] is not nine'
Packit Service a8c26c
fi
Packit Service a8c26c
unset y[4]
Packit Service a8c26c
if	(( ${#y[@]} != 6  ))
Packit Service a8c26c
then	err_exit 'number of elements of y is not 6'
Packit Service a8c26c
fi
Packit Service a8c26c
if	(( ${#y[4]} != 0  ))
Packit Service a8c26c
then	err_exit 'string length of unset element is not 0'
Packit Service a8c26c
fi
Packit Service a8c26c
unset foo
Packit Service a8c26c
if	(( ${#foo[@]} != 0  ))
Packit Service a8c26c
then	err_exit 'number of elements of unset variable foo is not 0'
Packit Service a8c26c
fi
Packit Service a8c26c
foo=''
Packit Service a8c26c
if	(( ${#foo[0]} != 0  ))
Packit Service a8c26c
then	err_exit 'string length of null element is not 0'
Packit Service a8c26c
fi
Packit Service a8c26c
if	(( ${#foo[@]} != 1  ))
Packit Service a8c26c
then	err_exit 'number of elements of null variable foo is not 1'
Packit Service a8c26c
fi
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo[0]=foo
Packit Service a8c26c
foo[3]=bar
Packit Service a8c26c
unset foo[0]
Packit Service a8c26c
unset foo[3]
Packit Service a8c26c
if	(( ${#foo[@]} != 0  ))
Packit Service a8c26c
then	err_exit 'number of elements of left in variable foo is not 0'
Packit Service a8c26c
fi
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo[3]=bar
Packit Service a8c26c
foo[0]=foo
Packit Service a8c26c
unset foo[3]
Packit Service a8c26c
unset foo[0]
Packit Service a8c26c
if	(( ${#foo[@]} != 0  ))
Packit Service a8c26c
then	err_exit 'number of elements of left in variable foo again is not 0'
Packit Service a8c26c
fi
Packit Service a8c26c
fun
Packit Service a8c26c
if	(( ${#xxx[@]} != 2  ))
Packit Service a8c26c
then	err_exit 'number of elements of left in variable xxx is not 2'
Packit Service a8c26c
fi
Packit Service a8c26c
fun
Packit Service a8c26c
if	(( ${#xxx[@]} != 2  ))
Packit Service a8c26c
then	err_exit 'number of elements of left in variable xxx again is not 2'
Packit Service a8c26c
fi
Packit Service a8c26c
set -A foo -- "${x[@]}"
Packit Service a8c26c
if	(( ${#foo[@]} != 6  ))
Packit Service a8c26c
then	err_exit 'number of elements of foo is not 6'
Packit Service a8c26c
fi
Packit Service a8c26c
if	(( ${#PWD[@]} != 1  ))
Packit Service a8c26c
then	err_exit 'number of elements of PWD is not 1'
Packit Service a8c26c
fi
Packit Service a8c26c
unset x
Packit Service a8c26c
x[2]=foo x[4]=bar
Packit Service a8c26c
if	(( ${#x[@]} != 2  ))
Packit Service a8c26c
then	err_exit 'number of elements of x is not 2'
Packit Service a8c26c
fi
Packit Service a8c26c
s[1]=1 c[1]=foo
Packit Service a8c26c
if	[[ ${c[s[1]]} != foo ]]
Packit Service a8c26c
then	err_exit 'c[1]=foo s[1]=1; ${c[s[1]]} != foo'
Packit Service a8c26c
fi
Packit Service a8c26c
unset s
Packit Service a8c26c
typeset -Ai s
Packit Service a8c26c
y=* z=[
Packit Service a8c26c
s[$y]=1
Packit Service a8c26c
s[$z]=2
Packit Service a8c26c
if	(( ${#s[@]} != 2  ))
Packit Service a8c26c
then	err_exit 'number of elements of  is not 2'
Packit Service a8c26c
fi
Packit Service a8c26c
(( s[$z] = s[$z] + ${s[$y]} ))
Packit Service a8c26c
if	[[ ${s[$z]} != 3  ]]
Packit Service a8c26c
then	err_exit '[[ ${s[$z]} != 3  ]]'
Packit Service a8c26c
fi
Packit Service a8c26c
if	(( s[$z] != 3 ))
Packit Service a8c26c
then	err_exit '(( s[$z] != 3 ))'
Packit Service a8c26c
fi
Packit Service a8c26c
(( s[$y] = s[$y] + ${s[$z]} ))
Packit Service a8c26c
if	[[ ${s[$y]} != 4  ]]
Packit Service a8c26c
then	err_exit '[[ ${s[$y]} != 4  ]]'
Packit Service a8c26c
fi
Packit Service a8c26c
if	(( s[$y] != 4 ))
Packit Service a8c26c
then	err_exit '(( s[$y] != 4 ))'
Packit Service a8c26c
fi
Packit Service a8c26c
set -A y 2 4 6
Packit Service a8c26c
typeset -i y
Packit Service a8c26c
z=${y[@]}
Packit Service a8c26c
typeset -R12 y
Packit Service a8c26c
typeset -i y
Packit Service a8c26c
if      [[ ${y[@]} != "$z" ]]
Packit Service a8c26c
then    err_exit 'error in array conversion from int to R12'
Packit Service a8c26c
fi
Packit Service a8c26c
if      (( ${#y[@]} != 3  ))
Packit Service a8c26c
then    err_exit 'error in count of array conversion from int to R12'
Packit Service a8c26c
fi
Packit Service a8c26c
unset abcdefg
Packit Service a8c26c
:  ${abcdefg[1]}
Packit Service a8c26c
set | grep '^abcdefg$' >/dev/null && err_exit 'empty array variable in set list'
Packit Service a8c26c
unset x y
Packit Service a8c26c
x=1
Packit Service a8c26c
typeset -i y[$x]=4
Packit Service a8c26c
if	[[ ${y[1]} != 4 ]]
Packit Service a8c26c
then    err_exit 'arithmetic expressions in typeset not working'
Packit Service a8c26c
fi
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset foo=bar
Packit Service a8c26c
typeset -A foo
Packit Service a8c26c
if	[[ ${foo[0]} != bar ]]
Packit Service a8c26c
then	err_exit 'initial value not preserved when typecast to associative'
Packit Service a8c26c
fi
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo=(one two)
Packit Service a8c26c
typeset -A foo
Packit Service a8c26c
foo[two]=3
Packit Service a8c26c
if	[[ ${#foo[*]} != 3 ]]
Packit Service a8c26c
then	err_exit 'conversion of indexed to associative array failed'
Packit Service a8c26c
fi
Packit Service a8c26c
set a b c d e f g h i j k l m
Packit Service a8c26c
if	[[ ${#} != 13 ]]
Packit Service a8c26c
then	err_exit '${#} not 13'
Packit Service a8c26c
fi
Packit Service a8c26c
unset xxx
Packit Service a8c26c
xxx=foo
Packit Service a8c26c
if	[[ ${!xxx[@]} != 0 ]]
Packit Service a8c26c
then	err_exit '${!xxx[@]} for scalar not 0'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${11} != k ]]
Packit Service a8c26c
then	err_exit '${11} not working'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${@:4:1} != d ]]
Packit Service a8c26c
then	err_exit '${@:4:1} not working'
Packit Service a8c26c
fi
Packit Service a8c26c
foovar1=abc
Packit Service a8c26c
foovar2=def
Packit Service a8c26c
if	[[ ${!foovar@} != +(foovar[[:alnum:]]?([ ])) ]]
Packit Service a8c26c
then	err_exit '${!foovar@} does not expand correctly'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${!foovar1} != foovar1 ]]
Packit Service a8c26c
then	err_exit '${!foovar1} != foovar1'
Packit Service a8c26c
fi
Packit Service a8c26c
unset xxx
Packit Service a8c26c
: ${xxx[3]}
Packit Service a8c26c
if	[[ ${!xxx[@]} ]]
Packit Service a8c26c
then	err_exit '${!xxx[@]} should be null'
Packit Service a8c26c
fi
Packit Service a8c26c
integer i=0
Packit Service a8c26c
{
Packit Service a8c26c
	set -x
Packit Service a8c26c
	xxx[++i]=1
Packit Service a8c26c
	set +x
Packit Service a8c26c
} 2> /dev/null
Packit Service a8c26c
if	(( i != 1))
Packit Service a8c26c
then	err_exit 'execution trace side effects with array subscripts'
Packit Service a8c26c
fi
Packit Service a8c26c
unset list
Packit Service a8c26c
: $(set -A list foo bar)
Packit Service a8c26c
if	(( ${#list[@]} != 0))
Packit Service a8c26c
then	err_exit '$(set -A list ...) leaves side effects'
Packit Service a8c26c
fi
Packit Service a8c26c
unset list
Packit Service a8c26c
list= (foo bar bam)
Packit Service a8c26c
( set -A list one two three four)
Packit Service a8c26c
if	[[ ${list[1]} != bar ]]
Packit Service a8c26c
then	err_exit 'array not restored after subshell'
Packit Service a8c26c
fi
Packit Service a8c26c
XPATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:.:/sbin:/usr/sbin
Packit Service a8c26c
xpath=( $( IFS=: ; echo $XPATH ) )
Packit Service a8c26c
if	[[ $(print -r  "${xpath[@]##*/}") != 'bin bin ucb bin . sbin sbin' ]]
Packit Service a8c26c
then	err_exit '${xpath[@]##*/} not applied to each element'
Packit Service a8c26c
fi
Packit Service a8c26c
foo=( zero one '' three four '' six)
Packit Service a8c26c
integer n=-1
Packit Service a8c26c
if	[[ ${foo[@]:n} != six ]]
Packit Service a8c26c
then	err_exit 'array offset of -1 not working'
Packit Service a8c26c
fi
Packit Service a8c26c
if	[[ ${foo[@]: -3:1} != four ]]
Packit Service a8c26c
then	err_exit 'array offset of -3:1 not working'
Packit Service a8c26c
fi
Packit Service a8c26c
$SHELL -c 'x=(if then else fi)' 2> /dev/null  || err_exit 'reserved words in x=() assignment not working'
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo=one
Packit Service a8c26c
foo=( $foo two)
Packit Service a8c26c
if	[[ ${#foo[@]} != 2 ]]
Packit Service a8c26c
then	err_exit 'array getting unset before right hand side evaluation'
Packit Service a8c26c
fi
Packit Service a8c26c
foo=(143 3643 38732)
Packit Service a8c26c
export foo
Packit Service a8c26c
typeset -i foo
Packit Service a8c26c
if	[[ $($SHELL -c 'print $foo') != 143 ]]
Packit Service a8c26c
then	err_exit 'exporting indexed array not exporting 0-th element'
Packit Service a8c26c
fi
Packit Service a8c26c
( $SHELL   -c '
Packit Service a8c26c
	unset foo
Packit Service a8c26c
	typeset -A foo=([0]=143 [1]=3643 [2]=38732)
Packit Service a8c26c
	export foo
Packit Service a8c26c
	typeset -i foo
Packit Service a8c26c
	[[ $($SHELL -c "print $foo") == 143 ]]'
Packit Service a8c26c
) 2> /dev/null ||
Packit Service a8c26c
		err_exit 'exporting associative array not exporting 0-th element'
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -A foo
Packit Service a8c26c
foo[$((10))]=ok 2> /dev/null || err_exit 'arithmetic expression as subscript not working'
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -A foo
Packit Service a8c26c
integer foo=0
Packit Service a8c26c
[[ $foo == 0 ]] || err_exit 'zero element of associative array not being set'
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -A foo=( [two]=1)
Packit Service a8c26c
for i in one three four five
Packit Service a8c26c
do	: ${foo[$i]}
Packit Service a8c26c
done
Packit Service a8c26c
if	[[ ${!foo[@]} != two ]]
Packit Service a8c26c
then	err_exit 'error in subscript names'
Packit Service a8c26c
fi
Packit Service a8c26c
unset x
Packit Service a8c26c
x=( 1 2 3)
Packit Service a8c26c
(x[1]=8)
Packit Service a8c26c
[[ ${x[1]} == 2 ]] || err_exit 'index array produce side effects in subshells'
Packit Service a8c26c
x=( 1 2 3)
Packit Service a8c26c
(
Packit Service a8c26c
	x+=(8)
Packit Service a8c26c
	[[ ${#x[@]} == 4 ]] || err_exit 'index array append in subshell error'
Packit Service a8c26c
)
Packit Service a8c26c
[[ ${#x[@]} == 3 ]] || err_exit 'index array append in subshell effects parent'
Packit Service a8c26c
x=( [one]=1 [two]=2 [three]=3)
Packit Service a8c26c
(x[two]=8)
Packit Service a8c26c
[[ ${x[two]} == 2 ]] || err_exit 'associative array produce side effects in subshells'
Packit Service a8c26c
unset x
Packit Service a8c26c
x=( [one]=1 [two]=2 [three]=3)
Packit Service a8c26c
(
Packit Service a8c26c
	x+=( [four]=4 )
Packit Service a8c26c
	[[ ${#x[@]} == 4 ]] || err_exit 'associative array append in subshell error'
Packit Service a8c26c
)
Packit Service a8c26c
[[ ${#x[@]} == 3 ]] || err_exit 'associative array append in subshell effects parent'
Packit Service a8c26c
unset x
Packit Service a8c26c
integer i
Packit Service a8c26c
for ((i=0; i < 40; i++))
Packit Service a8c26c
do	x[i]=$i
Packit Service a8c26c
done
Packit Service a8c26c
[[  ${#x[@]} == 40 ]] || err_exit 'index arrays loosing values'
Packit Service a8c26c
[[ $( ($SHELL -c 'typeset -A var; (IFS=: ; set -A var a:b:c ;print ${var[@]});:' )2>/dev/null) == 'a b c' ]] || err_exit 'change associative to index failed'
Packit Service a8c26c
unset foo
Packit Service a8c26c
[[ $(foo=good
Packit Service a8c26c
for ((i=0; i < 2; i++))
Packit Service a8c26c
do	[[ ${foo[i]} ]] && print ok
Packit Service a8c26c
done) == ok ]] || err_exit 'invalid optimization for subscripted variables'
Packit Service a8c26c
(
Packit Service a8c26c
x=([foo]=bar)
Packit Service a8c26c
set +A x bam
Packit Service a8c26c
) 2> /dev/null && err_exit 'set +A with associative array should be an error'
Packit Service a8c26c
unset bam foo
Packit Service a8c26c
foo=0
Packit Service a8c26c
typeset -A bam
Packit Service a8c26c
unset bam[foo]
Packit Service a8c26c
bam[foo]=value
Packit Service a8c26c
[[ $bam == value ]] && err_exit 'unset associative array element error'
Packit Service a8c26c
: only first element of an array can be exported
Packit Service a8c26c
unset bam
Packit Service a8c26c
print 'print ${var[0]} ${var[1]}' > $tmp/script
Packit Service a8c26c
chmod +x $tmp/script
Packit Service a8c26c
[[ $($SHELL -c "var=(foo bar);export var;$tmp/script") == foo ]] || err_exit 'export array not exporting just first element'
Packit Service a8c26c
Packit Service a8c26c
unset foo
Packit Service a8c26c
set --allexport
Packit Service a8c26c
foo=one
Packit Service a8c26c
foo[1]=two
Packit Service a8c26c
foo[0]=three
Packit Service a8c26c
[[ $foo == three ]] || err_exit '--allexport not working with arrays'
Packit Service a8c26c
set --noallexport
Packit Service a8c26c
unset foo
Packit Service a8c26c
Packit Service a8c26c
cat > $tmp/script <<- \!
Packit Service a8c26c
	typeset -A foo
Packit Service a8c26c
	print foo${foo[abc]}
Packit Service a8c26c
!
Packit Service a8c26c
[[ $($SHELL -c "typeset -A foo;$tmp/script")  == foo ]] 2> /dev/null || err_exit 'empty associative arrays not being cleared correctly before scripts'
Packit Service a8c26c
[[ $($SHELL -c "typeset -A foo;foo[abc]=abc;$tmp/script") == foo ]] 2> /dev/null || err_exit 'associative arrays not being cleared correctly before scripts'
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo=(one two)
Packit Service a8c26c
[[ ${foo[@]:1} == two ]] || err_exit '${foo[@]:1} == two'
Packit Service a8c26c
[[ ! ${foo[@]:2} ]] || err_exit '${foo[@]:2} not null'
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo=one
Packit Service a8c26c
[[ ! ${foo[@]:1} ]] || err_exit '${foo[@]:1} not null'
Packit Service a8c26c
function EMPTY
Packit Service a8c26c
{
Packit Service a8c26c
        typeset i
Packit Service a8c26c
        typeset -n ARRAY=$1
Packit Service a8c26c
        for i in ${!ARRAY[@]}
Packit Service a8c26c
        do      unset ARRAY[$i]
Packit Service a8c26c
        done
Packit Service a8c26c
}
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -A foo
Packit Service a8c26c
foo[bar]=bam
Packit Service a8c26c
foo[x]=y
Packit Service a8c26c
EMPTY foo
Packit Service a8c26c
[[ $(typeset | grep foo$) == *associative* ]] || err_exit 'array lost associative attribute'
Packit Service a8c26c
[[ ! ${foo[@]}  ]] || err_exit 'array not empty'
Packit Service a8c26c
[[ ! ${!foo[@]}  ]] || err_exit 'array names not empty'
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo=bar
Packit Service a8c26c
set -- "${foo[@]:1}"
Packit Service a8c26c
(( $# == 0 )) || err_exit '${foo[@]:1} should not have any values'
Packit Service a8c26c
unset bar
Packit Service a8c26c
exp=4
Packit Service a8c26c
: ${_foo[bar=4]}
Packit Service a8c26c
(( bar == 4 )) || err_exit "subscript of unset variable not evaluated -- expected '4', got '$got'"
Packit Service a8c26c
unset bar
Packit Service a8c26c
: ${_foo[bar=$exp]}
Packit Service a8c26c
(( bar == $exp )) || err_exit "subscript of unset variable not evaluated -- expected '$exp', got '$got'"
Packit Service a8c26c
unset foo bar
Packit Service a8c26c
foo[5]=4
Packit Service a8c26c
bar[4]=3
Packit Service a8c26c
bar[0]=foo
Packit Service a8c26c
foo[0]=bam
Packit Service a8c26c
foo[4]=5
Packit Service a8c26c
[[ ${!foo[2+2]} == 'foo[4]' ]] || err_exit '${!var[sub]} should be var[sub]'
Packit Service a8c26c
[[ ${bar[${foo[5]}]} == 3 ]] || err_exit  'array subscript cannot be an array instance'
Packit Service a8c26c
[[ $bar[4] == 3 ]] || err_exit '$bar[x] != ${bar[x]} inside [[ ]]'
Packit Service a8c26c
(( $bar[4] == 3  )) || err_exit '$bar[x] != ${bar[x]} inside (( ))'
Packit Service a8c26c
[[ $bar[$foo[5]] == 3 ]]  || err_exit '$bar[foo[x]] != ${bar[foo[x]]} inside [[ ]]'
Packit Service a8c26c
(( $bar[$foo[5]] == 3  )) || err_exit '$bar[foo[x]] != ${bar[foo[x]]} inside (( ))'
Packit Service a8c26c
x=$bar[4]
Packit Service a8c26c
[[ $x == 4 ]] && err_exit '$bar[4] should not be an array in an assignment'
Packit Service a8c26c
x=${bar[$foo[5]]}
Packit Service a8c26c
(( $x == 3 )) || err_exit '${bar[$foo[sub]]} not working'
Packit Service a8c26c
[[ $($SHELL  <<- \++EOF+++
Packit Service a8c26c
	typeset -i test_variable=0
Packit Service a8c26c
	typeset -A test_array
Packit Service a8c26c
	test_array[1]=100
Packit Service a8c26c
	read test_array[2] <<-!
Packit Service a8c26c
	2
Packit Service a8c26c
	!
Packit Service a8c26c
	read test_array[3] <<-!
Packit Service a8c26c
	3
Packit Service a8c26c
	!
Packit Service a8c26c
	test_array[3]=4
Packit Service a8c26c
	print "val=${test_array[3]}"
Packit Service a8c26c
++EOF+++
Packit Service a8c26c
) == val=4 ]] 2> /dev/null || err_exit 'after reading array[j] and assign array[j] fails'
Packit Service a8c26c
[[ $($SHELL <<- \+++EOF+++
Packit Service a8c26c
	pastebin=( typeset -a form)
Packit Service a8c26c
	pastebin.form+=( name="name"   data="clueless" )
Packit Service a8c26c
	print -r -- ${pastebin.form[0].name}
Packit Service a8c26c
+++EOF+++
Packit Service a8c26c
) == name ]] 2> /dev/null ||  err_exit 'indexed array in compound variable not working'
Packit Service a8c26c
unset foo bar
Packit Service a8c26c
: ${foo[bar=2]}
Packit Service a8c26c
[[ $bar == 2 ]] || err_exit 'subscript not evaluated for unset variable'
Packit Service a8c26c
unset foo bar
Packit Service a8c26c
bar=1
Packit Service a8c26c
typeset -a foo=([1]=ok [2]=no)
Packit Service a8c26c
[[ $foo[bar] == ok ]] || err_exit 'typeset -a not working for simple assignment'
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -a foo=([1]=(x=ok) [2]=(x=no))
Packit Service a8c26c
[[ $(typeset | grep 'foo$') == *index* ]] || err_exit 'typeset -a not creating an indexed array'
Packit Service a8c26c
foo+=([5]=good)
Packit Service a8c26c
[[ $(typeset | grep 'foo$') == *index* ]] || err_exit 'append to indexed array not preserving array type'
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -A foo=([1]=ok [2]=no)
Packit Service a8c26c
[[ $foo[bar] == ok ]] && err_exit 'typeset -A not working for simple assignment'
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -A foo=([1]=(x=ok) [2]=(x=no))
Packit Service a8c26c
[[ ${foo[bar].x} == ok ]] && err_exit 'typeset -A not working for compound assignment'
Packit Service a8c26c
[[ $($SHELL -c 'typeset -a foo;typeset | grep "foo$"'  2> /dev/null) == *index* ]] || err_exit 'typeset fails for indexed array with no elements'
Packit Service a8c26c
xxxxx=(one)
Packit Service a8c26c
[[ $(typeset | grep xxxxx$) == *'indexed array'* ]] || err_exit 'array of one element not an indexed array'
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo[1]=(x=3 y=4)
Packit Service a8c26c
{ [[ ${!foo[1].*} == 'foo[1].x foo[1].y' ]] ;} 2> /dev/null || err_exit '${!foo[sub].*} not expanding correctly'
Packit Service a8c26c
unset x
Packit Service a8c26c
x=( typeset -a foo=( [0]="a" [1]="b" [2]="c" ))
Packit Service a8c26c
[[  ${@x.foo} == 'typeset -a'* ]] || err_exit 'x.foo is not an indexed array'
Packit Service a8c26c
x=( typeset -A foo=( [0]="a" [1]="b" [2]="c" ))
Packit Service a8c26c
[[  ${@x.foo} == 'typeset -A'* ]] || err_exit 'x.foo is not an associative array'
Packit Service a8c26c
$SHELL -c $'x=(foo\n\tbar\nbam\n)' 2> /dev/null || err_exit 'compound array assignment with new-lines not working'
Packit Service a8c26c
$SHELL -c $'x=(foo\n\tbar:\nbam\n)' 2> /dev/null || err_exit 'compound array assignment with labels not working'
Packit Service a8c26c
$SHELL -c $'x=(foo\n\tdone\nbam\n)' 2> /dev/null || err_exit 'compound array assignment with reserved words not working'
Packit Service a8c26c
[[ $($SHELL -c 'typeset -A A; print $(( A[foo].bar ))' 2> /dev/null) == 0 ]] || err_exit 'unset variable not evaluating to 0'
Packit Service a8c26c
unset a
Packit Service a8c26c
typeset -A a
Packit Service a8c26c
a[a].z=1
Packit Service a8c26c
a[z].z=2
Packit Service a8c26c
unset a[a]
Packit Service a8c26c
[[ ${!a[@]} == z ]] || err_exit '"unset a[a]" unsets entire array'
Packit Service a8c26c
unset a
Packit Service a8c26c
a=([x]=1 [y]=2 [z]=(foo=3 bar=4))
Packit Service a8c26c
eval "b=$(printf "%B\n" a)"
Packit Service a8c26c
eval "c=$(printf "%#B\n" a)"
Packit Service a8c26c
[[ ${a[*]} == "${b[*]}" ]] || err_exit 'printf %B not preserving values for arrays'
Packit Service a8c26c
[[ ${a[*]} == "${c[*]}" ]] || err_exit 'printf %#B not preserving values for arrays'
Packit Service a8c26c
unset a
Packit Service a8c26c
a=(zero one two three four)
Packit Service a8c26c
a[6]=six
Packit Service a8c26c
[[ ${a[-1]} == six ]] || err_exit 'a[-1] should be six'
Packit Service a8c26c
[[ ${a[-3]} == four ]] || err_exit 'a[-3] should be four'
Packit Service a8c26c
[[ ${a[-3..-1]} == 'four six' ]] || err_exit "a[-3,-1] should be 'four six'"
Packit Service a8c26c
Packit Service a8c26c
FILTER=(typeset scope)
Packit Service a8c26c
FILTER[0].scope=include
Packit Service a8c26c
FILTER[1].scope=exclude
Packit Service a8c26c
[[ ${#FILTER[@]} == 2 ]] ||  err_exit "FILTER array should have two elements not ${#FILTER[@]}"
Packit Service a8c26c
Packit Service a8c26c
unset x
Packit Service a8c26c
function x.get
Packit Service a8c26c
{
Packit Service a8c26c
	print sub=${.sh.subscript}
Packit Service a8c26c
}
Packit Service a8c26c
x[2]=
Packit Service a8c26c
z=$(: ${x[1]} )
Packit Service a8c26c
[[ $z == sub=1 ]] || err_exit 'get function not invoked for index array'
Packit Service a8c26c
Packit Service a8c26c
unset x
Packit Service a8c26c
typeset -A x
Packit Service a8c26c
function x.get
Packit Service a8c26c
{
Packit Service a8c26c
	print sub=${.sh.subscript}
Packit Service a8c26c
}
Packit Service a8c26c
x[2]=
Packit Service a8c26c
z=$(: ${x[1]} )
Packit Service a8c26c
[[ $z == sub=1 ]] || err_exit 'get function not invoked for associative array'
Packit Service a8c26c
Packit Service a8c26c
unset y
Packit Service a8c26c
i=1
Packit Service a8c26c
a=(11 22)
Packit Service a8c26c
typeset -m y=a[i]
Packit Service a8c26c
[[ $y == 22 ]] || err_exit 'typeset -m for index array not working'
Packit Service a8c26c
[[ ${a[i]} || ${a[0]} != 11 ]] && err_exit 'typeset -m for index array not deleting element'
Packit Service a8c26c
Packit Service a8c26c
unset y
Packit Service a8c26c
a=([0]=11 [1]=22)
Packit Service a8c26c
typeset -m y=a[$i]
Packit Service a8c26c
[[ $y == 22 ]] || err_exit 'typeset -m for associative array not working'
Packit Service a8c26c
[[ ${a[$i]} || ${a[0]} != 11 ]] && err_exit 'typeset -m for associative array not deleting element'
Packit Service a8c26c
unset x a j
Packit Service a8c26c
Packit Service a8c26c
typeset -a a=( [0]="aa" [1]="bb" [2]="cc" )
Packit Service a8c26c
typeset -m 'j=a[0]'
Packit Service a8c26c
typeset -m 'a[0]=a[1]'
Packit Service a8c26c
typeset -m 'a[1]=j'
Packit Service a8c26c
[[ ${a[@]} == 'bb aa cc' ]] || err_exit 'moving index array elements not working'
Packit Service a8c26c
unset a j
Packit Service a8c26c
Packit Service a8c26c
typeset -A a=( [0]="aa" [1]="bb" [2]="cc" )
Packit Service a8c26c
typeset -m 'j=a[0]'
Packit Service a8c26c
typeset -m 'a[0]=a[1]'
Packit Service a8c26c
typeset -m 'a[1]=j'
Packit Service a8c26c
[[ ${a[@]} == 'bb aa cc' ]] || err_exit 'moving associative array elements not working'
Packit Service a8c26c
unset a j
Packit Service a8c26c
Packit Service a8c26c
z=(a b c)
Packit Service a8c26c
unset x
Packit Service a8c26c
typeset -m x[1]=z
Packit Service a8c26c
[[ ${x[1][@]} == 'a b c' ]] || err_exit 'moving indexed array to index array element not working'
Packit Service a8c26c
Packit Service a8c26c
unset x z
Packit Service a8c26c
z=([0]=a [1]=b [2]=c)
Packit Service a8c26c
typeset -m x[1]=z
Packit Service a8c26c
[[ ${x[1][@]} == 'a b c' ]] || err_exit 'moving associative array to index array element not working'
Packit Service a8c26c
Packit Service a8c26c
{
Packit Service a8c26c
typeset -a arr=(
Packit Service a8c26c
	float
Packit Service a8c26c
)
Packit Service a8c26c
} 2> /dev/null
Packit Service a8c26c
[[ ${arr[0]} == float ]] || err_exit 'typeset -a should not expand alias for float'
Packit Service a8c26c
unset arr
Packit Service a8c26c
Packit Service a8c26c
{
Packit Service a8c26c
typeset -r -a arr=(
Packit Service a8c26c
	float
Packit Service a8c26c
)
Packit Service a8c26c
} 2> /dev/null
Packit Service a8c26c
[[ ${arr[0]} == float ]] || err_exit 'typeset -r -a should not expand alias for float'
Packit Service a8c26c
{
Packit Service a8c26c
typeset -a arr2=(
Packit Service a8c26c
	typeset +r
Packit Service a8c26c
)
Packit Service a8c26c
} 2> /dev/null
Packit Service a8c26c
[[ ${arr2[0]} == typeset ]] || err_exit 'typeset -a should not process declarations'
Packit Service a8c26c
unset arr2
Packit Service a8c26c
Packit Service a8c26c
$SHELL 2> /dev/null -c $'typeset -a arr=(\nfor)' || err_exit 'typeset -a should allow reserved words as first argument'
Packit Service a8c26c
Packit Service a8c26c
$SHELL 2> /dev/null -c $'typeset -r -a arr=(\nfor)' || err_exit 'typeset -r -a should allow reserved words as first argument'
Packit Service a8c26c
Packit Service a8c26c
typeset arr2[6]
Packit Service a8c26c
[[ ${#arr2[@]} == 0 ]] || err_exit 'declartion "typeset array[6]" should not show any elements'
Packit Service a8c26c
Packit Service a8c26c
arr2[1]=def
Packit Service a8c26c
[[ ${arr2[1]} == def ]] || err_exit 'declaration "typeset array[6]" causes arrays causes wrong side effects'
Packit Service a8c26c
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset foo[7]
Packit Service a8c26c
[[ ${#foo[@]} == 0 ]] || err_exit 'typeset foo[7] should not have one element' 
Packit Service a8c26c
Packit Service a8c26c
a=123 $SHELL  2> /dev/null -c 'integer a[5]=3 a[2]=4; unset a;x=0; ((a[++x]++));:' || err_exit 'unsetting array variable leaves side effect'
Packit Service a8c26c
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo=(aa bb cc)
Packit Service a8c26c
foo=( ${foo[@]:1} )
Packit Service a8c26c
[[ ${foo[@]} == 'bb cc' ]] || err_exit "indexed array assignment using parts of array for values gives wrong result of ${foo[@]}"
Packit Service a8c26c
Packit Service a8c26c
unset foo
Packit Service a8c26c
foo=([xx]=aa [yy]=bb [zz]=cc)
Packit Service a8c26c
foo=( ${foo[yy]} ${foo[zz]} )
Packit Service a8c26c
[[ ${foo[@]} == 'bb cc' ]] || err_exit "associative array assignment using parts of array for values gives wrong result of ${foo[@]}"
Packit Service a8c26c
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -a foo=(abc=1 def=2)
Packit Service a8c26c
[[ ${foo[1]} == def=2 ]] || err_exit "index array with elements containing = not working"
Packit Service a8c26c
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -a foo=( a b )
Packit Service a8c26c
typeset -p foo[10]
Packit Service a8c26c
[[ ${!foo[@]} == '0 1' ]] || err_exit 'typeset -p foo[10] has side effect'
Packit Service a8c26c
Packit Service a8c26c
unset foo
Packit Service a8c26c
exp='typeset -a foo=((11 22) (66) )'
Packit Service a8c26c
x=$(
Packit Service a8c26c
	typeset -a foo=( ( 11 22 ) ( 44 55 ) )
Packit Service a8c26c
	foo[1]=(66)
Packit Service a8c26c
	typeset -p foo
Packit Service a8c26c
) 2> /dev/null
Packit Service a8c26c
[[ $x == "$exp" ]] || err_exit 'setting element 1 to index fooay failed'
Packit Service a8c26c
unset foo
Packit Service a8c26c
exp='typeset -a foo=((11 22) (x=3))'
Packit Service a8c26c
x=$(
Packit Service a8c26c
	typeset -a foo=( ( 11 22 ) ( 44 55 ) )
Packit Service a8c26c
	foo[1]=(x=3)
Packit Service a8c26c
	typeset -p foo
Packit Service a8c26c
) 2> /dev/null
Packit Service a8c26c
[[ $x == "$exp" ]] || err_exit 'setting element 1 of array to compound variable failed'
Packit Service a8c26c
Packit Service a8c26c
#test for cloning a very large index array - can core dump
Packit Service a8c26c
(	
Packit Service a8c26c
    trap 'x=$?;exit $(( $x!=0 ))' EXIT
Packit Service a8c26c
    $SHELL <<- \EOF
Packit Service a8c26c
	(
Packit Service a8c26c
		print '('
Packit Service a8c26c
		integer i
Packit Service a8c26c
		for ((i=0 ; i < 16384 ; i++ )) ; do
Packit Service a8c26c
                	printf '\tinteger var%i=%i\n' i i
Packit Service a8c26c
        	done
Packit Service a8c26c
        	printf 'typeset -a ar=(\n'
Packit Service a8c26c
		for ((i=0 ; i < 16384 ; i++ )) ; do
Packit Service a8c26c
			printf '\t[%d]=%d\n' i i
Packit Service a8c26c
		done
Packit Service a8c26c
		print ')'
Packit Service a8c26c
		print ')'
Packit Service a8c26c
	) | read -C hugecpv
Packit Service a8c26c
	compound hugecpv2=hugecpv
Packit Service a8c26c
	v=$(typeset -p hugecpv)
Packit Service a8c26c
	[[ ${v/hugecpv/hugecpv2} == "$(typeset -p hugecpv2)" ]]
Packit Service a8c26c
EOF
Packit Service a8c26c
) 2> /dev/null || err_exit 'copying a large array fails'
Packit Service a8c26c
Packit Service a8c26c
unset foo
Packit Service a8c26c
typeset -a foo
Packit Service a8c26c
foo+=(bar)
Packit Service a8c26c
[[ ${foo[0]} == bar ]] || 'appending to empty array not working'
Packit Service a8c26c
Packit Service a8c26c
unset isnull
Packit Service a8c26c
typeset -A isnull
Packit Service a8c26c
isnull[mdapp]=Y
Packit Service a8c26c
: ${isnull[@]}
Packit Service a8c26c
isnull[mdapp]=N
Packit Service a8c26c
[[ ${isnull[*]} != *N* ]] && err_exit 'bug after ${arr[@]} with one element associative array'
Packit Service a8c26c
Packit Service a8c26c
unset arr2
Packit Service a8c26c
arr2=()
Packit Service a8c26c
typeset -A arr2
Packit Service a8c26c
unset arr2
Packit Service a8c26c
[[ $(typeset -p arr2) ]] && err_exit 'unset associative array of compound variables not working'
Packit Service a8c26c
Packit Service a8c26c
arr3=(x=3)
Packit Service a8c26c
typeset -A arr3
Packit Service a8c26c
[[  $(typeset -p arr3) == 'typeset -A arr3=()' ]] || err_exit 'typeset -A does not first unset compound variable.'
Packit Service a8c26c
Packit Service a8c26c
arr4=(x=3)
Packit Service a8c26c
typeset -a arr4
Packit Service a8c26c
[[  $(typeset -p arr4) == 'typeset -a arr4' ]] || err_exit 'typeset -a does not first unset compound variable.'
Packit Service a8c26c
Packit Service a8c26c
alias foo=bar
Packit Service a8c26c
arr5=(foo bar)
Packit Service a8c26c
[[ $(typeset -p arr5) == 'typeset -a arr5=(foo bar)' ]] || err_exit 'typeset expanding non-declaration aliases'
Packit Service a8c26c
Packit Service a8c26c
typeset -A Foo
Packit Service a8c26c
Foo=( [a]=AA;[b]=BB)
Packit Service a8c26c
[[ ${Foo[a]} == AA ]] || err_exit 'Fooa[a] is {Foo[a]} not AA' 
Packit Service a8c26c
Packit Service a8c26c
exit $((Errors<125?Errors:125))