Salome HOME
Use /tmp for temporary files needed by salome tests.
[modules/yacs.git] / src / engine / Test / engineTest.cxx
index 2a47afd9423100039dd495cba560edf38fb35931..84f52bd736baa02f6ac473a8f3b09dee550f93fb 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2006-2015  CEA/DEN, EDF R&D
+// Copyright (C) 2006-2019  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
@@ -1000,7 +1000,7 @@ void EngineTest::RecursiveBlocs_multipleRecursion()
         DEBTRACE("     output port name for graphe = " << _nodeMap["graphe"]->getOutPortName(*it));
       }
     YACS::ENGINE::VisitorSaveState vst(_compoMap["graphe"]);
-    vst.openFileDump("dumpState.xml");
+    vst.openFileDump("/tmp/RecursiveBlocs_multipleRecursion_dumpState.xml");
     _compoMap["graphe"]->accept(&vst);
     vst.closeFileDump();
   }
@@ -1225,3 +1225,187 @@ void EngineTest::checkGraphAnalyser3()
     //CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
   }
 }
+
+void EngineTest::checkGraphAnalyser4()
+{
+  {
+    static const int NNN=3;
+    Bloc *ttt[NNN];
+    Bloc proc3("proc");
+    for(int i=0;i<NNN;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        ttt[i]=new Bloc(oss.str());
+        proc3.edAddChild(ttt[i]);
+      }
+    proc3.edAddCFLink(ttt[2],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[0]);
+    std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(n3+n2+n1) - ");
+  }
+}
+
+/*!
+ * Case revealed by EmC2 on complex managers.
+ * Here basic combination of Link/Fork is not enough.
+ */
+void EngineTest::checkGraphAnalyser5()
+{
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","E","C","F","D","G"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> E
+    proc.edAddCFLink(vn[0],vn[2]);//A -> C
+    proc.edAddCFLink(vn[2],vn[3]);//C -> F
+    proc.edAddCFLink(vn[2],vn[4]);//C -> D
+    proc.edAddCFLink(vn[1],vn[3]);//E -> F
+    proc.edAddCFLink(vn[3],vn[5]);//F -> G
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="((A+[C*E])+[(F+G)*[D*E]]) - ");
+  }
+  //
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","E","C","B","F","D","G"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> E
+    proc.edAddCFLink(vn[0],vn[2]);//A -> C
+    proc.edAddCFLink(vn[0],vn[3]);//A -> B
+    proc.edAddCFLink(vn[3],vn[4]);//B -> F
+    proc.edAddCFLink(vn[2],vn[4]);//C -> F
+    proc.edAddCFLink(vn[2],vn[5]);//C -> D
+    proc.edAddCFLink(vn[1],vn[4]);//E -> F
+    proc.edAddCFLink(vn[4],vn[6]);//F -> G
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - ");
+  }
+  //
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","E","C","B","F","D","G"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> E
+    proc.edAddCFLink(vn[0],vn[2]);//A -> C
+    proc.edAddCFLink(vn[0],vn[3]);//A -> B
+    proc.edAddCFLink(vn[3],vn[4]);//B -> F
+    proc.edAddCFLink(vn[2],vn[4]);//C -> F
+    proc.edAddCFLink(vn[2],vn[5]);//C -> D
+    proc.edAddCFLink(vn[1],vn[4]);//E -> F
+    proc.edAddCFLink(vn[4],vn[6]);//F -> G
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - ");
+  }
+  //
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","I","E","C","B","J","F","H","D","G"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> I
+    proc.edAddCFLink(vn[0],vn[2]);//A -> E
+    proc.edAddCFLink(vn[0],vn[3]);//A -> C
+    proc.edAddCFLink(vn[0],vn[4]);//A -> B
+    proc.edAddCFLink(vn[4],vn[6]);//B -> F
+    proc.edAddCFLink(vn[3],vn[7]);//C -> H
+    proc.edAddCFLink(vn[3],vn[6]);//C -> F
+    proc.edAddCFLink(vn[3],vn[8]);//C -> D
+    proc.edAddCFLink(vn[2],vn[6]);//E -> F
+    proc.edAddCFLink(vn[6],vn[9]);//F -> G
+    proc.edAddCFLink(vn[9],vn[5]);//G -> J
+    proc.edAddCFLink(vn[7],vn[5]);//H -> J
+    proc.edAddCFLink(vn[1],vn[5]);//I -> J
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(A+[([C*[(F+G)*I]]+[([[(F+G)*H]*[(F+G)*I]]+J)*[[(F+G)*D]*[(F+G)*I]]])*[[B*[(F+G)*I]]*[E*[(F+G)*I]]]]) - ");
+  }
+  //
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","I","E","C","B","J","F","H","D","K","G","L"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> I
+    proc.edAddCFLink(vn[0],vn[2]);//A -> E
+    proc.edAddCFLink(vn[0],vn[3]);//A -> C
+    proc.edAddCFLink(vn[0],vn[4]);//A -> B
+    proc.edAddCFLink(vn[4],vn[6]);//B -> F
+    proc.edAddCFLink(vn[3],vn[7]);//C -> H
+    proc.edAddCFLink(vn[3],vn[6]);//C -> F
+    proc.edAddCFLink(vn[3],vn[8]);//C -> D
+    proc.edAddCFLink(vn[2],vn[6]);//E -> F
+    proc.edAddCFLink(vn[6],vn[10]);//F -> G
+    proc.edAddCFLink(vn[10],vn[5]);//G -> J
+    proc.edAddCFLink(vn[7],vn[5]);//H -> J
+    proc.edAddCFLink(vn[1],vn[5]);//I -> J
+    proc.edAddCFLink(vn[5],vn[9]);//J -> K
+    proc.edAddCFLink(vn[9],vn[11]);//K -> L
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(A+[([C*[(F+G)*I]]+[([[(F+G)*H]*[(F+G)*I]]+(J+K+L))*[[(F+G)*D]*[(F+G)*I]]])*[[B*[(F+G)*I]]*[E*[(F+G)*I]]]]) - ");
+  }
+}