Bug #9572 fixed - assert_checkerror did not check multi lines errors. 25/5825/2
Allan CORNET [Thu, 5 Jan 2012 12:57:10 +0000 (13:57 +0100)]
Change-Id: Ie4f3695ebbd744908accfcd7e171c9804c219926

scilab/CHANGES_5.4.X
scilab/modules/development_tools/help/en_US/assert/assert_checkerror.xml
scilab/modules/development_tools/macros/assert/assert_checkerror.sci
scilab/modules/development_tools/tests/nonreg_tests/bug_9572.dia.ref [new file with mode: 0644]
scilab/modules/development_tools/tests/nonreg_tests/bug_9572.tst [new file with mode: 0644]
scilab/modules/development_tools/tests/unit_tests/assert/checkerror.dia.ref
scilab/modules/development_tools/tests/unit_tests/assert/checkerror.tst

index e40beee..8aadfbf 100644 (file)
@@ -101,6 +101,8 @@ Bug fixes
 * Bug #9197 fixed - Unitary test examples in toolbox_skeleton
                     and xcos_toolbox_skeleton did not use assert functions.
 
+* Bug #9572 fixed - assert_checkerror did not check multi lines errors.
+
 * Bug #9811 fixed - Output message of fminsearch was wrongly set.
 
 * Bug #10017 fixed - The unitary test for bdiag used a "strange" comparison
index 9c9b9a9..70ff011 100644 (file)
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
 <!--
  * 
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  -->
-
-<refentry version="5.0-subset Scilab" xml:id="assert_checkerror" xml:lang="en"
-          xmlns="http://docbook.org/ns/docbook"
-          xmlns:xlink="http://www.w3.org/1999/xlink"
-          xmlns:svg="http://www.w3.org/2000/svg"
-          xmlns:ns3="http://www.w3.org/1999/xhtml"
-          xmlns:mml="http://www.w3.org/1998/Math/MathML"
-          xmlns:db="http://docbook.org/ns/docbook">
-
-
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns3="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" version="5.0-subset Scilab" xml:id="assert_checkerror" xml:lang="en">
   <refnamediv>
     <refname>assert_checkerror</refname>
     <refpurpose>Check that an instruction produces the expected error.</refpurpose>
   </refnamediv>
-
-
-
   <refsynopsisdiv>
     <title>Calling Sequence</title>
     <synopsis>
@@ -39,7 +26,6 @@
 
     </synopsis>
   </refsynopsisdiv>
-
   <refsection>
     <title>Parameters</title>
     <variablelist>
@@ -52,7 +38,7 @@
       <varlistentry>
         <term>expectedmsg :</term>
         <listitem>
-          <para> a 1-by-1 matrix of strings, the error message to be produced</para>
+          <para> a string or a string vector, the error message to be produced</para>
         </listitem>
       </varlistentry>
       <varlistentry>
@@ -83,7 +69,6 @@
       </varlistentry>
     </variablelist>
   </refsection>
-
   <refsection>
     <title>Description</title>
     <para>
     </para>
     <para>
       If the error message is not expected or the error number is not expected,
-      <itemizedlist>
-        <listitem>
-          <para>if the errmsg output variable is not used, an error is generated,</para>
-        </listitem>
-        <listitem>
-          <para>if the errmsg output variable is used, no error is generated.</para>
-        </listitem>
-      </itemizedlist>
+      <itemizedlist><listitem><para>if the errmsg output variable is not used, an error is generated,</para></listitem><listitem><para>if the errmsg output variable is used, no error is generated.</para></listitem></itemizedlist>
     </para>
     <para>
       The goal of this function is to enable the tester to check the error
       cases in a simplified framework.
         Checking the error messages of a function has the following advantages:
-        <itemizedlist>
-          <listitem>
-            <para>
+        <itemizedlist><listitem><para>
               it checks that the correct error is generated when needed,
-            </para>
-          </listitem>
-          <listitem>
-            <para>
+            </para></listitem><listitem><para>
               it checks that the error message is correctly formatted,
-            </para>
-          </listitem>
-          <listitem>
-            <para>
+            </para></listitem><listitem><para>
               it checks that the error message is correctly localized.
