Xcos MVC: allow to pass the properties in any order 56/17056/2
Paul Bignier [Fri, 3 Jul 2015 09:32:16 +0000 (11:32 +0200)]
 * Also allowed to passed "fake" properties, that don't belong to the Adapter.
Nothing is done in that case

Change-Id: I4804872a4b38d42cc8f132fb6c0f496cfbaa5fff

scilab/modules/scicos/src/cpp/view_scilab/BaseAdapter.hxx
scilab/modules/scicos/tests/unit_tests/model/prop_wrong.dia.ref [new file with mode: 0644]
scilab/modules/scicos/tests/unit_tests/model/prop_wrong.tst [new file with mode: 0644]

index 25048e2..2e88e48 100644 (file)
@@ -184,47 +184,43 @@ public:
 
     bool setAsTList(types::InternalType* v, Controller& controller)
     {
-        typename property<Adaptor>::props_t properties = property<Adaptor>::fields;
-        std::sort(properties.begin(), properties.end(), property<Adaptor>::original_index_cmp);
-
         if (v->getType() != types::InternalType::ScilabTList && v->getType() != types::InternalType::ScilabMList)
         {
             return false;
         }
         types::TList* current = v->getAs<types::TList>();
-        // The input TList can have fewer elements than the concerned adapter, but not more, and cannot be empty
-        if (current->getSize() > static_cast<int>(1 + properties.size()) || current->getSize() < 1)
+        // The input TList cannot be empty
+        if (current->getSize() < 1)
         {
             return false;
         }
 
         // Check the header
         types::String* header = current->getFieldNames();
-        if (header->getSize() > static_cast<int>(1 + properties.size()) || header->getSize() < 1)
+        if (header->getSize() < 1)
         {
             return false;
         }
+        // Make sure it is the same type as the Adapter
         if (header->get(0) != Adaptor::getSharedTypeStr())
         {
             return false;
         }
-        typename property<Adaptor>::props_t_it it = properties.begin();
-        for (int index = 1; index < header->getSize(); ++index, ++it)
-        {
-            if (header->get(index) != it->name)
-            {
-                return false;
-            }
-        }
 
-        // This is a valid tlist, get each tlist field value and pass it to the right property decoder
-        it = properties.begin();
-        for (int index = 1; index < header->getSize(); ++index, ++it)
+        // Retrieve the Adapter's properties
+        typename property<Adaptor>::props_t properties = property<Adaptor>::fields;
+
+        // For each input property, if it corresponds to an Adapter's property, set it.
+        for (int index = 1; index < header->getSize(); ++index)
         {
-            bool status = it->set(*static_cast<Adaptor*>(this), current->get(index), controller);
-            if (!status)
+            typename property<Adaptor>::props_t_it found = std::lower_bound(properties.begin(), properties.end(), header->get(index));
+            if (found != properties.end() && !(header->get(index) < found->name))
             {
-                return false;
+                bool status = found->set(*static_cast<Adaptor*>(this), current->get(index), controller);
+                if (!status)
+                {
+                    return false;
+                }
             }
         }
 
diff --git a/scilab/modules/scicos/tests/unit_tests/model/prop_wrong.dia.ref b/scilab/modules/scicos/tests/unit_tests/model/prop_wrong.dia.ref
new file mode 100644 (file)
index 0000000..43d9f4c
--- /dev/null
@@ -0,0 +1,152 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- XCOS TEST -->
+scicos_log("TRACE");
+b = scicos_block();
+Xcos debug: objectCreated( 1 , BLOCK )
+Xcos trace: propertyUpdated( 1 , BLOCK , GEOMETRY ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , GEOMETRY ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EXPRS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , LABEL ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , STYLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , STATE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , DSTATE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ODSTATE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , RPAR ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , IPAR ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , OPAR ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , LABEL ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , NZCROSS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , NMODE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , UID ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , INTERFACE_FUNCTION ) : NO_CHANGES
+// Standard filling
+b.graphics = mlist(..
+["graphics","orig","sz","flip","theta","exprs","pin","pout","pein","peout","gr_i","id","in_implicit","out_implicit"],..
+[40,0],..
+[10,40],..
+%t,..
+0,..
+"2",..
+[0;0],..
+0,..
+[],..
+[],..
+list(),..
+"",..
+["E";"E"],..
+"E");
+Xcos trace: propertyUpdated( 1 , BLOCK , GEOMETRY ) : SUCCESS
+Xcos trace: propertyUpdated( 1 , BLOCK , GEOMETRY ) : SUCCESS
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EXPRS ) : SUCCESS
+Xcos debug: objectCreated( 2 , PORT )
+Xcos trace: propertyUpdated( 2 , PORT , SOURCE_BLOCK ) : SUCCESS
+Xcos trace: propertyUpdated( 2 , PORT , PORT_KIND ) : SUCCESS
+Xcos debug: objectCreated( 3 , PORT )
+Xcos trace: propertyUpdated( 3 , PORT , SOURCE_BLOCK ) : SUCCESS
+Xcos trace: propertyUpdated( 3 , PORT , PORT_KIND ) : SUCCESS
+Xcos trace: propertyUpdated( 1 , BLOCK , INPUTS ) : SUCCESS
+Xcos debug: objectCreated( 4 , PORT )
+Xcos trace: propertyUpdated( 4 , PORT , SOURCE_BLOCK ) : SUCCESS
+Xcos trace: propertyUpdated( 4 , PORT , PORT_KIND ) : SUCCESS
+Xcos trace: propertyUpdated( 1 , BLOCK , OUTPUTS ) : SUCCESS
+Xcos trace: propertyUpdated( 1 , BLOCK , LABEL ) : NO_CHANGES
+Xcos trace: propertyUpdated( 2 , PORT , IMPLICIT ) : NO_CHANGES
+Xcos trace: propertyUpdated( 3 , PORT , IMPLICIT ) : NO_CHANGES
+Xcos trace: propertyUpdated( 4 , PORT , IMPLICIT ) : NO_CHANGES
+// Omit "sz" and "id", so GEOMETRY#2 and LABEL are missing from the log
+b.graphics = mlist(..
+["graphics","orig","flip","theta","exprs","pin","pout","pein","peout","gr_i","in_implicit","out_implicit"],..
+[40,0],..
+%t,..
+0,..
+"2",..
+[0;0],..
+0,..
+[],..
+[],..
+list(),..
+["E";"E"],..
+"E");
+Xcos trace: propertyUpdated( 1 , BLOCK , GEOMETRY ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EXPRS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 2 , PORT , IMPLICIT ) : NO_CHANGES
+Xcos trace: propertyUpdated( 3 , PORT , IMPLICIT ) : NO_CHANGES
+Xcos trace: propertyUpdated( 4 , PORT , IMPLICIT ) : NO_CHANGES
+// Add a fake wrong property "fake" with value "fake". The log must be the same as above
+b.graphics = mlist(..
+["graphics","orig","flip","fake","theta","exprs","pin","pout","pein","peout","gr_i","in_implicit","out_implicit"],..
+[40,0],..
+%t,..
+"fake",..
+0,..
+"2",..
+[0;0],..
+0,..
+[],..
+[],..
+list(),..
+["E";"E"],..
+"E");
+Xcos trace: propertyUpdated( 1 , BLOCK , GEOMETRY ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EXPRS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 2 , PORT , IMPLICIT ) : NO_CHANGES
+Xcos trace: propertyUpdated( 3 , PORT , IMPLICIT ) : NO_CHANGES
+Xcos trace: propertyUpdated( 4 , PORT , IMPLICIT ) : NO_CHANGES
+// Swap "flip" and "in_implicit"
+b.graphics = mlist(..
+["graphics","orig","in_implicit","fake","theta","exprs","pin","pout","pein","peout","gr_i","flip","out_implicit"],..
+[40,0],..
+["E";"E"],..
+"fake",..
+0,..
+"2",..
+[0;0],..
+0,..
+[],..
+[],..
+list(),..
+%t,..
+"E");
+Xcos trace: propertyUpdated( 1 , BLOCK , GEOMETRY ) : NO_CHANGES
+Xcos trace: propertyUpdated( 2 , PORT , IMPLICIT ) : NO_CHANGES
+Xcos trace: propertyUpdated( 3 , PORT , IMPLICIT ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EXPRS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , ANGLE ) : NO_CHANGES
+Xcos trace: propertyUpdated( 4 , PORT , IMPLICIT ) : NO_CHANGES
+// Check that all the model items are freed
+clear
+Xcos trace: propertyUpdated( 1 , BLOCK , INPUTS ) : SUCCESS
+Xcos trace: propertyUpdated( 1 , BLOCK , OUTPUTS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+Xcos debug: objectDeleted( 2 , PORT )
+Xcos trace: propertyUpdated( 1 , BLOCK , INPUTS ) : SUCCESS
+Xcos trace: propertyUpdated( 1 , BLOCK , OUTPUTS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+Xcos debug: objectDeleted( 3 , PORT )
+Xcos trace: propertyUpdated( 1 , BLOCK , INPUTS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , OUTPUTS ) : SUCCESS
+Xcos trace: propertyUpdated( 1 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+Xcos trace: propertyUpdated( 1 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+Xcos debug: objectDeleted( 4 , PORT )
+Xcos debug: objectDeleted( 1 , BLOCK )
diff --git a/scilab/modules/scicos/tests/unit_tests/model/prop_wrong.tst b/scilab/modules/scicos/tests/unit_tests/model/prop_wrong.tst
new file mode 100644 (file)
index 0000000..71f934e
--- /dev/null
@@ -0,0 +1,80 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- XCOS TEST -->
+
+scicos_log("TRACE");
+
+b = scicos_block();
+
+// Standard filling
+b.graphics = mlist(..
+["graphics","orig","sz","flip","theta","exprs","pin","pout","pein","peout","gr_i","id","in_implicit","out_implicit"],..
+[40,0],..
+[10,40],..
+%t,..
+0,..
+"2",..
+[0;0],..
+0,..
+[],..
+[],..
+list(),..
+"",..
+["E";"E"],..
+"E");
+
+// Omit "sz" and "id", so GEOMETRY#2 and LABEL are missing from the log
+b.graphics = mlist(..
+["graphics","orig","flip","theta","exprs","pin","pout","pein","peout","gr_i","in_implicit","out_implicit"],..
+[40,0],..
+%t,..
+0,..
+"2",..
+[0;0],..
+0,..
+[],..
+[],..
+list(),..
+["E";"E"],..
+"E");
+
+// Add a fake wrong property "fake" with value "fake". The log must be the same as above
+b.graphics = mlist(..
+["graphics","orig","flip","fake","theta","exprs","pin","pout","pein","peout","gr_i","in_implicit","out_implicit"],..
+[40,0],..
+%t,..
+"fake",..
+0,..
+"2",..
+[0;0],..
+0,..
+[],..
+[],..
+list(),..
+["E";"E"],..
+"E");
+
+// Swap "flip" and "in_implicit"
+b.graphics = mlist(..
+["graphics","orig","in_implicit","fake","theta","exprs","pin","pout","pein","peout","gr_i","flip","out_implicit"],..
+[40,0],..
+["E";"E"],..
+"fake",..
+0,..
+"2",..
+[0;0],..
+0,..
+[],..
+[],..
+list(),..
+%t,..
+"E");
+
+
+// Check that all the model items are freed
+clear