changeset 20890:ef9b2a88fbb5 stable

Fixed isequal for comparison of objects with overridden size (bug #44334) * scripts/general/private/__isequal__.m: Removed comparison of built-in size (and ndims) with overridden size (and ndims). The algorithms compares the built-in values now. * test/classes/@SizeTester/SizeTester.m, test/classes/@SizeTester/size.m, test/classes/@SizeTester/numel.m: Implemented test class, which overrides its public size and numel in a consistent way. * test/classes/classes.tst: Added test cases for this bug and other related bugs.
author Oliver Heimlich <oheim@posteo.de>
date Mon, 14 Dec 2015 12:19:38 +0000
parents 9851a296cf87
children 9fe6db1dcc46
files scripts/general/private/__isequal__.m test/classes/@SizeTester/SizeTester.m test/classes/@SizeTester/numel.m test/classes/@SizeTester/size.m test/classes/classes.tst
diffstat 5 files changed, 64 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/general/private/__isequal__.m	Fri Aug 21 13:05:52 2015 -0400
+++ b/scripts/general/private/__isequal__.m	Mon Dec 14 12:19:38 2015 +0000
@@ -64,7 +64,7 @@
 
   if (t)
     ## Test that everything has the same number of dimensions.
-    t = all (ndims (x) == cellfun ("ndims", varargin));
+    t = all (builtin ("ndims", x) == cellfun ("ndims", varargin));
   endif
 
   if (t)
@@ -72,7 +72,7 @@
     nd = ndims (x);
     k = 1;
     do
-      t = all (size (x,k) == cellfun ("size", varargin, k));
+      t = all (builtin ("size", x, k) == cellfun ("size", varargin, k));
     until (!t || k++ == nd);
   endif
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/classes/@SizeTester/SizeTester.m	Mon Dec 14 12:19:38 2015 +0000
@@ -0,0 +1,6 @@
+function x = SizeTester (desired_size)
+
+  x = struct ("desired_size", desired_size);
+  x = class (x, "SizeTester");
+
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/classes/@SizeTester/numel.m	Mon Dec 14 12:19:38 2015 +0000
@@ -0,0 +1,5 @@
+function n = numel (this)
+
+  n = prod (this.desired_size);
+
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/classes/@SizeTester/size.m	Mon Dec 14 12:19:38 2015 +0000
@@ -0,0 +1,5 @@
+function s = size (this)
+
+  s = this.desired_size;
+
+endfunction
--- a/test/classes/classes.tst	Fri Aug 21 13:05:52 2015 -0400
+++ b/test/classes/classes.tst	Mon Dec 14 12:19:38 2015 +0000
@@ -361,3 +361,49 @@
 %% Trying to change to CPrecendenceTester3 > Snork
 %!error D = CPrecedenceTester3 (1);
 
+##############################################
+## Testing overridden size+numel method     ##
+## (builtin size method and similar methods ##
+## use the size of the struct container)    ##
+##############################################
+
+%!shared st
+%!test st = SizeTester ([1 1]);
+%! assert (isequal (size (st), [1 1]))
+%! assert (isequal (numel (st), 1))
+%!assert (isequal (ndims (st), 2))
+%!assert (isequal (rows (st), 1))
+%!assert (isequal (columns (st), 1))
+%!assert (isequal (st, st))
+%!assert (isscalar (st))
+%!assert (isvector (st))
+
+%!test st = SizeTester ([1 2]);
+%! assert (isequal (size (st), [1 2]))
+%! assert (isequal (numel (st), 2))
+%!assert (isequal (ndims (st), 2))
+%!assert (isequal (rows (st), 1))
+%!xtest assert (isequal (columns (st), 2))
+%!assert (isequal (st, st))                # bug #44334
+%!xtest assert (not (isscalar (st)))       # bug #44498
+%!assert (isvector (st))
+
+%!test st = SizeTester ([2 3]);
+%! assert (isequal (size (st), [2 3]))
+%! assert (isequal (numel (st), 6))
+%!assert (isequal (ndims (st), 2))
+%!xtest assert (isequal (rows (st), 2))
+%!xtest assert (isequal (columns (st), 3))
+%!assert (isequal (st, st))                # bug #44334
+%!xtest assert (not (isscalar (st)))       # bug #44498
+%!xtest assert (not (isvector (st)))       # bug #44498
+
+%!test st = SizeTester ([2 3 4]);
+%! assert (isequal (size (st), [2 3 4]))
+%! assert (isequal (numel (st), 24))
+%!xtest assert (isequal (ndims (st), 3))
+%!xtest assert (isequal (rows (st), 2))
+%!xtest assert (isequal (columns (st), 3))
+%!assert (isequal (st, st))                # bug #44334
+%!xtest assert (not (isscalar (st)))       # bug #44498
+%!xtest assert (not (isvector (st)))       # bug #44498