-            </para>
-          </listitem>
-        </itemizedlist>
+            </para></listitem></itemizedlist>
     </para>
     <para>
       The expected message can be a localized message.
       the computed error message.
     </para>
   </refsection>
-
   <refsection>
     <title>Examples</title>
     <para>
       We give several examples of using the <literal>assert_checkerror</literal> function. 
       We first have to define a function to be tested. 
     </para>
-
     <para>
       The following function <literal>f</literal> generates an error when
       the number of input arguments in wrong or the type of <literal>x</literal> is wrong.
     </para>
-    <programlisting role="example">
-      <![CDATA[
+    <programlisting role="example"><![CDATA[
 function y = f(x)
   [lhs,rhs]=argn()
   if ( rhs <> 1 ) then
@@ -178,8 +143,7 @@ function y = f(x)
   end
   y = x
 endfunction
-   ]]>
-    </programlisting>
+   ]]></programlisting>
     <para>
       Our task is to check the error messages produced by this function.
       The two following tests pass: the error message is the expected one. 
@@ -191,62 +155,52 @@ endfunction
          to format the message and to convert the "%s" and "%d" formats into 
          their actual values.
     </para>
-    <programlisting role="example">
-      <![CDATA[
+    <programlisting role="example"><![CDATA[
 lcl1="%s: Wrong number of input argument: %d expected.\n";
 assert_checkerror ( "y=f()"      , lcl1 , [] , "f" , 1);
 lcl2="%s: Wrong type for argument %d: Matrix expected.\n";
 assert_checkerror ( "y=f(""a"")" , lcl2 , [] , "f" , 1);
-   ]]>
-    </programlisting>
+   ]]></programlisting>
     <para>
       On the other hand, if we make the assumption that the current locale language 
       is english, we could as well use the following statement. 
       But this is not a recommended practice, since the test will 
       fail if the current locale is French, for example. 
     </para>
-    <programlisting role="example">
-      <![CDATA[
+    <programlisting role="example"><![CDATA[
 assert_checkerror ( "y=f()" , "f: Wrong number of input argument: 1 expected." );
-   ]]>
-    </programlisting>
+   ]]></programlisting>
     <para>
       In the following test, we also check the error number.
     </para>
-    <programlisting role="example">
-      <![CDATA[
+    <programlisting role="example"><![CDATA[
 lcl1="%s: Wrong number of input argument: %d expected.\n";
 assert_checkerror ( "y=f()" ,      lcl1 , 10000     , "f" , 1);
 lcl2="%s: Wrong type for argument %d: Matrix expected.\n";
 assert_checkerror ( "y=f(""a"")" , lcl2 , 123456789 , "f" , 1);
-   ]]>
-    </programlisting>
+   ]]></programlisting>
     <para>
       The two following tests fail.
     </para>
-    <programlisting role="example">
-      <![CDATA[
+    <programlisting role="example"><![CDATA[
 assert_checkerror ( "y=f()" , "oups" );
 msg1=msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"f",1);
 assert_checkerror ( "y=f()" , msg1 , 12 );
-   ]]>
-    </programlisting>
+   ]]></programlisting>
     <para>
        When errmsg is given as output argument, no error is generated, as in the 
           following example. 
           Notice the content of the <literal>flag</literal> and <literal>errmsg</literal> 
           variables.
     </para>
-    <programlisting role="example">
-      <![CDATA[
+    <programlisting role="example"><![CDATA[
 // A test which pass: flag is %t, errmsg is empty
 msg1=msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"f",1);
 [flag,errmsg] = assert_checkerror ( "y=f()" , msg1 )
 // A test which fail: flag is %f, errmsg is not empty
 [flag,errmsg] = assert_checkerror ( "y=f()" , "oups" )
 
-]]>
-    </programlisting>
+]]></programlisting>
     <para>
       The messages in the two following tests 
          are localized, so that they can work whatever the current language is. 
@@ -254,31 +208,21 @@ msg1=msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"f",
          we directly localize the message, which is less short, but 
          is a perfectly valid code.
     </para>
