* Bug 15776 fixed: assert_checktrue/false with sparse boolean 12/20512/5
Samuel GOUGEON [Fri, 21 Sep 2018 21:43:51 +0000 (23:43 +0200)]
  http://bugzilla.scilab.org/15776

  There are no other occurrences of the modified error messages
  in the whole Scilab.

Change-Id: I9adf43790350d9230e01ee4c81a51b6678bbcbf3

scilab/CHANGES.md
scilab/modules/development_tools/macros/assert/assert_checkfalse.sci
scilab/modules/development_tools/macros/assert/assert_checktrue.sci
scilab/modules/development_tools/tests/unit_tests/assert/checkfalse.dia.ref [deleted file]
scilab/modules/development_tools/tests/unit_tests/assert/checkfalse.tst
scilab/modules/development_tools/tests/unit_tests/assert/checktrue.dia.ref [deleted file]
scilab/modules/development_tools/tests/unit_tests/assert/checktrue.tst

index 5a4fce5..2bae345 100644 (file)
@@ -625,6 +625,7 @@ Known issues
 * [#15762](http://bugzilla.scilab.org/show_bug.cgi?id=15762): `error()` refused multiline error messages.
 * [#15770](http://bugzilla.scilab.org/show_bug.cgi?id=15770): zp2ss and zp2tf unitary tests were failing
 * [#15774](http://bugzilla.scilab.org/show_bug.cgi?id=15774): `clean()` failed on sparse complex matrix.
+* [#15776](http://bugzilla.scilab.org/show_bug.cgi?id=15776): `assert_checktrue` and `assert_checkfalse` did not accept a sparse boolean input. When failing, their error message did not indicate the index of the failing entry. The failing message of `assert_checkfalse` was wrong.
 * [#15778](http://bugzilla.scilab.org/show_bug.cgi?id=15778): Deleting some rows or columns of a boolean sparse array with `= []` crashed Scilab
 * [#15779](http://bugzilla.scilab.org/show_bug.cgi?id=15779): `test_run` did not accept the wildcard * in tests names.
 * [#15796](http://bugzilla.scilab.org/show_bug.cgi?id=15796): Display after `mprintf("")` crashed Scilab (regression)
index 421c5da..d8f34ee 100644 (file)
 // along with this program.
 
 function [flag,errmsg] = assert_checkfalse ( condition )
-    //   Check that condition is false.
+    //   Check that condition is false. All its components must be False.
 
     [lhs,rhs]=argn()
     if ( rhs <> 1 ) then
-        errmsg = sprintf ( gettext ( "%s: Wrong number of input arguments: %d expected.\n") , "assert_checkfalse" , 1 )
+        errmsg = gettext("%s: Wrong number of input arguments: %d expected.\n")
+        errmsg = msprintf(errmsg, "assert_checkfalse", 1)
         error(errmsg)
     end
     //
     // Check types of variables
-    if ( typeof(condition) <> "boolean" ) then
-        errmsg = sprintf ( gettext ( "%s: Wrong type for input argument #%d: Boolean matrix expected.\n") , "assert_checkfalse" , 1 )
+    if and(typeof(condition) <> ["boolean" "boolean sparse"]) then
+        errmsg = gettext("%s: Wrong type for input argument #%d: Boolean matrix expected.\n")
+        errmsg = sprintf(errmsg, "assert_checkfalse", 1)
         error(errmsg)
     end
     //
@@ -30,13 +32,9 @@ function [flag,errmsg] = assert_checkfalse ( condition )
         errmsg = ""
     else
         flag = %f
-        if ( size(condition,"*") == 1 ) then
-            cstr = string(condition)
-        else
-            cstr = "[" + string(condition(1)) + " ...]"
-        end
-        errmsg = msprintf(gettext("%s: Assertion failed: found false entry in condition = %s"), ..
-        "assert_checkfalse",cstr)
+        k = find(condition, 1);
+        errmsg = gettext("%s: Assertion failed: Entry %%T found in condition(%d).\n")
+        errmsg = msprintf(errmsg, "assert_checkfalse", k)
         if ( lhs < 2 ) then
             // If no output variable is given, generate an error
             assert_generror ( errmsg )
index 800542b..d687c46 100644 (file)
@@ -1,7 +1,7 @@
 // Copyright (C) 2008-2009 - INRIA - Michael Baudin
 // Copyright (C) 2010 - 2011 - DIGITEO - Michael Baudin
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
 // along with this program.
 
 function [flag,errmsg] = assert_checktrue ( condition )
-    //   Check that condition is true.
+    //   Check that condition is true. All its components must be true.
 
     [lhs,rhs]=argn()
     if ( rhs <> 1 ) then
-        errmsg = sprintf ( gettext ( "%s: Wrong number of input arguments: %d expected.\n") , "assert_checktrue" , 1 )
+        errmsg = gettext("%s: Wrong number of input arguments: %d expected.\n")
+        errmsg = msprintf(errmsg, "assert_checktrue", 1)
         error(errmsg)
     end
     //
     // Check types of variables
-    if ( typeof(condition) <> "boolean" ) then
-        errmsg = sprintf ( gettext ( "%s: Wrong type for input argument #%d: Boolean matrix expected.\n" ) , "assert_checktrue" , 1 )
+    if and(typeof(condition) <> ["boolean" "boolean sparse"]) then
+        errmsg = gettext("%s: Wrong type for input argument #%d: Boolean matrix expected.\n")
+        errmsg = msprintf (errmsg, "assert_checktrue", 1)
         error(errmsg)
     end
     //
@@ -31,16 +33,33 @@ function [flag,errmsg] = assert_checktrue ( condition )
     else
         flag = %f
         if ( size(condition,"*") == 1 ) then
-            cstr = string(condition)
+            k = 1
         else
-            cstr = "[" + string(condition(1)) + " ...]"
+            if issparse(condition)
+                // Retrieving the index of the first %F component
+                // (without densification)
+                s = size(condition)
+                v = gsort(sub2ind(s, spget(condition)),"g","i")
+                if isempty(v) | v(1)>1
+                    k = 1
+                elseif length(v)==1
+                    k = 2
+                else
+                    k = find(v(2:$)>(v(1:$-1)+1), 1)
+                    if k==[]
+                        k = v($)
+                    end
+                    k = k+1
+                end
+            else
+                k = find(~condition, 1)
+            end
         end
-        errmsg = msprintf(gettext("%s: Assertion failed: found false entry in condition = %s"), ..
-        "assert_checktrue",cstr)
+        errmsg = gettext("%s: Assertion failed: Entry %%F found in condition(%d).\n")
+        errmsg = msprintf(errmsg, "assert_checktrue", k)
         if ( lhs < 2 ) then
             // If no output variable is given, generate an error
             assert_generror ( errmsg )
         end
     end
 endfunction
-
diff --git a/scilab/modules/development_tools/tests/unit_tests/assert/checkfalse.dia.ref b/scilab/modules/development_tools/tests/unit_tests/assert/checkfalse.dia.ref
deleted file mode 100644 (file)
index c9aa717..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2008 - INRIA - Michael Baudin
-// Copyright (C) 2010 - DIGITEO - Michael Baudin
-//
-// Copyright (C) 2012 - 2016 - Scilab Enterprises
-//
-// This file is hereby licensed under the terms of the GNU GPL v2.0,
-// pursuant to article 5.3.4 of the CeCILL v.2.1.
-// This file was originally licensed under the terms of the CeCILL v2.1,
-// and continues to be available under such terms.
-// For more information, see the COPYING file which you should have received
-// along with this program.
-// <-- CLI SHELL MODE -->
-// <-- ENGLISH IMPOSED -->
-function flag = MY_assert_equal ( computed , expected )
-  if computed==expected then
-    flag = 1;
-  else
-    flag = 0;
-  end
-  if flag <> 1 then bugmes();quit;end
-endfunction
-function checkassert ( flag , errmsg , ctype )
-  if ( ctype == "success" ) then
-    MY_assert_equal ( (flag==%t) & (errmsg==""), %t )
-  else
-    MY_assert_equal ( (flag==%f) & (errmsg<>""), %t )
-  end
-endfunction
-format("v",10);
-// Check error message when number of arguments is false
-instr = "assert_checkfalse ( )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-//
-instr = "[o1,o2,o3]=assert_checkfalse ( %f )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 999 );
-//////////////////////////////////////////
-// Check error message when type of arguments is false
-instr = "assert_checkfalse ( ""a"" )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-//
-//
-// Check that the error message is correctly handled.
-instr = "assert_checkfalse ( [%f %t] )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-errmsg = lasterror();
-refmsg = msprintf( gettext ( "%s: Assertion failed: found false entry in condition = %s" ) , "assert_checkfalse", "[F ...]");
-MY_assert_equal ( errmsg , refmsg );
-//
-[flag,errmsg] = assert_checkfalse ( %f );
-checkassert ( flag , errmsg , "success" );
-//
-[flag,errmsg] = assert_checkfalse ( [%f %f] );
-checkassert ( flag , errmsg , "success" );
-//
-[flag,errmsg] = assert_checkfalse ( %t );
-checkassert ( flag , errmsg , "failure" );
-//
-[flag,errmsg] = assert_checkfalse ( [%t %f] );
-checkassert ( flag , errmsg , "failure" );
index 22a088c..48b026e 100644 (file)
@@ -1,7 +1,7 @@
 // Copyright (C) 2008 - INRIA - Michael Baudin
 // Copyright (C) 2010 - DIGITEO - Michael Baudin
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -12,6 +12,7 @@
 
 // <-- CLI SHELL MODE -->
 // <-- ENGLISH IMPOSED -->
+// <-- NO CHECK REF -->
 
 function flag = MY_assert_equal ( computed , expected )
   if computed==expected then
@@ -52,18 +53,16 @@ instr = "assert_checkfalse ( [%f %t] )";
 ierr=execstr(instr,"errcatch");
 MY_assert_equal ( ierr , 10000 );
 errmsg = lasterror();
-refmsg = msprintf( gettext ( "%s: Assertion failed: found false entry in condition = %s" ) , "assert_checkfalse", "[F ...]");
+msg = gettext ("%s: Assertion failed: Entry %%T found in condition(%d).")
+refmsg = msprintf(msg, "assert_checkfalse", 2);
 MY_assert_equal ( errmsg , refmsg );
 //
-[flag,errmsg] = assert_checkfalse ( %f );
-checkassert ( flag , errmsg , "success" );
-//
-[flag,errmsg] = assert_checkfalse ( [%f %f] );
-checkassert ( flag , errmsg , "success" );
+for o = list(%f, [%f %f], sparse(%f), sparse([%f %f]))
+    [flag,errmsg] = assert_checkfalse(o);
+    checkassert ( flag , errmsg , "success" );
+end
 //
-[flag,errmsg] = assert_checkfalse ( %t );
-checkassert ( flag , errmsg , "failure" );
-//
-[flag,errmsg] = assert_checkfalse ( [%t %f] );
-checkassert ( flag , errmsg , "failure" );
-
+for o = list(%t, [%t %f], [%f %t], sparse(%t), sparse([%t %f]), sparse([%f %t]))
+    [flag,errmsg] = assert_checkfalse(o);
+    checkassert(flag , errmsg , "failure");
+end
diff --git a/scilab/modules/development_tools/tests/unit_tests/assert/checktrue.dia.ref b/scilab/modules/development_tools/tests/unit_tests/assert/checktrue.dia.ref
deleted file mode 100644 (file)
index 44fb2b9..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2008 - INRIA - Michael Baudin
-// Copyright (C) 2010 - DIGITEO - Michael Baudin
-//
-// Copyright (C) 2012 - 2016 - Scilab Enterprises
-//
-// This file is hereby licensed under the terms of the GNU GPL v2.0,
-// pursuant to article 5.3.4 of the CeCILL v.2.1.
-// This file was originally licensed under the terms of the CeCILL v2.1,
-// and continues to be available under such terms.
-// For more information, see the COPYING file which you should have received
-// along with this program.
-// <-- CLI SHELL MODE -->
-// <-- ENGLISH IMPOSED -->
-function flag = MY_assert_equal ( computed , expected )
-  if computed==expected then
-    flag = 1;
-  else
-    flag = 0;
-  end
-  if flag <> 1 then bugmes();quit;end
-endfunction
-function checkassert ( flag , errmsg , ctype )
-  if ( ctype == "success" ) then
-    MY_assert_equal ( (flag==%t) & (errmsg==""), %t )
-  else
-    MY_assert_equal ( (flag==%f) & (errmsg<>""), %t )
-  end
-endfunction
-format("v",10);
-// Check error message when number of arguments is false
-instr = "assert_checktrue ( )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-//
-instr = "[o1,o2,o3]=assert_checktrue ( %t )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 999 );
-//////////////////////////////////////////
-// Check error message when type of arguments is false
-instr = "assert_checktrue ( ""a"" )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-//
-//
-// Check that the error message is correctly handled.
-instr = "assert_checktrue ( [%f %t] )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-errmsg = lasterror();
-refmsg = msprintf( gettext( "%s: Assertion failed: found false entry in condition = %s" ) , "assert_checktrue", "[F ...]");
-MY_assert_equal ( errmsg , refmsg );
-//
-[flag,errmsg] = assert_checktrue ( %t );
-checkassert ( flag , errmsg , "success" );
-//
-[flag,errmsg] = assert_checktrue ( [%t %t] );
-checkassert ( flag , errmsg , "success" );
-//
-[flag,errmsg] = assert_checktrue ( %f );
-checkassert ( flag , errmsg , "failure" );
-//
-[flag,errmsg] = assert_checktrue ( [%t %f] );
-checkassert ( flag , errmsg , "failure" );
index 7e9039c..9c6c2eb 100644 (file)
@@ -1,7 +1,7 @@
 // Copyright (C) 2008 - INRIA - Michael Baudin
 // Copyright (C) 2010 - DIGITEO - Michael Baudin
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -12,8 +12,9 @@
 
 // <-- CLI SHELL MODE -->
 // <-- ENGLISH IMPOSED -->
+// <-- NO CHECK REF -->
 
-function flag = MY_assert_equal ( computed , expected )
+function flag = MY_assert_equal (computed , expected)
   if computed==expected then
     flag = 1;
   else
@@ -22,48 +23,47 @@ function flag = MY_assert_equal ( computed , expected )
   if flag <> 1 then pause,end
 endfunction
 
-function checkassert ( flag , errmsg , ctype )
-  if ( ctype == "success" ) then
-    MY_assert_equal ( (flag==%t) & (errmsg==""), %t )
+function checkassert (flag , errmsg , ctype)
+  if (ctype == "success") then
+    MY_assert_equal ((flag==%t) & (errmsg==""), %t)
   else
-    MY_assert_equal ( (flag==%f) & (errmsg<>""), %t )
+    MY_assert_equal ((flag==%f) & (errmsg<>""), %t)
   end
 endfunction
 
 format("v",10);
 
 // Check error message when number of arguments is false
-instr = "assert_checktrue ( )";
+instr = "assert_checktrue ()";
 ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
+MY_assert_equal (ierr , 10000);
 //
-instr = "[o1,o2,o3]=assert_checktrue ( %t )";
+instr = "[o1,o2,o3]=assert_checktrue (%t)";
 ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 999 );
+MY_assert_equal (ierr , 999);
 //////////////////////////////////////////
 // Check error message when type of arguments is false
-instr = "assert_checktrue ( ""a"" )";
+instr = "assert_checktrue (""a"")";
 ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
+MY_assert_equal (ierr , 10000);
 //
 //
 // Check that the error message is correctly handled.
-instr = "assert_checktrue ( [%f %t] )";
+instr = "assert_checktrue ([%f %t])";
 ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
+MY_assert_equal (ierr , 10000);
 errmsg = lasterror();
-refmsg = msprintf( gettext( "%s: Assertion failed: found false entry in condition = %s" ) , "assert_checktrue", "[F ...]");
-MY_assert_equal ( errmsg , refmsg );
-//
-[flag,errmsg] = assert_checktrue ( %t );
-checkassert ( flag , errmsg , "success" );
-//
-[flag,errmsg] = assert_checktrue ( [%t %t] );
-checkassert ( flag , errmsg , "success" );
+msg = gettext("%s: Assertion failed: Entry %%F found in condition(%d).\n");
+refmsg = msprintf(msg, "assert_checktrue", 1);
+MY_assert_equal (errmsg , refmsg);
 //
-[flag,errmsg] = assert_checktrue ( %f );
-checkassert ( flag , errmsg , "failure" );
+for o = list(%t, [%t %t], sparse(%t), sparse([%t %t]))
+    [flag,errmsg] = assert_checktrue(o);
+    checkassert (flag , errmsg , "success");
+end
 //
-[flag,errmsg] = assert_checktrue ( [%t %f] );
-checkassert ( flag , errmsg , "failure" );
+for o = list(%f, [%f %f], [%t %f], sparse(%f), sparse([%f %f]), sparse([%t %f]))
+    [flag,errmsg] = assert_checktrue(o);
+    checkassert (flag , errmsg , "failure");
+end