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 Fiddamanfunction err_exit
21*b30d1939SAndy Fiddaman{
22*b30d1939SAndy Fiddaman	print -u2 -n "\t"
23*b30d1939SAndy Fiddaman	print -u2 -r ${Command}[$1]: "${@:2}"
24*b30d1939SAndy Fiddaman	(( Errors < 127 && Errors++ ))
25*b30d1939SAndy Fiddaman}
26*b30d1939SAndy Fiddamanalias err_exit='err_exit $LINENO'
27*b30d1939SAndy Fiddaman
28*b30d1939SAndy Fiddamanset -o nounset
29*b30d1939SAndy FiddamanCommand=${0##*/}
30*b30d1939SAndy Fiddamaninteger Errors=0
31*b30d1939SAndy Fiddaman
32*b30d1939SAndy Fiddamanset -o nounset
33*b30d1939SAndy Fiddaman
34*b30d1939SAndy Fiddamantypeset tmp
35*b30d1939SAndy Fiddaman
36*b30d1939SAndy Fiddaman# create temporary test directory
37*b30d1939SAndy Fiddamantmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
38*b30d1939SAndy Fiddamantrap "cd /; rm -rf $tmp" EXIT
39*b30d1939SAndy Fiddamancd $tmp || exit
40*b30d1939SAndy Fiddaman
41*b30d1939SAndy Fiddamanfunction test_arithmetric_expression_accesss_array_element_through_nameref
42*b30d1939SAndy Fiddaman{
43*b30d1939SAndy Fiddaman        compound out=( typeset stdout stderr ; integer res )
44*b30d1939SAndy Fiddaman	compound -r -a tests=(
45*b30d1939SAndy Fiddaman		(
46*b30d1939SAndy Fiddaman			cmd='@@TYPE@@ -a @@VAR@@ ;  @@VAR@@[1]=90 ;       function x { nameref nz=$1 ;              print " $(( round(nz) ))==$(( round($nz) ))" ; } ; x @@VAR@@[1]'		; stdoutpattern=' 90==90'
47*b30d1939SAndy Fiddaman		)
48*b30d1939SAndy Fiddaman		(
49*b30d1939SAndy Fiddaman			cmd='@@TYPE@@ -a @@VAR@@=( [1]=90 ) ;             function x { nameref nz=$1 ;              print " $(( round(nz) ))==$(( round($nz) ))" ; } ; x @@VAR@@[1]'		; stdoutpattern=' 90==90'
50*b30d1939SAndy Fiddaman		)
51*b30d1939SAndy Fiddaman		(
52*b30d1939SAndy Fiddaman			cmd='@@TYPE@@ -a @@VAR@@ ;  @@VAR@@[1][3]=90 ;    function x { nameref nz=$1 ;               print " $(( round(nz) ))==$(( round($nz) ))" ; } ; x @@VAR@@[1][3]'	; stdoutpattern=' 90==90'
53*b30d1939SAndy Fiddaman		)
54*b30d1939SAndy Fiddaman		(
55*b30d1939SAndy Fiddaman			cmd='@@TYPE@@ -a @@VAR@@=( [1][3]=90 ) ;          function x { nameref nz=$1 ;               print " $(( round(nz) ))==$(( round($nz) ))" ; } ; x @@VAR@@[1][3]'	; stdoutpattern=' 90==90'
56*b30d1939SAndy Fiddaman		)
57*b30d1939SAndy Fiddaman		(
58*b30d1939SAndy Fiddaman			cmd='@@TYPE@@ -a @@VAR@@ ;  @@VAR@@[1][3][5]=90 ; function x { nameref nz=$1 ;               print " $(( round(nz) ))==$(( round($nz) ))" ; } ; x @@VAR@@[1][3][5]'	; stdoutpattern=' 90==90'
59*b30d1939SAndy Fiddaman		)
60*b30d1939SAndy Fiddaman		(
61*b30d1939SAndy Fiddaman			cmd='@@TYPE@@ -a @@VAR@@=( [1][3][5]=90 ) ;       function x { nameref nz=$1 ;               print " $(( round(nz) ))==$(( round($nz) ))" ; } ; x @@VAR@@[1][3][5]'	; stdoutpattern=' 90==90'
62*b30d1939SAndy Fiddaman		)
63*b30d1939SAndy Fiddaman		(
64*b30d1939SAndy Fiddaman			cmd='@@TYPE@@ -a @@VAR@@ ;  @@VAR@@[1][3][5]=90 ; function x { nameref nz=${1}[$2][$3][$4] ; print " $(( round(nz) ))==$(( round($nz) ))" ; } ; x @@VAR@@ 1 3 5'	; stdoutpattern=' 90==90'
65*b30d1939SAndy Fiddaman		)
66*b30d1939SAndy Fiddaman		(
67*b30d1939SAndy Fiddaman			cmd='@@TYPE@@ -A @@VAR@@ ;  @@VAR@@[1]=90 ;       function x { nameref nz=$1 ;               print " $(( round(nz) ))==$(( round($nz) ))" ; } ; x @@VAR@@[1]'		; stdoutpattern=' 90==90'
68*b30d1939SAndy Fiddaman		)
69*b30d1939SAndy Fiddaman		(
70*b30d1939SAndy Fiddaman			cmd='@@TYPE@@ -A @@VAR@@=( [1]=90 ) ;             function x { nameref nz=$1 ;               print " $(( round(nz) ))==$(( round($nz) ))" ; } ; x @@VAR@@[1]'		; stdoutpattern=' 90==90'
71*b30d1939SAndy Fiddaman		)
72*b30d1939SAndy Fiddaman	)
73*b30d1939SAndy Fiddaman
74*b30d1939SAndy Fiddaman	typeset testname
75*b30d1939SAndy Fiddaman	integer i
76*b30d1939SAndy Fiddaman	typeset mode
77*b30d1939SAndy Fiddaman	typeset cmd
78*b30d1939SAndy Fiddaman
79*b30d1939SAndy Fiddaman	for (( i=0 ; i < ${#tests[@]} ; i++ )) ; do
80*b30d1939SAndy Fiddaman		# fixme: This list should include "typeset -lX" and "typeset -X" but ast-ksh.2010-03-09 fails like this:
81*b30d1939SAndy Fiddaman		# 'typeset -X -a z ;  z[1][3]=90 ; function x { nameref nz=$1 ; print " $(( nz ))==$(( $nz ))" ; } ; x z[1][3]'
82*b30d1939SAndy Fiddaman		# + typeset -X -a z
83*b30d1939SAndy Fiddaman		# + z[1][3]=90
84*b30d1939SAndy Fiddaman		# + x 'z[1][3]'
85*b30d1939SAndy Fiddaman		# /home/test001/bin/ksh[1]: x: line 1: x1.68000000000000000000000000000000p: no parent
86*b30d1939SAndy Fiddaman		for ty in \
87*b30d1939SAndy Fiddaman			'typeset' \
88*b30d1939SAndy Fiddaman			'integer' \
89*b30d1939SAndy Fiddaman			'float' \
90*b30d1939SAndy Fiddaman			'typeset -i' \
91*b30d1939SAndy Fiddaman			'typeset -si' \
92*b30d1939SAndy Fiddaman			'typeset -li' \
93*b30d1939SAndy Fiddaman			'typeset -E' \
94*b30d1939SAndy Fiddaman			'typeset -F' \
95*b30d1939SAndy Fiddaman			'typeset -X' \
96*b30d1939SAndy Fiddaman			'typeset -lE' \
97*b30d1939SAndy Fiddaman			'typeset -lX' \
98*b30d1939SAndy Fiddaman			'typeset -lF' ; do
99*b30d1939SAndy Fiddaman			for mode in \
100*b30d1939SAndy Fiddaman				'plain' \
101*b30d1939SAndy Fiddaman				'in_compound' \
102*b30d1939SAndy Fiddaman				'in_indexed_compound_array' \
103*b30d1939SAndy Fiddaman				'in_2d_indexed_compound_array' \
104*b30d1939SAndy Fiddaman				'in_4d_indexed_compound_array' \
105*b30d1939SAndy Fiddaman				'in_associative_compound_array' \
106*b30d1939SAndy Fiddaman				'in_compound_nameref' \
107*b30d1939SAndy Fiddaman				'in_indexed_compound_array_nameref' \
108*b30d1939SAndy Fiddaman				'in_2d_indexed_compound_array_nameref' \
109*b30d1939SAndy Fiddaman				'in_4d_indexed_compound_array_nameref' \
110*b30d1939SAndy Fiddaman				'in_associative_compound_array_nameref' \
111*b30d1939SAndy Fiddaman				 ; do
112*b30d1939SAndy Fiddaman				nameref tst=tests[i]
113*b30d1939SAndy Fiddaman
114*b30d1939SAndy Fiddaman				cmd="${tst.cmd//@@TYPE@@/${ty}}"
115*b30d1939SAndy Fiddaman
116*b30d1939SAndy Fiddaman				case "${mode}" in
117*b30d1939SAndy Fiddaman					'plain')
118*b30d1939SAndy Fiddaman						cmd="${cmd//@@VAR@@/z}"
119*b30d1939SAndy Fiddaman						;;
120*b30d1939SAndy Fiddaman
121*b30d1939SAndy Fiddaman					'in_compound')
122*b30d1939SAndy Fiddaman						cmd="compound c ; ${cmd//@@VAR@@/c.z}"
123*b30d1939SAndy Fiddaman						;;
124*b30d1939SAndy Fiddaman					'in_indexed_compound_array')
125*b30d1939SAndy Fiddaman						cmd="compound -a c ; ${cmd//@@VAR@@/c[11].z}"
126*b30d1939SAndy Fiddaman						;;
127*b30d1939SAndy Fiddaman					'in_2d_indexed_compound_array')
128*b30d1939SAndy Fiddaman						cmd="compound -a c ; ${cmd//@@VAR@@/c[17][19].z}"
129*b30d1939SAndy Fiddaman						;;
130*b30d1939SAndy Fiddaman					'in_4d_indexed_compound_array')
131*b30d1939SAndy Fiddaman						cmd="compound -a c ; ${cmd//@@VAR@@/c[17][19][23][27].z}"
132*b30d1939SAndy Fiddaman						;;
133*b30d1939SAndy Fiddaman					'in_associative_compound_array')
134*b30d1939SAndy Fiddaman						cmd="compound -A c ; ${cmd//@@VAR@@/c[info].z}"
135*b30d1939SAndy Fiddaman						;;
136*b30d1939SAndy Fiddaman
137*b30d1939SAndy Fiddaman					'in_compound_nameref')
138*b30d1939SAndy Fiddaman						cmd="compound c ; nameref ncr=c.z ; ${cmd//@@VAR@@/ncr}"
139*b30d1939SAndy Fiddaman						;;
140*b30d1939SAndy Fiddaman					'in_indexed_compound_array_nameref')
141*b30d1939SAndy Fiddaman						cmd="compound -a c ; nameref ncr=c[11].z ; ${cmd//@@VAR@@/ncr}"
142*b30d1939SAndy Fiddaman						;;
143*b30d1939SAndy Fiddaman					'in_2d_indexed_compound_array_nameref')
144*b30d1939SAndy Fiddaman						cmd="compound -a c ; nameref ncr=c[17][19].z ; ${cmd//@@VAR@@/ncr}"
145*b30d1939SAndy Fiddaman						;;
146*b30d1939SAndy Fiddaman					'in_4d_indexed_compound_array_nameref')
147*b30d1939SAndy Fiddaman						cmd="compound -a c ; nameref ncr=c[17][19][23][27].z ; ${cmd//@@VAR@@/ncr}"
148*b30d1939SAndy Fiddaman						;;
149*b30d1939SAndy Fiddaman					'in_associative_compound_array_nameref')
150*b30d1939SAndy Fiddaman						cmd="compound -A c ; nameref ncr=c[info].z ; ${cmd//@@VAR@@/ncr}"
151*b30d1939SAndy Fiddaman						;;
152*b30d1939SAndy Fiddaman					*)
153*b30d1939SAndy Fiddaman						err_exit "Unexpected mode ${mode}"
154*b30d1939SAndy Fiddaman						;;
155*b30d1939SAndy Fiddaman				esac
156*b30d1939SAndy Fiddaman
157*b30d1939SAndy Fiddaman				testname="${0}/${cmd}"
158*b30d1939SAndy Fiddaman#set -x
159*b30d1939SAndy Fiddaman				out.stderr="${ { out.stdout="${ ${SHELL} -o nounset -o errexit -c "${cmd}" ; (( out.res=$? )) ; }" ; } 2>&1 ; }"
160*b30d1939SAndy Fiddaman#set +x
161*b30d1939SAndy Fiddaman
162*b30d1939SAndy Fiddaman			        [[ "${out.stdout}" == ${tst.stdoutpattern}      ]] || err_exit "${testname}: Expected stdout to match $(printf '%q\n' "${tst.stdoutpattern}"), got $(printf '%q\n' "${out.stdout}")"
163*b30d1939SAndy Fiddaman       				[[ "${out.stderr}" == ''			]] || err_exit "${testname}: Expected empty stderr, got $(printf '%q\n' "${out.stderr}")"
164*b30d1939SAndy Fiddaman				(( out.res == 0 )) || err_exit "${testname}: Unexpected exit code ${out.res}"
165*b30d1939SAndy Fiddaman			done
166*b30d1939SAndy Fiddaman		done
167*b30d1939SAndy Fiddaman	done
168*b30d1939SAndy Fiddaman
169*b30d1939SAndy Fiddaman	return 0
170*b30d1939SAndy Fiddaman}
171*b30d1939SAndy Fiddaman
172*b30d1939SAndy Fiddamanfunction test_has_iszero
173*b30d1939SAndy Fiddaman{
174*b30d1939SAndy Fiddaman	typeset str
175*b30d1939SAndy Fiddaman	integer i
176*b30d1939SAndy Fiddaman
177*b30d1939SAndy Fiddaman	typeset -r -a tests=(
178*b30d1939SAndy Fiddaman		'(( iszero(0)   )) && print "OK"'
179*b30d1939SAndy Fiddaman		'(( iszero(0.)  )) && print "OK"'
180*b30d1939SAndy Fiddaman		'(( iszero(-0)  )) && print "OK"'
181*b30d1939SAndy Fiddaman		'(( iszero(-0.) )) && print "OK"'
182*b30d1939SAndy Fiddaman		'float n=0.  ; (( iszero(n) )) && print "OK"'
183*b30d1939SAndy Fiddaman		'float n=+0. ; (( iszero(n) )) && print "OK"'
184*b30d1939SAndy Fiddaman		'float n=-0. ; (( iszero(n) )) && print "OK"'
185*b30d1939SAndy Fiddaman		'float n=1.  ; (( iszero(n) )) || print "OK"'
186*b30d1939SAndy Fiddaman		'float n=1.  ; (( iszero(n-1.) )) && print "OK"'
187*b30d1939SAndy Fiddaman		'float n=-1. ; (( iszero(n+1.) )) && print "OK"'
188*b30d1939SAndy Fiddaman	)
189*b30d1939SAndy Fiddaman
190*b30d1939SAndy Fiddaman	for (( i=0 ; i < ${#tests[@]} ; i++ )) ; do
191*b30d1939SAndy Fiddaman		str="$( ${SHELL} -o errexit -c "${tests[i]}" 2>&1 )" || err_exit "test $i: returned non-zero exit code $?"
192*b30d1939SAndy Fiddaman		[[ "${str}" == 'OK' ]] || err_exit "test $i: expected 'OK', got '${str}'"
193*b30d1939SAndy Fiddaman	done
194*b30d1939SAndy Fiddaman
195*b30d1939SAndy Fiddaman	return 0
196*b30d1939SAndy Fiddaman}
197*b30d1939SAndy Fiddaman
198*b30d1939SAndy Fiddaman# run tests
199*b30d1939SAndy Fiddamantest_arithmetric_expression_accesss_array_element_through_nameref
200*b30d1939SAndy Fiddamantest_has_iszero
201*b30d1939SAndy Fiddaman
202*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
203