-    <programlisting role="example">
-      <![CDATA[
+    <programlisting role="example"><![CDATA[
 msg1=msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"f",1);
 assert_checkerror ( "y=f()"      , msg1 );
 msg2=msprintf(gettext("%s: Wrong type for argument %d: Matrix expected.\n"),"f",1);
 assert_checkerror ( "y=f(""a"")" , msg2 );
-   ]]>
-   
-    <para>
+   ]]><para>
     It may happen that we want to just test the error number, but not the 
     error message. 
 The following script just checks that the generated error number is 123456789 
 when the first argument is not a matrix of doubles: 
 we do not check the error message.
-    </para>
-
-    <programlisting role="example">
-      <![CDATA[
+    </para><programlisting role="example"><![CDATA[
 assert_checkerror("f(""foo"")",[],123456789);
-]]>
-    </programlisting>
-
-    </programlisting>
+]]></programlisting></programlisting>
   </refsection>
-
   <refsection>
     <title>Authors</title>
     <simplelist type="vert">
index a7d0982..c5c8265 100644 (file)
@@ -1,4 +1,5 @@
 // Copyright (C) 2010 - 2011 - DIGITEO - Michael Baudin
+// Copyright (C) 2012 - DIGITEO - Allan CORNET
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
@@ -16,9 +17,9 @@ function [flag,errmsg] = assert_checkerror ( varargin )
     end
     //
     // Get arguments
-    instr = varargin(1)
-    expectedmsg = varargin(2)
-    expectederrnb = argindefault ( rhs , varargin , 3 , [] )
+    instr = varargin(1);
+    expectedmsg = varargin(2);
+    expectederrnb = argindefault ( rhs , varargin , 3 , [] );
     //
     // Check types of variables
     if ( typeof(instr) <> "string" ) then
@@ -42,8 +43,8 @@ function [flag,errmsg] = assert_checkerror ( varargin )
         error(errmsg)
     end
     if (expectedmsg<>[]) then
-        if ( size(expectedmsg,"*") <> 1 ) then
-            errmsg = sprintf ( gettext ( "%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n") , "assert_checkerror" , 2 , 1 , 1 )
+        if ((size(expectedmsg, "r") > 1) & (size(expectedmsg, "c") > 1))
+            errmsg = sprintf ( gettext ( "%s: Wrong size for input argument #%d: A string vector expected.\n") , "assert_checkerror" , 2 );
             error(errmsg)
         end
     end
@@ -82,7 +83,7 @@ function [flag,errmsg] = assert_checkerror ( varargin )
     end
     //
     // Get the error
-    compmsg = lasterror()
+    compmsg = lasterror();
     //
     // Initialize output arguments
     flag = %t
@@ -94,7 +95,7 @@ function [flag,errmsg] = assert_checkerror ( varargin )
       instr = "expectedmsg = msprintf(localmsg, varargin(4:$))"
       ierr = execstr(instr,"errcatch")
       if ( ierr <> 0 ) then
-        fmterrmsg = lasterror()
+        fmterrmsg = lasterror();
         localstr = gettext ( "%s: Error while formatting the error message: ""%s""")
         errmsg = sprintf ( localstr , "assert_checkerror" , fmterrmsg )
         error(errmsg)
@@ -102,11 +103,24 @@ function [flag,errmsg] = assert_checkerror ( varargin )
     end
     //
     // Check the error message
-    if (expectedmsg<>[]) then
-        if ( expectedmsg <> compmsg ) then
+    if (expectedmsg <> []) then
+        isdifferentmsg = %t;
+        if size(expectedmsg, '*') <> size(compmsg, '*') then
+          isdifferentmsg = expectedmsg <> compmsg;
+        else
+          isdifferentmsg = or(expectedmsg <> compmsg);
+        end
+
+        if (isdifferentmsg) then
             flag = %f
+            if size(compmsg, '*') <> 1 then
+              compmsg = sci2exp(compmsg);
+            end
+            if size(expectedmsg, '*') <> 1 then
+              expectedmsg = sci2exp(expectedmsg);
+            end
             localstr = gettext("%s: Assertion failed: expected error message = ""%s"" while computed error message = ""%s"".")
-            errmsg = msprintf(localstr,"assert_checkerror",expectedmsg,compmsg)
+            errmsg = msprintf(localstr,"assert_checkerror", expectedmsg, compmsg)
             if ( lhs < 2 ) then
                 // If no output variable is given, generate an error
                 error ( errmsg )
