Salome HOME
[EDF28020] Fix nested foreach-switch.
authorOvidiu Mircescu <ovidiu.mircescu@edf.fr>
Wed, 19 Jul 2023 11:45:50 +0000 (13:45 +0200)
committerOvidiu Mircescu <ovidiu.mircescu@edf.fr>
Wed, 19 Jul 2023 11:45:50 +0000 (13:45 +0200)
src/engine/Switch.cxx
src/yacsloader/samples/foreach_switch_double.xml [new file with mode: 0644]
src/yacsloader_swig/Test/CMakeLists.txt
src/yacsloader_swig/Test/CTestTestfileInstall.cmake
src/yacsloader_swig/Test/testFixes.py [new file with mode: 0755]

index 392b009098d1a9b629b353bbd05b9b8faf567877..1c7feff44a67431da1ef505d07814d7d78003664 100644 (file)
@@ -114,7 +114,10 @@ CollectorSwOutPort::CollectorSwOutPort(Switch *master, InPort *port):OutPort("",
                                                                      Port(master),
                                                                      _consumer(port),_currentProducer(0)
 {
-  _name="Representant_of_"; _name+=master->getName(); _name+="_for_inport_"; _name+=master->getRootNode()->getInPortName(_consumer);
+  _name="Representant_of_";
+  _name+=master->getName();
+  _name+="_for_inport_";
+  _name+=port->getName();
 }
 
 CollectorSwOutPort::CollectorSwOutPort(const CollectorSwOutPort& other, Switch *master):OutPort("",master,other.edGetType()),
diff --git a/src/yacsloader/samples/foreach_switch_double.xml b/src/yacsloader/samples/foreach_switch_double.xml
new file mode 100644 (file)
index 0000000..f0de89c
--- /dev/null
@@ -0,0 +1,224 @@
+<?xml version='1.0' encoding='iso-8859-1' ?>
+<proc name="GeneratedSchema">
+   <property name="executor" value="workloadmanager"/>
+   <type name="string" kind="string"/>
+   <struct name="Engines/dataref">
+      <member name="ref" type="string"/>
+   </struct>
+   <type name="bool" kind="bool"/>
+   <sequence name="boolvec" content="bool"/>
+   <type name="double" kind="double"/>
+   <sequence name="dblevec" content="double"/>
+   <objref name="file" id="file"/>
+   <type name="int" kind="int"/>
+   <sequence name="intvec" content="int"/>
+   <struct name="stringpair">
+      <member name="name" type="string"/>
+      <member name="value" type="string"/>
+   </struct>
+   <sequence name="propvec" content="stringpair"/>
+   <objref name="pyobj" id="python:obj:1.0"/>
+   <sequence name="seqboolvec" content="boolvec"/>
+   <sequence name="seqdblevec" content="dblevec"/>
+   <sequence name="seqintvec" content="intvec"/>
+   <sequence name="seqpyobj" content="pyobj"/>
+   <sequence name="stringvec" content="string"/>
+   <sequence name="seqstringvec" content="stringvec"/>
+   <container name="DefaultContainer">
+      <property name="container_kind" value="Salome"/>
+      <property name="attached_on_cloning" value="0"/>
+      <property name="container_name" value="FactoryServer"/>
+      <property name="name" value="localhost"/>
+   </container>
+   <container name="default_container">
+      <property name="container_kind" value="Salome"/>
+      <property name="attached_on_cloning" value="1"/>
+      <property name="nb_parallel_procs" value="1"/>
+      <property name="type" value="multi"/>
+      <property name="use_py_cache" value="0"/>
+   </container>
+   <foreachdyn name="iteration_0" loopWeight="-1" type="pyobj">
+      <bloc name="block_iteration_0">
+         <inline name="Condition_1">
+            <script><code><![CDATA[r = c % 2
+]]></code></script>
+            <load container="DefaultContainer"/>
+            <inport name="c" type="pyobj"/>
+            <outport name="r" type="int"/>
+         </inline>
+         <switch name="Switch_2">
+            <case id="0">
+               <bloc name="Switch_2_case_0">
+                  <foreachdyn name="iter2_4" loopWeight="-1" type="pyobj">
+                     <bloc name="block_iter2_4">
+                        <inline name="Condition_5">
+                           <script><code><![CDATA[r = c % 2
+]]></code></script>
+                           <load container="DefaultContainer"/>
+                           <inport name="c" type="pyobj"/>
+                           <outport name="r" type="int"/>
+                        </inline>
+                        <switch name="Switch_6">
+                           <case id="0">
+                              <bloc name="Switch_6_case_0">
+                                 <remote name="faux_8" elementaryWeight="-1">
+                                    <script><code><![CDATA[r = "c'est faux!"
+]]></code></script>
+                                    <load container="default_container"/>
+                                    <outport name="r" type="pyobj"/>
+                                 </remote>
+                              </bloc>
+                           </case>
+                           <case id="1">
+                              <bloc name="Switch_6_case_1">
+                                 <remote name="vrai_7" elementaryWeight="-1">
+                                    <script><code><![CDATA[r = "c'est vrai!"
+]]></code></script>
+                                    <load container="default_container"/>
+                                    <outport name="r" type="pyobj"/>
+                                 </remote>
+                              </bloc>
+                           </case>
+                        </switch>
+                        <inline name="SwitchResults_9">
+                           <script><code><![CDATA[]]></code></script>
+                           <inport name="p0" type="pyobj"/>
+                           <outport name="p0" type="pyobj"/>
+                        </inline>
+                        <control> <fromnode>Condition_5</fromnode> <tonode>Switch_6</tonode> </control>
+                        <control> <fromnode>Switch_6</fromnode> <tonode>SwitchResults_9</tonode> </control>
+                        <datalink control="false">
+                           <fromnode>Condition_5</fromnode> <fromport>r</fromport>
+                           <tonode>Switch_6</tonode> <toport>select</toport>
+                        </datalink>
+                        <datalink control="false">
+                           <fromnode>Switch_6.p0_Switch_6_case_0.faux_8</fromnode> <fromport>r</fromport>
+                           <tonode>SwitchResults_9</tonode> <toport>p0</toport>
+                        </datalink>
+                        <datalink control="false">
+                           <fromnode>Switch_6.p1_Switch_6_case_1.vrai_7</fromnode> <fromport>r</fromport>
+                           <tonode>SwitchResults_9</tonode> <toport>p0</toport>
+                        </datalink>
+                     </bloc>
+                  </foreachdyn>
+                  <remote name="output_iter2_4_10" elementaryWeight="-1">
+                     <script><code><![CDATA[]]></code></script>
+                     <load container="default_container"/>
+                     <inport name="p0_0" type="seqpyobj"/>
+                     <outport name="p0_0" type="pyobj"/>
+                  </remote>
+                  <control> <fromnode>iter2_4</fromnode> <tonode>output_iter2_4_10</tonode> </control>
+                  <datalink control="false">
+                     <fromnode>iter2_4</fromnode> <fromport>evalSamples</fromport>
+                     <tonode>iter2_4.block_iter2_4.Condition_5</tonode> <toport>c</toport>
+                  </datalink>
+                  <datalink control="false">
+                     <fromnode>iter2_4.block_iter2_4.SwitchResults_9</fromnode> <fromport>p0</fromport>
+                     <tonode>output_iter2_4_10</tonode> <toport>p0_0</toport>
+                  </datalink>
+               </bloc>
+            </case>
+            <case id="1">
+               <bloc name="Switch_2_case_1">
+                  <remote name="vrai_3" elementaryWeight="-1">
+                     <script><code><![CDATA[r = "c'est vrai!"
+]]></code></script>
+                     <load container="default_container"/>
+                     <outport name="r" type="pyobj"/>
+                  </remote>
+               </bloc>
+            </case>
+         </switch>
+         <inline name="SwitchResults_11">
+            <script><code><![CDATA[]]></code></script>
+            <inport name="p0" type="pyobj"/>
+            <outport name="p0" type="pyobj"/>
+         </inline>
+         <control> <fromnode>Condition_1</fromnode> <tonode>Switch_2</tonode> </control>
+         <control> <fromnode>Switch_2</fromnode> <tonode>SwitchResults_11</tonode> </control>
+         <datalink control="false">
+            <fromnode>Condition_1</fromnode> <fromport>r</fromport>
+            <tonode>Switch_2</tonode> <toport>select</toport>
+         </datalink>
+         <datalink control="false">
+            <fromnode>Switch_2.p0_Switch_2_case_0.output_iter2_4_10</fromnode> <fromport>p0_0</fromport>
+            <tonode>SwitchResults_11</tonode> <toport>p0</toport>
+         </datalink>
+         <datalink control="false">
+            <fromnode>Switch_2.p1_Switch_2_case_1.vrai_3</fromnode> <fromport>r</fromport>
+            <tonode>SwitchResults_11</tonode> <toport>p0</toport>
+         </datalink>
+      </bloc>
+   </foreachdyn>
+   <remote name="output_iteration_0_12" elementaryWeight="-1">
+      <script><code><![CDATA[]]></code></script>
+      <load container="default_container"/>
+      <inport name="p0_0" type="seqpyobj"/>
+      <outport name="p0_0" type="pyobj"/>
+   </remote>
+   <remote name="End" elementaryWeight="-1">
+      <script><code><![CDATA[ok = x == [["c'est faux!", "c'est vrai!"],
+           "c'est vrai!"]
+]]></code></script>
+      <load container="default_container"/>
+      <inport name="x" type="pyobj"/>
+      <outport name="ok" type="bool"/>
+   </remote>
+   <control> <fromnode>iteration_0</fromnode> <tonode>output_iteration_0_12</tonode> </control>
+   <control> <fromnode>output_iteration_0_12</fromnode> <tonode>End</tonode> </control>
+   <datalink control="false">
+      <fromnode>iteration_0</fromnode> <fromport>evalSamples</fromport>
+      <tonode>iteration_0.block_iteration_0.Condition_1</tonode> <toport>c</toport>
+   </datalink>
+   <datalink control="false">
+      <fromnode>output_iteration_0_12</fromnode> <fromport>p0_0</fromport>
+      <tonode>End</tonode> <toport>x</toport>
+   </datalink>
+   <datalink control="false">
+      <fromnode>iteration_0.block_iteration_0.SwitchResults_11</fromnode> <fromport>p0</fromport>
+      <tonode>output_iteration_0_12</tonode> <toport>p0_0</toport>
+   </datalink>
+   <parameter>
+      <tonode>iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4.block_iter2_4.Condition_5</tonode><toport>c</toport>
+      <value><objref><![CDATA[YUkAI5F]]></objref></value>
+   </parameter>
+   <parameter>
+      <tonode>iteration_0.block_iteration_0.Condition_1</tonode><toport>c</toport>
+      <value><objref><![CDATA[YUkAI5F]]></objref></value>
+   </parameter>
+   <parameter>
+      <tonode>iteration_0</tonode><toport>SmplsCollection</toport>
+      <value><array><data>
+<value><objref>.G0dk.........1G.5F</objref></value>
+<value><objref>.G0dk.........1GU5F</objref></value>
+</data></array></value>
+   </parameter>
+   <parameter>
+      <tonode>iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4</tonode><toport>SmplsCollection</toport>
+      <value><array><data>
+<value><objref>.G0dk.........1G.5F</objref></value>
+<value><objref>.G0dk.........1GU5F</objref></value>
+</data></array></value>
+   </parameter>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0" x="6" y="61" width="776.75" height="407.625" expanded="1" expx="6" expy="61" expWidth="776.75" expHeight="407.625" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4.block_iter2_4" x="6" y="61" width="567.75" height="304.75" expanded="1" expx="6" expy="61" expWidth="567.75" expHeight="304.75" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.output_iter2_4_10" x="614.75" y="187.25" width="158" height="63" expanded="1" expx="614.75" expy="187.25" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4.block_iter2_4.Switch_6.p1_Switch_6_case_1" x="6" y="162.75" width="163.75" height="100.75" expanded="1" expx="6" expy="162.75" expWidth="163.75" expHeight="100.75" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0" x="6" y="61" width="1178.75" height="612.438" expanded="1" expx="6" expy="61" expWidth="1178.75" expHeight="612.438" shownState="0"/>
+   <presentation name="End" x="1419.75" y="341.25" width="158" height="63" expanded="1" expx="1419.75" expy="341.25" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p1_Switch_2_case_1" x="6" y="469.625" width="163.75" height="100.75" expanded="1" expx="6" expy="469.625" expWidth="163.75" expHeight="100.75" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4.block_iter2_4.SwitchResults_9" x="405.75" y="135.75" width="158" height="63" expanded="1" expx="405.75" expy="135.75" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4.block_iter2_4.Switch_6.p0_Switch_6_case_0.faux_8" x="1.75" y="33.75" width="158" height="63" expanded="1" expx="1.75" expy="33.75" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4.block_iter2_4.Condition_5" x="1.75" y="135.75" width="158" height="63" expanded="1" expx="1.75" expy="135.75" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2" x="194.875" y="34.0625" width="786.75" height="574.375" expanded="1" expx="194.875" expy="34.0625" expWidth="786.75" expHeight="574.375" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4.block_iter2_4.Switch_6.p0_Switch_6_case_0" x="6" y="61" width="163.75" height="100.75" expanded="1" expx="6" expy="61" expWidth="163.75" expHeight="100.75" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Condition_1" x="1.75" y="289.75" width="158" height="63" expanded="1" expx="1.75" expy="289.75" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="output_iteration_0_12" x="1225.75" y="341.25" width="158" height="63" expanded="1" expx="1225.75" expy="341.25" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.SwitchResults_11" x="1016.75" y="289.75" width="158" height="63" expanded="1" expx="1016.75" expy="289.75" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="iteration_0" x="1.375" y="34.0312" width="1188.75" height="677.438" expanded="1" expx="1.375" expy="34.0312" expWidth="1188.75" expHeight="677.438" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4.block_iter2_4.Switch_6" x="195.875" y="33.75" width="173.75" height="267" expanded="1" expx="195.875" expy="33.75" expWidth="173.75" expHeight="267" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p1_Switch_2_case_1.vrai_3" x="1.75" y="33.75" width="158" height="63" expanded="1" expx="1.75" expy="33.75" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4" x="1.375" y="33.875" width="577.75" height="369.75" expanded="1" expx="1.375" expy="33.875" expWidth="577.75" expHeight="369.75" shownState="0"/>
+   <presentation name="iteration_0.block_iteration_0.Switch_2.p0_Switch_2_case_0.iter2_4.block_iter2_4.Switch_6.p1_Switch_6_case_1.vrai_7" x="1.75" y="33.75" width="158" height="63" expanded="1" expx="1.75" expy="33.75" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="__ROOT__" x="0" y="0" width="1581.75" height="715.469" expanded="1" expx="0" expy="0" expWidth="1581.75" expHeight="715.469" shownState="0"/>
+</proc>
index f13da63f75d59798a6f095dac96086c56dab7059..782303255b6f235da3502a7c3dbe274889a0b049 100644 (file)
@@ -47,6 +47,7 @@ IF(NOT WIN32)
     async_plugin.py
     testWorkloadManager.py
     testPynodeWithCache.py
+    testFixes.py
    )
   INSTALL(PROGRAMS ${LOCAL_TEST_FILES}
         DESTINATION ${LOCAL_TEST_DIR})
