gsort_multilevel: special degenerate case fixed 00/21500/3
Samuel GOUGEON [Sun, 14 Jun 2020 13:09:29 +0000 (15:09 +0200)]
  test_run elementary_functions gsort*

Change-Id: I317be9d294fa6f2e62e5406760e0eadcf7e04419

scilab/modules/elementary_functions/macros/%gsort_multilevel.sci
scilab/modules/elementary_functions/sci_gateway/cpp/sci_gsort.cpp
scilab/modules/elementary_functions/tests/unit_tests/gsort_multilevel_complex.tst

index adb78ed..af744bb 100644 (file)
@@ -178,15 +178,18 @@ function v = %gsort_eval(a, fun)
         params = fun
         params(1) = null()
         fun = fun(1)
-        if typeof(fun)=="fptr" & fun==atan & type(a)==1 & ~isreal(a)
+        if typeof(fun)=="fptr" & fun==atan & type(a)==1
             v = fun(imag(a), real(a)) + params(1)
         else
             v = fun(a, params(:))
         end
-    elseif typeof(fun)=="fptr" & fun==atan & type(a)==1 & ~isreal(a)
+
+    elseif typeof(fun)=="fptr" & fun==atan & type(a)==1
         v = atan(imag(a), real(a))
+
     elseif typeof(fun)=="implicitlist" & (1:1:$)==fun
         v = a
+
     else
         v = fun(a)
     end
index 20c4b31..86b9996 100644 (file)
@@ -63,7 +63,8 @@ types::Function::ReturnValue sci_gsort(types::typed_list &in, int _iRetCount, ty
 
     // Get the sorting method, always as argin#2 for all generic types
     // ----------------------
-    char* msg = _("%s: Argument #%d: 'g','r','c','lc','lr' or integer in [1, %d] expected.\n");
+    char* msg = _("%s: Argument #%d: Must be in the set {%s} or integer in range [%d, %d].\n");
+    std::string argSetError = "'g','r','c','lc','lr'";
     std::wstring wstrProcess = L"g";
     int iOrientation = 0;
     int ndims = static_cast<int>(pGTIn->getDims());
@@ -84,7 +85,7 @@ types::Function::ReturnValue sci_gsort(types::typed_list &in, int _iRetCount, ty
 
             if (iOrientation <= 0 || iOrientation > ndims)
             {
-                Scierror(999, msg, "gsort", 2, ndims);
+                Scierror(999, msg, "gsort", 2, argSetError.data(), 1, ndims);
                 return types::Function::Error;
             }
             if ( iOrientation == 1 )
@@ -99,7 +100,7 @@ types::Function::ReturnValue sci_gsort(types::typed_list &in, int _iRetCount, ty
         }
         else if (in[1]->isString() == false)
         {
-            Scierror(999, msg, "gsort", 2, ndims);
+            Scierror(999, msg, "gsort", 2, argSetError.data(), 1, ndims);
             return types::Function::Error;
         }
         else
@@ -112,7 +113,7 @@ types::Function::ReturnValue sci_gsort(types::typed_list &in, int _iRetCount, ty
                  wstrProcess != L"lc" &&
                  wstrProcess != L"lr")
             {
-                Scierror(999, msg, "gsort", 2, ndims);
+                Scierror(999, msg, "gsort", 2, argSetError.data(), 1, ndims);
                 return types::Function::Error;
             }
         }
index 1e395bc..18daee2 100644 (file)
@@ -53,7 +53,7 @@ y = complex(A,B);
 assert_checkequal(b, [3 2 1 4 5]);
 assert_checkequal(y(b), a);
 
-refMsg = msprintf(_("%s: Argument #%d: Must be in the set {%s}.\n"), "gsort", 2, "''g'',''r'',''c'',''lc'',''lr''");
+refMsg = msprintf(_("%s: Argument #%d: Must be in the set {%s} or integer in range [%d, %d].\n"), "gsort", 2, "''g'',''r'',''c'',''lc'',''lr''", 1, 2);
 assert_checkerror("[a,b] = gsort(y,''l'')", refMsg);
 
 ierr = execstr("[a,b] = gsort(y,''g'');","errcatch");
@@ -74,7 +74,7 @@ assert_checkequal(ierr, 0);
 // -------------------------------------------------------------------
 // Error messages
 // -------------------------------------------------------------------
-msg = msprintf(_("%s: Argument #%d: Must be in the set {%s}.\n"), "gsort", 2, "''g'',''r'',''c'',''lc'',''lr''");
+msg = msprintf(_("%s: Argument #%d: Must be in the set {%s} or integer in range [%d, %d].\n"), "gsort", 2, "''g'',''r'',''c'',''lc'',''lr''", 1, 2);
 assert_checkerror("gsort(%i,''q'')", msg);
 msg = msprintf(_("%s: Argument #%d: Text(s) expected.\n"), "gsort", 3);
 assert_checkerror("gsort(%i,''g'',1)", msg);
@@ -258,8 +258,7 @@ end
 m = complex([7  6  9  2  8  1  0  4  3  2], 0);
 assert_checkequal(gsort(m, "g", "i", list(atan)), m);
 assert_checkequal(gsort(m, "g", "i", list(imag)), m);
-//assert_checkequal(gsort(m, "g", ["i" "i"], list(imag, atan)), m);
-// zeros(n,2) is actually sorted, while it should be preserved. TO BE INVESTIGATED
+assert_checkequal(gsort(m, "g", ["i" "i"], list(imag, atan)), m);
 assert_checkequal(gsort(m+%i, "g", "d", list(imag)), m+%i);
 
 // -------------------------------------------------------------------