* Bug 15800 fixed: elementwise assignments in vector of handles 46/20546/5
Samuel GOUGEON [Wed, 10 Oct 2018 21:24:27 +0000 (23:24 +0200)]
  http://bugzilla.scilab.org/15800

  These cases will be illustrated in the set() page when improving it
  for http://bugzilla.scilab.org/15414

Change-Id: Id58d81ae4b2075b6827315865ee36382ff970789

scilab/CHANGES.md
scilab/modules/graphics/macros/%h_set.sci
scilab/modules/graphics/tests/nonreg_tests/bug_15800.tst [new file with mode: 0644]
scilab/modules/graphics/tests/unit_tests/get_path.dia.ref [moved from scilab/modules/graphic_objects/tests/unit_tests/path.dia.ref with 100% similarity]
scilab/modules/graphics/tests/unit_tests/get_path.tst [moved from scilab/modules/graphic_objects/tests/unit_tests/path.tst with 100% similarity]
scilab/modules/graphics/tests/unit_tests/set.tst [new file with mode: 0644]

index 68b991e..102e680 100644 (file)
@@ -662,6 +662,7 @@ Known issues
 * [#15779](http://bugzilla.scilab.org/show_bug.cgi?id=15779): `test_run` did not accept the wildcard * in tests names.
 * [#15796](http://bugzilla.scilab.org/show_bug.cgi?id=15796): Display after `mprintf("")` crashed Scilab (regression)
 * [#15799](http://bugzilla.scilab.org/show_bug.cgi?id=15799): `ifftshift()` could not invert `fftshift(x, along)` directional actions.
+* [#15800](http://bugzilla.scilab.org/show_bug.cgi?id=15800): Distributive assignments of a property values in a vector of handles were not supported.
 * [#15805](http://bugzilla.scilab.org/show_bug.cgi?id=15805): `colorbar()` ticking was poor and most often irrelevant or puzzling, set to not simple values, with useless unreadable minor ticks.
 * [#15806](http://bugzilla.scilab.org/show_bug.cgi?id=15806): `colorbar(..)` missed some simple syntaxes with default umin, umax and colminmax values, such as `colorbar()`.
 * [#15808](http://bugzilla.scilab.org/show_bug.cgi?id=15808): `[5i]` was parsed as `[5,i]`
index 916e495..ff8002e 100644 (file)
@@ -20,10 +20,45 @@ function hdl = %h_set(varargin)
 
     elseif s > 2
         hdl = varargin(1)
-        sh = size(hdl,"*");
-        for i = 2:2:s
-            for j = 1:sh
-                hdl(j)(varargin(i)) = varargin(i+1);
+        Hsize = size(hdl);
+        nh = prod(Hsize);
+        for i = 2:2:s   // Loop on ("property",value) pairs
+            prop = varargin(i);
+            rhs = varargin(i+1);
+            if nh==1
+                // scalar handle => direct assignment
+                hdl(prop) = rhs;
+            else
+                // array of handles
+                RHSsize = size(rhs);
+                for j = 1:nh  // Loop on handles
+                    h = hdl(j)  // works around http://bugzilla.scilab.org/15802
+                    lhs = h(prop);     // Current handle's content
+                    LHSsize = size(lhs);
+                    if and(RHSsize==LHSsize) | lhs==[]  // => repeated assignment
+                        h(prop) = rhs;
+                    elseif size(lhs,"*")==1 & and(RHSsize==Hsize)
+                        // => element-wise assignments
+                        h(prop) = rhs(j);
+                    elseif LHSsize(2)==1 & LHSsize(1)==RHSsize(1) & RHSsize(2)==nh
+                        // column-wise assignments
+                        h(prop) = rhs(:,j);
+                    elseif LHSsize(1)==1 & LHSsize(2)==RHSsize(2) & RHSsize(1)==nh
+                        // row-wise assignments
+                        h(prop) = rhs(j,:);
+                    elseif prod(LHSsize)==prod(RHSsize)
+                        // Repeated assignment after RHS reformating
+                        h(prop) = matrix(rhs,LHSsize);
+                    elseif RHSsize(1)==nh & RHSsize(2)==prod(LHSsize)
+                        // example: axes.data_bounds is a 2x2 matrix,
+                        //          but a 1x4 assigment is possible
+                        h(prop) = rhs(j,:);
+                    else
+                        msg = _("%s: Unsupported assignment for property ''%s''.\n")
+                        error(msprintf(msg, "%h_set", prop))
+                    end
+                    hdl(j) = h;
+                end
             end
         end
     end
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_15800.tst b/scilab/modules/graphics/tests/nonreg_tests/bug_15800.tst
new file mode 100644 (file)
index 0000000..c7dbcb5
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+// <-- NO CHECK REF -->
+
+// <-- Non-regression test for bug 15800 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15800
+//
+// <-- Short Description -->
+// elementwise assignment in a vector of handles failed
+
+clf
+plot([[1 2]; [1 3]], [[3 4]; [4 5]], "o");
+e = gce();
+h = e.children;
+h.mark_background = h.mark_foreground ;
+assert_checkequal(h.mark_background, h.mark_foreground);
+set(h, "mark_background", 2*h.mark_foreground);
+assert_checkequal(h.mark_background, 2*h.mark_foreground);
diff --git a/scilab/modules/graphics/tests/unit_tests/set.tst b/scilab/modules/graphics/tests/unit_tests/set.tst
new file mode 100644 (file)
index 0000000..8418a6f
--- /dev/null
@@ -0,0 +1,161 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- TEST WITH GRAPHIC -->
+// <-- NO CHECK REF -->
+//
+// Unitary tests for set(h), h.prop = and h("prop") =
+//
+
+clf;
+plot();
+f = gcf();
+
+// SETS MULTIPLE PROPERTIES
+// ========================
+// .. of a scalar handle
+set(f, "figure_name", "set() test", "axes_size", [500 400]);
+assert_checkequal(f.figure_name, "set() test");
+assert_checkequal(f.axes_size, [500 400]);
+
+// .. of a vector of handles
+set(f.children, "foreground", 2, "rotation_angles", [0 90], "view","2d");
+assert_checkequal(f.children.foreground, [2 2]');
+assert_checkequal(f.children.view, ["2d" "2d"]');
+assert_checkequal(f.children.rotation_angles, [0 270 ; 0 270]);
+
+// SCALAR HANDLE
+// =============
+// Scalar property value
+set(f, "rotation_style", "multiple");
+assert_checkequal(f.rotation_style, "multiple");
+f.rotation_style = "unary";
+assert_checkequal(f.rotation_style, "unary");
+f("rotation_style") = "multiple";
+assert_checkequal(f.rotation_style, "multiple");
+
+// Row property value
+set(f, "axes_size", [600, 500]); sleep(200)
+assert_checkequal(f.axes_size, [600 500]);
+f.axes_size = [700 600]; sleep(200)
+assert_checkequal(f.axes_size, [700 600]);
+f.axes_size = [650 550]; sleep(200)
+assert_checkequal(f.axes_size, [650 550]);
+
+// Matrix property value
+cm = jetcolormap(50);
+set(f, "color_map", cm);
+assert_checkequal(f.color_map, cm);
+cm = jetcolormap(51);
+f.color_map = cm;
+assert_checkequal(f.color_map, cm);
+cm = jetcolormap(52);
+f.color_map = cm;
+assert_checkequal(f.color_map, cm);
+
+
+// ARRAY OF HANDLES
+// ================
+e = gce().children;  // Set of curves
+// Scalar property value (curve.thickness): repeated assignment
+L = list(e(1:3) , 2, [2 2 2]', ..
+         e(1:3)', 3, [3 3 3]', ..
+         matrix(e(1:6),2,3), 2, [2 2 2 2 2 2]');
+for i = 0:(size(L)/3-1)
+    h = L(1+3*i);
+    v = L(2+3*i);
+    vref = L(3+3*i);
+    set(h, "thickness",v);
+    assert_checkequal(h.thickness, vref);
+    h.thickness = 2*v;
+    assert_checkequal(h.thickness, 2*vref);
+    h("thickness") = v;
+    assert_checkequal(h.thickness, vref);
+end
+// Scalar property value (curve.thickness): distributive assignment
+L = list(e(1:3) , [2 3 4]', [2 3 4]', ..
+         e(1:3)', [1 2 3],  [1 2 3]', ..
+         matrix(e(1:6),2,3), [2 4 6; 3 5 7], (2:7)', ..
+         matrix(e(1:6),2,3), 1:6, (1:6)', ..
+         matrix(e(1:6),2,3), (1:6)', (1:6)', ..
+         );
+for i = 0:(size(L)/3-1)
+    h = L(1+3*i);
+    v = L(2+3*i);
+    vref = L(3+3*i);
+    set(h, "thickness",v);
+    assert_checkequal(h.thickness, vref);
+    h.thickness = 2*v;
+    assert_checkequal(h.thickness, 2*vref);
+    h("thickness") = v;
+    assert_checkequal(h.thickness, vref);
+end
+
+// Row property value (axes.grid): repeated assignments
+a = gcf().children;
+L = list(a , [1 2], [1 2 ; 1 2], ..
+         a', [2 3], [2 3 ; 2 3], ..
+        );
+for i = 0:(size(L)/3-1)
+    h = L(1+3*i);
+    v = L(2+3*i);
+    vref = L(3+3*i);
+    set(h, "grid",v);
+    assert_checkequal(h.grid, vref);
+    h.grid = v;
+    assert_checkequal(h.grid, vref);
+    h("grid") = v;
+    assert_checkequal(h.grid, vref);
+end
+
+// Row property value (axes.grid): row-wise assignments
+L = list(a , [1 5 ; 3 5], [1 5 ; 3 5], ..
+         a' , [1 5 ; 3 5], [1 5 ; 3 5], ..
+        );
+for i = 0:(size(L)/3-1)
+    h = L(1+3*i);
+    v = L(2+3*i);
+    vref = L(3+3*i);
+    set(h, "grid",v);
+    assert_checkequal(h.grid, vref);
+    h.grid = v;
+    assert_checkequal(h.grid, vref);
+    h("grid") = v;
+    assert_checkequal(h.grid, vref);
+end
+
+// Matrix property value (axes.data_bounds): repeated rowed assignments
+L = list(a , [1 1.5 0 0.5], [1 0 ; 1.5 0.5 ; 1 0 ; 1.5 0.5], ..
+         a', [1 1.5 0 0.5], [1 0 ; 1.5 0.5 ; 1 0 ; 1.5 0.5], ..
+        );
+for i = 0:(size(L)/3-1)
+    h = L(1+3*i);
+    v = L(2+3*i);
+    vref = L(3+3*i);
+    set(h, "data_bounds",v);
+    assert_checkequal(h.data_bounds, vref);
+    h.data_bounds = v;
+    assert_checkequal(h.data_bounds, vref);
+    h("data_bounds") = v;
+    assert_checkequal(h.data_bounds, vref);
+end
+
+// Matrix property value (axes.data_bounds): rowed-wise assignments
+L = list(a , [1 1.5 0 0.5 ; 1.5 2.2 -0.5 1], [1 0 ; 1.5 0.5 ; 1.5 -0.5 ; 2.2 1], ..
+         a', [1 1.5 0 0.5 ; 1.5 2.2 -0.5 1], [1 0 ; 1.5 0.5 ; 1.5 -0.5 ; 2.2 1], ..
+        );  // beware about http://bugzilla.scilab.org/15079 for vref
+for i = 0:(size(L)/3-1)
+    h = L(1+3*i);
+    v = L(2+3*i);
+    vref = L(3+3*i);
+    set(h, "data_bounds",v);
+    assert_checkequal(h.data_bounds, vref);
+    h.data_bounds = v;
+    assert_checkequal(h.data_bounds, vref);
+    h("data_bounds") = v;
+    assert_checkequal(h.data_bounds, vref);
+end