* Bugs 9529 16104 fixed: assert_checkequal() for lists with void elements 95/20995/8
Samuel GOUGEON [Sat, 1 Jun 2019 04:42:32 +0000 (06:42 +0200)]
  http://bugzilla.scilab.org/9529
  http://bugzilla.scilab.org/16104

  Are now properly supported:
   - Nan and void in compared lists
   - Nan in sparse
   - implicit lists
   - macros
   - libraries
   - primitives
   - graphical handles
   - when inputs are arrays or lists of same lengths: the mismatch
     message indicates the index of the first mistmatching elements.

Change-Id: I3bac3c5c88bbec181cf17df65e720022d373b384

scilab/CHANGES.md
scilab/modules/development_tools/help/en_US/assert/assert_checkequal.xml
scilab/modules/development_tools/help/ja_JP/assert/assert_checkequal.xml
scilab/modules/development_tools/help/ru_RU/assert/assert_checkequal.xml [new file with mode: 0644]
scilab/modules/development_tools/macros/assert/assert_checkequal.sci
scilab/modules/development_tools/tests/unit_tests/assert/checkequal.dia.ref [deleted file]
scilab/modules/development_tools/tests/unit_tests/assert/checkequal.tst

index ed741ae..6602b8f 100644 (file)
@@ -106,6 +106,9 @@ Feature changes and additions
   - `-toStruct` option added, to return results in a structure instead of in the calling environment.
 * `jremove` is optional and `clear` could be used to release Java objects mapped to Scilab.
 * `blockdiag()` is introduced to improve, replace, and extend `sysdiag()` to strings.
+* `assert_checkequal()` is upgraded:
+  - support added for Nan and void in lists, Nan in sparses, implicit lists, graphic handles, macros, libraries, and built-in.
+  - For arrays of matching typeof and sizes, and for lists of matching lengths, the failure message now indicates the index and values of the first mismatching elements.
 
 
 Help pages:
