* Bug 15403 fixed: bar(..,'stacked') missed y=0 40/20540/9
Samuel GOUGEON [Sun, 7 Oct 2018 03:24:20 +0000 (05:24 +0200)]
  http://bugzilla.scilab.org/15403

  + other bugs fixed about syntaxes

 All tests refering to bar() pass:
test_run graphics bug_4106 show_error
test_run graphics bug_7080 show_error
test_run graphics bug_12615 show_error
test_run graphics bug_13579 show_error
test_run graphics bar_stacked show_error
test_run graphics barhomogenize show_error // already fails before this patch. Updated for this patch

Change-Id: Ia00f4051a0a50eb4d61b784424f2f6dc29d61b41

12 files changed:
scilab/CHANGES.md
scilab/modules/graphics/help/en_US/bar_histogram/bar.xml
scilab/modules/graphics/help/fr_FR/bar_histogram/bar.xml
scilab/modules/graphics/help/ja_JP/bar_histogram/bar.xml
scilab/modules/graphics/help/pt_BR/bar_histogram/bar.xml
scilab/modules/graphics/macros/bar.sci
scilab/modules/graphics/tests/nonreg_tests/bug_15403.tst [new file with mode: 0644]
scilab/modules/graphics/tests/nonreg_tests/bug_7080.dia.ref [deleted file]
scilab/modules/graphics/tests/nonreg_tests/bug_7080.tst
scilab/modules/graphics/tests/unit_tests/bar.tst [new file with mode: 0644]
scilab/modules/graphics/tests/unit_tests/barhomogenize.dia.ref [deleted file]
scilab/modules/graphics/tests/unit_tests/barhomogenize.tst

