sident gateway fixed and "bad lhs" error modified. 56/16956/3
Cedric Delamarre [Mon, 3 Aug 2015 14:34:30 +0000 (16:34 +0200)]
test_run cacsd bug_14006
test_run string bug_7282

Change-Id: I21e4888f645d8ff61cdbd8ab4eb6b522ff1720bb

scilab/modules/ast/src/cpp/ast/run_CallExp.hpp
scilab/modules/cacsd/sci_gateway/c/sci_sident.c
scilab/modules/cacsd/tests/nonreg_tests/bug_14006.dia.ref [new file with mode: 0644]
scilab/modules/cacsd/tests/nonreg_tests/bug_14006.tst [new file with mode: 0644]
scilab/modules/string/tests/nonreg_tests/bug_7282.dia.ref
scilab/modules/string/tests/nonreg_tests/bug_7282.tst

index 1ce080f..b217fbe 100644 (file)
@@ -194,8 +194,6 @@ void RunVisitorT<T>::visitprivate(const CallExp &e)
                     ret = pIT->invoke(in, opt, iRetCount, out, *this, e);
                     if(ret == false && pIT->isUserType())
                     {
-
-
                         // call overload
                         ret = Overload::call(L"%" + pIT->getShortTypeStr() + L"_e", in, iRetCount, out, this);
                     }
@@ -205,9 +203,22 @@ void RunVisitorT<T>::visitprivate(const CallExp &e)
                 {
                     if (iSaveExpectedSize != -1 && iSaveExpectedSize > out.size())
                     {
-                        std::wostringstream os;
-                        os << _W("bad lhs, expected : ") << iRetCount << _W(" returned : ") << out.size() << std::endl;
-                        throw InternalError(os.str(), 999, e.getLocation());
+                        char szError[bsiz];
+                        if(pIT->isCallable())
+                        {
+                            char* strFName = wide_string_to_UTF8(pIT->getAs<Callable>()->getName().c_str());
+                            os_sprintf(szError, bsiz, _("%s: Wrong number of output argument(s): %d expected.\n"), strFName, out.size());
+                            FREE(strFName);
+                        }
+                        else
+                        {
+                            os_sprintf(szError, bsiz, _("%s: Wrong number of output argument(s): %d expected.\n"), "extract", out.size());
+                        }
+
+                        wchar_t* wError = to_wide_string(szError);
+                        std::wstring err(wError);
+                        FREE(wError);
+                        throw InternalError(err, 999, e.getLocation());
                     }
 
                     setExpectedSize(iSaveExpectedSize);
index 3585e0e..8b59525 100644 (file)
@@ -270,7 +270,6 @@ int sci_sident(char *fname, void* pvApiCtx)
     }
 
     // R(nr,nr)
-
     sciErr = getVarAddressFromPosition(pvApiCtx, 6, &piAddrR);
     if (sciErr.iErr)
     {
@@ -279,7 +278,7 @@ int sci_sident(char *fname, void* pvApiCtx)
         return 0;
     }
 
-    getMatrixOfDouble(pvApiCtx, piAddrR, &iNR, &iNCOL, &pdblR);
+    sciErr = getMatrixOfDouble(pvApiCtx, piAddrR, &iNR, &iNCOL, &pdblR);
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
@@ -305,7 +304,7 @@ int sci_sident(char *fname, void* pvApiCtx)
     iM = iNR / (2 * iNOBR) - iL;
 
     // tol
-    if (iRhs >= 6)
+    if (iRhs > 6)
     {
         int* piAddr = NULL;
 
@@ -317,8 +316,7 @@ int sci_sident(char *fname, void* pvApiCtx)
             return 0;
         }
 
-        getScalarDouble(pvApiCtx, piAddr, &dblTOL);
-        if (sciErr.iErr)
+        if (getScalarDouble(pvApiCtx, piAddr, &dblTOL))
         {
             printError(&sciErr, 0);
             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 7);
@@ -328,7 +326,7 @@ int sci_sident(char *fname, void* pvApiCtx)
 
 
     // t
