* Bug 15617 fixed: evstr() list check + error msgs 80/20180/4
Samuel GOUGEON [Sat, 23 Jun 2018 00:40:15 +0000 (02:40 +0200)]
  http://bugzilla.scilab.org/15617

Change-Id: I993289e353b7128be5f95fcd7dd7c12221e61ca4

scilab/CHANGES.md
scilab/modules/string/macros/evstr.sci
scilab/modules/string/tests/nonreg_tests/bug_15617.tst [new file with mode: 0644]

index 19817e4..6a076b7 100644 (file)
@@ -483,6 +483,7 @@ Known issues
 * [#15599](http://bugzilla.scilab.org/show_bug.cgi?id=15599): degree of zero polynomial was 0 instead of -Inf.
 * [#15609](http://bugzilla.scilab.org/show_bug.cgi?id=15609): (1:1):2 crashed Scilab.
 * [#15615](http://bugzilla.scilab.org/show_bug.cgi?id=15615): `datatipToggle()` was a duplicate of `datatipManagerMode()`.
+* [#15617](http://bugzilla.scilab.org/show_bug.cgi?id=15617): `evstr(list(..))` did not check the number and types of list components. When an input component can't be evaluated, the error messages were not clear enough.
 * [#15621](http://bugzilla.scilab.org/show_bug.cgi?id=15621): polynomial exponentiation silently truncated exponent (regression).
 * [#15625](http://bugzilla.scilab.org/show_bug.cgi?id=15625): `delip(1,1)=0` instead of `Inf`
 * [#15626](http://bugzilla.scilab.org/show_bug.cgi?id=15626): clicking on its icon did not give focus to a docked Scinotes.
index 4f375cb..bd8bbd8 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
 // Copyright (C) DIGITEO - 2010 - Allan CORNET
-// Copyright (C) 2016, 2017 - Samuel GOUGEON
+// Copyright (C) 2016, 2017, 2018 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
@@ -58,39 +58,49 @@ function [%val, %ierr] = evstr(%str)
         %t1(1) = "%val=[" + %t1(1);
         %t1($) = part(%t1($), 1:length(%t1($)) - 1)+";";
         %t1($+1)="]";
-        if lhs == 2 then
-            %ierr = execstr(%t1, "errcatch");
-        else
-            execstr(%t1)
+        %ierr = execstr(%t1, "errcatch");
+        if lhs == 1 & %ierr~=0 then
+            msg = _("%s: Argument #%d: Some expression can''t be evaluated (%s).\n")
+            error(msprintf(msg, "evstr", 1, strcat(lasterror())))
         end
 
     case 15 then
         // list
+        if size(%str)~=2
+            msg = _("%s: Argument #%d: %d-element list expected.\n")
+            error(msprintf(msg, "evstr", 1, 2));
+        end
+        if type(%str(1))~=10 | type(%str(2))~=10
+            msg = _("%s: Argument #%d: Both list components must be of text type.\n")
+            error(msprintf(msg, "evstr", 1));
+        end
         %sexp = %str(2),
         %nstr = prod(size(%sexp));
         % = list();
-        if lhs == 2 then
-            for %k_ = 1:%nstr,
-                [%w, %ierr] = evstr(%sexp(%k_));
-                %(%k_) = %w;
-                if %ierr <>0  then
+        for %k_ = 1:%nstr,
+            [%w, %ierr] = evstr(%sexp(%k_));
+            %(%k_) = %w;
+            if %ierr <>0  then
+                if lhs==2
                     %val = [];
                     return;
+                else
+                    msg = _("%s: Argument #1(2): The expression #%d = ""%s"" can''t be evaluated (%s).\n")
+                    error(msprintf(msg, "evstr", %k_, %sexp(%k_), strcat(lasterror())))
                 end
             end
+        end
+        if lhs==2
             [%val, %ierr] = evstr(%str(1));
         else
-            for %k_ = 1:%nstr,
-                %(%k_) = evstr(%sexp(%k_));
-            end
-            %val = evstr(%str(1))
+            %val = evstr(%str(1));
         end
 
     case 1 then
         // real or complex constant matrix
         %val = %str;
     else
-        error(msprintf(gettext("%s: Wrong type for input argument #%d: Real or Complex matrix, Matrix of character strings or list expected.\n"), "evstr", 1));
+        error(msprintf(gettext("%s: Wrong type for input argument #%d: Matrix of character strings or list expected.\n"), "evstr", 1));
     end
     if exists("%val", "local") == 0 then
         error(msprintf(gettext("%s: Given expression has no value.\n"), "evstr"));
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_15617.tst b/scilab/modules/string/tests/nonreg_tests/bug_15617.tst
new file mode 100644 (file)
index 0000000..afb26a3
--- /dev/null
@@ -0,0 +1,55 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+// <-- ENGLISH IMPOSED -->
+
+// <-- Non-regression test for bug 15617 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15617
+//
+// <-- Short Description -->
+// * evstr(list(..)): the number and types of the list components were
+//   not checked
+// * When some given expression can't be evaluated, the error message
+//   was misleading
+
+a = 1;
+clear b
+msg = _("%s: Argument #%d: %d-element list expected.\n")
+assert_checkerror("evstr(list([''b'',''a'']))", msprintf(msg, "evstr", 1, 2));
+
+msg = _("%s: Argument #%d: Both list components must be of text type.\n")
+assert_checkerror("evstr(list(%t,""a""))", msprintf(msg, "evstr", 1));
+assert_checkerror("evstr(list(""a+1"",%f))", msprintf(msg, "evstr", 1));
+
+msg = _("%s: Argument #%d: Some expression can''t be evaluated (%s).\n");
+submsg = msprintf(_("Undefined variable: %s\n"), "b");
+assert_checkerror("evstr([""a+1"" ""b-1""])", msprintf(msg, "evstr", 1, submsg));
+
+msg = _("%s: Argument #%d: Some expression can''t be evaluated (%s).\n");
+submsg = msprintf(_("Undefined variable: %s\n"), "%");
+assert_checkerror("evstr([""sin(4)"" ""a+%(1)""])", msprintf(msg, "evstr", 1, submsg));
+
+msg = _("%s: Argument #%d: Some expression can''t be evaluated (%s).\n");
+submsg = msprintf(_("Undefined variable: %s\n"), "b");
+assert_checkerror("evstr(list([""b-1"" ""a+1""],""2+3""))", msprintf(msg, "evstr", 1, submsg));
+
+msg = _("%s: Argument #1(2): The expression #%d = ""%s"" can''t be evaluated (%s).\n")
+submsg = msprintf(_("Undefined variable: %s\n"), "b");
+assert_checkerror("evstr(list([""sin(4)"" ""a+%(1)""],""b""))", msprintf(msg, "evstr", 1, "b", submsg));
+
+msg = _("%s: Argument #%d: Some expression can''t be evaluated (%s).\n");
+submsg = msprintf(_("Invalid index.\n"));
+assert_checkerror("evstr(list([""sin(4)"" ""a+%(3)""],[""2"" ""2*a""]))", msprintf(msg, "evstr", 1, submsg));
+
+msg = _("%s: Argument #%d: Some expression can''t be evaluated (%s).\n");
+submsg = msprintf(_("Function not defined for given argument type(s),\n"));
+submsg = submsg + msprintf(_("  check arguments or define function %s for overloading.\n"), "%c_cos");
+assert_checkerror("evstr(""cos(""""s"""")"")", msprintf(msg, "evstr", 1, submsg));