Added a flag to revert to old behaviour for addition and subtraction with empty matrix 14/17714/5
Pierre-Aime Agnel [Sun, 24 Jan 2016 14:10:17 +0000 (15:10 +0100)]
Change-Id: I9b49cb31d4ba1f353fa31a7ba43f05b001b0980e

16 files changed:
scilab/modules/ast/includes/system_env/configvariable.hxx
scilab/modules/ast/src/cpp/operations/types_addition.cpp
scilab/modules/ast/src/cpp/operations/types_subtraction.cpp
scilab/modules/ast/src/cpp/system_env/configvariable.cpp
scilab/modules/core/Makefile.am
scilab/modules/core/Makefile.in
scilab/modules/core/help/en_US/configuration/oldEmptyBehaviour.xml [new file with mode: 0644]
scilab/modules/core/help/fr_FR/configuration/oldEmptyBehaviour.xml [new file with mode: 0644]
scilab/modules/core/includes/core_gw.hxx
scilab/modules/core/sci_gateway/core_gateway.xml
scilab/modules/core/sci_gateway/cpp/core_gw.cpp
scilab/modules/core/sci_gateway/cpp/core_gw.vcxproj
scilab/modules/core/sci_gateway/cpp/core_gw.vcxproj.filters
scilab/modules/core/sci_gateway/cpp/sci_oldEmptyBehaviour.cpp [new file with mode: 0644]
scilab/modules/core/tests/unit_tests/oldEmptyBehaviour.dia.ref [new file with mode: 0644]
scilab/modules/core/tests/unit_tests/oldEmptyBehaviour.tst [new file with mode: 0644]

index 5999da0..3d2bd8a 100644 (file)
@@ -156,6 +156,14 @@ public :
     static void setWarningStop(bool _bWarningStop);
     static bool getWarningStop(void);
 
+    // WarningStop
+private :
+    static bool m_bOldEmptyBehaviour;
+
+public :
+    static void setOldEmptyBehaviour(bool _bOldEmptyBehaviour);
+    static bool getOldEmptyBehaviour(void);
+
     //HOME
 private :
     static std::wstring m_HOME;
@@ -215,13 +223,13 @@ public:
 private:
     static bool m_bVerbose;
 
-public : 
+public :
     static void setVerbose(bool _bVerbose);
     static bool getVerbose(void);
 
 
     //silent error ( try catch, errcatch, ... )
-private : 
+private :
     static bool m_iSilentError;
 public:
     static void setSilentError(bool _iSilentError);
index bf7780a..bad57e7 100644 (file)
@@ -20,6 +20,7 @@
 #include "operations.hxx"
 #include "double.hxx"
 #include "int.hxx"
