* Bug #7649 fixed: isempty() on struct(), {} or list(,) returned %F 03/18303/6
Samuel GOUGEON [Sat, 25 Jun 2016 04:32:37 +0000 (06:32 +0200)]
  http://bugzilla.scilab.org/7649

 - isempty({}) returned %F
 - isempty(struct()) returned %F
 - isempty(list(,)) returned %F
 - In lists, founding a first non-empty content did not stop uselessly
    scanning all remaining components.

Change-Id: I0ab56a72bddfcdb66a62e8162dbf658c2dde1805

scilab/CHANGES.md
scilab/modules/elementary_functions/macros/isempty.sci
scilab/modules/elementary_functions/tests/nonreg_tests/bug_7649.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/nonreg_tests/bug_7649.tst [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/isempty.dia.ref
scilab/modules/elementary_functions/tests/unit_tests/isempty.tst

index 2b9ee26..23cc807 100644 (file)
@@ -239,6 +239,7 @@ Bug Fixes
 ### In 6.0.0:
 * [Bug #2919](http://bugzilla.scilab.org/show_bug.cgi?id=2919) fixed - The `fchamp` example and demo were unclear and badly rendered
 * [Bug #5723](http://bugzilla.scilab.org/show_bug.cgi?id=5723) fixed   - Cross-references were missing between axis_properties and axes_properties help pages
+* [Bug #7649](http://bugzilla.scilab.org/show_bug.cgi?id=7649) fixed - `isempty` returned `%F` on `struct()`, `{}` or `list(,)` and was not shortcut
 * [Bug #7696](http://bugzilla.scilab.org/show_bug.cgi?id=7696) fixed   - The `parallel_run` help page was poorly formated
 * [Bug #9912](http://bugzilla.scilab.org/show_bug.cgi?id=9912) fixed   - In case of missing translated help page, the default en_US was sometimes ignored
 * [Bug #9153](http://bugzilla.scilab.org/9153) fixed                   - The `isqualbitwise` help page was inaccurate and badly located
index e9d1bcf..75550a8 100644 (file)
@@ -1,6 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 1998 - INRIA
 // Copyright (C) DIGITEO - 2011-2012 - Allan CORNET
+// Copyright (C) 2016 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
@@ -15,13 +16,15 @@ function answ = isempty(m)
 
     rhs = argn(2);
     if rhs <> 1 then
-        error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"), "isempty", 1));
+        msg = gettext("%s: Wrong number of input argument(s): %d expected.\n")
+        error(msprintf(msg, "isempty", 1))
     end
 
     m_type = type(m);
 
     if( (m_type >= 11) & (m_type <= 13) | (m_type >= 128) ) then
-        error(msprintf(gettext("%s: Wrong type for input argument #%d.\n"), "isempty", 1));
+        msg = gettext("%s: Wrong type for input argument #%d.\n")
+        error(msprintf(msg, "isempty", 1))
     end
 
     select m_type
@@ -34,15 +37,11 @@ function answ = isempty(m)
     case 15
         // list
         answ = %t;
-        for i=1:size(m),
-            clear __element__;
-            __element__ = m(i);
-            if isdef("__element__") then
-                r = isempty(m(i));
-            else
-                r = %F;
+        for i = 1:size(m),
+            answ = answ & (type(m(i))==0 || isempty(m(i)))
+            if ~answ
+                break
             end
-            answ = answ & r;
         end;
 
     case 16
@@ -51,24 +50,50 @@ function answ = isempty(m)
             answ = size(m, "*") == 0;
         else
             answ = %t;
-            for i=2:size(m),
-                clear __element__;
-                __element__ = m(i);
-                if isdef("__element__") then
-                    r = isempty(m(i));
-                else
-                    r = %F;
+            for i = 2:size(m,"*")
+                answ = answ & (type(m(i))==0 || isempty(m(i)))
+                if ~answ
+                    break
                 end
-                answ = answ & r;
-            end;
+            end
         end
 
     case 17
         // mlist
-        answ = %f;
+        answ = %t
+        if typeof(m)=="ce"      // array of cells
+            if size(m,"*")==1
+                answ = answ & isempty(m{1})
+            else
+                n = size(m,"*")
+                for i = 1:n
+                    answ = answ & isempty(m(i))
+                    if ~answ
+                        break
+                    end
+                end
+            end
+
+        elseif typeof(m)=="st"    // array of structures
+            fn = fieldnames(m)
+            if size(m, "*")>0 && fn~=[]
+                for f = fn(:)'
+                    answ = answ & isempty(m(f))
+                    if ~answ
+                        break
+                    end
+                end
+            end
+        else                    // other types of mlist
+            answ = %f
+        end
 
     else
-        answ = size(m,"*")==0;
+        if type(m)~=0
+            answ = size(m,"*")==0
+        else
+            answ = %t
+        end
     end
 
 endfunction
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_7649.dia.ref b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_7649.dia.ref
new file mode 100644 (file)
index 0000000..7786b75
--- /dev/null
@@ -0,0 +1,27 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 7649 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/7649
+//
+// <-- Short Description -->
+//  isempty() returned %F  on {}, list(,) struct() or struct without field
+// =============================================================================
+assert_checktrue(isempty({}));
+assert_checktrue(isempty(struct()));
+assert_checktrue(isempty(list(,)));
+assert_checktrue(isempty(list(,[],struct(),{}, list(,))));
+assert_checktrue(isempty({[],struct(),{}, list(,)(1)}));
+s(1).w = list(,);
+s(2).w = struct();
+s(3).w = {};
+s(4).w = [];
+assert_checktrue(isempty(s));
+s.w = null();
+assert_checktrue(isempty(s));
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_7649.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_7649.tst
new file mode 100644 (file)
index 0000000..e589feb
--- /dev/null
@@ -0,0 +1,30 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 7649 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/7649
+//
+// <-- Short Description -->
+//  isempty() returned %F  on {}, list(,) struct() or struct without field
+// =============================================================================
+
+assert_checktrue(isempty({}));
+assert_checktrue(isempty(struct()));
+assert_checktrue(isempty(list(,)));
+assert_checktrue(isempty(list(,[],struct(),{}, list(,))));
+assert_checktrue(isempty({[],struct(),{}, list(,)(1)}));
+s(1).w = list(,);
+s(2).w = struct();
+s(3).w = {};
+s(4).w = [];
+assert_checktrue(isempty(s));
+s.w = null();
+assert_checktrue(isempty(s));
index ffbeeeb..39359f5 100644 (file)
@@ -1,6 +1,7 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2008 - INRIA - Pierre MARECHAL <pierre.marechal@inria.fr>
+// Copyright (C) 2016 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
@@ -16,5 +17,18 @@ assert_checktrue(isempty([ '' , '' ; '' , '' ]));
 assert_checkfalse(isempty([ ' ' , '' ; '' , '' ]));
 // empty list
 assert_checktrue(isempty(list()));
-// mlist is never empty
+// list with only undefined elements
+assert_checktrue(isempty(list(,)));
+// empty structure()
+assert_checktrue(isempty(struct()));
+// empty cell()
+assert_checktrue(isempty({}));
+// nested empty containers
+assert_checktrue(isempty(list({}, list("",,[]), [], struct())));
+s.r = [];
+s.c = {};
+s.L = list();
+s.s = struct();
+assert_checktrue(isempty(s));
+// other mlists are never empty
 assert_checkfalse(isempty(mlist('')));
index 26fe6ec..f0deff3 100644 (file)
@@ -1,6 +1,7 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2008 - INRIA - Pierre MARECHAL <pierre.marechal@inria.fr>
+// Copyright (C) 2016 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
@@ -23,5 +24,22 @@ assert_checkfalse(isempty([ ' ' , '' ; '' , '' ]));
 // empty list
 assert_checktrue(isempty(list()));
 
-// mlist is never empty
+// list with only undefined elements
+assert_checktrue(isempty(list(,)));
+
+// empty structure()
+assert_checktrue(isempty(struct()));
+
+// empty cell()
+assert_checktrue(isempty({}));
+
+// nested empty containers
+assert_checktrue(isempty(list({}, list("",,[]), [], struct())));
+s.r = [];
+s.c = {};
+s.L = list();
+s.s = struct();
+assert_checktrue(isempty(s));
+
+// other mlists are never empty
 assert_checkfalse(isempty(mlist('')));