@@ -156,11 +159,15 @@ Bug Fixes
 * [#7724](http://bugzilla.scilab.org/show_bug.cgi?id=7724): When a figure is created in .auto_resize="on" mode, its .axes_size sets its .figure_size accordingly, not the reverse. But this was not documented.
 * [#8784](http://bugzilla.scilab.org/show_bug.cgi?id=8784): Automatic self-adjusting blocks `SCALE_CSCOPE` & `SCALE_CMSCOPE` in Xcos.
 * [#5512](http://bugzilla.scilab.org/show_bug.cgi?id=5512): `disp()` puzzlingly displayed arguments in reverse order.
+* [#9529](http://bugzilla.scilab.org/show_bug.cgi?id=9529): `assert_checkequal(list(1,,3), list(1,,3))` yielded an error.
 * [#9673](http://bugzilla.scilab.org/show_bug.cgi?id=9673): Priority of colon `:` operator was too low
 * [#10353](http://bugzilla.scilab.org/show_bug.cgi?id=10353): The referential for the uicontrol.position property was not provided.
+* [#12520](http://bugzilla.scilab.org/show_bug.cgi?id=12520): Vriable browser did not display the size of the variables.
+* [#12534](http://bugzilla.scilab.org/show_bug.cgi?id=12534): Variable browser did not display the size of the variables.
 * [#13766](http://bugzilla.scilab.org/show_bug.cgi?id=13766): Minimal values for `.figure_size` were not documented.
 * [#14498](http://bugzilla.scilab.org/show_bug.cgi?id=14498): `size([],3)` returned 1 instead of 0.
 * [#14557](http://bugzilla.scilab.org/show_bug.cgi?id=14557): `csim` failed when the system has no state.
+* [#14498](http://bugzilla.scilab.org/show_bug.cgi?id=14498): `size([],3)` returned 1 instead of 0.
 * [#14604](http://bugzilla.scilab.org/show_bug.cgi?id=14604): `emptystr()` is 40x slower with 6.0.0 wrt 5.5.2
 * [#14605](http://bugzilla.scilab.org/show_bug.cgi?id=14605): fixed - `bench_run` was too strict about the specification of tests names.
 * [#14606](http://bugzilla.scilab.org/show_bug.cgi?id=14606): Memory used by variables returned by `[names,mem]=who()` was always zero.
@@ -201,6 +208,7 @@ Bug Fixes
 * [#16075](http://bugzilla.scilab.org/show_bug.cgi?id=16075): `prettyprint()` was broken for cells.
 * [#16085](http://bugzilla.scilab.org/show_bug.cgi?id=16085): insertion in an empty struct was broken.
 * [#16087](http://bugzilla.scilab.org/show_bug.cgi?id=16087): Insertion of struct() in a non-empty struct crashed Scilab.
+* [#16104](http://bugzilla.scilab.org/show_bug.cgi?id=16104): `assert_checkequal()` did not support properly or at all Nan and void in lists, Nan in sparse, implicit lists, macros, libraries, built-in functions, graphical handles. For input arrays or lists of matching typeof and sizes, the failure message did not display neither the index nor the values of the first mismatching elements.
 * [#16111](http://bugzilla.scilab.org/show_bug.cgi?id=16111): `isglobal` was not supporting non-scalar array of strings as input.
 * [#16118](http://bugzilla.scilab.org/show_bug.cgi?id=16118): `%s <> (1+%s)` returned %F.
 * [#16139](http://bugzilla.scilab.org/show_bug.cgi?id=16139): `auread()` and `auwrite()` kept the sound file open and locked when returning on errors. They poorly handled the default .au sound file extension.
@@ -220,3 +228,4 @@ Bug Fixes
 * [#16272](http://bugzilla.scilab.org/show_bug.cgi?id=16272): `spzeros(0,n)` and `spzeros(n,0)` were different from `sparse(0,0)`.
 * [#16275](http://bugzilla.scilab.org/show_bug.cgi?id=16275): `fsolve(x0, fun, tol)` no longer took `tol` into account.
 
+
index ceed9d2..8c625db 100644 (file)
@@ -3,8 +3,8 @@
  *
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2010 - 2011 - DIGITEO - Michael Baudin
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2019 - 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.
  * along with this program.
  *
  -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns3="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="assert_checkequal" xml:lang="en">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns3="http://www.w3.org/1999/xhtml"
+          xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
+          xmlns:scilab="http://www.scilab.org" xml:id="assert_checkequal" xml:lang="en">
     <refnamediv>
         <refname>assert_checkequal</refname>
         <refpurpose>Check that computed and expected are equal.</refpurpose>
@@ -25,7 +28,6 @@
             assert_checkequal ( computed , expected )
             flag = assert_checkequal ( computed , expected )
             [flag,errmsg] = assert_checkequal ( computed , expected )
-
         </synopsis>
     </refsynopsisdiv>
     <refsection>
             <varlistentry>
                 <term>flag :</term>
                 <listitem>
-                    <para> a 1-by-1 matrix of boolean, %t if computed is equal to expected, %f if not</para>
+                    <para> a boolean, %t if computed is equal to expected, %f if not</para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>errmsg :</term>
                 <listitem>
-                    <para> a 1-by-1 matrix of strings, the error message. If flag==%t, then errormsg=="". If flag==%f, then errmsg contains the error message.</para>
+                    <para>
+                        a string, the error message. If flag==%t, then errormsg=="".
+                        If flag==%f, then errmsg contains the error message.
+                    </para>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Description</title>
         <para>
-            Performs silently if computed and expected are equal.
+            Performs silently if <varname>computed</varname> and <varname>expected</varname> are equal.
+        </para>
+        <para>
+            If the type of both input arguments is 1 (i.e. a matrix of real or complex numbers),
+            we check that non-nan values are equal (matching Nan values are considered equal).
         </para>
         <para>
-            If the type of both input arguments is 1 (i.e. a real matrix),
-            we check that non-nan values are equal.
+            For complex numbers: We compare first the real parts. In case of equality, we compare
+            the imaginary parts.
         </para>
         <para>
-            We compare first the real parts. In case of equality, we compare the imaginary parts.
+            <literal>1/%z</literal> and <literal>2/(2*%z)</literal> are not equal: For the time
+            being, Scilab does not normalize equivalent rationals.
+        </para>
+        <para>
+            In two lists, matching void elements are considered equal.
         </para>
         <para>
             If the comparison shows that computed is equal to expected,
     </refsection>
     <refsection>
         <title>Examples</title>
+        <para>
+            Tests with success:
+        </para>
         <programlisting role="example"><![CDATA[
-// Tests with success
 assert_checkequal ( %T , %T );
-flag = assert_checkequal ( list() , list() );
 [flag , errmsg] = assert_checkequal ( [%T %F], [%T %F] );
 assert_checkequal ( %nan , %nan );
+c = complex(1, %nan)
+assert_checkequal (c, c);
+assert_checkequal ( sparse(%nan) , sparse(%nan) );
+assert_checkequal ( 2:$-1, 2:$-1 );
+
+assert_checkequal ( ["abc" "" ascii([9 10 13])],  ["abc" "" ascii([9 10 13])] );
+assert_checkequal ( [gdf(), gda()], [gdf(), gda()]);
+
+assert_checkequal ( list() , list() );
+assert_checkequal ( list(1,,3), list(1,,3) );
+assert_checkequal ( list(1,,list(,4)), list(1,,list(,4)) );
+assert_checkequal ( list(%nan,,7) , list(%nan,,7) );
 
-// Tests with failure
+sine = sin;
+assert_checkequal ( sin, sine );
+cosinus = cosd;
+assert_checkequal ( cosinus, cosd );
+assert_checkequal( iolib, iolib );
+   ]]></programlisting>
+        <para>
+            Tests with failure:
+        </para>
+        <programlisting role="example"><![CDATA[
 assert_checkequal ( %F , %T );
 flag = assert_checkequal ( %F , %T );
 // No error produced :
 [flag , errmsg] = assert_checkequal ( %F , %T )
+
 assert_checkequal ( [1 2], [3 4] )
 assert_checkequal ( 1 , [2 3] )
 assert_checkequal ( 1 , "b" )
+assert_checkequal ( "b", "B" )
+assert_checkequal ( 1+%s, 1+%z )
+assert_checkequal ( 1/%s, 2/(2*%s) )
 
+assert_checkequal (list(2,,7), list(2,%F,8));
+assert_checkequal ( [gdf(), gda()], [gdf(), gdf()] );
+assert_checkequal ( sind, cosd );
+assert_checkequal ( iolib, corelib );
    ]]></programlisting>
+   <screen><![CDATA[
+...
+--> assert_checkequal (list(2,,7), list(2,%F,8));
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line   178 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 190 )
+
+assert_checkequal: Assertion failed: expected(2)= F  while computed(2)= (void)
+
+--> assert_checkequal ( [gdf(), gda()], [gdf(), gdf()] );
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line   178 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 190 )
+
+assert_checkequal: Assertion failed: expected(2)= Figure(uid:55)  while computed(2)= Axes(uid:85)
+
+--> assert_checkequal ( sind, cosd );
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line    82 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 94 )
+
+assert_checkequal: Assertion failed: expected= cosd()  while computed= sind()
+
+--> assert_checkequal ( iolib, corelib );
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line    95 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 107 )
+
+assert_checkequal: Assertion failed: expected= lib@SCI\modules\core\macros\  while ..
+                                     computed= lib@SCI\modules\io\macros\
+]]></screen>
     </refsection>
     <refsection>
         <title>History</title>
@@ -109,6 +179,29 @@ assert_checkequal ( 1 , "b" )
                 <revdescription>Function introduced
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    <itemizedlist>
+                      <listitem>
+                          The comparison of two implicit lists, Scilab functions, Scilab libraries,
+                          built-in functions or graphic handles is now always possible and properly
+                          done.
+                      </listitem>
+                      <listitem>
+                          In two lists, void and Nan elements are now supported, and matching ones
+                          are considered as equal.
+                      </listitem>
+                      <listitem>
+                          Nan are now supported in input sparse matrices and are considered as equal.
+                      </listitem>
+                      <listitem>
+                          When the test fails while inputs are arrays, the message now indicates
+                          the index of the first mismatching element.
+                      </listitem>
+                  </itemizedlist>
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
     <refsection>
index bf951a0..1a9eeb2 100644 (file)
@@ -3,8 +3,8 @@
  *
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2010 - 2011 - DIGITEO - Michael Baudin
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2019 - 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.
  * along with this program.
  *
  -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns3="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="assert_checkequal" xml:lang="ja">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns3="http://www.w3.org/1999/xhtml"
+          xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
+          xmlns:scilab="http://www.scilab.org" xml:id="assert_checkequal" xml:lang="ja">
     <refnamediv>
         <refname>assert_checkequal</refname>
         <refpurpose>計算値と予測値が等しいことを確認する.</refpurpose>
         </para>
         <para>
             入力引数の型が共に1 (すなわち実数行列)の場合,
-            nan以外の値が等しいことが確認されます.
+            nan以外の値が等しいことが確認されます (matching Nan values are considered equal).
+        </para>
+        <para>
+            For complex numbers: まず実部を確認し,それが等しい場合に虚部を確認します.
         </para>
         <para>
-            まず実部を確認し,それが等しい場合に虚部を確認します.
+            <literal>1/%z</literal> and <literal>2/(2*%z)</literal> are not equal: For the time
+            being, Scilab does not normalize equivalent rationals.
+        </para>
+        <para>
+            In two lists, matching void elements are considered equal.
         </para>
         <para>
             比較がcomputedがexpectedに等しくないことを示す場合,
     </refsection>
     <refsection>
         <title>例</title>
+        <para>
+            成功するテスト:
+        </para>
         <programlisting role="example"><![CDATA[
-// 成功するテスト
 assert_checkequal ( %T , %T );
-flag = assert_checkequal ( list() , list() );
 [flag , errmsg] = assert_checkequal ( [%T %F], [%T %F] );
 assert_checkequal ( %nan , %nan );
-// 失敗するテスト
+c = complex(1, %nan)
+assert_checkequal (c, c);
+assert_checkequal ( sparse(%nan) , sparse(%nan) );
+assert_checkequal ( 2:$-1, 2:$-1 );
+
+assert_checkequal ( ["abc" "" ascii([9 10 13])],  ["abc" "" ascii([9 10 13])] );
+assert_checkequal ( [gdf(), gda()], [gdf(), gda()]);
+
+assert_checkequal ( list() , list() );
+assert_checkequal ( list(1,,3), list(1,,3) );
+assert_checkequal ( list(1,,list(,4)), list(1,,list(,4)) );
+assert_checkequal ( list(%nan,,7) , list(%nan,,7) );
+
+sine = sin;
+assert_checkequal ( sin, sine );
+cosinus = cosd;
+assert_checkequal ( cosinus, cosd );
+assert_checkequal( iolib, iolib );
+   ]]></programlisting>
+        <para>
+            失敗するテスト:
+        </para>
+        <programlisting role="example"><![CDATA[
 assert_checkequal ( %F , %T );
 flag = assert_checkequal ( %F , %T );
 // エラーは発生しません :
 [flag , errmsg] = assert_checkequal ( %F , %T )
+
 assert_checkequal ( [1 2], [3 4] )
 assert_checkequal ( 1 , [2 3] )
 assert_checkequal ( 1 , "b" )
+assert_checkequal ( "b", "B" )
+assert_checkequal ( 1+%s, 1+%z )
+assert_checkequal ( 1/%s, 2/(2*%s) )
+
+assert_checkequal (list(2,,7), list(2,%F,8));
+assert_checkequal ( [gdf(), gda()], [gdf(), gdf()] );
+assert_checkequal ( sind, cosd );
+assert_checkequal ( iolib, corelib );
    ]]></programlisting>
+   <screen><![CDATA[
+...
+--> assert_checkequal (list(2,,7), list(2,%F,8));
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line   178 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 190 )
+
+assert_checkequal: Assertion failed: expected(2)= F  while computed(2)= (void)
+
+--> assert_checkequal ( [gdf(), gda()], [gdf(), gdf()] );
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line   178 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 190 )
+
+assert_checkequal: Assertion failed: expected(2)= Figure(uid:55)  while computed(2)= Axes(uid:85)
+
+--> assert_checkequal ( sind, cosd );
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line    82 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 94 )
+
+assert_checkequal: Assertion failed: expected= cosd()  while computed= sind()
+
+--> assert_checkequal ( iolib, corelib );
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line    95 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 107 )
+
+assert_checkequal: Assertion failed: expected= lib@SCI\modules\core\macros\  while ..
+                                     computed= lib@SCI\modules\io\macros\
+]]></screen>
     </refsection>
     <refsection>
         <title>履歴</title>
@@ -114,6 +183,29 @@ assert_checkequal ( 1 , "b" )
                 <revdescription>関数が導入されました
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    <itemizedlist>
+                      <listitem>
+                          The comparison of two implicit lists, Scilab functions, Scilab libraries,
+                          built-in functions or graphic handles is now always possible and properly
+                          done.
+                      </listitem>
+                      <listitem>
+                          In two lists, void and Nan elements are now supported, and matching ones
+                          are considered as equal.
+                      </listitem>
+                      <listitem>
+                          Nan are now supported in input sparse matrices and are considered as equal.
+                      </listitem>
+                      <listitem>
+                          When the test fails while inputs are arrays, the message now indicates
+                          the index of the first mismatching element.
+                      </listitem>
+                   </itemizedlist>
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
     <refsection>
diff --git a/scilab/modules/development_tools/help/ru_RU/assert/assert_checkequal.xml b/scilab/modules/development_tools/help/ru_RU/assert/assert_checkequal.xml
new file mode 100644 (file)
index 0000000..b547c3e
--- /dev/null
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ *
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2010 - 2011 - DIGITEO - Michael Baudin
+ * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2019 - 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.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * 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"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns3="http://www.w3.org/1999/xhtml"
+          xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
+          xmlns:scilab="http://www.scilab.org" xml:id="assert_checkequal" xml:lang="ru">
+    <refnamediv>
+        <refname>assert_checkequal</refname>
+        <refpurpose>Проверка того, что вычисленное и ожидаемое значения равны.</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Синтаксис</title>
+        <synopsis>
+            assert_checkequal ( computed , expected )
+            flag = assert_checkequal ( computed , expected )
+            [flag,errmsg] = assert_checkequal ( computed , expected )
+
+        </synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Аргументы</title>
+        <variablelist>
+            <varlistentry>
+                <term>computed:</term>
+                <listitem>
+                    <para> результат вычисления</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>expected :</term>
+                <listitem>
+                    <para> ожидаемый результат</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>flag :</term>
+                <listitem>
+                    <para>
+                      логическое значение, <literal>%t</literal>, если вычисление равно ожиданию,
+                      <literal>%f</literal>, если нет.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>errmsg :</term>
+                <listitem>
+                    <para>
+                        строковое значение, сообщение об ошибке. Если <literal>flag==%t</literal>,
+                        тогда <literal>errormsg==""</literal>.
+                        Если <literal>flag==%f</literal>, то <varname>errmsg</varname> содержит
+                        сообщение об ошибке.
+                    </para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Описание</title>
+        <para>
+            Работает молча, если <varname>computed</varname> и <varname>expected</varname> равны.
+        </para>
+        <para>
+            Если тип обоих входных аргументов равен 1 (т.е. матрица вещественных или комплексных
+            чисел), то мы проверяем, что не-Nan значения равны (совпадающие Nan-значения
+            считаются равными).
+        </para>
+        <para>
+            Для комплексных чисел: мы сравниваем сначала вещественные части. В случае равенства
+            мы сравниваем мнимые части.
+        </para>
+        <para>
+            <literal>1/%z</literal> и <literal>2/(2*%z)</literal> не равны: для времени Scilab
+            не нормирует эквивалентные рациональные значения.
+        </para>
+        <para>
+            В двух списках совпадающие пустые элементы считаются равными.
+        </para>
+        <para>
+            Если сравнение показывает, что вычисленное равно ожидаемому, то
+            <itemizedlist>
+                <listitem>
+                    <para>если выходная переменная <varname>errmsg</varname> не используется,
+                         ошибка генерируется,
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>если выходная переменная <varname>errmsg</varname> используется,
+                        то ошибка не генерируется.
+                    </para>
+                </listitem>
+            </itemizedlist>
+        </para>
+    </refsection>
+    <refsection>
+        <title>Примеры</title>
+        <para>
+            Тесты с успехом:
+        </para>
+        <programlisting role="example"><![CDATA[
+assert_checkequal ( %T , %T );
+[flag , errmsg] = assert_checkequal ( [%T %F], [%T %F] );
+assert_checkequal ( %nan , %nan );
+c = complex(1, %nan)
+assert_checkequal (c, c);
+assert_checkequal ( sparse(%nan) , sparse(%nan) );
+assert_checkequal ( 2:$-1, 2:$-1 );
+
+assert_checkequal ( ["abc" "" ascii([9 10 13])],  ["abc" "" ascii([9 10 13])] );
+assert_checkequal ( [gdf(), gda()], [gdf(), gda()]);
+
+assert_checkequal ( list() , list() );
+assert_checkequal ( list(1,,3), list(1,,3) );
+assert_checkequal ( list(1,,list(,4)), list(1,,list(,4)) );
+assert_checkequal ( list(%nan,,7) , list(%nan,,7) );
+
+sine = sin;
+assert_checkequal ( sin, sine );
+cosinus = cosd;
+assert_checkequal ( cosinus, cosd );
+assert_checkequal( iolib, iolib );
+   ]]></programlisting>
+        <para>
+            Тесты с провалом:
+        </para>
+        <programlisting role="example"><![CDATA[
+assert_checkequal ( %F , %T );
+flag = assert_checkequal ( %F , %T );
+// No error produced :
+[flag , errmsg] = assert_checkequal ( %F , %T )
+
+assert_checkequal ( [1 2], [3 4] )
+assert_checkequal ( 1 , [2 3] )
+assert_checkequal ( 1 , "b" )
+assert_checkequal ( "b", "B" )
+assert_checkequal ( 1+%s, 1+%z )
+assert_checkequal ( 1/%s, 2/(2*%s) )
+
+assert_checkequal (list(2,,7), list(2,%F,8));
+assert_checkequal ( [gdf(), gda()], [gdf(), gdf()] );
+assert_checkequal ( sind, cosd );
+assert_checkequal ( iolib, corelib );
+   ]]></programlisting>
+   <screen><![CDATA[
+...
+--> assert_checkequal (list(2,,7), list(2,%F,8));
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line   178 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 190 )
+
+assert_checkequal: Assertion failed: expected(2)= F  while computed(2)= (void)
+
+--> assert_checkequal ( [gdf(), gda()], [gdf(), gdf()] );
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line   178 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 190 )
+
+assert_checkequal: Assertion failed: expected(2)= Figure(uid:55)  while computed(2)= Axes(uid:85)
+
+--> assert_checkequal ( sind, cosd );
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line    82 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 94 )
+
+assert_checkequal: Assertion failed: expected= cosd()  while computed= sind()
+
+--> assert_checkequal ( iolib, corelib );
+at line    22 of function assert_generror   ( SCI\modules\..\assert_generror.sci line 33 )
+at line    95 of function assert_checkequal ( SCI\modules\..\assert_checkequal.sci line 107 )
+
+assert_checkequal: Assertion failed: expected= lib@SCI\modules\core\macros\  while ..
+                                     computed= lib@SCI\modules\io\macros\
+]]></screen>
+    </refsection>
+    <refsection>
+        <title>История</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.4.0</revnumber>
+                <revdescription>Введена функция
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    <itemizedlist>
+                      <listitem>
+                          The comparison of two implicit lists, Scilab functions, Scilab libraries,
+                          built-in functions or graphic handles is now always possible and properly
+                          done.
+                      </listitem>
+                      <listitem>
+                          In two lists, void and Nan elements are now supported, and matching ones
+                          are considered as equal.
+                      </listitem>
+                      <listitem>
+                          Nan are now supported in input sparse matrices and are considered as equal.
+                      </listitem>
+                      <listitem>
+                          When the test fails while inputs are arrays, the message now indicates
+                          the index of the first mismatching element.
+                      </listitem>
+                   </itemizedlist>
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
+    <refsection>
+        <title>Литература</title>
+        <para>"Automated Software Testing for Matlab", Steven Eddins, 2009</para>
+    </refsection>
+</refentry>
index 284f79d..5013ea4 100644 (file)
@@ -1,7 +1,7 @@
 // Copyright (C) 2008-2009 - INRIA - Michael Baudin
 // Copyright (C) 2010 - 2011 - DIGITEO - Michael Baudin
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2019 - 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.
 
 function [flag,errmsg] = assert_checkequal ( computed , expected )
     //  Check that computed and expected are equal.
-
-    function flag = comparedoubles ( computed , expected )
-        [cnonan , cnumb] = mythrownan(computed)
-        [enonan , enumb] = mythrownan(expected)
-        if ( and(enonan == cnonan) & and(enumb == cnumb) ) then
-            flag = %t
-        else
-            flag = %f
-        end
-    endfunction
-
-    function [nonan,numb] = mythrownan(x)
-        //
-        //
-        // Copyright (C) 2000 - INRIA - Carlos Klimann
-        // Copyright (C) 2010 - 2011 - DIGITEO - Michael Baudin
-        //This  function  returns  in  vector  nonan  the  values
-        //(ignoring the NANs) of a  vector or matrix x and in the
-        //corresponding places of vector  numb the indexes of the
-        //value.
-        //
-        //For  a  vector  or matrix  x,  [nonan,numb]=thrownan(x)
-        //considers x, whatever his dimensions are, like a linear
-        //vector (columns  first).
-        //
-        //
-        [lhs,rhs]=argn(0)
-        if ( rhs<>1 ) then
-            error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"thrownan",1))
-        end
-        numb=find(bool2s(~isnan(x)))
-        nonan=x(~isnan(x))
-    endfunction
-
     [lhs,rhs]=argn()
     if ( rhs <> 2 ) then
         errmsg = sprintf ( gettext ( "%s: Wrong number of input arguments: %d expected.\n") , "assert_checkequal" , 2 )
@@ -58,24 +24,33 @@ function [flag,errmsg] = assert_checkequal ( computed , expected )
         error(errmsg)
    end
 
+    //
     // Check sizes of variables
     if ( or(type(computed)==[16 17]) ) then
         ncom = length(computed)
     else
-        ncom = size(computed)
+        try
+            ncom = size(computed)
+        catch   // non-sizeable objects: 1:$, iolib, sin, sind, etc
+            ncom = -2
+        end
     end
     if ( or(type(expected)==[16 17]) ) then
         nexp = length(expected)
     else
-        nexp = size(expected)
+        try
+            nexp = size(expected)
+        catch
+            nexp = -2
+        end
     end
     if ( or(ncom <> nexp) ) then
         errmsg = sprintf ( gettext ( "%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n") , "assert_checkequal" , 1 , 2 )
         error(errmsg)
     end
-    //
-    if ( type(computed) == 1 & type(expected) == 1 ) then
-        // These are two matrices of doubles
+
+    // sparse or full real or complex matrices
+    if or(type(computed) == [1 5])  then
         cisreal = isreal(computed)
         eisreal = isreal(expected)
         if ( cisreal & ~eisreal ) then
@@ -86,71 +61,145 @@ function [flag,errmsg] = assert_checkequal ( computed , expected )
             errmsg = sprintf ( gettext ( "%s: Computed is complex, but expected is real.") , "assert_checkequal" )
             error(errmsg)
         end
-        if ( cisreal & eisreal ) then
-            flag = comparedoubles ( computed , expected )
+        if cisreal & eisreal then
+            [flag, k] = comparedoubles ( computed , expected )
         else
-            flagreal = comparedoubles ( real(computed) , real(expected) )
-            if ( flagreal ) then
-                flagimag = comparedoubles ( imag(computed) , imag(expected) )
-                flag = flagimag
+            [flag, k] = comparedoubles ( real(computed) , real(expected) )
+            if flag then
+                [flag ,k] = comparedoubles ( imag(computed) , imag(expected) )
+            end
+        end
+        // k is the index of the first discrepancy (or [] is none)
+
+    elseif or(typeof(computed)==["implicitlist" "fptr" "function"])
+                                    // http://bugzilla.scilab.org/16104 C) D) E)
+        flag = computed==expected
+        if ~flag then
+            if typeof(computed) == "implicitlist"
+                errmsg = _("%s: Assertion failed: expected= %s  while computed= %s")
+                errmsg = msprintf(errmsg,"assert_checkequal",string(expected),string(computed))
+
+            elseif typeof(computed) == "function"
+                c = macr2tree(computed).name+"()"
+                e = macr2tree(expected).name+"()"
+                errmsg = _("%s: Assertion failed: expected= %s  while computed= %s")
+                errmsg = msprintf(errmsg,"assert_checkequal", e, c)
+
             else
-                flag = %f
+                // no way to get the names of built-in functions
+                errmsg = _("%s: Assertion failed: expected and computed are two distinct built-in functions.")
+                errmsg = msprintf(errmsg,"assert_checkequal")
+            end
+            if lhs < 2 then
+                assert_generror ( errmsg )
             end
         end
-    else
-        if ( and ( computed == expected ) ) then
+        return
+
+    elseif type(computed) == 14   // library : http://bugzilla.scilab.org/16104#c1
+        flag = and(string(computed)==string(expected))
+        if ~flag then
+            errmsg = gettext("%s: Assertion failed: expected= %s  while computed= %s")
+            c = "lib@" + string(computed)(1)
+            e = "lib@" + string(expected)(1)
+            errmsg = msprintf(errmsg,"assert_checkequal", e, c)
+            if lhs < 2 then
+                assert_generror ( errmsg )
+            end
+        end
+        return
+
+    elseif type(computed)==15   // Simple lists
+        b = computed==expected
+        flag = and(b)
+        if ~flag
+            // computed<>expected can't be simply used due to // http://bugzilla.scilab.org/15293
             flag = %t
-        else
-            flag = %f
+            for i = find(~b)
+                tc = type(computed(i))
+                te = type(expected(i))
+                if tc==0 & te==0
+                    continue
+                elseif tc<>0 & te<>0 & isnan(computed(i)) & isnan(expected(i))
+                    continue
+                else
+                    flag = %f
+                    k = i
+                    if tc==0
+                        computed(k) = "(void)"
+                    end
+                    if te==0
+                        expected(k) = "(void)"
+                    end
+                    break
+                end
+            end
         end
-    end
 
-    if ( flag == %t ) then
+    else
+        b = and(computed == expected)
+        flag = b || isequal(computed, expected)
+        if ~flag & ~b
+            k = find(computed<>expected, 1);
+        end
+    end
 
+    if flag then
         errmsg = ""
+
     else
-        // Change the message if the matrix contains more than one value
-        if ( size(expected,"*") == 1 ) then
-            if ( or(typeof(expected) == ["sparse", "boolean sparse"])) then
-                val = full(expected)
-            else
-                val = expected
-            end
-            estr = string(val)
+        // Sets the message according to the type and size of the pair:
+        if or(typeof(expected) == ["sparse", "boolean sparse"])
+            e = full(expected(k))
+            c = full(computed(k))
+        elseif isdef("k","l")
+            e = expected(k)
+            c = computed(k)
         else
-            if ( or(typeof(expected) == ["sparse", "boolean sparse"])) then
-                val = full(expected(1))
-            else
-                val = expected(1)
+            try
+            e = expected(1)
+            c = computed(1)
+            catch
+            e = expected
+            c = computed
             end
-            estr = "[" + string(val) + " ...]"
         end
-        if ( size(computed,"*") == 1 ) then
-            if ( or(typeof(computed) == ["sparse", "boolean sparse"])) then
-                val = full(computed)
-            else
-                val = computed
-            end
-            cstr = string(val)
+        if type(computed)==9
+            estr = msprintf("%s(uid:%d)", e.type, e.uid)
+            cstr = msprintf("%s(uid:%d)", c.type, c.uid)
         else
-            if ( or(typeof(computed) == ["sparse", "boolean sparse"])) then
-                val = full(computed(1))
-            else
-                val = computed(1)
-            end
-            cstr = "[" + string(val) + " ...]"
+            estr = string(e)
+            cstr = string(c)
+        end
+        if isdef("k","l") & length(computed)>1
+            estr = msprintf(_("expected(%d)= "),k) + estr
+            cstr = msprintf(_("computed(%d)= "),k) + cstr
+        else
+            estr = _("expected= ") + estr
+            cstr = _("computed= ") + cstr
         end
+        //
         ierr = execstr("mdiff = string(mean(computed - expected))", "errcatch");
         if ( ierr == 0 ) then
-            errmsg = msprintf(gettext("%s: Assertion failed: expected = %s while computed = %s (mean diff = %s)"),"assert_checkequal",estr,cstr,mdiff)
+            errmsg = msprintf(gettext("%s: Assertion failed: %s  while %s (mean diff = %s)"),"assert_checkequal",estr, cstr, mdiff)
         else
-            errmsg = msprintf(gettext("%s: Assertion failed: expected = %s while computed = %s"),"assert_checkequal",estr,cstr)
+            errmsg = msprintf(gettext("%s: Assertion failed: %s  while %s"),"assert_checkequal", estr, cstr)
         end
-        if ( lhs < 2 ) then
+        if lhs < 2 then
             // If no output variable is given, generate an error
             assert_generror ( errmsg )
         end
     end
 endfunction
-
-
+// ---------------------------------------------------------------------------
+function [flag, k] = comparedoubles ( computed , expected )
+    rand("seed",getdate("s"))
+    joker = rand(1);
+    while find(expected==joker | computed==joker,1)<>[]
+        joker = rand(1);
+    end
+    computed(isnan(computed)) = joker;
+    expected(isnan(expected)) = joker;
+    k = find(expected<>computed,1);
+    flag = k==[];
+endfunction
diff --git a/scilab/modules/development_tools/tests/unit_tests/assert/checkequal.dia.ref b/scilab/modules/development_tools/tests/unit_tests/assert/checkequal.dia.ref
deleted file mode 100644 (file)
index 3ff23ed..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (C) 2008 - INRIA - Michael Baudin
-// Copyright (C) 2010 - DIGITEO - Michael Baudin
-//
-// Copyright (C) 2012 - 2016 - Scilab Enterprises
-//
-// 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.
-// This file was originally licensed under the terms of the CeCILL v2.1,
-// and continues to be available under such terms.
-// For more information, see the COPYING file which you should have received
-// along with this program.
-// <-- CLI SHELL MODE -->
-// <-- ENGLISH IMPOSED -->
-function flag = MY_assert_equal ( computed , expected )
-    if ( and ( computed==expected ) ) then
-        flag = 1;
-    else
-        flag = 0;
-    end
-    if flag <> 1 then bugmes();quit;end
-endfunction
-function checkassert ( flag , errmsg , ctype )
-    if ( ctype == "success" ) then
-        MY_assert_equal ( (flag==%t) & (errmsg==""), %t )
-    else
-        MY_assert_equal ( (flag==%f) & (errmsg<>""), %t )
-    end
-endfunction
-format("v",10);
-// Check error message when number of arguments is false
-instr = "assert_checkequal ( )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-//
-instr = "assert_checkequal ( 1 )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-//
-instr = "[o1,o2,o3]=assert_checkequal ( 1 , 1 )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 999 );
-//////////////////////////////////////////
-// Check error message when type of arguments is false
-instr = "assert_checkequal ( ""a"" , 2 )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-//
-instr = "assert_checkequal ( 1 , ""b"" )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-//////////////////////////////////////////
-// Check error message when size of arguments are not equal
-instr = "assert_checkequal ( 1 , [2 3] )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-//
-// Check that the error message is correctly handled.
-instr = "assert_checkequal ( [1 2], [3 4] )";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal ( ierr , 10000 );
-errmsg = lasterror();
-refmsg = msprintf( gettext( "%s: Assertion failed: expected = %s while computed = %s (mean diff = %s)" ) , "assert_checkequal" , "[3 ...]" , "[1 ...]", "-2");
-MY_assert_equal ( errmsg , refmsg );
-//
-[flag , errmsg] = assert_checkequal ( %T , %T );
-checkassert ( flag , errmsg , "success" );
-//
-[flag , errmsg] = assert_checkequal ( %F , %T );
-checkassert ( flag , errmsg , "failure" );
-//
-[flag , errmsg] = assert_checkequal ( %nan , %nan );
-checkassert ( flag , errmsg , "success" );
-//
-[flag , errmsg] = assert_checkequal ( list() , list() );
-checkassert ( flag , errmsg , "success" );
-//
-[flag , errmsg] = assert_checkequal ( [%T %F], [%T %F] );
-checkassert ( flag , errmsg , "success" );
-//
-// Test all IEEE values
-[flag , errmsg] = assert_checkequal ( [1 %inf -%inf %nan] , [1 %inf -%inf %nan] );
-checkassert ( flag , errmsg , "success" );
-//
-[flag , errmsg] = assert_checkequal ( [] , [] );
-checkassert ( flag , errmsg , "success" );
-////////////////////////////////////////////////////////
-// Check complex entries.
-[flag , errmsg] = assert_checkequal(complex(%nan,%nan),complex(%nan,0));
-checkassert ( flag , errmsg , "failure" );
-//
-[flag , errmsg] = assert_checkequal(complex(%nan,%inf),complex(%nan,0));
-checkassert ( flag , errmsg , "failure" );
-//
-[flag , errmsg] = assert_checkequal(complex(%nan,%nan),complex(0,%nan));
-checkassert ( flag , errmsg , "failure" );
-//
-[flag , errmsg] = assert_checkequal(complex(%nan,%inf),complex(0,%inf));
-checkassert ( flag , errmsg , "failure" );
-//
-[flag , errmsg] = assert_checkequal(complex(0,%inf),complex(0,%inf));
-checkassert ( flag , errmsg , "success" );
-//
-[flag , errmsg] = assert_checkequal(complex(%nan,%nan),complex(%nan,%nan));
-checkassert ( flag , errmsg , "success" );
-//
-[flag , errmsg] = assert_checkequal(complex(%inf,%nan),complex(%inf,%nan));
-checkassert ( flag , errmsg , "success" );
-//
-////////////////////////////////////////////////////////
-// Check various types
-//
-//  Mlist
-s=mlist(["V","name","value"],["a","b";"c" "d"],[1 2; 3 4]);
-t=s;
-assert_checkequal(s, t);
-//
-//  Tlist
-s=tlist(["V","name","value"],["a","b";"c" "d"],[1 2; 3 4]);
-t=s;
-assert_checkequal(s, t);
-//
-// Polynomial
-s=poly(0,"s");
-t=s;
-assert_checkequal(s, t);
-//
-// Sparse
-s=spzeros(3,5);
-t=s;
-assert_checkequal(s, t);
-s(1)=12;
-instr="assert_checkequal(s, t)";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal(ierr, 10000);
-//
-// Boolean
-s=(ones(3,5)==ones(3,5));
-t=s;
-assert_checkequal(s, t);
-//
-// Sparse Boolean
-s=(spzeros(3,5)==spzeros(3,5));
-t=s;
-assert_checkequal(s, t);
-s(1)=%f;
-instr="assert_checkequal(s, t)";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal(ierr, 10000);
-//
-// Integer  8
-s=int8(3);
-t=s;
-assert_checkequal(s, t);
-//
-// String
-s="foo";
-t=s;
-assert_checkequal(s, t);
-//
-// List
-s=list("foo",2);
-t=s;
-assert_checkequal(s, t);
-//
-// Hypermatrix
-// - Double
-s = rand(2,2,2);
-t = s;
-assert_checkequal(s,t);
-// - int8
-s = int8(rand(2,2,2));
-t = s;
-assert_checkequal(s,t);
-// - wrong type
-s = rand(2,2,2);
-t = int8(s);
-instr="assert_checkequal(s, t)";
-ierr=execstr(instr,"errcatch");
-MY_assert_equal(ierr, 10000);
index e5283d9..a16443b 100644 (file)
@@ -1,7 +1,7 @@
 // Copyright (C) 2008 - INRIA - Michael Baudin
 // Copyright (C) 2010 - DIGITEO - Michael Baudin
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2019 - 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.
@@ -9,17 +9,21 @@
 // and continues to be available under such terms.
 // For more information, see the COPYING file which you should have received
 // along with this program.
-
-// <-- CLI SHELL MODE -->
+// --------------------------------------------------------------------------
+// <-- NO CHECK REF -->
 // <-- ENGLISH IMPOSED -->
 
+// ====================================
+// Unitary tests of assert_checkequal()
+// ====================================
+
 function flag = MY_assert_equal ( computed , expected )
     if ( and ( computed==expected ) ) then
         flag = 1;
     else
         flag = 0;
     end
-    if flag <> 1 then pause,end
+    if flag <> 1 then whereami(), pause,end
 endfunction
 
 function checkassert ( flag , errmsg , ctype )
@@ -65,7 +69,10 @@ instr = "assert_checkequal ( [1 2], [3 4] )";
 ierr=execstr(instr,"errcatch");
 MY_assert_equal ( ierr , 10000 );
 errmsg = lasterror();
-refmsg = msprintf( gettext( "%s: Assertion failed: expected = %s while computed = %s (mean diff = %s)" ) , "assert_checkequal" , "[3 ...]" , "[1 ...]", "-2");
+refmsg = _("%s: Assertion failed: %s  while %s (mean diff = %s)");
+refmsg = msprintf(refmsg, "assert_checkequal", ..
+                          msprintf(_("expected(%d)= "),1)+"3", ..
+                          msprintf(_("computed(%d)= "),1)+"1", "-2");
 MY_assert_equal ( errmsg , refmsg );
 //
 [flag , errmsg] = assert_checkequal ( %T , %T );
@@ -114,26 +121,52 @@ checkassert ( flag , errmsg , "success" );
 //
 ////////////////////////////////////////////////////////
 // Check various types
+////////////////////////////////////////////////////////
 //
-//  Mlist
-s=mlist(["V","name","value"],["a","b";"c" "d"],[1 2; 3 4]);
-t=s;
-assert_checkequal(s, t);
+// Lists
+// -----
+assert_checkequal(list(), list());
+assert_checkequal(list([]), list([]));
+assert_checkequal(list(list()), list(list()));
+assert_checkequal(list(%nan), list(%nan));
+assert_checkequal(list(1,,3), list(1,,3));
+assert_checkequal(list(1,,%nan+%i), list(1,,%nan+%i));
+s = list(1,,list(2,,4));
+assert_checkequal(s, s);
+s = list("foo",2);
+assert_checkequal(s, s);
+ierr = execstr("assert_checkequal(list(2,,7), list(2,%F,8))","errcatch");
+MY_assert_equal(ierr, 10000);
+errmsg = lasterror();
+refmsg = _("%s: Assertion failed: %s  while %s");
+refmsg = msprintf(refmsg, "assert_checkequal", ..
+    msprintf(_("expected(%d)= "),2) + "F", ..
+    msprintf(_("computed(%d)= "),2) + "(void)");
+MY_assert_equal( errmsg , refmsg );
+
+// Mlist
+// -----
+s = mlist(["V","name","value"],["a","b";"c" "d"],[1 2; 3 4]);
+assert_checkequal(s, s);
 //
-//  Tlist
-s=tlist(["V","name","value"],["a","b";"c" "d"],[1 2; 3 4]);
-t=s;
-assert_checkequal(s, t);
+// Tlist
+// -----
+s = tlist(["V","name","value"],["a","b";"c" "d"],[1 2; 3 4]);
+assert_checkequal(s, s);
 //
 // Polynomial
-s=poly(0,"s");
-t=s;
-assert_checkequal(s, t);
+// ----------
+s = poly(0,"s");
+assert_checkequal(s, s);
 //
 // Sparse
-s=spzeros(3,5);
-t=s;
-assert_checkequal(s, t);
+// ------
+s = spzeros(3,5);
+assert_checkequal(s, s);
+assert_checkequal(sparse([]), sparse([]));
+assert_checkequal(sparse(%nan), sparse(%nan));
+assert_checkequal(sparse([0 %nan 2]), sparse([0 %nan 2]));
+t = s;
 s(1)=12;
 instr="assert_checkequal(s, t)";
 ierr=execstr(instr,"errcatch");
@@ -141,11 +174,13 @@ MY_assert_equal(ierr, 10000);
 
 //
 // Boolean
+// -------
 s=(ones(3,5)==ones(3,5));
 t=s;
 assert_checkequal(s, t);
 //
 // Sparse Boolean
+// --------------
 s=(spzeros(3,5)==spzeros(3,5));
 t=s;
 assert_checkequal(s, t);
@@ -155,22 +190,20 @@ ierr=execstr(instr,"errcatch");
 MY_assert_equal(ierr, 10000);
 
 //
-// Integer  8
+// Integer 8
+// ---------
 s=int8(3);
 t=s;
 assert_checkequal(s, t);
 //
 // String
-s="foo";
-t=s;
-assert_checkequal(s, t);
-//
-// List
-s=list("foo",2);
-t=s;
-assert_checkequal(s, t);
+// ------
+assert_checkequal("", "");
+s = ["foo" "FOO"];
+assert_checkequal(s,s);
 //
 // Hypermatrix
+// -----------
 // - Double
 s = rand(2,2,2);
 t = s;
@@ -186,20 +219,83 @@ instr="assert_checkequal(s, t)";
 ierr=execstr(instr,"errcatch");
 MY_assert_equal(ierr, 10000);
 
+// Implicit lists
+// --------------
+assert_checkequal(1:$, 1:$);
+assert_checkequal(3:2:$-1, 3:2:$-1);
+ierr = execstr("assert_checkequal(1:$,2:$)","errcatch");
+MY_assert_equal(ierr, 10000);
+errmsg = lasterror();
+refmsg = _("%s: Assertion failed: expected= %s  while computed= %s");
+refmsg = msprintf(refmsg, "assert_checkequal", "2:1:$", "1:1:$");
+MY_assert_equal ( errmsg , refmsg );
 
+ierr = execstr("assert_checkequal(1:$,1:$-1)","errcatch");
+MY_assert_equal(ierr, 10000);
 
+// Primitives
+// ----------
+assert_checkequal(sin, sin);
+sine = sin;
+assert_checkequal(sin, sine);
+ierr = execstr("assert_checkequal(sin, cos)","errcatch");
+MY_assert_equal(ierr, 10000);
+errmsg = lasterror();
+refmsg = _("%s: Assertion failed: expected and computed are two distinct built-in functions.");
+refmsg = msprintf(refmsg, "assert_checkequal");
+MY_assert_equal ( errmsg , refmsg );
 
+ierr = execstr("assert_checkequal(sin, sind)","errcatch");
+MY_assert_equal(ierr, 10000);
 
+// Scilab functions
+// ----------------
+assert_checkequal(sind, sind);
+sined = sind;
+assert_checkequal(sind, sined);
 
+ierr = execstr("assert_checkequal(sind, cosd)","errcatch");
+MY_assert_equal(ierr, 10000);
+errmsg = lasterror();
+refmsg = _("%s: Assertion failed: expected= %s  while computed= %s");
+refmsg = msprintf(refmsg, "assert_checkequal", "cosd()", "sind()");
+MY_assert_equal ( errmsg , refmsg );
 
+ierr = execstr("assert_checkequal(sind, sin)","errcatch");
+MY_assert_equal(ierr, 10000);
 
+// Scilab libraries
+// ----------------
+assert_checkequal(iolib, iolib);
+ierr = execstr("assert_checkequal(corelib, iolib)","errcatch");
+MY_assert_equal(ierr, 10000);
+errmsg = lasterror();
+refmsg = _("%s: Assertion failed: expected= %s  while computed= %s");
+refmsg = msprintf(refmsg, "assert_checkequal", ..
+                   "lib@" + string(iolib)(1), "lib@" + string(corelib)(1));
+MY_assert_equal( errmsg , refmsg );
 
+// Graphical handles
+// -----------------
+assert_checkequal(gdf(), gdf());
+assert_checkequal(gda(), gda());
+assert_checkequal([gdf(),gda()], [gdf(),gda()]);
+ierr = execstr("assert_checkequal(gdf(), gda())","errcatch");
+MY_assert_equal(ierr, 10000);
+errmsg = lasterror();
+refmsg = _("%s: Assertion failed: expected= %s  while computed= %s");
+refmsg = msprintf(refmsg, "assert_checkequal", ..
+                   msprintf("Axes(uid:%d)",gda().uid), ..
+                   msprintf("Figure(uid:%d)",gdf().uid));
+MY_assert_equal( errmsg , refmsg );
+assert_checkequal([gdf(),gda()], [gdf(),gda()]);
 
-
-
-
-
-
-
-
+ierr = execstr("assert_checkequal([gdf(),gda()],[gdf(),gdf()])","errcatch");
+MY_assert_equal(ierr, 10000);
+errmsg = lasterror();
+refmsg = _("%s: Assertion failed: %s  while %s");
+refmsg = msprintf(refmsg, "assert_checkequal", ..
+    msprintf(_("expected(%d)= "),2) + msprintf("Figure(uid:%d)",gdf().uid), ..
+    msprintf(_("computed(%d)= "),2) + msprintf("Axes(uid:%d)",gda().uid));
+MY_assert_equal( errmsg , refmsg );