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