* Bug 11600 fixed: now rand() parses its inputs as it should 11/21711/5
mottelet [Tue, 23 Mar 2021 09:41:17 +0000 (10:41 +0100)]
http://bugzilla.scilab.org/show_bug.cgi?id=11600

Change-Id: I8f26c2f6caf1056de183f37ece4fb27350be754b

scilab/CHANGES.md
scilab/modules/elementary_functions/sci_gateway/cpp/sci_rand.cpp
scilab/modules/elementary_functions/tests/nonreg_tests/bug_11600.tst [new file with mode: 0644]

index c424606..6f7f44d 100644 (file)
@@ -313,6 +313,7 @@ Bug Fixes
 * [#10465](https://bugzilla.scilab.org/10465): At Scilab exit, the help browser is not saved nor restored.
 * [#10476](https://bugzilla.scilab.org/10476): From `browsevar`, displaying the content of lists, structures, cells, or other custom tlists or mlists was not possible.
 * [#10490](https://bugzilla.scilab.org/10490): The `mapsound` page was poor with a single interesting example.
+* [#11600](https://bugzilla.scilab.org/11600): `rand()` was parsing its inputs incorrectly.
 * [#11677](https://bugzilla.scilab.org/11677): The original Arnoldi functions were obsolete.
 * [#12418](https://bugzilla.scilab.org/12418): Using bvode() with "continuation", i.e. `ipar(9) > 1` led to an error.
 * [#12516](https://bugzilla.scilab.org/12516): From `browsevar`, clicking on any graphical handle did not edit its figure with `ged`.
index 22061b3..b4090ad 100644 (file)
@@ -27,13 +27,13 @@ extern "C"
 #include "basic_functions.h"
 }
 
-const wchar_t g_pwstConfigInfo[] = {L"info"};
-const wchar_t g_pwstConfigSeed[] = {L"seed"};
+const wchar_t g_pwstConfigInfo[] = L"info";
+const wchar_t g_pwstConfigSeed[] = L"seed";
 
-const wchar_t g_pwstTypeUniform[] = {L"uniform"};
-const wchar_t g_pwstTypeNormal[] = {L"normal"};
+const wchar_t g_pwstTypeUniform[] = L"uniform";
+const wchar_t g_pwstTypeNormal[] = L"normal";
 
-int setRandType(wchar_t _wcType);
+int setRandType(const wchar_t* _wcType);
 double getNextRandValue(int _iRandType, int* _piRandSave, int _iForceInit);
 
 /*
@@ -69,7 +69,7 @@ types::Function::ReturnValue sci_rand(types::typed_list &in, int _iRetCount, typ
 
         wchar_t* pwstKey = pS->get(0);
 
-        if (pwstKey[0] == g_pwstConfigInfo[0])
+        if (!wcscmp(pwstKey,g_pwstConfigInfo))
         {
             //info
             if (iSizeIn > 1)
@@ -87,7 +87,7 @@ types::Function::ReturnValue sci_rand(types::typed_list &in, int _iRetCount, typ
                 out.push_back(new types::String(g_pwstTypeNormal));
             }
         }
-        else if (pwstKey[0] == g_pwstConfigSeed[0])
+        else if (!wcscmp(pwstKey,g_pwstConfigSeed))
         {
             //seed
             if (iSizeIn == 1)
@@ -114,7 +114,19 @@ types::Function::ReturnValue sci_rand(types::typed_list &in, int _iRetCount, typ
         }
         else
         {
-            siRandType = setRandType(pwstKey[0]);
+            int iRandSave = siRandType;
+            if (iSizeIn > 1)
+            {
+                Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "rand", 1);
+                return types::Function::Error;
+            }
+            siRandType = setRandType(pwstKey);
+            if (siRandType < 0) 
+            {
+                siRandType = iRandSave;                
+                Scierror(999, _("%s: Wrong value for input argument #%d: '%s', '%s', '%s' or '%s' expected.\n"), "rand", 1,"info","seed","uniform","normal");
+                return types::Function::Error;
+            }
         }
     }
     else
@@ -131,8 +143,14 @@ types::Function::ReturnValue sci_rand(types::typed_list &in, int _iRetCount, typ
             }
 
             //set randomize law
-            iRandSave = siRandType;
-            siRandType = setRandType(pS->get(0)[0]);
+            siRandType = setRandType(pS->get(0));
+            if (siRandType < 0) 
+            {
+                siRandType = iRandSave;                
+                Scierror(999, _("%s: Wrong value for input argument #%d: '%s' or '%s' expected.\n"), "rand", iSizeIn,"uniform","normal");
+                return types::Function::Error;
+            }
+            
             iSizeIn--;
         }
 
@@ -237,12 +255,17 @@ double getNextRandValue(int _iRandType, int* _piRandSave, int _iForceInit)
     return dblVal;
 }
 
-int setRandType(wchar_t _wcType)
+int setRandType(const wchar_t* _wcType)
 {
-    if (_wcType == L'g' || _wcType == L'n')
+    if (!wcscmp(_wcType,g_pwstTypeUniform))
+    {
+        return 0;
+    }
+    else if (!wcscmp(_wcType,g_pwstTypeNormal))
     {
         return 1;
     }
-    return 0;
+    return -1;
 }
 /*--------------------------------------------------------------------------*/
+
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_11600.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_11600.tst
new file mode 100644 (file)
index 0000000..5db04ca
--- /dev/null
@@ -0,0 +1,29 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2021 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 11600 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/11600
+//
+// <-- Short Description -->
+// rand("foo") runs silently without returning an error
+
+cmd = "rand(""foo"")";
+msg = msprintf(_("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'' or ''%s'' expected.\n"), "rand", 1,"info","seed","uniform","normal");
+assert_checkerror(cmd,msg)
+
+cmd = "rand(2,2,""foo"")";
+msg = msprintf(_("%s: Wrong value for input argument #%d: ''%s'' or ''%s'' expected.\n"), "rand", 3, "uniform","normal");
+assert_checkerror(cmd,msg)
+
+cmd = "rand(2,""foo"")";
+msg = msprintf(_("%s: Wrong value for input argument #%d: ''%s'' or ''%s'' expected.\n"), "rand", 2, "uniform","normal");
+assert_checkerror(cmd,msg)