Xcos MVC: slight improvements in Adapters 72/15672/12
Paul Bignier [Mon, 8 Dec 2014 15:17:47 +0000 (16:17 +0100)]
 * Allow consecutive initialization thanks to data protection in DiagramAdapter.cpp
 * Allow negative values for 'from' and 'to' block field Link properties
 * Give dummy properties to Cpr and State Adapters to be able to use them, returned as TLists
 * Copy a Block's 'doc_content' field when inserting it in a diagram
 * is_valid() now logically treats link_t items
 * Regenerate ref test files

Change-Id: Id068c30d18e110b486ccbbcfd336335c623d28a7

17 files changed:
scilab/modules/scicos/includes/adapters_utilities.hxx
scilab/modules/scicos/macros/scicos_scicos/scicos_state.sci
scilab/modules/scicos/sci_gateway/cpp/sci_scicos_new.cpp
scilab/modules/scicos/src/cpp/view_scilab/BaseAdapter.hxx
scilab/modules/scicos/src/cpp/view_scilab/BlockAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/CprAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/DiagramAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/LinkAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/LinkAdapter.hxx
scilab/modules/scicos/src/cpp/view_scilab/ModelAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/ModelAdapter.hxx
scilab/modules/scicos/src/cpp/view_scilab/StateAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/ports_management.hxx
scilab/modules/scicos/tests/unit_tests/model/Consecutive_init.dia.ref [new file with mode: 0644]
scilab/modules/scicos/tests/unit_tests/model/Consecutive_init.tst [new file with mode: 0644]
scilab/modules/scicos/tests/unit_tests/model/Cpr_State.dia.ref [new file with mode: 0644]
scilab/modules/scicos/tests/unit_tests/model/Cpr_State.tst [new file with mode: 0644]

index a25aa0f..7d48fd1 100644 (file)
@@ -21,8 +21,8 @@ enum startOrEnd
 
 struct link_t
 {
-    size_t block;
-    size_t port;
+    int block;
+    int port;
     enum startOrEnd kind;
 };
 
index 599d6b3..2a107b3 100644 (file)
@@ -23,12 +23,12 @@ function state=scicos_state(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11)
     //initialisation de state scicos_new
     if exists("x","local")==0 then x=[],end
     if exists("z","local")==0 then z=[],end
-    if exists("oz","local")==0 then oz=list,end
+    if exists("oz","local")==0 then oz=[],end
     if exists("iz","local")==0 then iz=[],end
     if exists("tevts","local")==0 then tevts=[],end
     if exists("evtspt","local")==0 then evtspt=[],end
     if exists("pointi","local")==0 then pointi=1,end
     if exists("outtb","local")==0 then outtb=list(),end
     state=scicos_new(["xcs","x","z","oz","iz","tevts","evtspt","pointi","outtb"],..
-    x,z,iz,tevts,evtspt,pointi,outtb)
+    x,z,oz,iz,tevts,evtspt,pointi,outtb)
 endfunction
index de70d2a..14757df 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "types.hxx"
 #include "string.hxx"
+#include "tlist.hxx"
 #include "mlist.hxx"
 #include "list.hxx"
 #include "function.hxx"
