1*b30d1939SAndy Fiddaman########################################################################
2*b30d1939SAndy Fiddaman#                                                                      #
3*b30d1939SAndy Fiddaman#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2011 AT&T Intellectual Property          #
5*b30d1939SAndy Fiddaman#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
7*b30d1939SAndy Fiddaman#                    by AT&T Intellectual Property                     #
8*b30d1939SAndy Fiddaman#                                                                      #
9*b30d1939SAndy Fiddaman#                A copy of the License is available at                 #
10*b30d1939SAndy Fiddaman#          http://www.eclipse.org/org/documents/epl-v10.html           #
11*b30d1939SAndy Fiddaman#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
12*b30d1939SAndy Fiddaman#                                                                      #
13*b30d1939SAndy Fiddaman#              Information and Software Systems Research               #
14*b30d1939SAndy Fiddaman#                            AT&T Research                             #
15*b30d1939SAndy Fiddaman#                           Florham Park NJ                            #
16*b30d1939SAndy Fiddaman#                                                                      #
17*b30d1939SAndy Fiddaman#                  David Korn <dgk@research.att.com>                   #
18*b30d1939SAndy Fiddaman#                                                                      #
19*b30d1939SAndy Fiddaman########################################################################
20*b30d1939SAndy Fiddaman#
21*b30d1939SAndy Fiddaman# Written by Roland Mainz <roland.mainz@nrubsig.org>
22*b30d1939SAndy Fiddaman#
23*b30d1939SAndy Fiddaman
24*b30d1939SAndy Fiddamanfunction err_exit
25*b30d1939SAndy Fiddaman{
26*b30d1939SAndy Fiddaman	print -u2 -n "\t"
27*b30d1939SAndy Fiddaman	print -u2 -r ${Command}[$1]: "${@:2}"
28*b30d1939SAndy Fiddaman	(( Errors < 127 && Errors++ ))
29*b30d1939SAndy Fiddaman}
30*b30d1939SAndy Fiddaman
31*b30d1939SAndy Fiddamanalias err_exit='err_exit $LINENO'
32*b30d1939SAndy Fiddaman
33*b30d1939SAndy Fiddamanset -o nounset
34*b30d1939SAndy FiddamanCommand=${0##*/}
35*b30d1939SAndy Fiddamaninteger Errors=0
36*b30d1939SAndy Fiddaman
37*b30d1939SAndy Fiddaman
38*b30d1939SAndy Fiddaman
39*b30d1939SAndy Fiddamantypeset -T test_t=(
40*b30d1939SAndy Fiddaman	typeset name
41*b30d1939SAndy Fiddaman	typeset cmd
42*b30d1939SAndy Fiddaman	typeset expected_output
43*b30d1939SAndy Fiddaman)
44*b30d1939SAndy Fiddaman
45*b30d1939SAndy Fiddamanfunction testfunc
46*b30d1939SAndy Fiddaman{
47*b30d1939SAndy Fiddaman	integer line_number=$1
48*b30d1939SAndy Fiddaman	typeset cmd="$2"
49*b30d1939SAndy Fiddaman	typeset expected_output="$3"
50*b30d1939SAndy Fiddaman	typeset output
51*b30d1939SAndy Fiddaman
52*b30d1939SAndy Fiddaman	output="$($SHELL -c "${cmd}" 2>&1 )"
53*b30d1939SAndy Fiddaman
54*b30d1939SAndy Fiddaman	[[ "${output}" == "${expected_output}" ]] || err_exit ${line_number} "${output} != ${expected_output}"
55*b30d1939SAndy Fiddaman}
56*b30d1939SAndy Fiddaman
57*b30d1939SAndy Fiddaman# test1: basic tests
58*b30d1939SAndy Fiddamanfunction test1
59*b30d1939SAndy Fiddaman{
60*b30d1939SAndy Fiddaman	# string
61*b30d1939SAndy Fiddaman	testfunc ${LINENO} '(function l { typeset -S x ;     x+="#" ; $1 && print "$x" ; } ; l false ; l false   ; l true)'  "###"
62*b30d1939SAndy Fiddaman	testfunc ${LINENO} 'function  l { typeset -S x=">" ; x+="#" ; $1 && print "$x" ; } ; l false ; l false   ; l true'   ">###"
63*b30d1939SAndy Fiddaman	testfunc ${LINENO} 'function  l { typeset -S x=">" ; x+="#" ; $1 && print "$x" ; } ; l false ; (l false) ; l true'   ">##"
64*b30d1939SAndy Fiddaman	testfunc ${LINENO} 'function  l { typeset -S x=">" ; x+="#" ; $1 && print "$x" ; } ; l false; ( ulimit -c 0 ; l false) ; l true' ">##"
65*b30d1939SAndy Fiddaman
66*b30d1939SAndy Fiddaman	# integer
67*b30d1939SAndy Fiddaman	# (normal)
68*b30d1939SAndy Fiddaman	testfunc ${LINENO} '(function l { integer -S x ;        x+=1 ;   $1 && print "$x" ; } ; l false ; l false   ; l true )' "3"
69*b30d1939SAndy Fiddaman	testfunc ${LINENO} '(function l { integer -S x ;        x+=1 ;   $1 && print "$x" ; } ; l false ; (l false) ; l true )' "2"
70*b30d1939SAndy Fiddaman	# (int)
71*b30d1939SAndy Fiddaman	testfunc ${LINENO} '(function l { typeset -S -i x ;     x+=1 ;   $1 && print "$x" ; } ; l false ; l false   ; l true )' "3"
72*b30d1939SAndy Fiddaman	testfunc ${LINENO} '(function l { typeset -S -i x ;     x+=1 ;   $1 && print "$x" ; } ; l false ; (l false) ; l true )' "2"
73*b30d1939SAndy Fiddaman	# (short)
74*b30d1939SAndy Fiddaman	testfunc ${LINENO} '(function l { typeset -S -s -i x ;  x+=1 ;   $1 && print "$x" ; } ; l false ; l false   ; l true )' "3"
75*b30d1939SAndy Fiddaman	testfunc ${LINENO} '(function l { typeset -S -s -i x ;  x+=1 ;   $1 && print "$x" ; } ; l false ; (l false) ; l true )' "2"
76*b30d1939SAndy Fiddaman
77*b30d1939SAndy Fiddaman	# float
78*b30d1939SAndy Fiddaman	testfunc ${LINENO} '(function l { float -S x=0.5 ;  (( x+=.5 )) ;   $1 && print "$x" ; } ; l false ; l false   ; l true )' "2"
79*b30d1939SAndy Fiddaman	testfunc ${LINENO} '(function l { float -S x=0.5 ;  (( x+=.5 )) ;   $1 && print "$x" ; } ; l false ; (l false) ; l true )' "1.5"
80*b30d1939SAndy Fiddaman
81*b30d1939SAndy Fiddaman	return 0
82*b30d1939SAndy Fiddaman}
83*b30d1939SAndy Fiddaman
84*b30d1939SAndy Fiddaman# test2: test the more complex datatypes
85*b30d1939SAndy Fiddamanfunction test2
86*b30d1939SAndy Fiddaman{
87*b30d1939SAndy Fiddaman        compound out=( typeset stdout stderr ; integer res )
88*b30d1939SAndy Fiddaman	integer i
89*b30d1939SAndy Fiddaman
90*b30d1939SAndy Fiddaman	test_t -r -a tests=(
91*b30d1939SAndy Fiddaman		(
92*b30d1939SAndy Fiddaman			name='compound'
93*b30d1939SAndy Fiddaman			cmd=$'
94*b30d1939SAndy Fiddaman				function l
95*b30d1939SAndy Fiddaman				{
96*b30d1939SAndy Fiddaman					compound -S s=(
97*b30d1939SAndy Fiddaman						integer a=1
98*b30d1939SAndy Fiddaman						integer b=2
99*b30d1939SAndy Fiddaman					)
100*b30d1939SAndy Fiddaman
101*b30d1939SAndy Fiddaman					(( s.a++, s.b++ ))
102*b30d1939SAndy Fiddaman
103*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" s.a s.b
104*b30d1939SAndy Fiddaman				}
105*b30d1939SAndy Fiddaman				(l false ; l false ; l true ; printf ";")
106*b30d1939SAndy Fiddaman				(l false ; l false ; l true ; printf ";")
107*b30d1939SAndy Fiddaman			'
108*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
109*b30d1939SAndy Fiddaman		)
110*b30d1939SAndy Fiddaman		(
111*b30d1939SAndy Fiddaman			name='compound_nameref'
112*b30d1939SAndy Fiddaman			cmd=$'
113*b30d1939SAndy Fiddaman				function l_n
114*b30d1939SAndy Fiddaman				{
115*b30d1939SAndy Fiddaman					nameref sn=$2
116*b30d1939SAndy Fiddaman					(( sn.a++, sn.b++ ))
117*b30d1939SAndy Fiddaman
118*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" sn.a sn.b
119*b30d1939SAndy Fiddaman				}
120*b30d1939SAndy Fiddaman				function l
121*b30d1939SAndy Fiddaman				{
122*b30d1939SAndy Fiddaman					compound -S s=( a=1 b=2 )
123*b30d1939SAndy Fiddaman					l_n $1 s
124*b30d1939SAndy Fiddaman				}
125*b30d1939SAndy Fiddaman				(l false ; l false ; l true ; printf ";")
126*b30d1939SAndy Fiddaman				(l false ; l false ; l true ; printf ";")
127*b30d1939SAndy Fiddaman			'
128*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
129*b30d1939SAndy Fiddaman		)
130*b30d1939SAndy Fiddaman
131*b30d1939SAndy Fiddaman		(
132*b30d1939SAndy Fiddaman			name='type'
133*b30d1939SAndy Fiddaman			cmd=$'
134*b30d1939SAndy Fiddaman				typeset -T ab_t=(
135*b30d1939SAndy Fiddaman					integer a=1
136*b30d1939SAndy Fiddaman					integer b=2
137*b30d1939SAndy Fiddaman
138*b30d1939SAndy Fiddaman					function increment
139*b30d1939SAndy Fiddaman					{
140*b30d1939SAndy Fiddaman						(( _.a++, _.b++ ))
141*b30d1939SAndy Fiddaman					}
142*b30d1939SAndy Fiddaman				)
143*b30d1939SAndy Fiddaman				function l
144*b30d1939SAndy Fiddaman				{
145*b30d1939SAndy Fiddaman					ab_t -S s
146*b30d1939SAndy Fiddaman
147*b30d1939SAndy Fiddaman					s.increment
148*b30d1939SAndy Fiddaman
149*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" s.a s.b
150*b30d1939SAndy Fiddaman				}
151*b30d1939SAndy Fiddaman				(l false ; l false ; l true ; printf ";")
152*b30d1939SAndy Fiddaman				(l false ; l false ; l true ; printf ";")
153*b30d1939SAndy Fiddaman			'
154*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
155*b30d1939SAndy Fiddaman		)
156*b30d1939SAndy Fiddaman
157*b30d1939SAndy Fiddaman		(
158*b30d1939SAndy Fiddaman			name='type_nameref'
159*b30d1939SAndy Fiddaman			cmd=$'
160*b30d1939SAndy Fiddaman				typeset -T ab_t=(
161*b30d1939SAndy Fiddaman					integer a=1
162*b30d1939SAndy Fiddaman					integer b=2
163*b30d1939SAndy Fiddaman
164*b30d1939SAndy Fiddaman					function increment
165*b30d1939SAndy Fiddaman					{
166*b30d1939SAndy Fiddaman						(( _.a++, _.b++ ))
167*b30d1939SAndy Fiddaman					}
168*b30d1939SAndy Fiddaman				)
169*b30d1939SAndy Fiddaman				function l_n
170*b30d1939SAndy Fiddaman				{
171*b30d1939SAndy Fiddaman					nameref sn=$2
172*b30d1939SAndy Fiddaman
173*b30d1939SAndy Fiddaman					sn.increment
174*b30d1939SAndy Fiddaman
175*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" sn.a sn.b
176*b30d1939SAndy Fiddaman				}
177*b30d1939SAndy Fiddaman				function l
178*b30d1939SAndy Fiddaman				{
179*b30d1939SAndy Fiddaman					ab_t -S s
180*b30d1939SAndy Fiddaman					l_n $1 s
181*b30d1939SAndy Fiddaman				}
182*b30d1939SAndy Fiddaman				(l false ; l false ; l true ; printf ";")
183*b30d1939SAndy Fiddaman				(l false ; l false ; l true ; printf ";")
184*b30d1939SAndy Fiddaman			'
185*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
186*b30d1939SAndy Fiddaman		)
187*b30d1939SAndy Fiddaman
188*b30d1939SAndy Fiddaman		(
189*b30d1939SAndy Fiddaman			name='indexed_string_array_appendelement'
190*b30d1939SAndy Fiddaman			cmd=$'
191*b30d1939SAndy Fiddaman				function ar
192*b30d1939SAndy Fiddaman				{
193*b30d1939SAndy Fiddaman					typeset -a -S s=( "hello" )
194*b30d1939SAndy Fiddaman
195*b30d1939SAndy Fiddaman					s+=( "an element" )
196*b30d1939SAndy Fiddaman
197*b30d1939SAndy Fiddaman					$1 && { printf "%s" "${s[@]}" ; printf "\n" ; }
198*b30d1939SAndy Fiddaman				}
199*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
200*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
201*b30d1939SAndy Fiddaman			'
202*b30d1939SAndy Fiddaman			expected_output=$'helloan elementan elementan element\n;helloan elementan elementan element\n;'
203*b30d1939SAndy Fiddaman		)
204*b30d1939SAndy Fiddaman
205*b30d1939SAndy Fiddaman		(
206*b30d1939SAndy Fiddaman			name='indexed_string_array_nameref_appendelement'
207*b30d1939SAndy Fiddaman			cmd=$'
208*b30d1939SAndy Fiddaman				function ar_n
209*b30d1939SAndy Fiddaman				{
210*b30d1939SAndy Fiddaman					nameref sn=$2
211*b30d1939SAndy Fiddaman					sn+=( "an element" )
212*b30d1939SAndy Fiddaman
213*b30d1939SAndy Fiddaman					$1 && { printf "%s" "${sn[@]}" ; printf "\n" ; }
214*b30d1939SAndy Fiddaman				}
215*b30d1939SAndy Fiddaman				function ar
216*b30d1939SAndy Fiddaman				{
217*b30d1939SAndy Fiddaman					typeset -a -S s=( "hello" )
218*b30d1939SAndy Fiddaman					ar_n $1 s
219*b30d1939SAndy Fiddaman				}
220*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
221*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
222*b30d1939SAndy Fiddaman			'
223*b30d1939SAndy Fiddaman			expected_output=$'helloan elementan elementan element\n;helloan elementan elementan element\n;'
224*b30d1939SAndy Fiddaman		)
225*b30d1939SAndy Fiddaman
226*b30d1939SAndy Fiddaman		(
227*b30d1939SAndy Fiddaman			name='associative_string_array_appendelement'
228*b30d1939SAndy Fiddaman			cmd=$'
229*b30d1939SAndy Fiddaman				function ar
230*b30d1939SAndy Fiddaman				{
231*b30d1939SAndy Fiddaman					typeset -A -S s=( [0]="hello" )
232*b30d1939SAndy Fiddaman
233*b30d1939SAndy Fiddaman					s[$(( ${#s[@]} + 1))]="an element"
234*b30d1939SAndy Fiddaman
235*b30d1939SAndy Fiddaman					$1 && { printf "%s" "${s[@]}" ; printf "\n" ; }
236*b30d1939SAndy Fiddaman				}
237*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
238*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
239*b30d1939SAndy Fiddaman			'
240*b30d1939SAndy Fiddaman			expected_output=$'helloan elementan elementan element\n;helloan elementan elementan element\n;'
241*b30d1939SAndy Fiddaman		)
242*b30d1939SAndy Fiddaman
243*b30d1939SAndy Fiddaman		(
244*b30d1939SAndy Fiddaman			name='associative_string_array_nameref_appendelement'
245*b30d1939SAndy Fiddaman			cmd=$'
246*b30d1939SAndy Fiddaman				function ar_n
247*b30d1939SAndy Fiddaman				{
248*b30d1939SAndy Fiddaman					nameref sn=$2
249*b30d1939SAndy Fiddaman
250*b30d1939SAndy Fiddaman					sn[$(( ${#sn[@]} + 1))]="an element"
251*b30d1939SAndy Fiddaman
252*b30d1939SAndy Fiddaman					$1 && { printf "%s" "${sn[@]}" ; printf "\n" ; }
253*b30d1939SAndy Fiddaman				}
254*b30d1939SAndy Fiddaman				function ar
255*b30d1939SAndy Fiddaman				{
256*b30d1939SAndy Fiddaman					typeset -A -S s=( [0]="hello" )
257*b30d1939SAndy Fiddaman					ar_n $1 s
258*b30d1939SAndy Fiddaman				}
259*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
260*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
261*b30d1939SAndy Fiddaman			'
262*b30d1939SAndy Fiddaman			expected_output=$'helloan elementan elementan element\n;helloan elementan elementan element\n;'
263*b30d1939SAndy Fiddaman		)
264*b30d1939SAndy Fiddaman
265*b30d1939SAndy Fiddaman		(
266*b30d1939SAndy Fiddaman			name='indexed_compound_array_editelement'
267*b30d1939SAndy Fiddaman			cmd=$'
268*b30d1939SAndy Fiddaman				function ar
269*b30d1939SAndy Fiddaman				{
270*b30d1939SAndy Fiddaman					compound -S -a s=(
271*b30d1939SAndy Fiddaman						[5]=(
272*b30d1939SAndy Fiddaman							integer a=1
273*b30d1939SAndy Fiddaman							integer b=2
274*b30d1939SAndy Fiddaman						)
275*b30d1939SAndy Fiddaman					)
276*b30d1939SAndy Fiddaman
277*b30d1939SAndy Fiddaman					(( s[5].a++, s[5].b++ ))
278*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" s[5].a s[5].b
279*b30d1939SAndy Fiddaman				}
280*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
281*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
282*b30d1939SAndy Fiddaman			'
283*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
284*b30d1939SAndy Fiddaman		)
285*b30d1939SAndy Fiddaman
286*b30d1939SAndy Fiddaman		(
287*b30d1939SAndy Fiddaman			name='indexed_compound_array_nameref_editelement'
288*b30d1939SAndy Fiddaman			cmd=$'
289*b30d1939SAndy Fiddaman				function ar_n
290*b30d1939SAndy Fiddaman				{
291*b30d1939SAndy Fiddaman					nameref sn=$2
292*b30d1939SAndy Fiddaman
293*b30d1939SAndy Fiddaman					(( sn.a++, sn.b++ ))
294*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" sn.a sn.b
295*b30d1939SAndy Fiddaman				}
296*b30d1939SAndy Fiddaman				function ar
297*b30d1939SAndy Fiddaman				{
298*b30d1939SAndy Fiddaman					compound -S -a s=(
299*b30d1939SAndy Fiddaman						[5]=(
300*b30d1939SAndy Fiddaman							integer a=1
301*b30d1939SAndy Fiddaman							integer b=2
302*b30d1939SAndy Fiddaman						)
303*b30d1939SAndy Fiddaman					)
304*b30d1939SAndy Fiddaman
305*b30d1939SAndy Fiddaman					ar_n $1 s[5]
306*b30d1939SAndy Fiddaman				}
307*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
308*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
309*b30d1939SAndy Fiddaman			'
310*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
311*b30d1939SAndy Fiddaman		)
312*b30d1939SAndy Fiddaman
313*b30d1939SAndy Fiddaman		(
314*b30d1939SAndy Fiddaman			name='2d_indexed_compound_array_editelement'
315*b30d1939SAndy Fiddaman			cmd=$'
316*b30d1939SAndy Fiddaman				function ar
317*b30d1939SAndy Fiddaman				{
318*b30d1939SAndy Fiddaman					compound -S -a s=(
319*b30d1939SAndy Fiddaman						[8][5]=(
320*b30d1939SAndy Fiddaman							integer a=1
321*b30d1939SAndy Fiddaman							integer b=2
322*b30d1939SAndy Fiddaman						)
323*b30d1939SAndy Fiddaman					)
324*b30d1939SAndy Fiddaman
325*b30d1939SAndy Fiddaman					(( s[8][5].a++, s[8][5].b++ ))
326*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" s[8][5].a s[8][5].b
327*b30d1939SAndy Fiddaman				}
328*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
329*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
330*b30d1939SAndy Fiddaman			'
331*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
332*b30d1939SAndy Fiddaman		)
333*b30d1939SAndy Fiddaman
334*b30d1939SAndy Fiddaman		(
335*b30d1939SAndy Fiddaman			name='2d_indexed_compound_array_nameref_editelement'
336*b30d1939SAndy Fiddaman			cmd=$'
337*b30d1939SAndy Fiddaman				function ar_n
338*b30d1939SAndy Fiddaman				{
339*b30d1939SAndy Fiddaman					nameref sn=$2
340*b30d1939SAndy Fiddaman
341*b30d1939SAndy Fiddaman					(( sn.a++, sn.b++ ))
342*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" sn.a sn.b
343*b30d1939SAndy Fiddaman				}
344*b30d1939SAndy Fiddaman				function ar
345*b30d1939SAndy Fiddaman				{
346*b30d1939SAndy Fiddaman					compound -S -a s=(
347*b30d1939SAndy Fiddaman						[8][5]=(
348*b30d1939SAndy Fiddaman							integer a=1
349*b30d1939SAndy Fiddaman							integer b=2
350*b30d1939SAndy Fiddaman						)
351*b30d1939SAndy Fiddaman					)
352*b30d1939SAndy Fiddaman
353*b30d1939SAndy Fiddaman					ar_n $1 s[8][5]
354*b30d1939SAndy Fiddaman				}
355*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
356*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
357*b30d1939SAndy Fiddaman			'
358*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
359*b30d1939SAndy Fiddaman		)
360*b30d1939SAndy Fiddaman		(
361*b30d1939SAndy Fiddaman			name='4d_indexed_compound_array_editelement'
362*b30d1939SAndy Fiddaman			cmd=$'
363*b30d1939SAndy Fiddaman				function ar
364*b30d1939SAndy Fiddaman				{
365*b30d1939SAndy Fiddaman					compound -S -a s=(
366*b30d1939SAndy Fiddaman						[8][5][0][9]=(
367*b30d1939SAndy Fiddaman							integer a=1
368*b30d1939SAndy Fiddaman							integer b=2
369*b30d1939SAndy Fiddaman						)
370*b30d1939SAndy Fiddaman					)
371*b30d1939SAndy Fiddaman
372*b30d1939SAndy Fiddaman					(( s[8][5][0][9].a++, s[8][5][0][9].b++ ))
373*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" s[8][5][0][9].a s[8][5][0][9].b
374*b30d1939SAndy Fiddaman				}
375*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
376*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
377*b30d1939SAndy Fiddaman			'
378*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
379*b30d1939SAndy Fiddaman		)
380*b30d1939SAndy Fiddaman
381*b30d1939SAndy Fiddaman		(
382*b30d1939SAndy Fiddaman			name='4d_indexed_compound_array_nameref_editelement'
383*b30d1939SAndy Fiddaman			cmd=$'
384*b30d1939SAndy Fiddaman				function ar_n
385*b30d1939SAndy Fiddaman				{
386*b30d1939SAndy Fiddaman					nameref sn=$2
387*b30d1939SAndy Fiddaman
388*b30d1939SAndy Fiddaman					(( sn.a++, sn.b++ ))
389*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" sn.a sn.b
390*b30d1939SAndy Fiddaman				}
391*b30d1939SAndy Fiddaman				function ar
392*b30d1939SAndy Fiddaman				{
393*b30d1939SAndy Fiddaman					compound -S -a s=(
394*b30d1939SAndy Fiddaman						[8][5][0][9]=(
395*b30d1939SAndy Fiddaman							integer a=1
396*b30d1939SAndy Fiddaman							integer b=2
397*b30d1939SAndy Fiddaman						)
398*b30d1939SAndy Fiddaman					)
399*b30d1939SAndy Fiddaman
400*b30d1939SAndy Fiddaman					ar_n $1 s[8][5][0][9]
401*b30d1939SAndy Fiddaman				}
402*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
403*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
404*b30d1939SAndy Fiddaman			'
405*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
406*b30d1939SAndy Fiddaman		)
407*b30d1939SAndy Fiddaman
408*b30d1939SAndy Fiddaman		(
409*b30d1939SAndy Fiddaman			name='associative_compound_array_editelement'
410*b30d1939SAndy Fiddaman			cmd=$'
411*b30d1939SAndy Fiddaman				function ar
412*b30d1939SAndy Fiddaman				{
413*b30d1939SAndy Fiddaman					compound -S -A s=(
414*b30d1939SAndy Fiddaman						[5]=(
415*b30d1939SAndy Fiddaman							integer a=1
416*b30d1939SAndy Fiddaman							integer b=2
417*b30d1939SAndy Fiddaman						)
418*b30d1939SAndy Fiddaman					)
419*b30d1939SAndy Fiddaman
420*b30d1939SAndy Fiddaman					(( s[5].a++, s[5].b++ ))
421*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" s[5].a s[5].b
422*b30d1939SAndy Fiddaman				}
423*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
424*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
425*b30d1939SAndy Fiddaman			'
426*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
427*b30d1939SAndy Fiddaman		)
428*b30d1939SAndy Fiddaman
429*b30d1939SAndy Fiddaman		(
430*b30d1939SAndy Fiddaman			name='associative_compound_array_nameref_editelement'
431*b30d1939SAndy Fiddaman			cmd=$'
432*b30d1939SAndy Fiddaman				function ar_n
433*b30d1939SAndy Fiddaman				{
434*b30d1939SAndy Fiddaman					nameref sn=$2
435*b30d1939SAndy Fiddaman
436*b30d1939SAndy Fiddaman					(( sn.a++, sn.b++ ))
437*b30d1939SAndy Fiddaman					$1 && printf "a=%d, b=%d\n" sn.a sn.b
438*b30d1939SAndy Fiddaman				}
439*b30d1939SAndy Fiddaman				function ar
440*b30d1939SAndy Fiddaman				{
441*b30d1939SAndy Fiddaman					compound -S -A s=(
442*b30d1939SAndy Fiddaman						[5]=(
443*b30d1939SAndy Fiddaman							integer a=1
444*b30d1939SAndy Fiddaman							integer b=2
445*b30d1939SAndy Fiddaman						)
446*b30d1939SAndy Fiddaman					)
447*b30d1939SAndy Fiddaman
448*b30d1939SAndy Fiddaman					ar_n $1 s[5]
449*b30d1939SAndy Fiddaman				}
450*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
451*b30d1939SAndy Fiddaman				(ar false ; ar false ; ar true ; printf ";")
452*b30d1939SAndy Fiddaman			'
453*b30d1939SAndy Fiddaman			expected_output=$'a=4, b=5\n;a=4, b=5\n;'
454*b30d1939SAndy Fiddaman		)
455*b30d1939SAndy Fiddaman
456*b30d1939SAndy Fiddaman			(
457*b30d1939SAndy Fiddaman				name='indexed_type_array_editelement'
458*b30d1939SAndy Fiddaman				cmd=$'
459*b30d1939SAndy Fiddaman					typeset -T ab_t=(
460*b30d1939SAndy Fiddaman						integer a=1
461*b30d1939SAndy Fiddaman						integer b=2
462*b30d1939SAndy Fiddaman
463*b30d1939SAndy Fiddaman						function increment
464*b30d1939SAndy Fiddaman						{
465*b30d1939SAndy Fiddaman							(( _.a++, _.b++ ))
466*b30d1939SAndy Fiddaman						}
467*b30d1939SAndy Fiddaman					)
468*b30d1939SAndy Fiddaman
469*b30d1939SAndy Fiddaman					function ar
470*b30d1939SAndy Fiddaman					{
471*b30d1939SAndy Fiddaman						ab_t -S -a s
472*b30d1939SAndy Fiddaman						[[ -v s[5] ]] || s[5]=( ) # how do I init an array of types ?
473*b30d1939SAndy Fiddaman
474*b30d1939SAndy Fiddaman						s[5].increment
475*b30d1939SAndy Fiddaman						$1 && printf "a=%d, b=%d\n" s[5].a s[5].b
476*b30d1939SAndy Fiddaman					}
477*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
478*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
479*b30d1939SAndy Fiddaman				'
480*b30d1939SAndy Fiddaman				expected_output=$'a=4, b=5\n;a=4, b=5\n;'
481*b30d1939SAndy Fiddaman			)
482*b30d1939SAndy Fiddaman
483*b30d1939SAndy Fiddaman			(
484*b30d1939SAndy Fiddaman				name='indexed_type_array_nameref_editelement'
485*b30d1939SAndy Fiddaman				cmd=$'
486*b30d1939SAndy Fiddaman					typeset -T ab_t=(
487*b30d1939SAndy Fiddaman						integer a=1
488*b30d1939SAndy Fiddaman						integer b=2
489*b30d1939SAndy Fiddaman
490*b30d1939SAndy Fiddaman						function increment
491*b30d1939SAndy Fiddaman						{
492*b30d1939SAndy Fiddaman							(( _.a++, _.b++ ))
493*b30d1939SAndy Fiddaman						}
494*b30d1939SAndy Fiddaman					)
495*b30d1939SAndy Fiddaman
496*b30d1939SAndy Fiddaman					function ar_n
497*b30d1939SAndy Fiddaman					{
498*b30d1939SAndy Fiddaman						nameref sn=$2
499*b30d1939SAndy Fiddaman
500*b30d1939SAndy Fiddaman						sn.increment
501*b30d1939SAndy Fiddaman						$1 && printf "a=%d, b=%d\n" sn.a sn.b
502*b30d1939SAndy Fiddaman					}
503*b30d1939SAndy Fiddaman					function ar
504*b30d1939SAndy Fiddaman					{
505*b30d1939SAndy Fiddaman						ab_t -S -a s
506*b30d1939SAndy Fiddaman						[[ -v s[5] ]] || s[5]=( ) # how do I init an array of types ?
507*b30d1939SAndy Fiddaman
508*b30d1939SAndy Fiddaman						ar_n $1 s[5]
509*b30d1939SAndy Fiddaman					}
510*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
511*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
512*b30d1939SAndy Fiddaman				'
513*b30d1939SAndy Fiddaman				expected_output=$'a=4, b=5\n;a=4, b=5\n;'
514*b30d1939SAndy Fiddaman			)
515*b30d1939SAndy Fiddaman
516*b30d1939SAndy Fiddaman			(
517*b30d1939SAndy Fiddaman				name='2d_indexed_type_array_editelement'
518*b30d1939SAndy Fiddaman				cmd=$'
519*b30d1939SAndy Fiddaman					typeset -T ab_t=(
520*b30d1939SAndy Fiddaman						integer a=1
521*b30d1939SAndy Fiddaman						integer b=2
522*b30d1939SAndy Fiddaman
523*b30d1939SAndy Fiddaman						function increment
524*b30d1939SAndy Fiddaman						{
525*b30d1939SAndy Fiddaman							(( _.a++, _.b++ ))
526*b30d1939SAndy Fiddaman						}
527*b30d1939SAndy Fiddaman					)
528*b30d1939SAndy Fiddaman
529*b30d1939SAndy Fiddaman					function ar
530*b30d1939SAndy Fiddaman					{
531*b30d1939SAndy Fiddaman						ab_t -S -a s
532*b30d1939SAndy Fiddaman						[[ -v s[9][5] ]] || s[9][5]=( ) # how do I init an array of types ?
533*b30d1939SAndy Fiddaman
534*b30d1939SAndy Fiddaman						s[9][5].increment
535*b30d1939SAndy Fiddaman						$1 && printf "a=%d, b=%d\n" s[9][5].a s[9][5].b
536*b30d1939SAndy Fiddaman					}
537*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
538*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
539*b30d1939SAndy Fiddaman				'
540*b30d1939SAndy Fiddaman				expected_output=$'a=4, b=5\n;a=4, b=5\n;'
541*b30d1939SAndy Fiddaman			)
542*b30d1939SAndy Fiddaman
543*b30d1939SAndy Fiddaman			(
544*b30d1939SAndy Fiddaman				name='2d_indexed_type_array_nameref_editelement'
545*b30d1939SAndy Fiddaman				cmd=$'
546*b30d1939SAndy Fiddaman					typeset -T ab_t=(
547*b30d1939SAndy Fiddaman						integer a=1
548*b30d1939SAndy Fiddaman						integer b=2
549*b30d1939SAndy Fiddaman
550*b30d1939SAndy Fiddaman						function increment
551*b30d1939SAndy Fiddaman						{
552*b30d1939SAndy Fiddaman							(( _.a++, _.b++ ))
553*b30d1939SAndy Fiddaman						}
554*b30d1939SAndy Fiddaman					)
555*b30d1939SAndy Fiddaman
556*b30d1939SAndy Fiddaman					function ar_n
557*b30d1939SAndy Fiddaman					{
558*b30d1939SAndy Fiddaman						nameref sn=$2
559*b30d1939SAndy Fiddaman
560*b30d1939SAndy Fiddaman						sn.increment
561*b30d1939SAndy Fiddaman						$1 && printf "a=%d, b=%d\n" sn.a sn.b
562*b30d1939SAndy Fiddaman					}
563*b30d1939SAndy Fiddaman					function ar
564*b30d1939SAndy Fiddaman					{
565*b30d1939SAndy Fiddaman						ab_t -S -a s
566*b30d1939SAndy Fiddaman						[[ -v s[9][5] ]] || s[9][5]=( ) # how do I init an array of types ?
567*b30d1939SAndy Fiddaman
568*b30d1939SAndy Fiddaman						ar_n $1 s[9][5]
569*b30d1939SAndy Fiddaman					}
570*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
571*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
572*b30d1939SAndy Fiddaman				'
573*b30d1939SAndy Fiddaman				expected_output=$'a=4, b=5\n;a=4, b=5\n;'
574*b30d1939SAndy Fiddaman			)
575*b30d1939SAndy Fiddaman
576*b30d1939SAndy Fiddaman			(
577*b30d1939SAndy Fiddaman				name='associative_type_array_editelement'
578*b30d1939SAndy Fiddaman				cmd=$'
579*b30d1939SAndy Fiddaman					typeset -T ab_t=(
580*b30d1939SAndy Fiddaman						integer a=1
581*b30d1939SAndy Fiddaman						integer b=2
582*b30d1939SAndy Fiddaman
583*b30d1939SAndy Fiddaman						function increment
584*b30d1939SAndy Fiddaman						{
585*b30d1939SAndy Fiddaman							(( _.a++, _.b++ ))
586*b30d1939SAndy Fiddaman						}
587*b30d1939SAndy Fiddaman					)
588*b30d1939SAndy Fiddaman
589*b30d1939SAndy Fiddaman					function ar
590*b30d1939SAndy Fiddaman					{
591*b30d1939SAndy Fiddaman						ab_t -S -A s
592*b30d1939SAndy Fiddaman						[[ -v s[5] ]] || s[5]=( ) # how do I init an array of types ?
593*b30d1939SAndy Fiddaman
594*b30d1939SAndy Fiddaman						s[5].increment
595*b30d1939SAndy Fiddaman						$1 && printf "a=%d, b=%d\n" s[5].a s[5].b
596*b30d1939SAndy Fiddaman					}
597*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
598*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
599*b30d1939SAndy Fiddaman				'
600*b30d1939SAndy Fiddaman				expected_output=$'a=4, b=5\n;a=4, b=5\n;'
601*b30d1939SAndy Fiddaman			)
602*b30d1939SAndy Fiddaman
603*b30d1939SAndy Fiddaman			(
604*b30d1939SAndy Fiddaman				name='associative_type_array_nameref_editelement'
605*b30d1939SAndy Fiddaman				cmd=$'
606*b30d1939SAndy Fiddaman					typeset -T ab_t=(
607*b30d1939SAndy Fiddaman						integer a=1
608*b30d1939SAndy Fiddaman						integer b=2
609*b30d1939SAndy Fiddaman
610*b30d1939SAndy Fiddaman						function increment
611*b30d1939SAndy Fiddaman						{
612*b30d1939SAndy Fiddaman							(( _.a++, _.b++ ))
613*b30d1939SAndy Fiddaman						}
614*b30d1939SAndy Fiddaman					)
615*b30d1939SAndy Fiddaman
616*b30d1939SAndy Fiddaman					function ar_n
617*b30d1939SAndy Fiddaman					{
618*b30d1939SAndy Fiddaman						nameref sn=$2
619*b30d1939SAndy Fiddaman
620*b30d1939SAndy Fiddaman						sn.increment
621*b30d1939SAndy Fiddaman						$1 && printf "a=%d, b=%d\n" sn.a sn.b
622*b30d1939SAndy Fiddaman					}
623*b30d1939SAndy Fiddaman					function ar
624*b30d1939SAndy Fiddaman					{
625*b30d1939SAndy Fiddaman						ab_t -S -A s
626*b30d1939SAndy Fiddaman						[[ -v s[5] ]] || s[5]=( ) # how do I init an array of types ?
627*b30d1939SAndy Fiddaman
628*b30d1939SAndy Fiddaman						ar_n $1 s[5]
629*b30d1939SAndy Fiddaman					}
630*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
631*b30d1939SAndy Fiddaman					(ar false ; ar false ; ar true ; printf ";")
632*b30d1939SAndy Fiddaman				'
633*b30d1939SAndy Fiddaman				expected_output=$'a=4, b=5\n;a=4, b=5\n;'
634*b30d1939SAndy Fiddaman			)
635*b30d1939SAndy Fiddaman
636*b30d1939SAndy Fiddaman	)
637*b30d1939SAndy Fiddaman
638*b30d1939SAndy Fiddaman	for (( i=0 ; i < ${#tests[@]} ; i++ )) ; do
639*b30d1939SAndy Fiddaman		nameref currtest=tests[i]
640*b30d1939SAndy Fiddaman
641*b30d1939SAndy Fiddaman#print -u2 -- "${currtest.cmd}"
642*b30d1939SAndy Fiddaman		out.stderr="${ { out.stdout="${ ${SHELL} -o nounset -c "${currtest.cmd}" ; (( out.res=$? )) ; }" ; } 2>&1 ; }"
643*b30d1939SAndy Fiddaman
644*b30d1939SAndy Fiddaman		(( out.res == 0 )) || err_exit "${currtest.name}: Test shell returned with exit code ${out.res}"
645*b30d1939SAndy Fiddaman		[[ "${out.stdout}" == "${currtest.expected_output}" ]] || err_exit "${currtest.name}: Expected stdout == $(printf "%q\n" "${currtest.expected_output}"), got $(printf "%q\n" "${out.stdout}")"
646*b30d1939SAndy Fiddaman		[[ "${out.stderr}" == '' ]] || err_exit "${currtest.name}: Expected empty stderr, got $(printf "%q\n" "${out.stderr}")"
647*b30d1939SAndy Fiddaman   	done
648*b30d1939SAndy Fiddaman
649*b30d1939SAndy Fiddaman	return 0
650*b30d1939SAndy Fiddaman}
651*b30d1939SAndy Fiddaman
652*b30d1939SAndy Fiddaman# run tests
653*b30d1939SAndy Fiddamantest1
654*b30d1939SAndy Fiddamantest2
655*b30d1939SAndy Fiddaman
656*b30d1939SAndy Fiddaman
657*b30d1939SAndy Fiddaman# Test visibilty of "global" vs. "static" variables. if we have a "static" variable in a
658*b30d1939SAndy Fiddaman# function and "unset" it we should see a global variable with the same
659*b30d1939SAndy Fiddaman# name, right ?
660*b30d1939SAndy Fiddamaninteger hx=5
661*b30d1939SAndy Fiddamanfunction test_hx_scope
662*b30d1939SAndy Fiddaman{
663*b30d1939SAndy Fiddaman	integer -S hx=9
664*b30d1939SAndy Fiddaman	$2 && unset hx
665*b30d1939SAndy Fiddaman	$1 && printf 'hx=%d\n' hx
666*b30d1939SAndy Fiddaman}
667*b30d1939SAndy Fiddamantest_hx_scope false false
668*b30d1939SAndy Fiddamantest_hx_scope false false
669*b30d1939SAndy Fiddaman# first test the "unset" call in a $(...) subshell...
670*b30d1939SAndy Fiddaman[[ "$( test_hx_scope true true   )" == 'hx=5' ]] || err_exit "can't see global variable hx after unsetting static variable hx"
671*b30d1939SAndy Fiddaman# ... end then test whether the value has changed.
672*b30d1939SAndy Fiddaman[[ "${ test_hx_scope true false ;}" == 'hx=9' ]] || err_exit "hx variable somehow changed"
673*b30d1939SAndy Fiddaman
674*b30d1939SAndy Fiddamanout=$(function fun2
675*b30d1939SAndy Fiddaman{
676*b30d1939SAndy Fiddaman        nameref sn=$1
677*b30d1939SAndy Fiddaman        (( sn.a++, sn.b++ ))
678*b30d1939SAndy Fiddaman        $2 && printf "a=%d, b=%d\n" sn.a sn.b
679*b30d1939SAndy Fiddaman}
680*b30d1939SAndy Fiddamanfunction fun1
681*b30d1939SAndy Fiddaman{
682*b30d1939SAndy Fiddaman        compound -S s=( a=0 b=0 )
683*b30d1939SAndy Fiddaman        fun2 s $1
684*b30d1939SAndy Fiddaman}
685*b30d1939SAndy Fiddaman(fun1 false ; fun1 false ; fun1 true)
686*b30d1939SAndy Fiddaman(fun1 false ; fun1 false ; fun1 true)
687*b30d1939SAndy Fiddaman)
688*b30d1939SAndy Fiddaman[[ $out == $'a=3, b=3\na=3, b=3' ]] || err_exit 'static variables in functions with initializers not working'
689*b30d1939SAndy Fiddaman
690*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
691