index af7060a..bc37421 100644 (file)
@@ -541,6 +541,7 @@ Known issues
 * [#15284](http://bugzilla.scilab.org/show_bug.cgi?id=15284): Port names are not set to the corresponding I/O block labels.
 * [#15310](http://bugzilla.scilab.org/show_bug.cgi?id=15310): `isdef` considered void arguments as defined (regression)
 * [#15346](http://bugzilla.scilab.org/show_bug.cgi?id=15346): In an array of rationals, there was no way to address components with their linearized indices.
+* [#15403](http://bugzilla.scilab.org/show_bug.cgi?id=15403): `bar(..,"stacked")` could start from y<>0. Input arguments and possible syntaxes were poorly tested. 
 * [#15404](http://bugzilla.scilab.org/show_bug.cgi?id=15404): `surf()` and `mesh()` did not allow to specify `foreground`, `facecolor`, `markforeground` and `markbackground` global properties colors as a predefined named color out of a list of the 9 main color names. Colors specifications as "#RRGGBB" hexa code or Colors indices in the color map were nor allowed.
 * [#15422](http://bugzilla.scilab.org/show_bug.cgi?id=15422): `strsubst("ab", "", "cd")` crashed Scilab.
 * [#15423](http://bugzilla.scilab.org/show_bug.cgi?id=15423): `tbx_make(myModule,sections)` executed the existing builder (if any), instead of targeting only selected module sections. Otherwise, tbx_make(myModule, "help"|"macros") yielded an error, and tbx_make(myModule,"localization") never built it.
index ed5e55f..dd88c1d 100644 (file)
@@ -25,8 +25,9 @@
         <title>Syntax</title>
         <synopsis>bar(y)
             bar(x, y)
-            bar(x, y [,width [,color [,style]]])
-            bar(h, x, y ..)
+            bar(x, y, width, colors, style)
+            bar(x, y [,width] [,colors] [,style])
+            bar(h, ..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
             <varlistentry>
                 <term>y</term>
                 <listitem>
-                    <para>a real scalar, vector of size N, or a matrix N*M.</para>
+                    <para>
+                        scalar, vector of size N, or matrix N*M of real numbers or encoded integers,
+                      with
+                      <itemizedlist>
+                        <listitem>
+                          N : number of groups (each group of bars gathered on/around an x position)
+                        </listitem>
+                        <listitem>
+                          M : number of categories in each group
+                        </listitem>
+                      </itemizedlist>
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>x</term>
                 <listitem>
-                    <para>a real scalar or a vector of size N, (default: if y is a
-                        vector then x is a vector and x length equals to y length. If y is a
-                        matrix then x is a vector and x length equals to the lines number of
-                        y.
+                    <para>a real scalar or a vector of size N. By default,
+                      <itemizedlist>
+                        <listitem>
+                          If <varname>y</varname> is a vector: <literal>x=1:length(y)</literal>
+                        </listitem>
+                        <listitem>
+                          If <varname>y</varname> is a matrix: <literal>x=1:size(y,"r")</literal>
+                        </listitem>
+                      </itemizedlist>
                     </para>
                 </listitem>
             </varlistentry>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>color</term>
+                <term>colors</term>
                 <listitem>
                     <para>
-                        (optional) the color filling bars, specified by its literal name among
-                        predefined ones, or by its "#RRGGBB" hexadecimal code.  Default: "blue"
+                        (optional) Single string or vector of M strings: colors names (among
+                        predefined ones) or "#RRGGBB" hexadecimal codes of categories colors.
+                        Default = default plot() colors series, starting with "blue".
                     </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>style:</term>
+                <term>style</term>
                 <listitem>
-                    <para>a string, 'grouped' or 'stacked' (default: 'grouped').</para>
+                    <para>a string, 'grouped' (default), or 'stacked'.</para>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Description</title>
         <para>
-            <literal>bar(y,...) :</literal> if y is a vector then bar function draws a
-            polyline which has the <literal>polyline_style</literal> type 6. If y is a
-            vector, bar draws vector y versus vector 1:size(y,'*') . If y is a matrix
-            N*M, bar draws M polylines (type 6), each polyline corresponds to a column
-            of y versus vector x=1:size(y,1).
+            <literal>bar(y,...) :</literal> if y is a vector, then bar() draws a
+            polyline which has the <literal>polyline_style</literal> type 6, versus x=1:length(y).
+            If y is a matrix N*M, bar() draws M polylines (type 6), versus x=1:size(y,1).
+            Each polyline represents a category, with a specific color.
         </para>
         <para>
-            <literal>bar(x,y,...) :</literal> if y is a vector then bar function draws a
+            <literal>bar(x,y,...) :</literal> if y is a vector, then bar() draws a
             polyline which has the <literal>polyline_style</literal> type 6, where x length
-            = y length.If y is a matrix NxM then bar function draws M polylines which
+            = y length. If y is a matrix NxM then bar function draws M polylines which
             have the type 6. Each polyline corresponds to a column of y versus vector
             x.
         </para>
         <para>
-            <literal>bar(h,...) :</literal> defines the current axes where the drawing is
+            <literal>bar(h,...) :</literal> specifies the targeted axes where the drawing is
             performed.
         </para>
         <para>
-            <literal>bar(...,width,...) :</literal> defines the width of the bar(s) in
-            percentage (generally: 0&lt;width&lt;=1).
+            <literal>bar(...,width,...) :</literal> defines the relative width of the bar(s):
+            0&lt;width&lt;=1.
         </para>
         <para>
             <literal>bar(...,style,...) :</literal> defines how the bar is drawn. If y is
-            a matrix N*M (so M polylines of type 6) then there are two ways to draw
+            a matrix N*M (so M polylines of type 6), then there are two ways to draw
             the M bars. the style option = 'grouped' allows to center the M polylines
             versus each components of x, and the style option 'stacked' allows to
             stack them.
         </para>
         <para>
-            <literal>bar(...,color,...) : </literal> defines the bars filling color.
+            <literal>bar(...,colors,...) : </literal> defines the colors identifying categories
+            and filling the corresponding subsets of bars.
         </para>
         <para>
             If there are several bar() calls, the <literal>barhomogenize</literal> function
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
 // First example: draw a bar (i.e a polyline with polyline_style type =6) with
-// width=0.5 and color='yellow' and default style='grouped', x=1:length(y).
+// width=0.5 and colors='yellow' and default style='grouped', x=1:length(y).
 scf(0);
 y=[1 -3 5];
 bar(y,0.5,'yellow');
@@ -158,7 +176,7 @@ bar(x,y,'stacked');
             bar(x,y,'stacked');
         </scilab:image>
         <programlisting role="example"><![CDATA[
-// Fourth example: width=0.2;color='green'; default style='grouped'
+// Fourth example: width=0.2;colors='green'; default style='grouped'
 scf(3);
 x=[1 2 5];
 y=[1 4 7;2 5 8;3 6 9];
@@ -191,6 +209,9 @@ bar(x,y,0.2,'green');
             <member>
                 <link linkend="polyline_properties">polyline_properties</link>
             </member>
+            <member>
+                <link linkend="hist3d">hist3d</link>
+            </member>
         </simplelist>
     </refsection>
     <refsection role="history">
@@ -199,9 +220,18 @@ bar(x,y,0.2,'green');
             <revision>
                 <revnumber>6.0.1</revnumber>
                 <revdescription>
-                    color is no longer restricted to the 10 major colors: It can now be any of the
-                    numerous predefined Scilab color names. Moreover, it can now be specified by
-                    its "#RRGGBB" hexadecimal code.
+                    <itemizedlist>
+                      <listitem>
+                        A vector of M colors can now be provided, one for each category.
+                      </listitem>
+                      <listitem>
+                        Available colors are no longer restricted to the 10 major colors. All the
+                        predefined colors names can now be used.
+                      </listitem>
+                      <listitem>
+                        Colors can now be specified also by their "#RRGGBB" hexadecimal codes.
+                      </listitem>
+                    </itemizedlist>
                 </revdescription>
             </revision>
         </revhistory>
index 405abf9..5627d57 100644 (file)
@@ -9,9 +9,11 @@
     </refnamediv>
     <refsynopsisdiv>
         <title>Séquence d'appel</title>
-        <synopsis>bar(y)
+        <synopsis>
+            bar(y)
             bar(x, y)
-            bar(x, y [,width [,color [,style]]])
+            bar(x, y, width, colors, style)
+            bar(x, y [,width] [,colors] [,style])
             bar(h, x, y ..)
         </synopsis>
     </refsynopsisdiv>
                 <term>y</term>
                 <listitem>
                     <para>
-                      un scalaire, un vecteur de taille N, ou une matrice de taille N*M
+                       scalaire, vecteur de taille N, ou matrice (N_lignes * M_colonnes) de nombres
+                       réels ou d'entiers encodés, avec
+                      <itemizedlist>
+                        <listitem>
+                          N : nombre de groupes de barres. Chaque groupe est rassemblé à (proximité
+                          de) la position x dédiée.
+                        </listitem>
+                        <listitem>
+                          M : nombre de catégories = nombre de barres dans chaque groupe.
+                        </listitem>
+                      </itemizedlist>
                     </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>x</term>
                 <listitem>
-                    <para>
-                      un scalaire ou un vecteur de taille N, (si y est un vecteur alors x doit
-                      etre de meme longeur que y. Si y est une matrice alors x doit etre un vecteur
-                      de longeur egale au nombre de lignes de y).
+                    <para>scalaire, ou vecteur de taille N. Par défaut,
+                      <itemizedlist>
+                        <listitem>
+                          Si <varname>y</varname> est un vecteur : <literal>x=1:length(y)</literal>
+                        </listitem>
+                        <listitem>
+                          Si <varname>y</varname> est une matrice : <literal>x=1:size(y,"r")</literal>
+                        </listitem>
+                      </itemizedlist>
                     </para>
                 </listitem>
             </varlistentry>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>color</term>
+                <term>colors</term>
                 <listitem>
                     <para>
-                        (optionnel) couleur de remplissage des barres, indiquée par son nom
-                        littéral choisi dans la liste des couleurs Scilab prédéfinies, ou par
-                        son code hexadécimal littéral du type "#RRGGBB".  Par défaut: "blue"
+                        (option) String unique (commune), ou vecteur de M strings : noms des
+                        couleurs des M catégories (choisis dans la liste Scilab des noms prédéfinis),
+                        ou codes hexadécimaux de celles-ci (du type "#RRGGBB"). Par défaut, la
+                        série de couleurs utilisées par défaut par plot() est utilisée, commençant
+                        par "blue".
                     </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>style:</term>
+                <term>style</term>
                 <listitem>
                     <para>
-                      (optionel), une chaine, 'grouped' or 'stacked' (par défaut: 'grouped').
+                      (option) 'grouped' (par défaut), ou 'stacked'.
                     </para>
                 </listitem>
             </varlistentry>
     <refsection>
         <title>Description</title>
         <para>
-            <literal>bar(y,...) :</literal> si y est un vecteur alors la fonction bar
-            dessine une polyline de type <literal>polyline_style</literal> égale à 6, dans
-            ce cas x =1 : length(y). Si y est une matrice de taille N*M, alors la
-            fonction bar dessine M polylines de (type 6), chaque polyline correspond à
-            une colonne de y est au vecteur x=1:size(y,1).
+            <literal>bar(y,...) :</literal> si y est un vecteur, alors bar()
+            dessine une polyline unique de type <literal>polyline_style=6</literal>, avec
+            <literal>x=1:length(y)</literal>. Si y est une matrice de taille N*M, alors bar()
+            dessine M polylines de (type 6), avec x=1:size(y,1) ; chaque polyline correspond alors
+            à une colonne de y, et à une catégorie, avec sa propre couleur .
         </para>
         <para>
-            <literal>bar(x,y,...) :</literal> si y est un vecteur alors la fonction bar
-            dessine une polyline de type <literal>polyline_style</literal> égale à 6,
-            vérifiant: longeur de x = longeur de y .Si y est une matrice de taille
-            N*M, alors la fonction bar dessine M polylines de (type 6), chaque
-            polyline correspond à une colonne de y est au vecteur x vérifiant longueur
-            de x=size(y,1) (i.e longueur de x = nombre de ligne de y).
+            <literal>bar(x,y,...) :</literal> comme <literal>bar(y,...) :</literal>, mais en
+            indiquant explicitement les N positions x des groupes.
         </para>
         <para>
             <literal>bar(h,...) :</literal> definit les axes courants ou le dessin est
             réalisé.
         </para>
         <para>
-            <literal>bar(...,width,...) :</literal> definit l'épaisseur des barres en
-            pourcentage (générallement: 0&lt;width&lt;=1).
+            <literal>bar(...,width,...) :</literal> definit la largeur relative des barres :
+            0&lt;width&lt;=1.
         </para>
         <para>
             <literal>bar(...,style,...) :</literal> dans le cas ou y est une matrice
             'stacked' permet de les empiler.
         </para>
         <para>
-            <literal>bar(...,color,...) : </literal> definit la couleur des barres.
+            <literal>bar(...,colors,...) : </literal> definit les couleurs des catégories de barres.
+            Toutes les barres d'une même catégorie sont remplies avec la même couleur.
         </para>
         <para>S'il y a plusieurs appels à la fonction bar(), la fonction
             <literal>barhomogenize</literal> permet d'homogénéiser l'épaisseur et le style
         <title>Exemples</title>
         <programlisting role="example"><![CDATA[
 // Premier exemple : dessine une barre, avec les paramètres width=0.5
-// et color='yellow' et par défaut x=1:length(y), style = 'grouped'.
+// et colors='yellow' et par défaut x=1:length(y), style = 'grouped'.
 scf(0);
 y=[1 -3 5];
 bar(y,0.5,'yellow');
@@ -155,7 +171,7 @@ bar(x,y,'stacked');
             bar(x,y,'stacked');
         </scilab:image>
         <programlisting role="example"><![CDATA[
-// Quatrième exemple; width=0.2;color='green'; par défaut style='grouped'
+// Quatrième exemple; width=0.2;colors='green'; par défaut style='grouped'
 scf(3);
 x=[1 2 5]; y=[1 4 7;2 5 8;3 6 9];
 bar(x,y,0.2,'green');
@@ -187,6 +203,9 @@ bar(x,y,0.2,'green');
             <member>
                 <link linkend="polyline_properties">polyline_properties</link>
             </member>
+            <member>
+                <link linkend="hist3d">hist3d</link>
+            </member>
         </simplelist>
     </refsection>
     <refsection role="history">
@@ -195,10 +214,21 @@ bar(x,y,0.2,'green');
             <revision>
                 <revnumber>6.0.1</revnumber>
                 <revdescription>
-                    La valeur de color n'est plus restreinte aux 10 principales couleurs : elle
-                    peut désormais être toute couleur parmi celles -- nombreuses -- prédéfinies
-                    dans Scilab. En outre, color peut maintenant être indiquée par son code
-                    hexadécimal "#RRGGBB".
+                    <itemizedlist>
+                      <listitem>
+                        Un vecteur de M couleurs peut désormais être fourni, une couleur pour
+                        chaque catégorie.
+                      </listitem>
+                      <listitem>
+                        Les couleurs utilisables ne sont plus restreintes à la liste des 10 couleurs
+                        majeures utilisées par plot(). Toutes les couleurs nommées prédéfinies
+                        dans Scilab sont utilisables.
+                      </listitem>
+                      <listitem>
+                        Les couleurs peuvent désormais être indiquées également par leur code
+                        hexadécimal "#RRGGBB".
+                      </listitem>
+                    </itemizedlist>
                 </revdescription>
             </revision>
         </revhistory>
index e770c72..b78e239 100644 (file)
@@ -1,14 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
 <!--
-
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-
  * Copyright (C) INRIA - Farid Belahcene
-
  *
-
-
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
@@ -17,9 +11,7 @@
  * and continues to be available under such terms.
  * For more information, see the COPYING file which you should have received
  * along with this program.
-
  *
-
  -->
 
 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
 
         <title>呼び出し手順</title>
 
-        <synopsis>bar(y)
+        <synopsis>
+            bar(y)
             bar(x, y)
-            bar(x, y [,width [,color [,style]]])
+            bar(x, y, width, colors, style)
+            bar(x, y [,width] [,colors] [,style])
             bar(h, x, y ..)
         </synopsis>
 
 
                 <listitem>
 
-                    <para>実数スカラー, 大きさ Nのベクトル, または N*M行列.</para>
+                    <para>
+                        scalar, vector of size N, or matrix N*M of real numbers or encoded integers,
+                      with
+                      <itemizedlist>
+                        <listitem>
+                          N : number of groups (each group of bars gathered on/around an x position)
+                        </listitem>
+                        <listitem>
+                          M : number of categories in each group
+                        </listitem>
+                      </itemizedlist>
+                    </para>
 
                 </listitem>
 
 
                 <listitem>
 
-                    <para>実数スカラー, 大きさ Nのベクトル, (デフォルト:  y がベクトルの場合,
-
-                        x はベクトルで xの長さはyの長さに等しくなります.
-
-                        yが行列の場合,xはベクトルとなりxの長さはyの行数と等しくなります.
-
+                    <para>a real scalar or a vector of size N. By default,
+                      <itemizedlist>
+                        <listitem>
+                          If <varname>y</varname> is a vector: <literal>x=1:length(y)</literal>
+                        </listitem>
+                        <listitem>
+                          If <varname>y</varname> is a matrix: <literal>x=1:size(y,"r")</literal>
+                        </listitem>
+                      </itemizedlist>
                     </para>
 
                 </listitem>
 
             <varlistentry>
 
-                <term>color</term>
+                <term>colors</term>
 
                 <listitem>
                     <para>
-                        (オプション) the color filling bars, specified by its literal name among
-                        predefined ones, or by its "#RRGGBB" hexadecimal code.  Default: "blue"
+                        (オプション) Single string or vector of M strings: colors names (among
+                        predefined ones) or "#RRGGBB" hexadecimal codes of categories colors.
+                        Default = default plot() colors series, starting with "blue".
                     </para>
                 </listitem>
 
         </para>
 
         <para>
-
-            <literal>bar(...,color,...) : </literal>は,barの色を定義します.
-
+            <literal>bar(...,colors,...) : </literal> defines the colors identifying categories
+            and filling the corresponding subsets of bars.
         </para>
 
         <para>bar()を複数回コールする場合,
 
 // 最初の例: 棒を描画 (すなわち,polyline_style type =6のポリライン) ただし,
 
-// width=0.5 , color='yellow' で default style='grouped', x=1:length(y).
+// width=0.5 , colors='yellow' で default style='grouped', x=1:length(y).
 
 scf(0);
 
@@ -304,7 +312,7 @@ bar(x,y,'stacked');
 
         <programlisting role="example"><![CDATA[
 
-// 4番目の例: width=0.2;color='green'; default style='grouped'
+// 4番目の例: width=0.2;colors='green'; default style='grouped'
 
 scf(3);
 
@@ -349,6 +357,9 @@ bar(x,y,0.2,'green');
             <member>
                 <link linkend="polyline_properties">polyline_properties</link>
             </member>
+            <member>
+                <link linkend="hist3d">hist3d</link>
+            </member>
         </simplelist>
     </refsection>
     <refsection role="history">
@@ -357,9 +368,18 @@ bar(x,y,0.2,'green');
             <revision>
                 <revnumber>6.0.1</revnumber>
                 <revdescription>
-                    color is no longer restricted to the 10 major colors: It can now be any of the
-                    numerous predefined Scilab color names. Moreover, it can now be specified by
-                    its "#RRGGBB" hexadecimal code.
+                    <itemizedlist>
+                      <listitem>
+                        A vector of M colors can now be provided, one for each category.
+                      </listitem>
+                      <listitem>
+                        Available colors are no longer restricted to the 10 major colors. All the
+                        predefined colors names can now be used.
+                      </listitem>
+                      <listitem>
+                        Colors can now be specified also by their "#RRGGBB" hexadecimal codes.
+                      </listitem>
+                    </itemizedlist>
                 </revdescription>
             </revision>
         </revhistory>
index 863bf49..2f483b1 100644 (file)
@@ -25,7 +25,8 @@
         <title>Seqüência de Chamamento</title>
         <synopsis>
             bar(x, y)
-            bar(x, y [,width [,color [,style]]])
+            bar(x, y, width, colors, style)
+            bar(x, y [,width] [,colors] [,style])
             bar(h, x, y ..)
         </synopsis>
     </refsynopsisdiv>
             <varlistentry>
                 <term>y</term>
                 <listitem>
-                    <para>escalar real, vetor de tamanho N ou uma matriz NxM.</para>
+                    <para>
+                        scalar, vector of size N, or matrix N*M of real numbers or encoded integers,
+                      with
+                      <itemizedlist>
+                        <listitem>
+                          N : number of groups (each group of bars gathered on/around an x position)
+                        </listitem>
+                        <listitem>
+                          M : number of categories in each group
+                        </listitem>
+                      </itemizedlist>
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>color</term>
+                <term>colors</term>
                 <listitem>
-                    <para>(opcional) the color filling bars, specified by its literal name among
-                        predefined ones, or by its "#RRGGBB" hexadecimal code. Padrão: 'blue')
+                    <para>(opcional) Single string or vector of M strings: colors names (among
+                        predefined ones) or "#RRGGBB" hexadecimal codes of categories colors.
+                        Default = default plot() colors series, starting with "blue".
                     </para>
                 </listitem>
             </varlistentry>
             style = 'stacked' permite empilhá-las.
         </para>
         <para>
-            <literal>bar(...,color,...) : </literal>define a cor da barra.
+            <literal>bar(...,colors,...) : </literal>define a cor da barra.
         </para>
         <para>Se há várias chamadas a bar(), a função
             <literal>barhomogenize</literal> permite homogeneizar a largura e estilo
         <title>Exemplos</title>
         <programlisting role="example"><![CDATA[
 // primeiro exemplo: desenhando uma barra (i.e uma poligonal com polyline_style =6) com
-// width=0.5 e color='yellow' e style='grouped', x=1:length(y).
+// width=0.5 e colors='yellow' e style='grouped', x=1:length(y).
 scf(0);
 y=[1 -3 5];
 bar(y,0.5,'yellow');
@@ -137,7 +150,7 @@ scf(2);
 x=[1 2 5]; y=[1 4 7;2 5 8;3 6  9];
 bar(x,y,'stacked');
 
-// quarto exemplo: width=0.2;color='green', style='grouped'
+// quarto exemplo: width=0.2;colors='green', style='grouped'
 scf(3);
 x=[1 2 5]; y=[1 4 7;2 5 8;3 6 9];
 bar(x,y,0.2,'green');
@@ -164,6 +177,9 @@ bar(x,y,0.2,'green');
             <member>
                 <link linkend="polyline_properties">polyline_properties</link>
             </member>
+            <member>
+                <link linkend="hist3d">hist3d</link>
+            </member>
         </simplelist>
     </refsection>
     <refsection role="history">
@@ -172,9 +188,18 @@ bar(x,y,0.2,'green');
             <revision>
                 <revnumber>6.0.1</revnumber>
                 <revdescription>
-                    color is no longer restricted to the 10 major colors: It can now be any of the
-                    numerous predefined Scilab color names. Moreover, it can now be specified by
-                    its "#RRGGBB" hexadecimal code.
+                    <itemizedlist>
+                      <listitem>
+                        A vector of M colors can now be provided, one for each category.
+                      </listitem>
+                      <listitem>
+                        Available colors are no longer restricted to the 10 major colors. All the
+                        predefined colors names can now be used.
+                      </listitem>
+                      <listitem>
+                        Colors can now be specified also by their "#RRGGBB" hexadecimal codes.
+                      </listitem>
+                    </itemizedlist>
                 </revdescription>
             </revision>
         </revhistory>
index d3e56f0..516c9d7 100644 (file)
@@ -1,9 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2005 - INRIA - Farid Belahcene
 // Copyright (C) 2012 - Michael Baudin
-// Copyright (C) 2018 - Samuel GOUGEON
-// 
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-
 function  bar(varargin)
-    // bar(x, y, width, colors, "stacked"|"grouped")|
+    // bar(y)
+    // bar(x, y)
+    // bar(x, y, width, colors, style)
+    // bar(x, y [,width] [,colors] [,style])
+    // bar(h, ..)
     //
     // Input :
     // x : a real scalar or a vector
@@ -28,19 +30,18 @@ function  bar(varargin)
     //         has as many components as there are categories.
     // style : a string 'grouped' or 'stacked' (default: style='grouped')
 
-    if size(varargin)<1 | size(varargin)>5  then
+    fname = "bar"
+    ListArg = varargin;
+
+    if size(varargin)<1 | size(varargin)>6  then
         msg = gettext("%s: Wrong number of input argument(s): %d to %d expected.\n")
-        error(msprintf(msg, "bar", 1, 5));
+        error(msprintf(msg, fname, 1, 6));
     end
 
-    styletab=["grouped","stacked"]
-    COLORBOOL=%f
-    STYLE="grouped"
-
-    //Check RHS argument
-    ListArg = varargin;
-
-    //detect and set the current axes now:
+    // PARSING INPUT ARGUMENTS
+    // =======================
+    // Targeted axes
+    // -------------
     shift = 0;  // shift for argins positions
     if type(ListArg(1)) == 9
         hdle = ListArg(1);
@@ -49,182 +50,153 @@ function  bar(varargin)
             ListArg(1) = null(); // remove this parameter from the list
             shift = 1;
         else
-            msg = gettext("%s: Wrong type for input argument #%d: Axes handle expected.\n")
-            warning(msprintf(msg, "bar", 1));
-            return
+            msg = gettext("%s: Argument #%d: Graphic handle of type ''%s'' expected.\n")
+            error(msprintf(msg, fname, 1, "Axes"));
         end
     end
-
-    if size(ListArg) == 4 then
-        COLOR=ListArg(4);
-        c = iscolor(COLOR,"a#")
-        if or(c(:,1)==-1)
-            msg = gettext("%s: Argument #%d: Wrong color specification.\n")
-            error(msprintf(msg, "bar", shift+4));
+    // Style
+    // -----
+    STYLE = "grouped"
+    if length(ListArg)>0 & type(ListArg($))==10 then
+        tmp = stripblanks(convstr(ListArg($)))
+        if or(tmp=="stacked" | tmp=="grouped")
+            if size(tmp,"*")>1
+                msg = gettext("%s: Argument #%d: Scalar (1 element) expected.\n")
+                error(msprintf(msg, fname, shift+length(ListArg)));
+            end
+            STYLE = tmp
+            ListArg($) = null()
         end
     end
-    if size(ListArg) == 5 then
-        STYLE=ListArg(5);
-        if type(STYLE) <> 10 then
-            msg = gettext("%s: Wrong type for input arguments #%d: string expected.\n")
-            error(msprintf(msg, "bar", shift+5));
+    // bar([h,] y,..)
+    // --------------
+    msg = gettext("%s: Argument #%d: Decimal number(s) expected.\n")
+    if length(ListArg)>0 & (length(ListArg)==1 | and(type(ListArg(2))~=[1 8]) | ..
+        (length(ListArg(2))==1 & ListArg(2)>0 & ListArg(2)<=1))  // is width
+        Y = ListArg(1)
+        if isvector(Y)
+            Y = Y(:)
+        end
+        X = (1:size(Y,1))'
+        ListArg(1) = null()
+        ky = shift+1
+    else
+        // bar([h,] x, y,..)  expected
+        // X
+        if ListArg==list()
+            error(msprintf(msg, fname, shift+1));
+        end
+        X = ListArg(1)
+        ListArg(1) = null()
+        // Y
+        if ListArg==list()
+            error(msprintf(msg, fname, shift+2));
+        end
+        Y = ListArg(1)
+        ListArg(1) = null()
+        ky = shift+2
+        if X==[]
+            X = 1:size(Y,1)
+        end
+        X = X(:)
+        if isvector(X) & isvector(Y)
+            Y = Y(:)
         end
     end
-    nv = size(ListArg)
-
-    T=[];
-
-    // Number of inputs arguments < 6
-    if  size(ListArg)>5 then
-        msg = gettext("%s: Wrong number of input arguments: %d to %d expected.\n")
-        error(msprintf(msg, "bar", 1, shift+5));
+    if Y==[] then
+        msg = gettext("%s: Argument #%d: Non-empty matrix expected.\n")
+        error(msprintf(msg, fname, ky))
     end
-
-    for k=1:nv
-        T(k) = type(ListArg(k))
+    if and(type(X)~=[1 8]) | (type(X)==1 & ~isreal(X)) then
+        error(msprintf(msg, fname, shift+1))
+    else
+        X = double(X)
     end
-
-    argdb=find(T==1)
-    argstr=find(T==10)
-
-    if size(argdb,"*")<> argdb($) then
-        msg = gettext("%s: Wrong type for input arguments: Matrix expected for %s, %s and %s.\n")
-        error(msprintf(msg, "bar", "x", "y", "width"));
+    if and(type(Y)~=[1 8]) | (type(Y)==1 & ~isreal(Y)) then
+        error(msprintf(msg, fname, ky))
+    else
+        Y = double(Y)
     end
-
-    if size(argstr,"*") <> nv-argdb($) then
-        msg = gettext("%s: Wrong type for input arguments: String expected for %s and %s.\n")
-        error(msprintf(msg, "bar", "color", "style"));
+    if size(Y,1)~=length(X) then
+        msg = gettext("%s: Arguments #%d and #%d: Incompatible sizes.\n")
+        error(msprintf(msg, fname, shift+1, shift+2))
     end
-
-    //set the double argument : x,y,width
-    // bar(y,...)
-    if size(argdb,"*")==1
-        Y=ListArg(1)
-        WIDTH = 0.8
-        if or(size(Y)==1) then
-            Y=Y(:)
-        end
-        X=1:size(Y,1)
+    if (isnan(X) | isinf(X))
+        msg = gettext("%s: Argument #%d: Inf and Nan values forbidden.\n")
+        error(msprintf(msg, fname, shift+1))
     end
-
-    if size(argdb,"*")==2
-        if size(ListArg(2),"*")==1 then
-            // bar(x,y,...)
-            if size(ListArg(1),"*")==1 then
-                WIDTH=0.8
-                X=ListArg(1)
-                Y=ListArg(2)
-            else
-                //bar(y,width,...)
-                WIDTH=ListArg(2)
-                Y=ListArg(1)
-                if or(size(Y)==1) then
-                    Y=Y(:)
-                end
-                X=1:size(Y,1)
-            end
-        else
-            // bar(x,y,...)
-            X=ListArg(1)
-            Y=ListArg(2)
-            if or(size(X)==1) then
-                if size(X,"*")<>1 then // X is a vector
-                    if or(size(Y)==1) then // Y is a vector
-                        Y=Y(:)
-                    end
-                    if size(X,"*")<>size(Y,1) // Y is a matrix
-                        msg = gettext("%s: Wrong size for input arguments #%d and #%d: The number of rows of argument #%d must be equal to the size of argument #%d.\n")
-                        error(msprintf(msg, "bar", shift+1, shift+2, shift+2, shift+1));
-                    end
-                elseif size(Y,1)>1 then
-                    msg = gettext("%s: Wrong size for input argument #%d: A scalar or a row vector expected.\n")
-                    error(msprintf(msg,"bar", shift+2));
-                end
-            else
-                msg = gettext("%s: Wrong type for input argument #%d: A scalar or a vector expected.\n")
-                error(msprintf(msg, "bar", shift+1));
-            end
-            WIDTH=0.8
+    if STYLE=="stacked"
+        if (isnan(Y) | isinf(Y))
+            msg = gettext("%s: Argument #%d: Inf and Nan values forbidden.\n")
+            error(msprintf(msg, fname, ky))
+        end
+        if or(Y<0)
+            msg = gettext("%s: Argument #%d: Non-negative values expected.\n")
+            warning(msprintf(msg, fname, ky))
         end
     end
 
-    // bar(x,y,width,...)
-    if size(argdb,"*")==3
-        X = ListArg(1)
-        Y = ListArg(2)
-        WIDTH = ListArg(3)
+    // Width
+    // -----
+    kw = ky
+    WIDTH = 0.8
+    if length(ListArg)>0 & or(type(ListArg(1))==[1 8]) then
+        kw = ky+1   // position of the width arg
+        WIDTH = ListArg(1)
+        if length(WIDTH)>1
+            msg = gettext("%s: Argument #%d: Scalar (1 element) expected.\n")
+            error(msprintf(msg, fname, kw))
+        end
         if WIDTH==[]
             WIDTH = 0.80
         end
-        if size(WIDTH,"*")<>1 then
-            msg = gettext("%s: Wrong type for input argument #%d: A scalar expected.\n")
-            error(msprintf(msg, "bar", shift+3));
-        elseif or(size(X)==1) then
-            if size(X,"*")<>1 then // X is a vector
-                if or(size(Y)==1) then // Y is a vector
-                    Y=Y(:)
-                end
-                if size(X,"*")<>size(Y,1)
-                    msg = gettext("%s: Wrong size for input arguments #%d and #%d: The number of rows of argument #%d must be equal to the size of argument #%d.\n");
-                    error(msprintf(msg, "bar", shift+1, shift+2, shift+2, shift+1))
-                end
-            elseif size(Y,1)>1 then
-                msg = gettext("%s: Wrong size for input arguments #%d: A scalar or a column vector expected.\n");
-                error(msprintf(msg, "bar", shift+2));
-            end
-        else
-            msg = gettext("%s: Wrong type for input argument #%d: A scalar or a vector expected.\n");
-            error(msprintf(msg, "bar", shift+1));
-        end
-    end
-    X=X(:)
-
-    // set the string argument
-    for i=1:size(argstr,"*")
-        // bar(...,style)
-        if or(ListArg(argstr(i))==styletab) then
-            STYLE=ListArg(argstr(i))
-        else
-            COLOR=ListArg(argstr(i))
-            COLORBOOL=%t
+        if ~isreal(WIDTH) | WIDTH<0 | WIDTH>1
+            msg = gettext("%s: Argument #%d: Must be in the interval %s.\n")
+            error(msprintf(msg, fname, kw, "[0, 1]"))
         end
+        ListArg(1) = null();
     end
-    // drawlater
-    curFig = gcf();
-    immediate_drawing = curFig.immediate_drawing;
 
-    wmode = warning("query");
-    if COLORBOOL
-        c = iscolor(COLOR);
-        if or(c(:,1)==-1)
-            msg = _("%s: Argument #%d: Wrong color specification.\n")
-            error(msprintf(msg, "bar", shift+4));
-        end
-        nparts = max(1, size(Y,"c"));
-
-        if size(c,"r")==1
-            // Only one color is provided => we replicate it
-            if type(COLOR)==10
-                COLOR = emptystr(1,nparts) + COLOR;  // name or "#RRGGBB"
-            elseif size(COLOR,"c")==3
-                COLOR = ones(nparts,1)*COLOR        // [r g b]
+    // Colors
+    // ------
+    COLOR = []
+    if length(ListArg)>0
+        COLOR = ListArg(1)
+        if COLOR~=[]
+            nColors = size(COLOR,"*")
+            msg = gettext("%s: Argument #%d: Wrong color specification.\n")
+            if type(COLOR)~=10
+                error(msprintf(msg, fname, kw+1));
+            end
+            c = iscolor(COLOR, "a#")
+            if or(c(:,1)==-1)
+                error(msprintf(msg, fname, kw+1));
+            end
+            if nColors~=1 & nColors<size(Y,2) then
+                msg = _("%s: Arguments #%d and #%d: Incompatible sizes.\n")
+                error(msprintf(msg, fname, ky, kw+1));
+            end
+            if nColors>1 then
+                COLOR = COLOR(1:size(Y,2)) // extra components ignored
             else
-                COLOR = ones(nparts,1)*COLOR        // index in colormap
+                COLOR = emptystr(1,size(Y,2)) + COLOR;  // name or "#RRGGBB"
             end
-        elseif size(c,"r") < nparts
-            msg = _("%s: Arguments #%d and #%d: Incompatible sizes.\n")
-            error(msprintf(msg, "bar", shift+2, shift+4));
         end
-        warning("off"); // See bug #13579 (some bar() syntaxes will lead to a plot() warning)
-        plot(X,Y,"color",COLOR); // plot manages immediate_drawing property itself to avoid flickering
-    else
-        warning("off"); 
-        plot(X,Y); // plot manages immediate_drawing property itself to avoid flickering
     end
-    warning(wmode);
 
-    curFig.immediate_drawing = "off";
+    // PLOTTING
+    // ========
+    curFig = gcf()
+    immediate_drawing = curFig.immediate_drawing
+    wmode = warning("query")
+    warning("off")
+    if COLOR~=[]
+        plot(X,Y, "color",COLOR)
+    else
+        plot(X,Y)
+    end
+    warning(wmode)
+    curFig.immediate_drawing = "off"
 
     bar_number=size(Y,2)
     if size(X,"*")>1 then
@@ -234,7 +206,11 @@ function  bar(varargin)
             inter=min(Xtemp(i+1)-Xtemp(i),inter)
         end
         if bar_number>1
-            inter=inter*0.9
+            if STYLE == "stacked"
+                inter = inter * 0.9
+            else
+                inter = inter * 0.7
+            end
         end
     else
         Xtemp=X
@@ -242,13 +218,11 @@ function  bar(varargin)
     end
 
     wmax=inter/bar_number
-
     y_shift=zeros(size(X,"*"),1)
-
     bar_number= bar_number
 
-    e=gce()
-    a=gca()
+    e = gce()
+    a = gca()
 
     a.sub_ticks(1) = 0; // bar (barh => a.sub_ticks(2) = 0;)
 
@@ -272,17 +246,17 @@ function  bar(varargin)
 
         // Udate the axes data bounds
         if STYLE=="grouped"
-            xmin = min(a.data_bounds(1,1),min(X)+x_shift-0.4*wmax)
+            xmin = min(a.data_bounds(1,1),min(X)+x_shift-0.45*wmax)
             ymin = min(a.data_bounds(1,2),0,min(y_shift+Y(:,bar_number-i+1)))
-            xmax = max(a.data_bounds(2,1),max(X)+x_shift+0.4*wmax)
+            xmax = max(a.data_bounds(2,1),max(X)+x_shift+0.45*wmax)
             ymax = max(a.data_bounds(2,2),0)
             ei.x_shift = x_shift*ones(size(X,"*"),1)
         else
             wmax = inter
-            xmin = min(a.data_bounds(1,1),min(X)-0.4*wmax)
-            ymin = min(a.data_bounds(1,2),min(y_shift+Y(:,bar_number-i+1)))
-            xmax = max(a.data_bounds(2,1),max(X)+0.4*wmax)
-            ymax = max(a.data_bounds(2,2),max(y_shift+Y(:,bar_number-i+1)))
+            xmin = min(a.data_bounds(1,1),min(X)-0.45*wmax)
+            ymin = min(a.data_bounds(1,2), 0, min(y_shift+Y(:,bar_number-i+1)))
+            xmax = max(a.data_bounds(2,1),max(X)+0.45*wmax)
+            ymax = max(a.data_bounds(2,2), 0, max(y_shift+Y(:,bar_number-i+1)))
             ei.y_shift = y_shift
         end
         a.data_bounds=[xmin ymin; xmax ymax]
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_15403.tst b/scilab/modules/graphics/tests/nonreg_tests/bug_15403.tst
new file mode 100644 (file)
index 0000000..551cb4c
--- /dev/null
@@ -0,0 +1,27 @@
+// =============================================================================
+// 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 -->
+// <-- INTERACTIVE TEST -->
+
+// <-- Non-regression test for bug 15403 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15403
+//
+// <-- Short Description -->
+// In "stacked" mode, bar(..) did not start from y=0
+
+// The vertical bars must all start from 0
+clf
+subplot(1,3,1)
+bar(2,[2 1 3],"stacked")
+subplot(1,3,2)
+bar(1:5, 1+rand(1,5), "stacked")
+subplot(1,3,3)
+bar(1:5, rand(1,5)-0.5, "stacked")
+
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_7080.dia.ref b/scilab/modules/graphics/tests/nonreg_tests/bug_7080.dia.ref
deleted file mode 100644 (file)
index c007d5b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// <-- TEST WITH GRAPHIC -->
-//
-// <-- Non-regression test for bug 7080 -->
-//
-// <-- Bugzilla URL -->
-// http://bugzilla.scilab.org/7080
-//
-// <-- Short Description -->
-// Some graphics macros do not use standard error messages
-f1="bar";
-f2="barh";
-f3="barhomogenize";
-f4="getColorIndex";
-f13="Sgrayplot";
-f14="TitleLabel";
-//bar
-msgerr11=msprintf(_("%s: Wrong number of input argument(s): %d to %d expected.\n"),f1,1,5);
-assert_checkerror("bar(gca(),[1 2],[1 2],0.8,""blue"",""grouped"")", msgerr11);
-msgerr12=msprintf(gettext("%s: Wrong type for input arguments: Matrix expected for %s, %s and %s.\n"),"bar", "x", "y", "width");
-assert_checkerror("bar(gca(),[""s"" ""d""],[1 2 3])", msgerr12);
-msgerr13=msprintf(_("%s: Wrong size for input arguments #%d and #%d: The number of rows of argument #%d must be equal to the size of argument #%d.\n"),"bar",1, 2, 2, 1);
-assert_checkerror("bar([1 2],[1 2 3],0.8,""blue"")", msgerr13);
-//barh
-msgerr21=msprintf(_("%s: Wrong number of input argument(s): %d to %d expected.\n"),f2,1,5);
-assert_checkerror("barh(gca(),[1 2],[1 2],0.8,""blue"",""grouped"")", msgerr21);
-msgerr22=msprintf(gettext("%s: Wrong type for input arguments: Matrix expected for %s, %s and %s.\n"),"barh", "x", "y", "width");
-assert_checkerror("barh(gca(),[""s"" ""d""],[1 2 3])", msgerr22);
-msgerr23=msprintf(_("%s: Wrong size for input arguments #%d and #%d: The number of rows of argument #%d must be equal to the size of argument #%d.\n"),"bar",1, 2, 2, 1);
-assert_checkerror("barh([1 2],[1 2 3],0.8,""blue"")", msgerr23);
-msgerr24=msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"),f2,5);
-assert_checkerror("barh(1,2,3,4,5)",msgerr24);
-//barhomogenize
-msgerr31=msprintf(_("%s: Wrong number of input argument(s): %d to %d expected.\n"),f3,0,3);
-assert_checkerror("barhomogenize(gca(),[1 2],[1 2],0.8,""blue"",""grouped"")", msgerr31);
-msgerr32=msprintf(_("%s: Could not find any bar in the current graphic.\n"), "barhomogenize");
-assert_checkerror("barhomogenize(gca(),""grouped"",3)", msgerr32);
-//getColorIndex
-msgerr41=msprintf(_("%s: Wrong type for input argument #%d: string expected.\n"), f4, 1);
-assert_checkerror("getColorIndex(1)", msgerr41);
-//Sgrayplot
-msgerr131=msprintf(gettext("%s: Wrong number of input arguments: At least %d expected.\n"),"Sgrayplot",3);
-assert_checkerror("Sgrayplot(1)", msgerr131);
-msgerr132=msprintf(gettext("%s: Wrong type for input argument(s): Arguments #%d, #%d and #%d must be real.\n"), "Sgrayplot",1,2,3);
-assert_checkerror("Sgrayplot(%i,%i,[%i,%i])", msgerr132);
-//TitleLabel
-msgerr141=msprintf(gettext("%s: Wrong size or type for input argument #%d: string expected.\n"),f14,1);
-assert_checkerror("TitleLabel(""Scale n°3"",1)",msgerr141);
index 02020e7..fe280cb 100644 (file)
@@ -6,6 +6,7 @@
 // =============================================================================
 //
 // <-- TEST WITH GRAPHIC -->
+// <-- NO CHECK REF -->
 //
 // <-- Non-regression test for bug 7080 -->
 //
@@ -23,11 +24,11 @@ f13="Sgrayplot";
 f14="TitleLabel";
 
 //bar
-msgerr11=msprintf(_("%s: Wrong number of input argument(s): %d to %d expected.\n"),f1,1,5);
-assert_checkerror("bar(gca(),[1 2],[1 2],0.8,""blue"",""grouped"")", msgerr11);
-msgerr12=msprintf(gettext("%s: Wrong type for input arguments: Matrix expected for %s, %s and %s.\n"),"bar", "x", "y", "width");
+msgerr11=msprintf(_("%s: Wrong number of input argument(s): %d to %d expected.\n"),f1,1,6);
+assert_checkerror("bar(gca(),[1 2],[1 2],0.8,""blue"",""grouped"",[])", msgerr11);
+msgerr12=msprintf(gettext("%s: Argument #%d: Decimal number(s) expected.\n"), f1, 2);
 assert_checkerror("bar(gca(),[""s"" ""d""],[1 2 3])", msgerr12);
-msgerr13=msprintf(_("%s: Wrong size for input arguments #%d and #%d: The number of rows of argument #%d must be equal to the size of argument #%d.\n"),"bar",1, 2, 2, 1);
+msgerr13=msprintf(_("%s: Arguments #%d and #%d: Incompatible sizes.\n"), f1, 1, 2);
 assert_checkerror("bar([1 2],[1 2 3],0.8,""blue"")", msgerr13);
 
 //barh
diff --git a/scilab/modules/graphics/tests/unit_tests/bar.tst b/scilab/modules/graphics/tests/unit_tests/bar.tst
new file mode 100644 (file)
index 0000000..d926f5a
--- /dev/null
@@ -0,0 +1,111 @@
+// =============================================================================
+// 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 -->
+// <-- ENGLISH IMPOSED -->
+// <-- NO CHECK REF -->
+
+// Unitary tests of bar()
+// ----------------------
+
+// Allowed syntaxes
+// ----------------
+Y_34 = grand(3,4,'uin',0,6)/2;
+for a = ["" "ax, "]     // Targeted axes
+    for xy = ["[2 1 1.5]"  "[2 1 1.5]''"  "[], [2 1 1.5]"  "7.5, [2 1 1.5]" ..
+              "-1.2:0.8, [2 1 1.5]"  "2.2:1.1:4.4, [2 1 1.5]''" ..
+              "(2.2:1.1:4.4)'', [2 1 1.5]''" ..
+              "Y_34"  "7:2:11, Y_34"  "(7:2:11)'', Y_34" ..
+              "int8([2 1 1.5])"  "int8(-4), [2 1 1.5]"  ..
+              "int8(-4), int8([2 1 1.5])" ];
+        for w = ["", ", []", ", 0.6"]             // bars width
+            if grep(xy,",")==[] & w~=""
+                continue
+            end
+            for col = ["", ", []", ", ""pink"""]      // colors
+                if grep(xy,",")==[] & w=="" & col==", []"
+                    continue
+                end
+                for sty = ["" ", ""stacked"""]        // style
+                    mprintf("bar(%s%s%s%s%s)\n",a,xy,w,col,sty);
+                    clf
+                    ax = gca();
+                    cmd = "bar("+a+xy+w+col+sty+")";
+                    assert_checkequal(execstr(cmd, "errcatch"), 0);
+                end
+            end
+        end
+    end
+end
+// Multiple colors
+
+
+// Expected Errors
+// ---------------
+msg = "bar: Wrong number of input argument(s): 1 to 6 expected."
+assert_checkerror("clf, bar()", msg);
+assert_checkerror("clf, bar(1,2,3,4,5,6,7)", msg);
+
+// Bad handle type
+msg = "bar: Argument #1: Graphic handle of type ''Axes'' expected."
+assert_checkerror("clf, bar(gcf(),7, [3 -2 1]'')", msg);
+
+// X, Y
+msg = "bar: Argument #1: Decimal number(s) expected.";
+assert_checkerror("clf, bar(''stacked'')", msg);
+assert_checkerror("clf, bar([2 3]<1)", msg);
+msg = "bar: Argument #2: Decimal number(s) expected.";
+assert_checkerror("clf, bar(gca(), ''stacked'')", msg);
+assert_checkerror("clf, bar(gca(), [2 3]<1)", msg);
+msg = "bar: Argument #1: Non-empty matrix expected.";
+assert_checkerror("clf, bar([])", msg);
+msg = "bar: Argument #2: Non-empty matrix expected.";
+assert_checkerror("clf, bar(gca(), [])", msg);
+msg = "bar: Argument #2: Non-empty matrix expected.";
+assert_checkerror("clf, bar([2 3],[])", msg);
+msg = "bar: Argument #3: Non-empty matrix expected.";
+assert_checkerror("clf, bar(gca(), [2 3],[])", msg);
+msg = "bar: Argument #3: Non-empty matrix expected.";
+assert_checkerror("clf, bar(gca(), [2 3],[])", msg);
+msg = "bar: Argument #2: Wrong color specification.";
+assert_checkerror("clf, bar(3,[1 2]<3)", msg);
+
+msg = "bar: Arguments #1 and #2: Incompatible sizes."
+assert_checkerror("clf, bar(7, [3 -2 1]'')", msg);
+msg = "bar: Arguments #2 and #3: Incompatible sizes."
+assert_checkerror("clf, bar(gca(), 7, [3 -2 1]'')", msg);
+
+// Width
+msg = "bar: Argument #3: Must be in the interval [0, 1]."
+assert_checkerror("clf, bar(7, [3 -2 1], -0.5)", msg);
+assert_checkerror("clf, bar(7, [3 -2 1], 1.1)", msg);
+msg = "bar: Argument #3: Scalar (1 element) expected.";
+assert_checkerror("clf, bar(7, [3 -2 1], [0.3 0.4])", msg);
+
+msg = "bar: Argument #4: Must be in the interval [0, 1]."
+assert_checkerror("clf, bar(gca(), 7, [3 -2 1], -0.5)", msg);
+assert_checkerror("clf, bar(gca(), 7, [3 -2 1], 1.1)", msg);
+msg = "bar: Argument #4: Scalar (1 element) expected.";
+assert_checkerror("clf, bar(gca(), 7, [3 -2 1], [0.3 0.4])", msg);
+
+// Colors
+msg = "bar: Argument #3: Wrong color specification.";
+assert_checkerror("clf, bar(7, [3 -2 1],[""abc"" ""red""])", msg);
+msg = "bar: Argument #4: Wrong color specification.";
+assert_checkerror("clf, bar(gca(), 7, [3 -2 1],[""abc"" ""red""])", msg);
+// # of colors =/= number of categories
+msg = "bar: Arguments #2 and #3: Incompatible sizes.";
+assert_checkerror("clf, bar(7, [3 -2 1],[""green"" ""red""])", msg);
+msg = "bar: Arguments #3 and #4: Incompatible sizes.";
+assert_checkerror("clf, bar(gca(), 7, [3 -2 1],[""green"" ""red""])", msg);
+
+// Style
+msg = "bar: Argument #3: Scalar (1 element) expected.";
+assert_checkerror("clf, bar(7, [3 -2 1],[""abc"" ""stacked""])", msg);
+msg = "bar: Argument #4: Scalar (1 element) expected.";
+assert_checkerror("clf, bar(gca(), 7, [3 -2 1],[""abc"" ""stacked""])", msg);
+
diff --git a/scilab/modules/graphics/tests/unit_tests/barhomogenize.dia.ref b/scilab/modules/graphics/tests/unit_tests/barhomogenize.dia.ref
deleted file mode 100644 (file)
index 9dcaf5d..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// <-- TEST WITH GRAPHIC -->
-// Unit test for barhomogenize
-subplot(2,3,1);
-xtitle("ex1: creation of 1 yellow bar and  3 bars");
-x=1:3; y1=1:3; y2=[4 3 5;6 7 8;9 10 11];
-bar(x,y1,"yellow");bar(x,y2);
-subplot(2,3,2);
-xtitle("grouped homogenization");
-x=1:3; y1=1:3; y2=[4 3 5;6 7 8;9 10 11];
-bar(x,y1,"yellow");bar(x,y2);
-barhomogenize();
-subplot(2,3,3);
-xtitle("stacked homogenization");
-x=1:3; y1=1:3; y2=[4 3 5;6 7 8;9 10 11];
-bar(x,y1,"yellow");bar(x,y2);
-barhomogenize("stacked",1);
-f=gcf();
-a1=f.children(1);
-a2=f.children(2);
-a3=f.children(3);
-c11=a1.children(1);
-c12=a1.children(2);
-c21=a2.children(1);
-c22=a2.children(2);
-c31=a3.children(1);
-c32=a3.children(2);
-// Third graphic: stacked
-p111=c11.children(1); // red polyline
-p112=c11.children(2); // green polyline
-p113=c11.children(3); // blue polyline
-p121=c12.children(1); // yellow polyline
-// Second graphic: grouped
-p211=c21.children(1); // red polyline
-p212=c21.children(2); // green polyline
-p213=c21.children(3); // blue polyline
-p221=c22.children(1); // yellow polyline
-// First graphic: no homogenized
-p311=c31.children(1); // red polyline
-p312=c31.children(2); // green polyline
-p313=c31.children(3); // blue polyline
-p321=c32.children(1); // yellow polyline
-// Check First graphic axes
-assert_checkequal(a3.x_location, "bottom");
-assert_checkequal(a3.y_location, "left");
-assert_checkequal(a3.auto_ticks, ["off", "on", "on"]);
-assert_checkequal(a3.x_ticks.locations, [1;2;3]);
-assert_checkequal(a3.y_ticks.locations, [0;2;4;6;8;10;12]);
-assert_checkequal(a3.z_ticks.locations, []);
-assert_checkequal(a3.x_ticks.labels, ["1";"2";"3"]);
-assert_checkequal(a3.y_ticks.labels, ["0";"2";"4";"6";"8";"10";"12"]);
-assert_checkequal(a3.z_ticks.labels, []);
-assert_checkequal(a3.sub_ticks, [0,1]);
-assert_checktrue(abs(a3.data_bounds - [0.55,0;3.45,11]) < 0.05);
-assert_checkequal(a3.margins(2:$), [0.125,0.125,0.125]);
-assert_checktrue(abs(a3.axes_bounds - [0,0,0.3333333333,0.5]) < 0.0005);
-// Check Second
-assert_checkequal(a2.x_location, a3.x_location);
-assert_checkequal(a2.y_location, a3.y_location);
-assert_checkequal(a2.auto_ticks, a3.auto_ticks);
-assert_checkequal(a2.x_ticks.locations, a3.x_ticks.locations);
-assert_checkequal(a2.y_ticks.locations, a3.y_ticks.locations);
-assert_checkequal(a2.z_ticks.locations, a3.z_ticks.locations);
-assert_checkequal(a2.x_ticks.labels, a3.x_ticks.labels);
-assert_checkequal(a2.y_ticks.labels, a3.y_ticks.labels);
-assert_checkequal(a2.z_ticks.labels, a3.z_ticks.labels);
-assert_checkequal(a2.sub_ticks, a3.sub_ticks);
-assert_checktrue(abs(a2.data_bounds - a3.data_bounds) < 0.05);
-assert_checkequal(a2.margins, a3.margins);
-assert_checktrue(abs(a2.axes_bounds - a3.axes_bounds) < 0.5);
-// Check third
-assert_checkequal(a1.x_location, a3.x_location);
-assert_checkequal(a1.y_location, a3.y_location);
-assert_checkequal(a1.auto_ticks, a3.auto_ticks);
-assert_checkequal(a1.x_ticks.locations, a3.x_ticks.locations);
-assert_checkequal(a1.y_ticks.locations, [0;10;20;30]);
-assert_checkequal(a1.z_ticks.locations, a3.z_ticks.locations);
-assert_checkequal(a1.x_ticks.labels, a3.x_ticks.labels);
-assert_checkequal(a1.y_ticks.labels, ["0";"10";"20";"30"]);
-assert_checkequal(a1.z_ticks.labels, a3.z_ticks.labels);
-assert_checkequal(a1.sub_ticks, a3.sub_ticks);
-assert_checktrue(abs(a1.data_bounds - [0.55,0;3.45,33]) < 0.05);
-assert_checkequal(a1.margins, a3.margins);
-assert_checktrue(abs(a1.axes_bounds - [0.6666667,0,0.3333333,0.5]) < 0.05);
-// Check polylines of first graphic
-assert_checkequal(p311.data, [1,5;2,8;3,11]);
-assert_checkequal(p311.line_style, 1);
-assert_checkequal(p311.polyline_style, 6);
-assert_checkequal(p311.foreground, -1);
-assert_checkequal(p311.background, 5);
-assert_checkequal(p311.mark_mode, "off");
-assert_checkequal(p311.mark_style, 0);
-assert_checkequal(p311.mark_size_unit, "point");
-assert_checkequal(p311.mark_size, 0);
-assert_checkequal(p311.mark_foreground, -1);
-assert_checkequal(p311.mark_background, -2);
-assert_checkequal(p311.x_shift, [0.3,0.3,0.3]);
-assert_checkequal(p311.y_shift, []);
-assert_checkalmostequal(p311.bar_width, 0.24);
-assert_checkequal(p312.data, [1,3;2,7;3,10]);
-assert_checkequal(p312.line_style, 1);
-assert_checkequal(p312.polyline_style, 6);
-assert_checkequal(p312.foreground, -1);
-assert_checkequal(p312.background, 33);
-assert_checkequal(p312.mark_mode, "off");
-assert_checkequal(p312.mark_style, 0);
-assert_checkequal(p312.mark_size_unit, "point");
-assert_checkequal(p312.mark_size, 0);
-assert_checkequal(p312.mark_foreground, -1);
-assert_checkequal(p312.mark_background, -2);
-assert_checkequal(p312.x_shift, [0,0,0]);
-assert_checkequal(p312.y_shift, []);
-assert_checkalmostequal(p312.bar_width, 0.24);
-assert_checkequal(p313.data, [1,4;2,6;3,9]);
-assert_checkequal(p313.line_style, 1);
-assert_checkequal(p313.polyline_style, 6);
-assert_checkequal(p313.foreground, -1);
-assert_checkequal(p313.background, 2);
-assert_checkequal(p313.mark_mode, "off");
-assert_checkequal(p313.mark_style, 0);
-assert_checkequal(p313.mark_size_unit, "point");
-assert_checkequal(p313.mark_size, 0);
-assert_checkequal(p313.mark_foreground, -1);
-assert_checkequal(p313.mark_background, -2);
-assert_checkequal(p313.x_shift, [-0.3,-0.3,-0.3]);
-assert_checkequal(p313.y_shift, []);
-assert_checkalmostequal(p313.bar_width, 0.24);
-assert_checkequal(p321.data, [1,1;2,2;3,3]);
-assert_checkequal(p321.line_style, 1);
-assert_checkequal(p321.polyline_style, 6);
-assert_checkequal(p321.foreground, -1);
-assert_checkequal(p321.background, 7);
-assert_checkequal(p321.mark_mode, "off");
-assert_checkequal(p321.mark_style, 0);
-assert_checkequal(p321.mark_size_unit, "point");
-assert_checkequal(p321.mark_size, 0);
-assert_checkequal(p321.mark_foreground, -1);
-assert_checkequal(p321.mark_background, -2);
-assert_checkequal(p321.x_shift, [0,0,0]);
-assert_checkequal(p321.y_shift, []);
-assert_checkalmostequal(p321.bar_width, 0.8);
-// Check polylines of second graphic
-assert_checkequal(p211.data, p311.data);
-assert_checkequal(p211.line_style, p311.line_style);
-assert_checkequal(p211.polyline_style, p311.polyline_style);
-assert_checkequal(p211.foreground, p311.foreground);
-assert_checkequal(p211.background, p311.background);
-assert_checkequal(p211.mark_mode, p311.mark_mode);
-assert_checkequal(p211.mark_style, p311.mark_style);
-assert_checkequal(p211.mark_size_unit, p311.mark_size_unit);
-assert_checkequal(p211.mark_size, p311.mark_size);
-assert_checkequal(p211.mark_foreground, p311.mark_foreground);
-assert_checkequal(p211.mark_background, p311.mark_background);
-assert_checkequal(p211.x_shift, [-0.3375,-0.3375,-0.3375]);
-assert_checkequal(p211.y_shift, [0,0,0]);
-assert_checkalmostequal(p211.bar_width, 0.18);
-assert_checkequal(p212.data, p312.data);
-assert_checkequal(p212.line_style, p312.line_style);
-assert_checkequal(p212.polyline_style, p312.polyline_style);
-assert_checkequal(p212.foreground, p312.foreground);
-assert_checkequal(p212.background, p312.background);
-assert_checkequal(p212.mark_mode, p312.mark_mode);
-assert_checkequal(p212.mark_style, p312.mark_style);
-assert_checkequal(p212.mark_size_unit, p312.mark_size_unit);
-assert_checkequal(p212.mark_size, p312.mark_size);
-assert_checkequal(p212.mark_foreground, p312.mark_foreground);
-assert_checkequal(p212.mark_background, p312.mark_background);
-assert_checkequal(p212.x_shift, [-0.1125,-0.1125,-0.1125]);
-assert_checkequal(p212.y_shift, p211.y_shift);
-assert_checkalmostequal(p212.bar_width, p211.bar_width);
-assert_checkequal(p213.data, p313.data);
-assert_checkequal(p213.line_style, p313.line_style);
-assert_checkequal(p213.polyline_style, p313.polyline_style);
-assert_checkequal(p213.foreground, p313.foreground);
-assert_checkequal(p213.background, p313.background);
-assert_checkequal(p213.mark_mode, p313.mark_mode);
-assert_checkequal(p213.mark_style, p313.mark_style);
-assert_checkequal(p213.mark_size_unit, p313.mark_size_unit);
-assert_checkequal(p213.mark_size, p313.mark_size);
-assert_checkequal(p213.mark_foreground, p313.mark_foreground);
-assert_checkequal(p213.mark_background, p313.mark_background);
-assert_checkequal(p213.x_shift, [0.1125,0.1125,0.1125]);
-assert_checkequal(p213.y_shift, p211.y_shift);
-assert_checkalmostequal(p213.bar_width, p211.bar_width);
-assert_checkequal(p221.data, p321.data);
-assert_checkequal(p221.line_style, p321.line_style);
-assert_checkequal(p221.polyline_style, p321.polyline_style);
-assert_checkequal(p221.foreground, p321.foreground);
-assert_checkequal(p221.background, p321.background);
-assert_checkequal(p221.mark_mode, p321.mark_mode);
-assert_checkequal(p221.mark_style, p321.mark_style);
-assert_checkequal(p221.mark_size_unit, p321.mark_size_unit);
-assert_checkequal(p221.mark_size, p321.mark_size);
-assert_checkequal(p221.mark_foreground, p321.mark_foreground);
-assert_checkequal(p221.mark_background, p321.mark_background);
-assert_checkequal(p221.x_shift, [0.3375,0.3375,0.3375]);
-assert_checkequal(p221.y_shift, p211.y_shift);
-assert_checkalmostequal(p221.bar_width, p211.bar_width);
-// Check polylines of third graphic
-assert_checkequal(p111.data, p311.data);
-assert_checkequal(p111.line_style, p311.line_style);
-assert_checkequal(p111.polyline_style, p311.polyline_style);
-assert_checkequal(p111.foreground, p311.foreground);
-assert_checkequal(p111.background, p311.background);
-assert_checkequal(p111.mark_mode, p311.mark_mode);
-assert_checkequal(p111.mark_style, p311.mark_style);
-assert_checkequal(p111.mark_size_unit, p311.mark_size_unit);
-assert_checkequal(p111.mark_size, p311.mark_size);
-assert_checkequal(p111.mark_foreground, p311.mark_foreground);
-assert_checkequal(p111.mark_background, p311.mark_background);
-assert_checkequal(p111.x_shift, [0,0,0]);
-assert_checkequal(p111.y_shift, [0,0,0]);
-assert_checkalmostequal(p111.bar_width, 0.9);
-assert_checkequal(p112.data, p312.data);
-assert_checkequal(p112.line_style, p312.line_style);
-assert_checkequal(p112.polyline_style, p312.polyline_style);
-assert_checkequal(p112.foreground, p312.foreground);
-assert_checkequal(p112.background, p312.background);
-assert_checkequal(p112.mark_mode, p312.mark_mode);
-assert_checkequal(p112.mark_style, p312.mark_style);
-assert_checkequal(p112.mark_size_unit, p312.mark_size_unit);
-assert_checkequal(p112.mark_size, p312.mark_size);
-assert_checkequal(p112.mark_foreground, p312.mark_foreground);
-assert_checkequal(p112.mark_background, p312.mark_background);
-assert_checkequal(p112.x_shift, [0,0,0]);
-assert_checkequal(p112.y_shift, [5,8,11]);
-assert_checkalmostequal(p112.bar_width, p111.bar_width);
-assert_checkequal(p113.data, p313.data);
-assert_checkequal(p113.line_style, p313.line_style);
-assert_checkequal(p113.polyline_style, p313.polyline_style);
-assert_checkequal(p113.foreground, p313.foreground);
-assert_checkequal(p113.background, p313.background);
-assert_checkequal(p113.mark_mode, p313.mark_mode);
-assert_checkequal(p113.mark_style, p313.mark_style);
-assert_checkequal(p113.mark_size_unit, p313.mark_size_unit);
-assert_checkequal(p113.mark_size, p313.mark_size);
-assert_checkequal(p113.mark_foreground, p313.mark_foreground);
-assert_checkequal(p113.mark_background, p313.mark_background);
-assert_checkequal(p113.x_shift, [0,0,0]);
-assert_checkequal(p113.y_shift, [8,15,21]);
-assert_checkalmostequal(p113.bar_width, p111.bar_width);
-assert_checkequal(p121.data, p321.data);
-assert_checkequal(p121.line_style, p321.line_style);
-assert_checkequal(p121.polyline_style, p321.polyline_style);
-assert_checkequal(p121.foreground, p321.foreground);
-assert_checkequal(p121.background, p321.background);
-assert_checkequal(p121.mark_mode, p321.mark_mode);
-assert_checkequal(p121.mark_style, p321.mark_style);
-assert_checkequal(p121.mark_size_unit, p321.mark_size_unit);
-assert_checkequal(p121.mark_size, p321.mark_size);
-assert_checkequal(p121.mark_foreground, p321.mark_foreground);
-assert_checkequal(p121.mark_background, p321.mark_background);
-assert_checkequal(p121.x_shift, [0,0,0]);
-assert_checkequal(p121.y_shift, [12,21,30]);
-assert_checkalmostequal(p121.bar_width, p111.bar_width);
index 6276fc1..aa56125 100644 (file)
@@ -6,6 +6,7 @@
 // =============================================================================
 //
 // <-- TEST WITH GRAPHIC -->
+// <-- NO CHECK REF -->
 
 // Unit test for barhomogenize
 
@@ -95,7 +96,8 @@ assert_checkequal(a1.y_ticks.labels, ["0";"10";"20";"30"]);
 assert_checkequal(a1.z_ticks.labels, a3.z_ticks.labels);
 assert_checkequal(a1.sub_ticks, a3.sub_ticks);
 assert_checktrue(abs(a1.data_bounds - [0.55,0;3.45,33]) < 0.05);
-assert_checkequal(a1.margins, a3.margins);
+assert_checkequal(a1.margins, a3.margins);  // fails (before Change 20540)
+                           // a1.margins(1) is 0.1353722 instead of 0.125
 assert_checktrue(abs(a1.axes_bounds - [0.6666667,0,0.3333333,0.5]) < 0.05);
 
 // Check polylines of first graphic
@@ -110,9 +112,9 @@ assert_checkequal(p311.mark_size_unit, "point");
 assert_checkequal(p311.mark_size, 0);
 assert_checkequal(p311.mark_foreground, -1);
 assert_checkequal(p311.mark_background, -2);
-assert_checkequal(p311.x_shift, [0.3,0.3,0.3]);
+assert_checkequal(p311.x_shift, [0.7,0.7,0.7]/3);
 assert_checkequal(p311.y_shift, []);
-assert_checkalmostequal(p311.bar_width, 0.24);
+assert_checkalmostequal(p311.bar_width, 0.56/3);
 
 assert_checkequal(p312.data, [1,3;2,7;3,10]);
 assert_checkequal(p312.line_style, 1);
@@ -127,7 +129,7 @@ assert_checkequal(p312.mark_foreground, -1);
 assert_checkequal(p312.mark_background, -2);
 assert_checkequal(p312.x_shift, [0,0,0]);
 assert_checkequal(p312.y_shift, []);
-assert_checkalmostequal(p312.bar_width, 0.24);
+assert_checkalmostequal(p312.bar_width, 0.56/3);
 
 assert_checkequal(p313.data, [1,4;2,6;3,9]);
 assert_checkequal(p313.line_style, 1);
@@ -140,9 +142,9 @@ assert_checkequal(p313.mark_size_unit, "point");
 assert_checkequal(p313.mark_size, 0);
 assert_checkequal(p313.mark_foreground, -1);
 assert_checkequal(p313.mark_background, -2);
-assert_checkequal(p313.x_shift, [-0.3,-0.3,-0.3]);
+assert_checkequal(p313.x_shift, -0.7*[1 1 1]/3);
 assert_checkequal(p313.y_shift, []);
-assert_checkalmostequal(p313.bar_width, 0.24);
+assert_checkalmostequal(p313.bar_width, 0.56/3);
 
 assert_checkequal(p321.data, [1,1;2,2;3,3]);
 assert_checkequal(p321.line_style, 1);
@@ -153,7 +155,7 @@ assert_checkequal(p321.mark_mode, "off");
 assert_checkequal(p321.mark_style, 0);
 assert_checkequal(p321.mark_size_unit, "point");
 assert_checkequal(p321.mark_size, 0);
-assert_checkequal(p321.mark_foreground, -1);
+assert_checkequal(p321.mark_foreground, -1); // fails (before Change 20540): 7 returned
 assert_checkequal(p321.mark_background, -2);
 assert_checkequal(p321.x_shift, [0,0,0]);
 assert_checkequal(p321.y_shift, []);