@@ -53,7 +54,7 @@ static const std::string funame = "scicos_new";
 template<class Adaptor, class Adaptee>
 types::InternalType * alloc_and_set(kind_t k, types::String* type_name, types::typed_list &in)
 {
-    Controller controller = Controller();
+    Controller controller;
 
     // create the associated object
     ScicosID o = controller.createObject(k);
@@ -75,6 +76,32 @@ types::InternalType * alloc_and_set(kind_t k, types::String* type_name, types::t
 }
 
 template<class Adaptor, class Adaptee>
+types::InternalType * alloc_and_set_as_tlist(types::String* type_name, types::typed_list &in)
+{
+    // check header
+    Adaptor adaptor(0);
+    for (int i = 1; i < (int)in.size(); i++)
+    {
+        std::wstring name(type_name->get(i));
+        if (!adaptor.hasProperty(name))
+        {
+            Scierror(999, _("%s: Wrong value for input argument #%d: unable to set \"%ls\".\n"), funame.data(), i, name.data());
+            return 0;
+        }
+    }
+
+    // copy the data
+    types::TList* tlist = new types::TList();
+    tlist->set(0, type_name->clone());
+    for (int i = 1; i < (int)in.size(); i++)
+    {
+        tlist->set(i, in[i]);
+    }
+
+    return tlist;
+}
+
+template<class Adaptor, class Adaptee>
 types::InternalType * alloc_and_set_as_mlist(types::String* type_name, types::typed_list &in)
 {
     // check header
@@ -150,7 +177,7 @@ types::Function::ReturnValue sci_scicos_new(types::typed_list &in, int _iRetCoun
             out.push_back(returnType);
             break;
         case view_scilab::Adapters::CPR_ADAPTER:
-            returnType = alloc_and_set<view_scilab::CprAdapter, model::Diagram>(DIAGRAM, type_name, in);
+            returnType = alloc_and_set_as_tlist<view_scilab::CprAdapter, model::Diagram>(type_name, in);
             if (returnType == 0)
             {
                 return types::Function::Error;
@@ -210,7 +237,7 @@ types::Function::ReturnValue sci_scicos_new(types::typed_list &in, int _iRetCoun
             out.push_back(returnType);
             break;
         case view_scilab::Adapters::STATE_ADAPTER:
-            returnType = alloc_and_set<view_scilab::StateAdapter, model::Diagram>(DIAGRAM, type_name, in);
+            returnType = alloc_and_set_as_tlist<view_scilab::StateAdapter, model::Diagram>(type_name, in);
             if (returnType == 0)
             {
                 return types::Function::Error;
index cadef5c..2fa983c 100644 (file)
@@ -104,7 +104,7 @@ public:
     BaseAdapter(std::shared_ptr<Adaptee> adaptee) : m_adaptee(adaptee) {};
     BaseAdapter(const BaseAdapter& adapter) : m_adaptee(0)
     {
-        Controller controller = Controller();
+        Controller controller;
         ScicosID id = controller.cloneObject(adapter.getAdaptee()->id());
         m_adaptee = std::static_pointer_cast<Adaptee>(controller.getObject(id));
     };
@@ -171,19 +171,7 @@ public:
         index = 1;
         for (typename property<Adaptor>::props_t_it it = properties.begin(); it != properties.end(); ++it, ++index)
         {
-            // In a ModelAdapter, the 'rpar' property (number 13) can return '0', in which case do not set the field
-            if (index != 13)
-            {
-                tlist->set(index, it->get(*static_cast<Adaptor*>(this), controller));
-            }
-            else
-            {
-                types::InternalType* pVal = it->get(*static_cast<Adaptor*>(this), controller);
-                if (pVal != 0)
-                {
-                    tlist->set(index, pVal);
-                }
-            }
+            tlist->set(index, it->get(*static_cast<Adaptor*>(this), controller));
         }
 
         tlist->IncreaseRef();
index ea95544..801efed 100644 (file)
@@ -31,6 +31,8 @@
 #include "TextAdapter.hxx"
 
 extern "C" {
+#include "wchar.h"
+
 #include "sci_malloc.h"
 #include "charEncoding.h"
 }
@@ -75,7 +77,7 @@ struct model
             return false;
         }
 
-        adaptor.setDiagram(localAdaptor.getRpar());
+        adaptor.setDiagram(localAdaptor.getDiagram());
 
         return true;
     }
index a35f62c..5f67745 100644 (file)
@@ -14,7 +14,6 @@
 #include <memory>
 
 #include "internal.hxx"
-#include "list.hxx"
 #include "types.hxx"
 #include "user.hxx"
 
@@ -28,6 +27,22 @@ namespace view_scilab
 namespace
 {
 
+struct dummy_property
+{
+
+    static types::InternalType* get(const CprAdapter& /*adaptor*/, const Controller& /*controller*/)
+    {
+        // Return a default empty matrix.
+        return types::Double::Empty();
+    }
+
+    static bool set(CprAdapter& /*adaptor*/, types::InternalType* /*v*/, Controller& /*controller*/)
+    {
+        // Everything should be right as the properties mapped using this adapter do not perform anything
+        return true;
+    }
+};
+
 } /* namespace */
 
 template<> property<CprAdapter>::props_t property<CprAdapter>::fields = property<CprAdapter>::props_t();
@@ -37,7 +52,11 @@ CprAdapter::CprAdapter(std::shared_ptr<org_scilab_modules_scicos::model::Diagram
 {
     if (property<CprAdapter>::properties_have_not_been_set())
     {
-        // FIXME: add some properties
+        property<CprAdapter>::fields.reserve(4);
+        property<CprAdapter>::add_property(L"state", &dummy_property::get, &dummy_property::set);
+        property<CprAdapter>::add_property(L"sim", &dummy_property::get, &dummy_property::set);
+        property<CprAdapter>::add_property(L"cor", &dummy_property::get, &dummy_property::set);
+        property<CprAdapter>::add_property(L"corinv", &dummy_property::get, &dummy_property::set);
     }
 }
 
index 7f81602..a82d0d1 100644 (file)
@@ -80,7 +80,7 @@ struct objs
         std::vector<link_t> to = adaptor.getTo();
 
         int link_number = 0;
-        Controller newController = Controller();
+        Controller newController;
         for (int i = 0; i < static_cast<int>(children.size()); ++i)
         {
             std::shared_ptr<model::BaseObject> item = newController.getObject(children[i]);
@@ -108,6 +108,8 @@ struct objs
                             oldBlockDiagram->IncreaseRef();
                         }
                         localAdaptor->setDiagram(oldBlockDiagram);
+                        types::InternalType* oldDoc = oldBlock->getDocContent();
+                        localAdaptor->setDocContent(oldDoc);
                     }
 
                     o->set(i, localAdaptor);
@@ -252,15 +254,10 @@ struct objs
         {
             // Trigger 'from' and 'to' properties
             from_content[i] = linkListView[i]->getFrom();
-            if (!linkListView[i]->setFromInModel(from_content[i], controller) && (from_content[i].block != 0 && from_content[i].port != 0))
-            {
-                return false;
-            }
+            linkListView[i]->setFromInModel(from_content[i], controller);
+
             to_content[i] = linkListView[i]->getTo();
-            if (!linkListView[i]->setToInModel(to_content[i], controller) && (to_content[i].block != 0 && to_content[i].port != 0))
-            {
-                return false;
-            }
+            linkListView[i]->setToInModel(to_content[i], controller);
         }
         adaptor.setFrom(from_content);
         adaptor.setTo(to_content);
@@ -434,11 +431,11 @@ DiagramAdapter::DiagramAdapter(const DiagramAdapter& adapter) :
 
 DiagramAdapter::~DiagramAdapter()
 {
-    // Unlink the diagram's children if necessary
-    Controller controller;
-    std::vector<ScicosID> diagramChildren;
-    if (getAdaptee() != 0)
+    // Unlink the diagram's children if the adaptee is being deleted
+    if (getAdaptee().use_count() == 3)
     {
+        Controller controller;
+        std::vector<ScicosID> diagramChildren;
         controller.getObjectProperty(getAdaptee()->id(), DIAGRAM, CHILDREN, diagramChildren);
         for (ScicosID id : diagramChildren)
         {
index 709f061..712252e 100644 (file)
@@ -258,8 +258,8 @@ struct ct
         double* data;
         types::Double* o = new types::Double(1, 2, &data);
 
-        data[0] = static_cast<double>(color);
-        data[1] = static_cast<double>(kind);
+        data[0] = color;
+        data[1] = kind;
         return o;
     }
 
@@ -452,7 +452,7 @@ void setLinkEnd(const ScicosID id, Controller& controller, const object_properti
     // kind == 0: trying to set the start of the link (output port)
     // kind == 1: trying to set the end of the link (input port)
 
-    if (v.block > children.size())
+    if (v.block > static_cast<int>(children.size()))
     {
         return; // Trying to link to a non-existing block
     }
@@ -465,7 +465,7 @@ void setLinkEnd(const ScicosID id, Controller& controller, const object_properti
     }
 
     // v.port may be decremented locally to square with the port indexes
-    size_t portIndex = v.port;
+    int portIndex = v.port;
 
     std::vector<ScicosID> sourceBlockPorts;
     bool newPortIsImplicit = false;
@@ -540,7 +540,7 @@ void setLinkEnd(const ScicosID id, Controller& controller, const object_properti
             }
 
             // Rule out the implicit ports
-            for (size_t i = 0; i < sourceBlockPorts.size(); ++i)
+            for (int i = 0; i < static_cast<int>(sourceBlockPorts.size()); ++i)
             {
                 bool isImplicit;
                 controller.getObjectProperty(sourceBlockPorts[i], PORT, IMPLICIT, isImplicit);
@@ -574,7 +574,7 @@ void setLinkEnd(const ScicosID id, Controller& controller, const object_properti
                 if (isImplicit == false)
                 {
                     sourceBlockPorts.erase(sourceBlockPorts.begin() + i);
-                    if (portIndex > i + 1)
+                    if (portIndex > static_cast<int>(i + 1))
                     {
                         portIndex--; // Keep portIndex consistent with the port indexes
                     }
@@ -589,7 +589,7 @@ void setLinkEnd(const ScicosID id, Controller& controller, const object_properti
         controller.setObjectProperty(concernedPort, PORT, CONNECTED_SIGNALS, unconnected);
     }
 
-    size_t nBlockPorts = sourceBlockPorts.size();
+    int nBlockPorts = static_cast<int>(sourceBlockPorts.size());
     if (nBlockPorts >= portIndex)
     {
         concernedPort = sourceBlockPorts[portIndex - 1];
@@ -657,30 +657,18 @@ void setLinkEnd(const ScicosID id, Controller& controller, const object_properti
     controller.setObjectProperty(id, LINK, end, concernedPort);
 }
 
-// check if the link is valid
-bool is_valid(types::Double* o)
+// Check if the Link is valid
+bool is_valid(const link_t& linkt)
 {
-    if (o->getSize() >= 2)
+    if (floor(linkt.block) != linkt.block ||
+            floor(linkt.port) != linkt.port ||
+            floor(linkt.kind) != linkt.kind)
     {
-        if (floor(o->get(0)) != o->get(0) || floor(o->get(1)) != o->get(1))
-        {
-            return false; // Must be an integer value
-        }
-        if (o->get(0) < 0 || o->get(1) < 0)
-        {
-            return false; // Must be positive
-        }
+        return false; // Block, Port and Kind must be integer values
     }
-    if (o->getSize() == 3)
+    if (linkt.port < 0 || linkt.kind < 0)
     {
-        if (floor(o->get(2)) != o->get(2))
-        {
-            return false; // Must be an integer value
-        }
-        if (o->get(2) < 0)
-        {
-            return false; // Must be positive
-        }
+        return false; // Port and Kind must be positive
     }
 
     return true;
@@ -716,11 +704,6 @@ struct from
             return false;
         }
 
-        if (!is_valid(current))
-        {
-            return false;
-        }
-
         link_t from_content {0, 0, Start};
         if (current->getSize() >= 2)
         {
@@ -733,7 +716,13 @@ struct from
             from_content.kind = (current->get(2) == 0.) ? Start : End;
         }
 
-        return adaptor.setFromInModel(from_content, controller);
+        if (!is_valid(from_content))
+        {
+            return false;
+        }
+
+        adaptor.setFromInModel(from_content, controller);
+        return true;
     }
 };
 
@@ -767,11 +756,6 @@ struct to
             return false;
         }
 
-        if (!is_valid(current))
-        {
-            return false;
-        }
-
         link_t to_content {0, 0, End};
         if (current->getSize() >= 2)
         {
@@ -784,7 +768,13 @@ struct to
             to_content.kind = (current->get(2) == 0.) ? Start : End;
         }
 
-        return adaptor.setToInModel(to_content, controller);
+        if (!is_valid(to_content))
+        {
+            return false;
+        }
+
+        adaptor.setToInModel(to_content, controller);
+        return true;
     }
 };
 
@@ -852,7 +842,7 @@ void LinkAdapter::setFrom(const link_t& v)
     m_from = v;
 }
 
-bool LinkAdapter::setFromInModel(const link_t& v, Controller& controller)
+void LinkAdapter::setFromInModel(const link_t& v, Controller& controller)
 {
     m_from = v;
 
@@ -865,8 +855,6 @@ bool LinkAdapter::setFromInModel(const link_t& v, Controller& controller)
         // If the provided values are wrong, the model is not updated but the info is stored in the Adapter for future attempts
         setLinkEnd(getAdaptee()->id(), controller, SOURCE_PORT, v);
     }
-
-    return true;
 }
 
 link_t LinkAdapter::getTo() const
@@ -879,7 +867,7 @@ void LinkAdapter::setTo(const link_t& v)
     m_to = v;
 }
 
-bool LinkAdapter::setToInModel(const link_t& v, Controller& controller)
+void LinkAdapter::setToInModel(const link_t& v, Controller& controller)
 {
     m_to = v;
 
@@ -892,8 +880,6 @@ bool LinkAdapter::setToInModel(const link_t& v, Controller& controller)
         // If the provided values are wrong, the model is not updated but the info is stored in the Adapter for future attempts
         setLinkEnd(getAdaptee()->id(), controller, DESTINATION_PORT, v);
     }
-
-    return true;
 }
 
 } /* namespace view_scilab */
index fa067b2..8d0680b 100644 (file)
@@ -44,10 +44,10 @@ public:
 
     link_t getFrom() const;
     void setFrom(const link_t& v);
-    bool setFromInModel(const link_t& v, Controller& controller);
+    void setFromInModel(const link_t& v, Controller& controller);
     link_t getTo() const;
     void setTo(const link_t& v);
-    bool setToInModel(const link_t& v, Controller& controller);
+    void setToInModel(const link_t& v, Controller& controller);
 
 private:
     link_t m_from;
index aac7f1e..bdfbbca 100644 (file)
@@ -916,7 +916,7 @@ struct rpar
             //model::Diagram* super = static_cast<model::Diagram*>(controller.getObject(diagramC[0]).get());
             //DiagramAdapter* localAdapter = new DiagramAdapter(std::shared_ptr<model::Diagram>(super));
 
-            DiagramAdapter* diagram = adaptor.getRpar();
+            DiagramAdapter* diagram = adaptor.getDiagram();
             localAdaptor->setListObjects(diagram->getListObjects());
             localAdaptor->setFrom(diagram->getFrom());
             localAdaptor->setTo(diagram->getTo());
@@ -1748,7 +1748,7 @@ ModelAdapter::ModelAdapter(std::shared_ptr<model::Block> adaptee) :
 
 ModelAdapter::ModelAdapter(const ModelAdapter& adapter) :
     BaseAdapter<ModelAdapter, org_scilab_modules_scicos::model::Block>(adapter),
-    diagramAdapter(adapter.getRpar())
+    diagramAdapter(adapter.getDiagram())
 {
 }
 
@@ -1771,7 +1771,7 @@ std::wstring ModelAdapter::getShortTypeStr()
     return getSharedTypeStr();
 }
 
