# Tests for the zsh/param/static module %prep zmodload zsh/param/static %test typeset scalar_test=toplevel () { print $scalar_test static scalar_test print $+scalar_test unset scalar_test print $+scalar_test } print $scalar_test 0:basic scope hiding >toplevel >1 >0 >toplevel typeset scalar_test=toplevel print $scalar_test () { static scalar_test=function print $scalar_test } print $scalar_test 0:enter and exit a scope >toplevel >function >toplevel print $+unset_test () { static unset_test print $+unset_test unset_test=setme print $unset_test } print $+unset_test 0:variable defined only in scope >0 >1 >setme >0 # Depends on zsh-5.0.9 typeset keyword typeset -a array_test=(top level) () { local -Sa array_test=(in function) () { static array_test print $+array_test } print $array_test } print $array_test 0:nested scope with different type, correctly restored >1 >in function >top level typeset -a array_test=(top level) () { static array_test array_test=(in function) } 1:type of static may not be changed by assignment ?(anon):2: array_test: attempt to assign array value to non-array typeset -A hash_test=(top level) () { setopt localoptions noglob static hash_test[top] } 1:associative array fields may not be static ?(anon):static:2: hash_test[top]: can't create local array elements () { static path } 1:tied params may not be static, part 1 ?(anon):static:1: can't change scope of existing param: path () { static PATH } 1:tied params may not be static, part 2 ?(anon):static:1: can't change scope of existing param: PATH () { static -h path print X$path } 0:statics may hide tied paramters >X # Deliberate type mismatch here typeset -a hash_test=(top level) typeset -p hash_test inner () { static -p hash_test print ${(t)hash_test} ${(kv)hash_test} } outer () { local -SA hash_test=(in function) typeset -p hash_test inner } outer print ${(kv)hash_test} 0:static hides value from surrounding scope in nested scope >typeset -a hash_test >hash_test=( top level ) >typeset -A hash_test >hash_test=( in function ) >typeset -a hash_test >hash_test=( top level ) >array-local top level >top level F:note "typeset" rather than "static" in output from outer () { static -a array_test local array_test=scalar } 1:static cannot be re-declared as local ?(anon):local:2: array_test: inconsistent type for assignment () { local hash_test=scalar static -A hash_test } 1:local cannot be re-declared as static ?(anon):static:2: can't change scope of existing param: hash_test inner () { print $+scalar_test $ZTST_testdir/../Src/zsh -fc 'print X $scalar_test' } () { static -x scalar_test=whaat $ZTST_testdir/../Src/zsh -fc 'print X $scalar_test' inner print Y $scalar_test } 0:exported static behaves like a local, part 1 >X whaat >0 >X whaat >Y whaat inner () { typeset -p array_test $ZTST_testdir/../Src/zsh -fc 'print X $array_test' } () { local -Sax array_test=(whaat) print Y $array_test $ZTST_testdir/../Src/zsh -fc 'print X $array_test' inner } 0:exported static behaves like a local, part 2 (arrays do not export) ?inner:typeset:1: no such variable: array_test >Y whaat >X >X inner () { print $+scalar_test $ZTST_testdir/../Src/zsh -fc 'print X $scalar_test' } () { static scalar_test=whaat export scalar_test $ZTST_testdir/../Src/zsh -fc 'print X $scalar_test' inner () { print $+scalar_test $ZTST_testdir/../Src/zsh -fc 'print X $scalar_test' } print Y $scalar_test } 0:exported static behaves like a local, part 3 (export does not change scope) >X whaat >0 >X whaat >0 >X whaat >Y whaat typeset -A hash_test=(top level) () { local -SA hash_test=(in function) () { print X ${(kv)hash_test} } print Y ${(kv)hash_test} } print ${(kv)hash_test} 0:statics are not visible in anonymous functions, part 1 >X top level >Y in function >top level typeset -A hash_test=(top level) () { local -SA hash_test=(in function) () { print X ${(kv)hash_test} hash_test[in]=deeper } print Y ${(kv)hash_test} } print ${(okv)hash_test} 0:statics are not visible in anonymous functions, part 2 >X top level >Y in function >deeper in level top typeset -A hash_test=(top level) () { local -Sa array_test=(in function) local -SA hash_test=($array_test) () { print X ${(kv)hash_test} hash_test=(even deeper) array_test+=(${(kv)hash_test}) } print Y ${(kv)hash_test} Z $array_test } print ${(kv)hash_test} 0:statics are not visible in anonymous functions, part 3 >X top level >Y in function Z in function >even deeper typeset -A hash_test=(top level) () { local -SA hash_test=(in function) () { print X ${(kv)hash_test} unset hash_test } print Y ${(kv)hash_test} } print ${(t)hash_test} ${(kv)hash_test} 0:statics are not visible in anonymous functions, part 4 >X top level >Y in function > # Subshell because otherwise this silently dumps core when broken ( () { static SECONDS } ) 1:special parameters cannot be made static ?(anon):static: can't change scope of existing param: SECONDS () { static -h SECONDS } 0:static parameter may hide a special parameter