diff --git a/scilab/modules/development_tools/tests/nonreg_tests/bug_9572.dia.ref b/scilab/modules/development_tools/tests/nonreg_tests/bug_9572.dia.ref
new file mode 100644 (file)
index 0000000..1f44c8c
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- JVM NOT MANDATORY -->
+// <-- Non-regression test for bug 9572 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9572
+//
+// <-- Short Description -->
+// assert_checkerror did not check multi lines errors
+cmd = "error(999,''line1'' + ascii(10) + ''line2'')";
+ref_msgerr = ['line1';'line2'];
+ref_ierr = 999;
+// first, we check without assert_checkerror
+ierr = execstr(cmd, 'errcatch');
+msgerr = lasterror();
+assert_checkequal(ierr, ref_ierr);
+assert_checkequal(msgerr, ref_msgerr);
+// real test case
+assert_checkerror(cmd, ref_msgerr);
diff --git a/scilab/modules/development_tools/tests/nonreg_tests/bug_9572.tst b/scilab/modules/development_tools/tests/nonreg_tests/bug_9572.tst
new file mode 100644 (file)
index 0000000..0a4b8e3
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- JVM NOT MANDATORY -->
+
+// <-- Non-regression test for bug 9572 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9572
+//
+// <-- Short Description -->
+// assert_checkerror did not check multi lines errors
+
+
+cmd = "error(999,''line1'' + ascii(10) + ''line2'')";
+ref_msgerr = ['line1';'line2'];
+ref_ierr = 999;
+
+// first, we check without assert_checkerror
+ierr = execstr(cmd, 'errcatch');
+msgerr = lasterror();
+assert_checkequal(ierr, ref_ierr);
+assert_checkequal(msgerr, ref_msgerr);
+
+
+// real test case
+assert_checkerror(cmd, ref_msgerr);
+
index da12b3b..5930490 100644 (file)
@@ -105,12 +105,13 @@ MY_assert_equal ( ierr , 10000 );
 lerr = lasterror();
 MY_assert_equal ( lerr , sprintf ( gettext ( "%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n") , "assert_checkerror" , 1 , 1, 1) );
 //
-// Check error message when size of 2nd argument of assert_checkerror is false
+// Check error message when size of 2nd argument of assert_checkerror is true 
+//
 instr = "assert_checkerror ( """" , ["""" """"] )";
-ierr=execstr(instr,"errcatch");
+ierr = execstr(instr, "errcatch");
 MY_assert_equal ( ierr , 10000 );
 lerr = lasterror();
-MY_assert_equal ( lerr , sprintf ( gettext ( "%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n") , "assert_checkerror" , 2 , 1, 1) );
+MY_assert_equal ( lerr , sprintf( gettext ( "%s: No error was produced while evaluating ""%s"".") , "assert_checkerror" , "") );
 //
 // Check error message when size of 3d argument of assert_checkerror is false
 instr = "assert_checkerror ( """" , """", [1 2] )";
index fb856c8..86fa8b9 100644 (file)
@@ -110,12 +110,13 @@ MY_assert_equal ( ierr , 10000 );
 lerr = lasterror();
 MY_assert_equal ( lerr , sprintf ( gettext ( "%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n") , "assert_checkerror" , 1 , 1, 1) );
 //
-// Check error message when size of 2nd argument of assert_checkerror is false
+// Check error message when size of 2nd argument of assert_checkerror is true 
+//
 instr = "assert_checkerror ( """" , ["""" """"] )";
-ierr=execstr(instr,"errcatch");
+ierr = execstr(instr, "errcatch");
 MY_assert_equal ( ierr , 10000 );
 lerr = lasterror();
-MY_assert_equal ( lerr , sprintf ( gettext ( "%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n") , "assert_checkerror" , 2 , 1, 1) );
+MY_assert_equal ( lerr , sprintf( gettext ( "%s: No error was produced while evaluating ""%s"".") , "assert_checkerror" , "") );
 //
 // Check error message when size of 3d argument of assert_checkerror is false
 instr = "assert_checkerror ( """" , """", [1 2] )";