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