-DiagramAdapter* ModelAdapter::getRpar() const
+DiagramAdapter* ModelAdapter::getDiagram() const
 {
     if (diagramAdapter != nullptr)
     {
index 9fac105..a7636e3 100644 (file)
@@ -40,7 +40,7 @@ public:
     std::wstring getTypeStr();
     std::wstring getShortTypeStr();
 
-    DiagramAdapter* getRpar() const;
+    DiagramAdapter* getDiagram() const;
     void setDiagram(DiagramAdapter* newDiagram);
 
 private:
index 4174434..59c2a2c 100644 (file)
@@ -14,7 +14,6 @@
 #include <memory>
 
 #include "internal.hxx"
-#include "list.hxx"
 #include "types.hxx"
 #include "user.hxx"
 
@@ -28,6 +27,22 @@ namespace view_scilab
 namespace
 {
 
+struct dummy_property
+{
+
+    static types::InternalType* get(const StateAdapter& /*adaptor*/, const Controller& /*controller*/)
+    {
+        // Return a default empty matrix.
+        return types::Double::Empty();
+    }
+
+    static bool set(StateAdapter& /*adaptor*/, types::InternalType* /*v*/, Controller& /*controller*/)
+    {
+        // Everything should be right as the properties mapped using this adapter do not perform anything
+        return true;
+    }
+};
+
 } /* namespace */
 
 template<> property<StateAdapter>::props_t property<StateAdapter>::fields = property<StateAdapter>::props_t();
@@ -37,7 +52,15 @@ StateAdapter::StateAdapter(std::shared_ptr<org_scilab_modules_scicos::model::Dia
 {
     if (property<StateAdapter>::properties_have_not_been_set())
     {
-        // FIXME: add some properties
+        property<StateAdapter>::fields.reserve(8);
+        property<StateAdapter>::add_property(L"x", &dummy_property::get, &dummy_property::set);
+        property<StateAdapter>::add_property(L"z", &dummy_property::get, &dummy_property::set);
+        property<StateAdapter>::add_property(L"oz", &dummy_property::get, &dummy_property::set);
+        property<StateAdapter>::add_property(L"iz", &dummy_property::get, &dummy_property::set);
+        property<StateAdapter>::add_property(L"tevts", &dummy_property::get, &dummy_property::set);
+        property<StateAdapter>::add_property(L"evtspt", &dummy_property::get, &dummy_property::set);
+        property<StateAdapter>::add_property(L"pointi", &dummy_property::get, &dummy_property::set);
+        property<StateAdapter>::add_property(L"outtb", &dummy_property::get, &dummy_property::set);
     }
 }
 
index 24eb758..ecd8859 100644 (file)
@@ -398,11 +398,14 @@ inline bool updateNewPort(const ScicosID oldPort, int newPort, Controller& contr
                 controller.setObjectProperty(oldSignalSrc, PORT, CONNECTED_SIGNALS, unconnected);
             }
             // Link de-association is not performed as the link will be removed
-            // connect the new link
-            controller.setObjectProperty(newSignal, LINK, SOURCE_PORT, 0);
-            controller.setObjectProperty(oldPort, PORT, CONNECTED_SIGNALS, newSignal);
-            children.erase(std::find(children.begin(), children.end(), oldSignal));
-            deletedObjects.push_back(oldSignal);
+            // connect the new link if there is one
+            if (newSignal != 0)
+            {
+                controller.setObjectProperty(newSignal, LINK, SOURCE_PORT, 0);
+                controller.setObjectProperty(oldPort, PORT, CONNECTED_SIGNALS, newSignal);
+                children.erase(std::find(children.begin(), children.end(), oldSignal));
+                deletedObjects.push_back(oldSignal);
+            }
         }
     }
     else
diff --git a/scilab/modules/scicos/tests/unit_tests/model/Consecutive_init.dia.ref b/scilab/modules/scicos/tests/unit_tests/model/Consecutive_init.dia.ref
new file mode 100644 (file)
index 0000000..c103e18
--- /dev/null
@@ -0,0 +1,295 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+loadXcosLibs();
+scicos_log("TRACE");
+// Check consecutive initialization of a diagram in a SuperBlock
+super = scicos_block();
+objectCreated( 1 , BLOCK )
+propertyUpdated( 1 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , RPAR ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , INTERFACE_FUNCTION ) : NO_CHANGES
+d         = scicos_diagram();
+objectCreated( 2 , DIAGRAM )
+propertyUpdated( 2 , DIAGRAM , TITLE ) : NO_CHANGES
+propertyUpdated( 2 , DIAGRAM , PATH ) : NO_CHANGES
+propertyUpdated( 2 , DIAGRAM , PROPERTIES ) : NO_CHANGES
+propertyUpdated( 2 , DIAGRAM , PROPERTIES ) : NO_CHANGES
+propertyUpdated( 2 , DIAGRAM , CONTEXT ) : NO_CHANGES
+propertyUpdated( 2 , DIAGRAM , CHILDREN ) : NO_CHANGES
+propertyUpdated( 2 , DIAGRAM , VERSION_NUMBER ) : NO_CHANGES
+sub       = scicos_block();
+objectCreated( 3 , BLOCK )
+propertyUpdated( 3 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , RPAR ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 3 , BLOCK , INTERFACE_FUNCTION ) : NO_CHANGES
+d.objs(1) = sub;
+objectCreated( 4 , BLOCK )
+propertyUpdated( 4 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , INTERFACE_FUNCTION ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , RPAR ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , EQUATIONS ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , PARENT_BLOCK ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , CHILDREN ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 2 , DIAGRAM , CHILDREN ) : SUCCESS
+super.model.rpar = d;
+propertyUpdated( 1 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , CHILDREN ) : SUCCESS
+propertyUpdated( 4 , BLOCK , PARENT_BLOCK ) : SUCCESS
+propertyUpdated( 1 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , UID ) : NO_CHANGES
+// 'b' is a SuperBlock containing a Block
+sizeBeforeInsert = size(super.model.rpar.objs);
+super.model.rpar = d;
+propertyUpdated( 1 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , CHILDREN ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , PARENT_BLOCK ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 1 , BLOCK , UID ) : NO_CHANGES
+sizeAfterInsert  = size(super.model.rpar.objs);
+assert_checkequal(sizeBeforeInsert, 1);
+assert_checkequal(sizeAfterInsert,  1);
+// Check consecutive initialization of a SuperBlock in a diagram
+superD = scicos_diagram();
+objectCreated( 5 , DIAGRAM )
+propertyUpdated( 5 , DIAGRAM , TITLE ) : NO_CHANGES
+propertyUpdated( 5 , DIAGRAM , PATH ) : NO_CHANGES
+propertyUpdated( 5 , DIAGRAM , PROPERTIES ) : NO_CHANGES
+propertyUpdated( 5 , DIAGRAM , PROPERTIES ) : NO_CHANGES
+propertyUpdated( 5 , DIAGRAM , CONTEXT ) : NO_CHANGES
+propertyUpdated( 5 , DIAGRAM , CHILDREN ) : NO_CHANGES
+propertyUpdated( 5 , DIAGRAM , VERSION_NUMBER ) : NO_CHANGES
+superD.objs(1) = super;
+objectCreated( 6 , BLOCK )
+propertyUpdated( 6 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , INTERFACE_FUNCTION ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , RPAR ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , EQUATIONS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , PARENT_BLOCK ) : NO_CHANGES
+objectCreated( 7 , DIAGRAM )
+propertyUpdated( 7 , DIAGRAM , TITLE ) : NO_CHANGES
+propertyUpdated( 7 , DIAGRAM , PATH ) : NO_CHANGES
+propertyUpdated( 7 , DIAGRAM , VERSION_NUMBER ) : NO_CHANGES
+propertyUpdated( 7 , DIAGRAM , PROPERTIES ) : NO_CHANGES
+propertyUpdated( 7 , DIAGRAM , CONTEXT ) : NO_CHANGES
+objectCreated( 8 , BLOCK )
+propertyUpdated( 8 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , INTERFACE_FUNCTION ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , RPAR ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EQUATIONS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 8 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , PARENT_BLOCK ) : SUCCESS
+propertyUpdated( 8 , BLOCK , CHILDREN ) : NO_CHANGES
+propertyUpdated( 7 , DIAGRAM , CHILDREN ) : SUCCESS
+propertyUpdated( 6 , BLOCK , CHILDREN ) : SUCCESS
+propertyUpdated( 6 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 5 , DIAGRAM , CHILDREN ) : SUCCESS
+// 'superD' is a diagram containing a SuperBlock
+sBeforeInsert = size(superD.objs(1).model.rpar.objs);
+superD.objs(1) = super;
+objectCreated( 9 , BLOCK )
+propertyUpdated( 9 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , INTERFACE_FUNCTION ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , RPAR ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , EQUATIONS ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+propertyUpdated( 9 , BLOCK , PARENT_BLOCK ) : NO_CHANGES
+objectCreated( 10 , DIAGRAM )
+propertyUpdated( 10 , DIAGRAM , TITLE ) : NO_CHANGES
+propertyUpdated( 10 , DIAGRAM , PATH ) : NO_CHANGES
+propertyUpdated( 10 , DIAGRAM , VERSION_NUMBER ) : NO_CHANGES
+propertyUpdated( 10 , DIAGRAM , PROPERTIES ) : NO_CHANGES
+propertyUpdated( 10 , DIAGRAM , CONTEXT ) : NO_CHANGES
+objectCreated( 11 , BLOCK )
+propertyUpdated( 11 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , INTERFACE_FUNCTION ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , RPAR ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , EQUATIONS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 11 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , PARENT_BLOCK ) : SUCCESS
+propertyUpdated( 11 , BLOCK , CHILDREN ) : NO_CHANGES
+propertyUpdated( 10 , DIAGRAM , CHILDREN ) : SUCCESS
+propertyUpdated( 9 , BLOCK , CHILDREN ) : SUCCESS
+propertyUpdated( 6 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 9 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 5 , DIAGRAM , CHILDREN ) : SUCCESS
+propertyUpdated( 6 , BLOCK , CHILDREN ) : SUCCESS
+objectDeleted( 6 , BLOCK )
+sAfterInsert  = size(superD.objs(1).model.rpar.objs);
+assert_checkequal(sizeBeforeInsert, 1);
+assert_checkequal(sizeAfterInsert,  1);
+// Check that all the model items are freed
+clear
+objectDeleted( 3 , BLOCK )
+propertyUpdated( 1 , BLOCK , CHILDREN ) : SUCCESS
+objectDeleted( 1 , BLOCK )
+propertyUpdated( 9 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
+propertyUpdated( 5 , DIAGRAM , CHILDREN ) : SUCCESS
+propertyUpdated( 9 , BLOCK , CHILDREN ) : SUCCESS
+objectDeleted( 9 , BLOCK )
+objectDeleted( 5 , DIAGRAM )
diff --git a/scilab/modules/scicos/tests/unit_tests/model/Consecutive_init.tst b/scilab/modules/scicos/tests/unit_tests/model/Consecutive_init.tst
new file mode 100644 (file)
index 0000000..ecbf6b2
--- /dev/null
@@ -0,0 +1,43 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+loadXcosLibs();
+scicos_log("TRACE");
+
+// Check consecutive initialization of a diagram in a SuperBlock
+super = scicos_block();
+
+d         = scicos_diagram();
+sub       = scicos_block();
+d.objs(1) = sub;
+
+super.model.rpar = d;
+// 'b' is a SuperBlock containing a Block
+sizeBeforeInsert = size(super.model.rpar.objs);
+super.model.rpar = d;
+sizeAfterInsert  = size(super.model.rpar.objs);
+
+assert_checkequal(sizeBeforeInsert, 1);
+assert_checkequal(sizeAfterInsert,  1);
+
+// Check consecutive initialization of a SuperBlock in a diagram
+superD = scicos_diagram();
+
+superD.objs(1) = super;
+// 'superD' is a diagram containing a SuperBlock
+sBeforeInsert = size(superD.objs(1).model.rpar.objs);
+superD.objs(1) = super;
+sAfterInsert  = size(superD.objs(1).model.rpar.objs);
+
+assert_checkequal(sizeBeforeInsert, 1);
+assert_checkequal(sizeAfterInsert,  1);
+
+
+// Check that all the model items are freed
+clear
diff --git a/scilab/modules/scicos/tests/unit_tests/model/Cpr_State.dia.ref b/scilab/modules/scicos/tests/unit_tests/model/Cpr_State.dia.ref
new file mode 100644 (file)
index 0000000..19c9c91
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+loadXcosLibs();
+scicos_log("TRACE");
+// Allocate a State and check its default values
+state = scicos_state();
+header = ["xcs" "x" "z" "oz" "iz" "tevts" "evtspt" "pointi" "outtb"];
+assert_checkequal(state(1), header);
+for i=2:7
+    assert_checkequal(state(i), []);
+end
+assert_checkequal(state(8), 1);
+assert_checkequal(state(9), list());
+// Allocate a Cpr and check its default values
+cpr = scicos_cpr();
+header = ["cpr" "state" "sim" "cor" "corinv"];
+assert_checkequal(cpr(1), header);
+assert_checkequal(cpr(2), state);
+assert_checkequal(cpr(3), scicos_sim());
+assert_checkequal(cpr(4), list());
+assert_checkequal(cpr(5), list());
diff --git a/scilab/modules/scicos/tests/unit_tests/model/Cpr_State.tst b/scilab/modules/scicos/tests/unit_tests/model/Cpr_State.tst
new file mode 100644 (file)
index 0000000..92e0af2
--- /dev/null
@@ -0,0 +1,35 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+loadXcosLibs();
+scicos_log("TRACE");
+
+// Allocate a State and check its default values
+state = scicos_state();
+
+header = ["xcs" "x" "z" "oz" "iz" "tevts" "evtspt" "pointi" "outtb"];
+
+assert_checkequal(state(1), header);
+for i=2:7
+    assert_checkequal(state(i), []);
+end
+assert_checkequal(state(8), 1);
+assert_checkequal(state(9), list());
+
+
+// Allocate a Cpr and check its default values
+cpr = scicos_cpr();
+
+header = ["cpr" "state" "sim" "cor" "corinv"];
+
+assert_checkequal(cpr(1), header);
+assert_checkequal(cpr(2), state);
+assert_checkequal(cpr(3), scicos_sim());
+assert_checkequal(cpr(4), list());
+assert_checkequal(cpr(5), list());