changeset 16979:0d5d3e53255f

test.m: Fix randomly failing %!warning test blocks (bug #35850, bug #38679). * scripts/testfun/test.m: Initialize lasterr and lastwarn to "" before running code block. Rewrite trimleft which generated its own error with "" input. Change output messages to correctly print "error" or "warning" depending on code block type. Workaround really odd bug with lastwarn function when embedded in try/catch blocks.
author Rik <rik@octave.org>
date Sat, 13 Jul 2013 16:27:49 -0700
parents 13affad7347c
children 00379f9f8773
files scripts/testfun/test.m
diffstat 1 files changed, 19 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/testfun/test.m
+++ b/scripts/testfun/test.m
@@ -395,7 +395,7 @@
         if (! strcmp (__pattern, '.'))
           __patstr = ["<",__pattern,">"];
         else
-          __patstr = "an error";
+          __patstr = ifelse (__warning, "a warning", "an error");
         endif
       endif
       try
@@ -411,17 +411,25 @@
         __success = 0;
         __warnstate = warning ("query", "quiet");
         warning ("on", "quiet");
+        ## Clear error and warning strings before starting
+        lasterr ("");
+        lastwarn ("");
         try
+          ## FIXME: lastwarn () must be called once from *WITHIN* the try block
+          ##        or subsequent warning/lastwarn statements may fail.
+          ##        Likely this is something to do with the specialness of
+          ##        the try block which is disabling normal errors.
+          lastwarn ();
           eval (sprintf ("__test__(%s);", __shared));
           if (! __warning)
             __msg = sprintf ("%serror failed.\nExpected %s but got no error\n",
                              __signal_fail, __patstr);
           else
             if (! isempty (__id))
-              [~, __err] = lastwarn;
+              [~, __err] = lastwarn ();
               __mismatch = ! strcmp (__err, __id);
             else
-              __err = trimerr (lastwarn, "warning");
+              __err = trimerr (lastwarn (), "warning");
               __mismatch = isempty (regexp (__err, __pattern, "once"));
             endif
             warning (__warnstate.state, "quiet");
@@ -430,7 +438,7 @@
                                 "Expected %s but got no warning\n"],
                                __signal_fail, __patstr);
             elseif (__mismatch)
-              __msg = sprintf ("%serror failed.\nExpected %s but got <%s>\n",
+              __msg = sprintf ("%swarning failed.\nExpected %s but got <%s>\n",
                                __signal_fail, __patstr, __err);
             else
               __success = 1;
@@ -439,10 +447,10 @@
 
         catch
           if (! isempty (__id))
-            [~, __err] = lasterr;
+            [~, __err] = lasterr ();
             __mismatch = ! strcmp (__err, __id);
           else
-            __err = trimerr (lasterr, "error");
+            __err = trimerr (lasterr (), "error");
             __mismatch = isempty (regexp (__err, __pattern, "once"));
           endif
           warning (__warnstate.state, "quiet");
@@ -645,20 +653,17 @@
 
 ## Strip '.*prefix:' from '.*prefix: msg\n' and strip trailing blanks.
 function msg = trimerr (msg, prefix)
-  idx = index (msg, cstrcat (prefix, ":"));
+  idx = index (msg, [prefix ":"]);
   if (idx > 0)
     msg(1:idx+length(prefix)) = [];
   endif
-  msg = trimleft (deblank (msg));
+  msg = strtrim (msg);
 endfunction
 
 ## Strip leading blanks from string.
 function str = trimleft (str)
-  idx = find (isspace (str));
-  leading = find (idx == 1:length (idx));
-  if (! isempty (leading))
-    str = str(leading(end)+1:end);
-  endif
+  idx = find (! isspace (str), 1);
+  str = str(idx:end);
 endfunction
 
 ## Make a structure out of the named variables
@@ -686,6 +691,7 @@
   endif
 endfunction
 
+
 ### example from toeplitz
 %!shared msg1,msg2
 %! msg1="C must be a vector";