+#include "configvariable.hxx"
 
 extern "C"
 {
@@ -1137,6 +1138,11 @@ InternalType* add_M_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_M_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1197,6 +1203,11 @@ InternalType* add_MC_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_MC_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1235,6 +1246,11 @@ InternalType* add_S_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_S_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1271,6 +1287,11 @@ InternalType* add_SC_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_SC_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1281,6 +1302,11 @@ InternalType* add_SC_E(T *_pL, U * /*_pR*/)
 template<class T, class U, class O>
 InternalType* add_E_M(T *_pL, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pR;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1290,6 +1316,11 @@ InternalType* add_E_M(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_E_MC(T *_pL, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pR;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1299,6 +1330,11 @@ InternalType* add_E_MC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_E_S(T *_pL, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pR;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1308,6 +1344,11 @@ InternalType* add_E_S(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_E_SC(T *_pL, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pR;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1542,6 +1583,11 @@ template<class T, class U, class O> InternalType* add_IC_IC(T *_pL, U *_pR)
 
 template<class T, class U, class O> types::InternalType* add_I_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1550,6 +1596,11 @@ template<class T, class U, class O> types::InternalType* add_I_E(T *_pL, U * /*_
 
 template<class T, class U, class O> types::InternalType* add_IC_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1558,6 +1609,11 @@ template<class T, class U, class O> types::InternalType* add_IC_E(T *_pL, U * /*
 
 template<class T, class U, class O> types::InternalType* add_E_I(T * /*_pL*/, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pR;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1566,6 +1622,11 @@ template<class T, class U, class O> types::InternalType* add_E_I(T * /*_pL*/, U
 
 template<class T, class U, class O> types::InternalType* add_E_IC(T * /*_pL*/, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pR;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1689,6 +1750,11 @@ InternalType* add_S_S<String, String, String>(String* _pL, String* _pR)
 template<>
 InternalType* add_M_E<String, Double, String>(String* _pL, Double* /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1698,6 +1764,11 @@ InternalType* add_M_E<String, Double, String>(String* _pL, Double* /*_pR*/)
 template<>
 InternalType* add_S_E<String, Double, String>(String* _pL, Double* /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1707,6 +1778,11 @@ InternalType* add_S_E<String, Double, String>(String* _pL, Double* /*_pR*/)
 template<>
 InternalType* add_E_M<Double, String, String>(Double* /*_pL*/, String* _pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pR;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
@@ -1716,6 +1792,11 @@ InternalType* add_E_M<Double, String, String>(Double* /*_pL*/, String* _pR)
 template<>
 InternalType* add_E_S<Double, String, String>(Double* /*_pL*/, String* _pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation +: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pR;
+    }
     Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     add();
index e1c1bf1..8a3da38 100644 (file)
@@ -900,6 +900,11 @@ InternalType* sub_M_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_M_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
@@ -982,6 +987,11 @@ InternalType* sub_MC_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_MC_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
@@ -1024,6 +1034,11 @@ InternalType* sub_S_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_S_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
@@ -1066,6 +1081,11 @@ InternalType* sub_SC_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_SC_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
@@ -1076,6 +1096,11 @@ InternalType* sub_SC_E(T *_pL, U * /*_pR*/)
 template<class T, class U, class O>
 InternalType* sub_E_M(T * /*_pL*/, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return opposite_M<U, O>(_pR);
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
@@ -1085,6 +1110,11 @@ InternalType* sub_E_M(T * /*_pL*/, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_E_MC(T * /*_pL*/, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return opposite_MC<U, O>(_pR);
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
@@ -1468,6 +1498,11 @@ template<class T, class U, class O> InternalType* sub_IC_IC(T *_pL, U *_pR)
 
 template<class T, class U, class O> types::InternalType* sub_I_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
@@ -1476,6 +1511,11 @@ template<class T, class U, class O> types::InternalType* sub_I_E(T *_pL, U * /*_
 
 template<class T, class U, class O> types::InternalType* sub_IC_E(T *_pL, U * /*_pR*/)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return _pL;
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
@@ -1484,6 +1524,11 @@ template<class T, class U, class O> types::InternalType* sub_IC_E(T *_pL, U * /*
 
 template<class T, class U, class O> types::InternalType* sub_E_I(T * /*_pL*/, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return opposite_I<U, O>(_pR);
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
@@ -1492,6 +1537,11 @@ template<class T, class U, class O> types::InternalType* sub_E_I(T * /*_pL*/, U
 
 template<class T, class U, class O> types::InternalType* sub_E_IC(T * /*_pL*/, U *_pR)
 {
+    if (ConfigVariable::getOldEmptyBehaviour())
+    {
+        Sciwarning(_("operation -: Warning adding a matrix with the empty matrix old behaviour.\n"));
+        return opposite_IC<U, O>(_pR);
+    }
     Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n"));
     Double* pOut = Double::Empty();
     sub();
index e3fb0b4..90e514f 100644 (file)
@@ -286,6 +286,25 @@ bool ConfigVariable::getWarningStop(void)
 ** \}
 */
 
+/*
+** Old Empty Behaviour
+** \{
+*/
+bool ConfigVariable::m_bOldEmptyBehaviour = false;
+
+void ConfigVariable::setOldEmptyBehaviour(bool _bOldEmptyBehaviour)
+{
+    m_bOldEmptyBehaviour = _bOldEmptyBehaviour;
+}
+
+bool ConfigVariable::getOldEmptyBehaviour(void)
+{
+    return m_bOldEmptyBehaviour;
+}
+/*
+** \}
+*/
+
 
 /*
 ** HOME
index 23d2ba1..0a84bd7 100644 (file)
@@ -125,6 +125,7 @@ GATEWAY_CPP_SOURCES = \
        sci_gateway/cpp/sci_tlist.cpp \
        sci_gateway/cpp/sci_mlist.cpp \
        sci_gateway/cpp/sci_isfield.cpp \
+       sci_gateway/cpp/sci_oldEmptyBehaviour.cpp \
        sci_gateway/cpp/sci_fieldnames.cpp
 
 if ENABLE_DEBUG
index 2d9cbe7..343ba7a 100644 (file)
@@ -294,6 +294,7 @@ am__libscicore_la_SOURCES_DIST = sci_gateway/c/sci_getdebuginfo.c \
        sci_gateway/cpp/sci_makecell.cpp \
        sci_gateway/cpp/sci_typeof.cpp sci_gateway/cpp/sci_tlist.cpp \
        sci_gateway/cpp/sci_mlist.cpp sci_gateway/cpp/sci_isfield.cpp \
+       sci_gateway/cpp/sci_oldEmptyBehaviour.cpp \
        sci_gateway/cpp/sci_fieldnames.cpp \
        sci_gateway/cpp/sci_inspectorDeleteUnreferencedItems.cpp \
        sci_gateway/cpp/sci_inspectorGetItem.cpp \
@@ -362,6 +363,7 @@ am__objects_6 = sci_gateway/cpp/libscicore_la-core_gw.lo \
        sci_gateway/cpp/libscicore_la-sci_tlist.lo \
        sci_gateway/cpp/libscicore_la-sci_mlist.lo \
        sci_gateway/cpp/libscicore_la-sci_isfield.lo \
+       sci_gateway/cpp/libscicore_la-sci_oldEmptyBehaviour.lo \
        sci_gateway/cpp/libscicore_la-sci_fieldnames.lo \
        $(am__objects_5)
 am_libscicore_la_OBJECTS = $(am__objects_4) $(am__objects_6)
@@ -855,6 +857,7 @@ GATEWAY_CPP_SOURCES = sci_gateway/cpp/core_gw.cpp \
        sci_gateway/cpp/sci_makecell.cpp \
        sci_gateway/cpp/sci_typeof.cpp sci_gateway/cpp/sci_tlist.cpp \
        sci_gateway/cpp/sci_mlist.cpp sci_gateway/cpp/sci_isfield.cpp \
+       sci_gateway/cpp/sci_oldEmptyBehaviour.cpp \
        sci_gateway/cpp/sci_fieldnames.cpp $(am__append_1)
 libscicore_la_CPPFLAGS = -I$(srcdir)/includes/ -I$(srcdir)/src/c/ \
        -I$(srcdir)/src/cpp/ -I$(top_srcdir)/modules/ast/includes/ast/ \
@@ -1407,6 +1410,9 @@ sci_gateway/cpp/libscicore_la-sci_mlist.lo:  \
 sci_gateway/cpp/libscicore_la-sci_isfield.lo:  \
        sci_gateway/cpp/$(am__dirstamp) \
        sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp)
+sci_gateway/cpp/libscicore_la-sci_oldEmptyBehaviour.lo:  \
+       sci_gateway/cpp/$(am__dirstamp) \
+       sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp)
 sci_gateway/cpp/libscicore_la-sci_fieldnames.lo:  \
        sci_gateway/cpp/$(am__dirstamp) \
        sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp)
@@ -1499,6 +1505,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_mode.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_newfun.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_null.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_oldEmptyBehaviour.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_pause.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_predef.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_quit.Plo@am__quote@
@@ -2270,6 +2277,13 @@ sci_gateway/cpp/libscicore_la-sci_isfield.lo: sci_gateway/cpp/sci_isfield.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscicore_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sci_gateway/cpp/libscicore_la-sci_isfield.lo `test -f 'sci_gateway/cpp/sci_isfield.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_isfield.cpp
 
+sci_gateway/cpp/libscicore_la-sci_oldEmptyBehaviour.lo: sci_gateway/cpp/sci_oldEmptyBehaviour.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscicore_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sci_gateway/cpp/libscicore_la-sci_oldEmptyBehaviour.lo -MD -MP -MF sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_oldEmptyBehaviour.Tpo -c -o sci_gateway/cpp/libscicore_la-sci_oldEmptyBehaviour.lo `test -f 'sci_gateway/cpp/sci_oldEmptyBehaviour.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_oldEmptyBehaviour.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_oldEmptyBehaviour.Tpo sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_oldEmptyBehaviour.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='sci_gateway/cpp/sci_oldEmptyBehaviour.cpp' object='sci_gateway/cpp/libscicore_la-sci_oldEmptyBehaviour.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscicore_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sci_gateway/cpp/libscicore_la-sci_oldEmptyBehaviour.lo `test -f 'sci_gateway/cpp/sci_oldEmptyBehaviour.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_oldEmptyBehaviour.cpp
+
 sci_gateway/cpp/libscicore_la-sci_fieldnames.lo: sci_gateway/cpp/sci_fieldnames.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscicore_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sci_gateway/cpp/libscicore_la-sci_fieldnames.lo -MD -MP -MF sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_fieldnames.Tpo -c -o sci_gateway/cpp/libscicore_la-sci_fieldnames.lo `test -f 'sci_gateway/cpp/sci_fieldnames.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_fieldnames.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_fieldnames.Tpo sci_gateway/cpp/$(DEPDIR)/libscicore_la-sci_fieldnames.Plo
diff --git a/scilab/modules/core/help/en_US/configuration/oldEmptyBehaviour.xml b/scilab/modules/core/help/en_US/configuration/oldEmptyBehaviour.xml
new file mode 100644 (file)
index 0000000..0cf02a5
--- /dev/null
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="en" xml:id="oldEmptyBehaviour">
+    <refnamediv>
+        <refname>oldEmptyBehaviour</refname>
+        <refpurpose>Controls the operation+ and operation- behaviour for Scilab</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Syntax</title>
+        <synopsis>oldEmptyBehaviour(behaviour)</synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>behaviour</term>
+                <listitem>
+                    <para>
+                        a single string amongst <literal>"on"</literal>, <literal>"off"</literal> or <literal>"query"</literal>. The behaviour mode for operation+ and operation-
+                    </para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>
+            Controls the behaviour of the empty matrix addition and subtraction. On versions prior to scilab-6.0.0, adding or subtracting and empty matrix to any other value <literal>val</literal> would return <literal>val</literal>.
+        </para>
+        <para>
+            If <literal>behaviour == "off"</literal>, adding or subtracting the empty matrix will yield to the empty matrix. This is the default behaviour of scilab after version 6.0.0.
+        </para>
+        <para>
+            If <literal>behaviour == "on"</literal>, activates the behaviour prior to scilab-6.0.0.
+        </para>
+        <para>
+            If <literal>behaviour == "query"</literal>, returns the current value (<literal>"on"</literal> or <literal>"off"</literal>) for the <literal>oldEmptyBehaviour</literal> tag.
+        </para>
+    </refsection>
+    <refsection>
+        <title>Examples</title>
+        <programlisting role="example"><![CDATA[
+// Get the current behaviour
+behaviour = oldEmptyBehaviour("query");
+
+// These will return empty
+oldEmptyBehaviour("off");
+1 + []
+"Test string" + []
+[] - int8(1)
+[] - %s
+
+// These will leave the other operand unchanged
+oldEmptyBehaviour("on");
+1 + [] // returns 1
+"Test string" + [] // returns "Test string"
+[] - int8(1) // returns int8(1)
+[] - %s // returns %s
+
+// Get back to the saved behaviour
+oldEmptyBehaviour(behaviour)
+ ]]></programlisting>
+    </refsection>
+    <refsection>
+        <title>See Also</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="warning">warning</link> for the warning behaviour on operation+ and operation-
+            </member>
+            <member>
+                <link linkend="plus">plus</link> for the behaviour of the operation+.
+            </member>
+            <member>
+                <link linkend="minus">minus</link> for the behaviour of the operation-.
+            </member>
+        </simplelist>
+    </refsection>
+</refentry>
diff --git a/scilab/modules/core/help/fr_FR/configuration/oldEmptyBehaviour.xml b/scilab/modules/core/help/fr_FR/configuration/oldEmptyBehaviour.xml
new file mode 100644 (file)
index 0000000..772616c
--- /dev/null
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="fr" xml:id="oldEmptyBehaviour">
+    <refnamediv>
+        <refname>oldEmptyBehaviour</refname>
+        <refpurpose>Contrôle le comportement de l'opération+ et de l'opération- sur la matrice vide</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Syntaxe</title>
+        <synopsis>oldEmptyBehaviour(behaviour)</synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>behaviour</term>
+                <listitem>
+                    <para>
+                        une chaîne de caractères parmi <literal>"on"</literal>, <literal>"off"</literal> ou <literal>"query"</literal>. Comportement de l'opération+ et de l'opération-
+                    </para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>
+            Contrôle le comportement de l'addition ou de la soustraction avec la matrice vide. Sur les versions antérieures à scilab-6.0.0, ajouter ou soustraire la matrice vide à une autre matrice <literal>val</literal> retournait <literal>val</literal>.
+        </para>
+        <para>
+            Si <literal>behaviour == "off"</literal>, ajouter ou soustraire la matrice vide retourne la matrice vide. C'est le comportement par défaut après la version 6.0.0.
+        </para>
+        <para>
+            Si <literal>behaviour == "on"</literal>, active le comportement antérieur à la version scilab-6.0.0.
+        </para>
+        <para>
+            Si <literal>behaviour == "query"</literal>, renvoie la valeur courante pour l'option <literal>oldEmptyBehaviour</literal> (<literal>"on"</literal> or <literal>"off"</literal>)
+        </para>
+    </refsection>
+    <refsection>
+        <title>Exemples</title>
+        <programlisting role="example"><![CDATA[
+// Recuperer le comportement actuel
+behaviour = oldEmptyBehaviour("query");
+
+// Ces lignes renvoie la matrice vide
+oldEmptyBehaviour("off");
+1 + []
+"Test string" + []
+[] - int8(1)
+[] - %s
+
+// Ces lignes renverront l'opérande non vide
+oldEmptyBehaviour("on");
+1 + [] // renvoie 1
+"Test string" + [] // renvoie "Test string"
+[] - int8(1) // renvoie -int8(1)
+[] - %s // renvoie -%s
+
+// Re positionne le comportement
+oldEmptyBehaviour(behaviour)
+ ]]></programlisting>
+    </refsection>
+    <refsection>
+        <title>Voir aussi</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="warning">warning</link> pour le comportement des avertissements à l'utilisation de l'opération+ et de l'opération-.
+            </member>
+            <member>
+                <link linkend="plus">plus</link> pour le comportement de l'opération +.
+            </member>
+            <member>
+                <link linkend="minus">minus</link> pour le comporetment de l'opération -.
+            </member>
+        </simplelist>
+    </refsection>
+</refentry>
index a44263f..f0ebe7a 100644 (file)
@@ -87,6 +87,7 @@ CPP_GATEWAY_PROTOTYPE(sci_tlist_gw);
 CPP_GATEWAY_PROTOTYPE(sci_mlist_gw);
 CPP_GATEWAY_PROTOTYPE(sci_isfield);
 CPP_GATEWAY_PROTOTYPE(sci_fieldnames);
+CPP_GATEWAY_PROTOTYPE(sci_oldEmptyBehaviour);
 
 #ifndef NDEBUG
 CPP_GATEWAY_PROTOTYPE(sci_inspectorGetItemCount);
index f2a5fad..b15c769 100644 (file)
@@ -84,6 +84,7 @@
     <PRIMITIVE gatewayId="13" primitiveId="50" primitiveName="getdebuginfo" />
     <PRIMITIVE gatewayId="13" primitiveId="51" primitiveName="readgateway" />
     <PRIMITIVE gatewayId="13" primitiveId="52" primitiveName="exit" />
+    <PRIMITIVE gatewayId="13" primitiveId="53" primitiveName="oldEmptyBehaviour" />
     
     <PRIMITIVE gatewayId="14" primitiveId="1" primitiveName="user" />
     
index 9e67220..113427c 100644 (file)
@@ -79,6 +79,7 @@ int CoreModule::Load()
     symbol::Context::getInstance()->addFunction(types::Function::createFunction(L"mlist", &sci_mlist_gw, MODULE_NAME));
     symbol::Context::getInstance()->addFunction(types::Function::createFunction(L"isfield", &sci_isfield, MODULE_NAME));
     symbol::Context::getInstance()->addFunction(types::Function::createFunction(L"fieldnames", &sci_fieldnames, MODULE_NAME));
+    symbol::Context::getInstance()->addFunction(types::Function::createFunction(L"oldEmptyBehaviour", &sci_oldEmptyBehaviour, MODULE_NAME));
 
 #ifndef NDEBUG
     symbol::Context::getInstance()->addFunction(types::Function::createFunction(L"inspectorGetItemCount", &sci_inspectorGetItemCount, MODULE_NAME));
index 6599f04..5e0ea0a 100644 (file)
     <ClCompile Include="sci_mode.cpp" />
     <ClCompile Include="sci_newfun.cpp" />
     <ClCompile Include="sci_null.cpp" />
+    <ClCompile Include="sci_oldEmptyBehaviour.cpp" />
     <ClCompile Include="sci_predef.cpp" />
     <ClCompile Include="sci_recursionlimit.cpp" />
     <ClCompile Include="sci_sciargs.cpp" />
index c23d930..6680f8c 100644 (file)
     <ClCompile Include="sci_list.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="sci_oldEmptyBehaviour.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\includes\banner.hxx">
diff --git a/scilab/modules/core/sci_gateway/cpp/sci_oldEmptyBehaviour.cpp b/scilab/modules/core/sci_gateway/cpp/sci_oldEmptyBehaviour.cpp
new file mode 100644 (file)
index 0000000..041bfe3
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ *  Copyright (C) 2016 - Scilab Enterprises - Pierre-Aime Agnel
+ *
+ *  This file must be used under the terms of the CeCILL.
+ *  This source file is licensed as described in the file COPYING, which
+ *  you should have received as part of this distribution.  The terms
+ *  are also available at
+ *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "core_gw.hxx"
+#include "function.hxx"
+#include "string.hxx"
+#include "scilabWrite.hxx"
+#include "configvariable.hxx"
+
+extern "C"
+{
+#include "localization.h"
+#include "Scierror.h"
+}
+/*--------------------------------------------------------------------------*/
+types::Function::ReturnValue sci_oldEmptyBehaviour(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    types::String *psInput = NULL;
+
+    if (in.size() != 1)
+    {
+        Scierror(999, _("%s: Wrong number of input argument(s): %d expected.\n"), "oldEmptyBehaviour", 1);
+        return types::Function::Error;
+    }
+
+    if (_iRetCount != 1)
+    {
+        Scierror(999, _("%s: Wrong number of output argument(s): %d expected.\n"), "oldEmptyBehaviour", 1);
+        return types::Function::Error;
+    }
+
+    if (in[0]->isString() == false)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "oldEmptyBehaviour", 1);
+        return types::Function::Error;
+    }
+
+    psInput = in[0]->getAs<types::String>();
+    if (psInput->getSize() != 1)
+    {
+        Scierror(999, _("%s: Wrong size for input argument #%d: Single string expected.\n"), "oldEmptyBehaviour", 1);
+        return types::Function::Error;
+    }
+
+    /* "on" "off" "query" */
+    if (wcscmp(psInput->get(0), L"on") == 0)
+    {
+        ConfigVariable::setOldEmptyBehaviour(TRUE);
+        return types::Function::OK;
+    }
+
+    if (wcscmp(psInput->get(0), L"off") == 0)
+    {
+        ConfigVariable::setOldEmptyBehaviour(FALSE);
+        return types::Function::OK;
+    }
+
+    if (wcscmp(psInput->get(0), L"query") == 0)
+    {
+        if (ConfigVariable::getOldEmptyBehaviour())
+        {
+            // OldEmptyBehaviour is on
+            out.push_back(new types::String(L"on"));
+        }
+        else
+        {
+            // OldEmptyBehaviour is off
+            out.push_back(new types::String(L"off"));
+        }
+        return types::Function::OK;
+    }
+
+    // String input is different than "on", "off" or "query"
+    Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set {#%s}.\n"), "oldEmptyBehaviour", 1, "\"on\", \"off\", \"query\"");
+
+    return types::Function::Error;
+}
+/*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/core/tests/unit_tests/oldEmptyBehaviour.dia.ref b/scilab/modules/core/tests/unit_tests/oldEmptyBehaviour.dia.ref
new file mode 100644 (file)
index 0000000..d7a8c51
--- /dev/null
@@ -0,0 +1,110 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- ENGLISH ONLY -->
+// Testing oldEmptyBehaviour default mode
+behaviour = oldEmptyBehaviour("query");
+assert_checkequal(behaviour, "off");
+// Changing the behaviour
+oldEmptyBehaviour("on");
+behaviour = oldEmptyBehaviour("query");
+assert_checkequal(behaviour, "on");
+E = [];
+s = 1;
+sc = 1 + %i;
+M = [1 2; 3 4];
+MC = M + M.*%i;
+I = int8(M);
+P = [3*%s^2 + %s + 1; %s^2];
+PC = P + %i*%s;
+st = ["this is a test"; "with a string"];
+num = {s, sc, M, MC, I, P, PC};
+// Test all numeric
+for i = 1:size(num, "*")
+    assert_checkequal(E + num{i}, num{i});
+    assert_checkequal(E - num{i}, -num{i});
+    assert_checkequal(num{i} + E, num{i});
+    assert_checkequal(num{i} - E, num{i});
+end
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+operation -: Warning adding a matrix with the empty matrix old behaviour.
+// test strings
+assert_checkequal(E + st, st);
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+assert_checkequal(st + E, st);
+operation +: Warning adding a matrix with the empty matrix old behaviour.
+// New behaviour
+oldEmptyBehaviour("off");
+behaviour = oldEmptyBehaviour("query");
+assert_checkequal(behaviour, "off");
+// Test all numeric
+for i = 1:size(num, "*")
+    assert_checkequal(E + num{i}, E);
+    assert_checkequal(E - num{i}, E);
+    assert_checkequal(num{i} + E, E);
+    assert_checkequal(num{i} - E, E);
+end
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.
+// test strings
+assert_checkequal(E + st, E);
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
+assert_checkequal(st + E, E);
+operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.
diff --git a/scilab/modules/core/tests/unit_tests/oldEmptyBehaviour.tst b/scilab/modules/core/tests/unit_tests/oldEmptyBehaviour.tst
new file mode 100644 (file)
index 0000000..56ac154
--- /dev/null
@@ -0,0 +1,60 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+//
+// <-- ENGLISH ONLY -->
+
+// Testing oldEmptyBehaviour default mode
+behaviour = oldEmptyBehaviour("query");
+assert_checkequal(behaviour, "off");
+
+// Changing the behaviour
+oldEmptyBehaviour("on");
+behaviour = oldEmptyBehaviour("query");
+assert_checkequal(behaviour, "on");
+E = [];
+s = 1;
+sc = 1 + %i;
+M = [1 2; 3 4];
+MC = M + M.*%i;
+I = int8(M);
+P = [3*%s^2 + %s + 1; %s^2];
+PC = P + %i*%s;
+st = ["this is a test"; "with a string"];
+
+num = {s, sc, M, MC, I, P, PC};
+
+// Test all numeric
+for i = 1:size(num, "*")
+    assert_checkequal(E + num{i}, num{i});
+    assert_checkequal(E - num{i}, -num{i});
+    assert_checkequal(num{i} + E, num{i});
+    assert_checkequal(num{i} - E, num{i});
+end
+
+// test strings
+assert_checkequal(E + st, st);
+assert_checkequal(st + E, st);
+
+// New behaviour
+oldEmptyBehaviour("off");
+behaviour = oldEmptyBehaviour("query");
+assert_checkequal(behaviour, "off");
+
+// Test all numeric
+for i = 1:size(num, "*")
+    assert_checkequal(E + num{i}, E);
+    assert_checkequal(E - num{i}, E);
+    assert_checkequal(num{i} + E, E);
+    assert_checkequal(num{i} - E, E);
+end
+
+// test strings
+assert_checkequal(E + st, E);
+assert_checkequal(st + E, E);
+