about summary refs log tree commit diff
path: root/Test
diff options
context:
space:
mode:
Diffstat (limited to 'Test')
-rw-r--r--Test/B02typeset.ztst2
-rw-r--r--Test/V01zmodload.ztst6
-rw-r--r--Test/V04features.ztst162
3 files changed, 166 insertions, 4 deletions
diff --git a/Test/B02typeset.ztst b/Test/B02typeset.ztst
index bbc00a2ea..40669defd 100644
--- a/Test/B02typeset.ztst
+++ b/Test/B02typeset.ztst
@@ -356,8 +356,6 @@
 
  local parentenv=preserved
  fn() {
-  # The first declare works around the "not an identifier" bug with -h
-  declare \! \# \$ \* - \? @ 0
   typeset -h +g -m \*
   unset -m \*
   integer i=9
diff --git a/Test/V01zmodload.ztst b/Test/V01zmodload.ztst
index d26ae1e42..daba3e0a1 100644
--- a/Test/V01zmodload.ztst
+++ b/Test/V01zmodload.ztst
@@ -49,9 +49,11 @@
 >zmodload zsh/main
 >zmodload zsh/parameter
 
+# You use to need zmodload -i to avoid an error.
+# That has been deemed pointless, so now an attempt
+# to load a loaded module should succeed.
  zmodload zsh/main
-1:Test reloading an already-loaded module
-?(eval):zmodload:1: module zsh/main already loaded.
+0:Test reloading an already-loaded module
 
 # Loop over the modules found above and attempt to load each one.  Use
 # the -i flag in case dependencies cause multiple modules to be loaded,
diff --git a/Test/V04features.ztst b/Test/V04features.ztst
new file mode 100644
index 000000000..f5f136b65
--- /dev/null
+++ b/Test/V04features.ztst
@@ -0,0 +1,162 @@
+%prep
+
+# Do some tests on handling of features.
+# This also does some slightly more sophisticated loading and
+# unloading tests than we did in V01zmodload.ztst.
+#
+# We use zsh/datetime because it has a list of features that is short
+# but contains two types.
+
+  if ! (zmodload zsh/datetime >/dev/null 2>/dev/null); then
+    ZTST_unimplemented="can't load the zsh/datetime module for testing"
+  fi
+
+%test
+  zmodload -F zsh/datetime
+  zmodload -lF zsh/datetime
+0:Loading modules with no features
+>-b:strftime
+>-p:EPOCHSECONDS
+
+  zmodload -F zsh/datetime b:strftime
+  zmodload -lF zsh/datetime
+0:Enabling features
+>+b:strftime
+>-p:EPOCHSECONDS
+
+  zmodload -F zsh/datetime +p:EPOCHSECONDS -b:strftime
+  zmodload -lF zsh/datetime
+0:Disabling features
+>-b:strftime
+>+p:EPOCHSECONDS
+
+  zmodload -Fe zsh/datetime p:EPOCHSECONDS b:strftime
+0:Testing existing features
+
+  zmodload -Fe zsh/datetime +p:EPOCHSECONDS
+0:Testing features are in given state (on feature is on)
+
+  zmodload -Fe zsh/datetime -p:EPOCHSECONDS
+1:Testing features are in given state (on feature is not off
+
+  zmodload -Fe zsh/datetime +p:strftime
+1:Testing features are in given state (off feature is not on)
+
+  zmodload -Fe zsh/datetime -b:strftime
+0:Testing features are in given state (off feature is off
+
+  zmodload -Fe zsh/datetime p:EPOCHSECONDS b:strftime b:mktimebetter
+1:Testing non-existent features
+
+  zmodload -FlP dtf zsh/datetime
+  for feature in b:strftime p:EPOCHSECONDS; do
+    if [[ ${${dtf[(R)?$feature]}[1]} = + ]]; then
+      print $feature is enabled
+    else
+      print $feature is disabled
+    fi
+  done
+0:Testing features via array parameter
+>b:strftime is disabled
+>p:EPOCHSECONDS is enabled
+
+  fn() {
+    local EPOCHSECONDS=scruts
+    print $EPOCHSECONDS
+    print ${(t)EPOCHSECONDS}
+  }
+  fn
+  if [[ $EPOCHSECONDS = <-> ]]; then
+    print EPOCHSECONDS is a number
+  else
+    print EPOCHSECONDS is some random piece of junk
+  fi
+  print ${(t)EPOCHSECONDS}
+0:Module special parameter is hidden by a local parameter
+>scruts
+>scalar-local
+>EPOCHSECONDS is a number
+>integer-readonly-hide-hideval-special
+
+  typeset +h EPOCHSECONDS
+  fn() {
+    local EPOCHSECONDS=scruts
+    print Didn\'t get here >&2
+  }
+  fn
+1:Unhidden readonly special can't be assigned to when made local
+?fn:1: read-only variable: EPOCHSECONDS
+
+  zmodload -u zsh/datetime
+0:Module unloaded
+
+  zmodload -e zsh/datetime
+1:Module doesn't exist when unloaded
+
+  zmodload -Fe zsh/datetime p:EPOCHSECONDS
+1:Module doesn't have features when unloaded
+
+  fn() {
+    local EPOCHSECONDS=scrimf
+    zmodload zsh/datetime
+  }
+  fn
+# status is zero because load succeded although features not all enabled
+2:Failed to add parameter if local parameter present
+?fn:2: Can't add module parameter `EPOCHSECONDS': local parameter exists
+?fn:zsh/datetime:2: error when adding parameter `EPOCHSECONDS'
+
+  zmodload -lF zsh/datetime
+0:Feature state with loading after error enabling
+>+b:strftime
+>-p:EPOCHSECONDS
+
+  zmodload -F zsh/datetime p:EPOCHSECONDS
+  zmodload -Fe zsh/datetime +p:EPOCHSECONDS
+0:Successfully added feature parameter that previously failed
+
+  fn() {
+    local EPOCHSECONDS=scrooble
+    zmodload -u zsh/datetime
+    print $EPOCHSECONDS
+  }
+  fn
+  print ${+EPOCHSECONDS}
+0:Successfully unloaded a module despite a parameter being hidden
+>scrooble
+>0
+
+  EPOCHSECONDS=(any old parameter)
+  print -l $EPOCHSECONDS
+0:Using parameter as normal after unloading is OK
+>any
+>old
+>parameter
+
+  print strftime is ${builtins[strftime]:-undefined}
+  zmodload -F zsh/datetime b:strftime
+  print strftime is ${builtins[strftime]:-undefined}
+  zmodload -F zsh/datetime -b:strftime
+  print strftime is ${builtins[strftime]:-undefined}
+0:Enabling and disabling of builtins as features
+>strftime is undefined
+>strftime is defined
+>strftime is undefined
+
+  zmodload -u zsh/datetime
+  zmodload zsh/datetime
+2:Loading won't override global parameter
+?(eval):2: Can't add module parameter `EPOCHSECONDS': parameter already exists
+?(eval):zsh/datetime:2: error when adding parameter `EPOCHSECONDS'
+
+  unset EPOCHSECONDS
+  zmodload -F zsh/datetime p:EPOCHSECONDS
+  zmodload -Fe zsh/datetime +p:EPOCHSECONDS
+0:unsetting a global parameter allows feature parameter to be enabled
+
+  zmodload -F zsh/datetime -b:strftime -p:EPOCHSECONDS
+  zmodload zsh/datetime
+  zmodload -lF zsh/datetime
+0:zmodload with no -F enables all features
+>+b:strftime
+>+p:EPOCHSECONDS