-    if (iRhs >= 7)
+    if (iRhs > 7)
     {
         cJOBCK = 'K';
         CHECK_PARAM(pvApiCtx, 8);
@@ -535,7 +533,7 @@ int sci_sident(char *fname, void* pvApiCtx)
     //Copy inputs from scilab workspace to locally allocated arrays.
     iSize = iLDR * iNCOL;
     C2F(dcopy)(&iSize, pdblR, &iOne, pR, &iOne);
-    if(iTASK >= 2 && iIJOB >= 3)
+    if (iTASK >= 2 && iIJOB >= 3)
     {
         iSize = iLDA * iN;
         C2F(dcopy)(&iSize, pdblA, &iOne, pA, &iOne);
@@ -549,26 +547,28 @@ int sci_sident(char *fname, void* pvApiCtx)
                 pRY, &iLDRY, pS, &iLDS, pK, &iLDK, &dblTOL, pIWORK, pDWORK,
                 &iLDWORK, pBWORK, &iWARN, &iINFO);
 
-    if(iWARN != 0 && iPRINTW)
+    if (iWARN != 0 && iPRINTW)
     {
         sciprint("IWARN = %d ON EXIT FROM IB01BD\n", iWARN);
     }
 
-    if(iINFO != 0)
+    if (iINFO != 0)
     {
         Scierror(999, _("%s: INFO = %d ON EXIT FROM IB01BD\n"), fname, iINFO);
     }
     else //Copy output to scilab workspace.
     {
-        if(iIJOB <= 2)
+        if (iIJOB <= 2)
         {
-            createMatrixOfDouble(pvApiCtx, iRhs + 1, iN, iN, pA);
             iIP = 1;
+            createMatrixOfDouble(pvApiCtx, iRhs + iIP, iN, iN, pA);
+            AssignOutputVariable(pvApiCtx, iIP) = iRhs + iIP;
 
-            if(iLhs > 1)
+            if (iLhs > 1)
             {
-                createMatrixOfDouble(pvApiCtx, iRhs + 2, iLDC, iN, pC);
                 iIP = 2;
+                createMatrixOfDouble(pvApiCtx, iRhs + iIP, iLDC, iN, pC);
+                AssignOutputVariable(pvApiCtx, iIP) = iRhs + iIP;
             }
         }
         else
@@ -576,38 +576,43 @@ int sci_sident(char *fname, void* pvApiCtx)
             iIP = 0;
         }
 
-        if(iLhs > iIP)
+        if (iLhs > iIP)
         {
-            if(iIJOB == iIP || iIJOB >= 3)
+            if (iIJOB == 1 || iIJOB >= 3)
             {
                 iIP++;
                 createMatrixOfDouble(pvApiCtx, iRhs + iIP, iN, iM, pB);
+                AssignOutputVariable(pvApiCtx, iIP) = iRhs + iIP;
             }
 
-            if(iLhs > iIP)
+            if (iLhs > iIP)
             {
-                if(iIJOB == 1 || iIJOB == 4)
+                if (iIJOB == 1 || iIJOB == 4)
                 {
                     iIP++;
                     createMatrixOfDouble(pvApiCtx, iRhs + iIP, iL, iM, pD);
+                    AssignOutputVariable(pvApiCtx, iIP) = iRhs + iIP;
                 }
             }
         }
 
-        if(iNSMPL > 0 && iLhs > iIP)
+        if (iNSMPL > 0 && iLhs > iIP)
         {
             iIP++;
             createMatrixOfDouble(pvApiCtx, iRhs + iIP, iN, iN, pQ);
+            AssignOutputVariable(pvApiCtx, iIP) = iRhs + iIP;
             iIP++;
             createMatrixOfDouble(pvApiCtx, iRhs + iIP, iL, iL, pRY);
+            AssignOutputVariable(pvApiCtx, iIP) = iRhs + iIP;
             iIP++;
             createMatrixOfDouble(pvApiCtx, iRhs + iIP, iN, iL, pS);
+            AssignOutputVariable(pvApiCtx, iIP) = iRhs + iIP;
         }
 
-        if(iLhs > iIP)
+        if (iLhs > iIP)
         {
             iIP++;
-            if(iNSMPL == 0)
+            if (iNSMPL == 0)
             {
                 iNRC = 4;
             }
@@ -616,7 +621,8 @@ int sci_sident(char *fname, void* pvApiCtx)
                 iNRC = 12;
             }
 
-            createMatrixOfDouble(pvApiCtx, iRhs + iIP, iNRC, 1, pDWORK+2-1);
+            createMatrixOfDouble(pvApiCtx, iRhs + iIP, iNRC, 1, pDWORK + 2 - 1);
+            AssignOutputVariable(pvApiCtx, iIP) = iRhs + iIP;
         }
     }
 
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_14006.dia.ref b/scilab/modules/cacsd/tests/nonreg_tests/bug_14006.dia.ref
new file mode 100644 (file)
index 0000000..786be74
--- /dev/null
@@ -0,0 +1,36 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13791 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14006
+//
+// <-- Short Description -->
+//sident gives an unclear error when running example from the doc;
+//
+A = [ 0.5, 0.1,-0.1, 0.2;
+0.1, 0,  -0.1,-0.1;
+-0.4,-0.6,-0.7,-0.1;
+0.8, 0,  -0.6,-0.6];
+B = [0.8;0.1;1;-1];
+C = [1 2 -1 0];
+SYS=syslin(0.1,A,B,C);
+nsmp=100;
+U=prbs_a(nsmp,nsmp/5);
+Y=(flts(U,SYS)+0.3*rand(1,nsmp,"normal"));
+S = 15;
+N = 3;
+METH=1;
+[R,N1] = findR(S,Y',U',METH);
+// must not returns any error
+[A,C,B,D,K] = sident(METH,1,S,N,1,R);
+// Wrong number of output arguments
+expectedError = msprintf(gettext("%s: Wrong number of output argument(s): %d expected.\n"), "sident", 5);
+assert_checkerror("[A,C,B,D,K,BadOutput] = sident(METH,1,S,N,1,R);", expectedError);
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_14006.tst b/scilab/modules/cacsd/tests/nonreg_tests/bug_14006.tst
new file mode 100644 (file)
index 0000000..23b3b2e
--- /dev/null
@@ -0,0 +1,40 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13791 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14006
+//
+// <-- Short Description -->
+//sident gives an unclear error when running example from the doc;
+//
+
+A = [ 0.5, 0.1,-0.1, 0.2;
+0.1, 0,  -0.1,-0.1;
+-0.4,-0.6,-0.7,-0.1;
+0.8, 0,  -0.6,-0.6];
+B = [0.8;0.1;1;-1];
+C = [1 2 -1 0];
+SYS=syslin(0.1,A,B,C);
+nsmp=100;
+U=prbs_a(nsmp,nsmp/5);
+Y=(flts(U,SYS)+0.3*rand(1,nsmp,"normal"));
+
+S = 15;
+N = 3;
+METH=1;
+[R,N1] = findR(S,Y',U',METH);
+
+// must not returns any error
+[A,C,B,D,K] = sident(METH,1,S,N,1,R);
+
+// Wrong number of output arguments
+expectedError = msprintf(gettext("%s: Wrong number of output argument(s): %d expected.\n"), "sident", 5);
+assert_checkerror("[A,C,B,D,K,BadOutput] = sident(METH,1,S,N,1,R);", expectedError);
index 977f84f..f7be79d 100644 (file)
@@ -12,7 +12,7 @@
 //
 // <-- Short Description -->
 // eval failed on some functions without output arguments.
-errmsg = _("bad lhs, expected : ") + string(1) + _(" returned : ") + string(0);
+errmsg = msprintf(gettext("%s: Wrong number of output argument(s): %d expected.\n"), "realtimeinit", 0);
 str = "realtimeinit(60)";
 assert_checkerror("eval(str)", errmsg);
 function o = blabla()
index b058b73..db8da10 100644 (file)
 //
 // <-- Short Description -->
 // eval failed on some functions without output arguments.
-errmsg = _("bad lhs, expected : ") + string(1) + _(" returned : ") + string(0);
+errmsg = msprintf(gettext("%s: Wrong number of output argument(s): %d expected.\n"), "realtimeinit", 0);
 str = "realtimeinit(60)";
 assert_checkerror("eval(str)", errmsg);
 
 function o = blabla()
- o = 3;
+    o = 3;
 endfunction
 
 r = eval("blabla()");