index 65202d3bce00b46586628dbdde9fd5f3c695b66a..af5f10f56bc162291fc123d2a15aa60deba7bd67 100644 (file)
@@ -80,4 +80,11 @@ IF(NOT WIN32)
                                     ENVIRONMENT "SALOME_EMB_SERVANT=1"
                       )
 
+  SET(TEST_NAME ${COMPONENT_NAME}_Fixes_swig)
+  ADD_TEST(${TEST_NAME} testFixes.py)
+  SET_TESTS_PROPERTIES(${TEST_NAME} PROPERTIES
+                                    LABELS "${COMPONENT_NAME}"
+                                    ENVIRONMENT "SALOME_EMB_SERVANT=1"
+                      )
+
 ENDIF()
diff --git a/src/yacsloader_swig/Test/testFixes.py b/src/yacsloader_swig/Test/testFixes.py
new file mode 100755 (executable)
index 0000000..b3ba77d
--- /dev/null
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+# Copyright (C) 2006-2023  CEA/DEN, EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+"""
+Various non regression tests.
+"""
+
+import sys
+import pilot
+import SALOMERuntime
+import loader
+import unittest
+import tempfile
+import os
+import salome
+
+NB_NODE=15
+class TestEdit(unittest.TestCase):
+
+    def setUp(self):
+        SALOMERuntime.RuntimeSALOME_setRuntime()
+        self.r = pilot.getRuntime()
+        self.l = loader.YACSLoader()
+        self.e = pilot.ExecutorSwig()
+        # We need a catalog which contains only one resource named "localhost"
+        # with NB_NODE cores. The modifications made here are not saved to the
+        # catalog file.
+        salome.salome_init()
+        resourceManager = salome.lcc.getResourcesManager()
+        resource_definition = resourceManager.GetResourceDefinition("localhost")
+        resource_definition.nb_node = NB_NODE
+        resource_definition.nb_proc_per_node = 1
+        resourceManager.AddResource(resource_definition, False, "")
+        resource_required = salome.ResourceParameters()
+        resource_required.can_run_containers = True
+        res_list = resourceManager.GetFittingResources(resource_required)
+        for r in res_list:
+          if r != "localhost":
+            resourceManager.RemoveResource(r, False, "")
+        resource_definition = resourceManager.GetResourceDefinition("localhost")
+        self.assertEqual(resource_definition.nb_node, NB_NODE)
+        self.assertEqual(resource_definition.nb_proc_per_node, 1)
+
+    def tearDown(self):
+        cm = salome.lcc.getContainerManager()
+        cm.ShutdownContainers()
+
+    def test_double_foreach_switch(self):
+        """ Two layers of nested foreach and switch structures.
+        """
+        proc = self.l.load("samples/foreach_switch_double.xml")
+        self.e.RunW(proc,0)
+        self.assertEqual(proc.getState(),pilot.DONE)
+        ok = proc.getChildByName("End").getOutputPort("ok")
+        self.assertTrue(ok, "Wrong result!")
+
+if __name__ == '__main__':
+  dir_test = tempfile.mkdtemp(suffix=".yacstest")
+  file_test = os.path.join(dir_test,"UnitTestsResult")
+  with open(file_test, 'a') as f:
+      f.write("  --- TEST src/yacsloader: testFixes.py\n")
+      suite = unittest.makeSuite(TestEdit)
+      result=unittest.TextTestRunner(f, descriptions=1, verbosity=1).run(suite)
+  sys.exit(not result.wasSuccessful())