changeset 26247:86217421a37f

__parse_movargs__.m: Accept dimension and nanflag arguments. * __parse_movargs__.m: Rewrite to accept both dimension and nanflag arguments as both may be present simultaneously. Create a new first argument to the function, caller, which is a string used in error messages so that the correct function is identified as the source of the error. Add BIST tests for function. * movmin.m: Call __parse_movargs__ with first argument of "movmin".
author Rik <rik@octave.org>
date Sun, 16 Dec 2018 13:53:54 -0800
parents 7adb62e4cc39
children 8a0778f549e8
files scripts/signal/__parse_movargs__.m scripts/statistics/movmin.m
diffstat 2 files changed, 64 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/signal/__parse_movargs__.m	Sun Dec 16 12:48:00 2018 -0800
+++ b/scripts/signal/__parse_movargs__.m	Sun Dec 16 13:53:54 2018 -0800
@@ -27,22 +27,73 @@
 ## @seealso{movfun}
 ## @end deftypefn
 
-function args = __parse_movargs__ (varargin)
+function args = __parse_movargs__ (caller, varargin)
+
+  args = {};
 
-  if (isscalar (varargin))
-    ## Either DIM or NANCOND
-    if (ischar (varargin{1}))
-      args = {"nancond", varargin{1}};
+  have_dim = have_nancond = false;
+  imax = numel (varargin);
+  i = 1;
+  while (i <= imax)
+    arg = varargin{i};
+    if (ischar (arg))
+      if (any (strcmpi (arg, {"omitnan", "includenan"})))
+        args(end+(1:2)) = {"nancond", arg};
+        have_nancond = true;
+      else
+        i += 1;  # Prop/Val pair
+        if (i > imax)
+          error ([caller ": property '%s' missing value argument"], arg);
+        endif
+        args(end+(1:2)) = {arg, varargin{i}};
+      endif
+    elseif (isnumeric (arg))
+      args(end+(1:2)) = {"dim", arg};
+      have_dim = true;
     else
-      args = {"dim", varargin{1}};
+      error ("Octave:invalid-input-arg",
+             [caller ": invalid input at position %d"], i);
+      args(end+1) = arg;
     endif
-  else
-    ## Name,Value pairs
-    args = varargin;
-  endif
+
+    i += 1;  # Advance to next element
+    if (have_nancond && have_dim)
+      args = [args, varargin(i:end)];
+      break;
+    endif
+  endwhile
 
 endfunction
 
 
-## No tests needed for internal function
-%!assert (1)
+%!test
+%! caller = "tstblock";
+%! vararg = {5};
+%! assert (__parse_movargs__ (caller, vararg{:}), {"dim", 5});
+%! vararg = {"Endpoints", "shrink", 3};
+%! assert (__parse_movargs__ (caller, vararg{:}),
+%!         {"Endpoints", "shrink", "dim", 3});
+%! vararg = {"includenan", 2};
+%! assert (__parse_movargs__ (caller, vararg{:}),
+%!         {"nancond", "includenan", "dim", 2});
+
+%!test
+%! caller = "tstblock";
+%! vararg = {"INCLUDENAN"};
+%! assert (__parse_movargs__ (caller, vararg{:}), {"nancond", "INCLUDENAN"});
+%! vararg = {"Endpoints", "fill", "OMITNAN"};
+%! assert (__parse_movargs__ (caller, vararg{:}),
+%!         {"Endpoints", "fill", "nancond", "OMITNAN"});
+%! vararg = {2, "includenan"};
+%! assert (__parse_movargs__ (caller, vararg{:}),
+%!         {"dim", 2, "nancond", "includenan"});
+
+%!test
+%! caller = "tstblock";
+%! vararg = {};
+%! assert (__parse_movargs__ (caller, vararg{:}), {});
+%! vararg = {"Endpoints", "fill"};
+%! assert (__parse_movargs__ (caller, vararg{:}), {"Endpoints", "fill"});
+%! vararg = {5, "omitnan", "Endpoints", "fill"};
+%! assert (__parse_movargs__ (caller, vararg{:}),
+%!         {"dim", 5, "nancond", "omitnan", "Endpoints", "fill"});
--- a/scripts/statistics/movmin.m	Sun Dec 16 12:48:00 2018 -0800
+++ b/scripts/statistics/movmin.m	Sun Dec 16 13:53:54 2018 -0800
@@ -33,7 +33,7 @@
 ## @end deftypefn
 
 function y = movmin (x, wlen, varargin)
-  y = movfun (@min, x, wlen, __parse_movargs__ (varargin{:}){:});
+  y = movfun (@min, x, wlen, __parse_movargs__ ("movmin", varargin{:}){:});
 endfunction