Salome HOME
xml dump file is stored in a USER dedicated directory
[modules/yacs.git] / src / engine / Test / engineTest.cxx
index b7828bbc16836a86256b0348fd58fef7932ac4e4..5c2a7bee2749390a24e4a788a1314f0e4637061c 100644 (file)
@@ -1,11 +1,32 @@
+// Copyright (C) 2006-2020  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
+//
 
 // --- include from engine first, to avoid redifinition warning _POSIX_C_SOURCE
-
+//
 #include "Bloc.hxx"
+#include "Proc.hxx"
+#include "Logger.hxx"
 #include "ElementaryNode.hxx"
 #include "Loop.hxx"
 #include "Switch.hxx"
 #include "VisitorSaveState.hxx"
+#include "SetOfPoints.hxx"
 
 #include "SharedPtr.hxx"
 #include "RuntimeForEngineTest.hxx"
@@ -17,6 +38,8 @@
 #include <string>
 #include <list>
 #include <vector>
+#include <string.h>
+#include <unistd.h>
 
 //#define _DEVDEBUG_
 #include "YacsTrace.hxx"
@@ -85,7 +108,8 @@ void EngineTest::checkAny1()
   CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
   CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
   tmp->decrRef();
-  tmp=AtomAny::New("coucou",0);
+  const char tmp2[]="coucou";
+  tmp=AtomAny::New((char *)tmp2,0);
   CPPUNIT_ASSERT( tmp->getStringValue() == "coucou");
   CPPUNIT_ASSERT( tmp->getStringValue() == "coucou");
   tmp->decrRef();
@@ -238,7 +262,7 @@ void EngineTest::checkAny2()
     }
   catch(Exception& e)
     {
-      CPPUNIT_ASSERT(std::string(e.what())=="Value is not a Double");
+      CPPUNIT_ASSERT(std::string(e.what())=="Value is not a double");
     }
   SequenceAnyPtr tmp3=SequenceAny::New(tmp->getType());
   try
@@ -248,7 +272,7 @@ void EngineTest::checkAny2()
     }
   catch(Exception& e)
     {
-      CPPUNIT_ASSERT(std::string(e.what())=="Invalid runtime of YACS::Any struct : having Int and you want Sequence");
+      CPPUNIT_ASSERT(std::string(e.what())=="Invalid runtime of YACS::Any struct : having int and you want Sequence");
     }
   CPPUNIT_ASSERT_EQUAL(0,(int)tmp3->size());
   CPPUNIT_ASSERT_EQUAL(202,(*tmp)[9]->getIntValue());
@@ -375,7 +399,8 @@ void EngineTest::checkAny4()
   tmp->setEltAtRank(3,tmp2);
   CPPUNIT_ASSERT_EQUAL(107,(*tmp)[3]->getIntValue());
   tmp=SequenceAny::New(Runtime::_tc_string,2);
-  tmp2=AtomAny::New("titi",0);
+  const char tmpSt[]="titi";
+  tmp2=AtomAny::New((char*)tmpSt,0);
   tmp->setEltAtRank(1,tmp2);
   CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="titi");
   vector<double> vec4;
@@ -424,6 +449,7 @@ void EngineTest::checkAny5()
   CPPUNIT_ASSERT((*tmp3)[2]->getStringValue()=="tutu");
   AnyPtr tmp4=tmp3->clone();
   CPPUNIT_ASSERT( (*tmp3==*tmp4) );
+  CPPUNIT_ASSERT( (*tmp3==*tmp3) );
   tmp3->popBack();
   CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
   tmp1=AtomAny::New("tutu");
@@ -440,6 +466,203 @@ void EngineTest::checkAny5()
   CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
 }
 
+/*!
+ * Test of ArrayAny. Only one level. 
+ */
+void EngineTest::checkAny6()
+{
+  const int lgth=8;
+  const int tab[lgth]={0,1,1,9,2,7,2,3};
+  const int tab2[lgth]={13,1,1,9,2,7,2,3};
+  ArrayAnyPtr tmp1(ArrayAny::New(tab,lgth));
+  ArrayAnyPtr tmp2(ArrayAny::New(tab,lgth));
+  CPPUNIT_ASSERT((*tmp1)[3]->getIntValue()==9);
+  CPPUNIT_ASSERT( (*tmp1==*tmp2) );
+  CPPUNIT_ASSERT( (*tmp1==*tmp1) );
+  CPPUNIT_ASSERT( 8==tmp1->size() );
+  CPPUNIT_ASSERT( 8==tmp2->size() );
+  tmp2=ArrayAny::New(tab,lgth-1);
+  CPPUNIT_ASSERT( 7==tmp2->size() );
+  CPPUNIT_ASSERT( !(*tmp1==*tmp2) );
+  tmp2=ArrayAny::New(tab2,lgth);
+  CPPUNIT_ASSERT( !(*tmp1==*tmp2) );
+  tmp2=ArrayAny::New(tab,lgth);
+  CPPUNIT_ASSERT( (*tmp1==*tmp2) );
+  ArrayAnyPtr tmp3=(ArrayAny *)tmp1->clone();
+  CPPUNIT_ASSERT( (*tmp1==*tmp3) );
+  CPPUNIT_ASSERT((*tmp3)[3]->getIntValue()==9); CPPUNIT_ASSERT((*tmp3)[4]->getIntValue()==2);
+  // Ok let's test with double.
+  const double tab3[lgth]={0.1,1.1,1.1,9.1,2.1,7.1,2.1,3.1};
+  const double tab4[lgth]={13.1,1.1,1.1,9.1,2.1,7.1,2.1,3.1};
+  ArrayAnyPtr tmp4(ArrayAny::New(tab3,lgth));
+  ArrayAnyPtr tmp5(ArrayAny::New(tab3,lgth));
+  CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp4)[3]->getDoubleValue(),9.1,1e-12);
+  CPPUNIT_ASSERT( (*tmp4==*tmp5) );
+  CPPUNIT_ASSERT( (*tmp4==*tmp4) );
+  CPPUNIT_ASSERT( 8==tmp4->size() );
+  CPPUNIT_ASSERT( 8==tmp5->size() );
+  tmp5=ArrayAny::New(tab3,lgth-1);
+  CPPUNIT_ASSERT( 7==tmp5->size() );
+  CPPUNIT_ASSERT( !(*tmp4==*tmp5) );
+  tmp5=ArrayAny::New(tab4,lgth);
+  CPPUNIT_ASSERT( !(*tmp4==*tmp5) );
+  tmp5=ArrayAny::New(tab3,lgth);
+  CPPUNIT_ASSERT( (*tmp4==*tmp5) );
+  ArrayAnyPtr tmp6=(ArrayAny *)tmp4->clone();
+  CPPUNIT_ASSERT( (*tmp4==*tmp6) );
+  CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp6)[3]->getDoubleValue(),9.1,1e-12);
+  CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp6)[4]->getDoubleValue(),2.1,1e-12);
+  //Ok let's test with bool.
+  const bool tab5[lgth]={false,true,false,true,false,false,false,false};
+  const bool tab6[lgth]={true ,true,false,true,false,false,false,false};
+  ArrayAnyPtr tmp7(ArrayAny::New(tab5,lgth));
+  ArrayAnyPtr tmp8(ArrayAny::New(tab5,lgth));
+  CPPUNIT_ASSERT((*tmp7)[3]->getBoolValue());
+  CPPUNIT_ASSERT( (*tmp7==*tmp8) );
+  CPPUNIT_ASSERT( (*tmp7==*tmp7) );
+  CPPUNIT_ASSERT( 8==tmp7->size() );
+  CPPUNIT_ASSERT( 8==tmp8->size() );
+  tmp8=ArrayAny::New(tab5,lgth-1);
+  CPPUNIT_ASSERT( 7==tmp8->size() );
+  CPPUNIT_ASSERT( !(*tmp7==*tmp8) );
+  tmp8=ArrayAny::New(tab6,lgth);
+  CPPUNIT_ASSERT( !(*tmp7==*tmp8) );
+  tmp8=ArrayAny::New(tab5,lgth);
+  CPPUNIT_ASSERT( (*tmp7==*tmp8) );
+  ArrayAnyPtr tmp9=(ArrayAny *)tmp7->clone();
+  CPPUNIT_ASSERT( (*tmp9==*tmp7) );
+  CPPUNIT_ASSERT((*tmp8)[3]->getBoolValue());
+  CPPUNIT_ASSERT(!(*tmp8)[4]->getBoolValue());
+  //Ok let's test with strings.
+  vector<string> tab7(lgth); tab7[0]="abc"; tab7[1]="def"; tab7[2]="ghi"; tab7[3]="jkl"; tab7[4]="mno"; tab7[5]="pqr"; tab7[6]="stu"; tab7[7]="vwx";
+  vector<string> tab8(lgth); tab8[0]="zbc"; tab8[1]="def"; tab8[2]="ghi"; tab8[3]="jkl"; tab8[4]="mno"; tab8[5]="pqr"; tab8[6]="stu"; tab8[7]="vwx";
+  ArrayAnyPtr tmp10(ArrayAny::New(tab7));
+  ArrayAnyPtr tmp11(ArrayAny::New(tab7));
+  CPPUNIT_ASSERT((*tmp10)[3]->getStringValue()=="jkl");
+  CPPUNIT_ASSERT( (*tmp10==*tmp11) );
+  CPPUNIT_ASSERT( (*tmp10==*tmp10) );
+  CPPUNIT_ASSERT( 8==tmp10->size() );
+  CPPUNIT_ASSERT( 8==tmp11->size() );
+  vector<string> tab9(tab7); tab9.pop_back();
+  tmp11=ArrayAny::New(tab9);
+  CPPUNIT_ASSERT( 7==tmp11->size() );
+  CPPUNIT_ASSERT( !(*tmp10==*tmp11) );
+  tmp11=ArrayAny::New(tab8);
+  CPPUNIT_ASSERT( !(*tmp10==*tmp11) );
+  tmp11=ArrayAny::New(tab7);
+  CPPUNIT_ASSERT( (*tmp10==*tmp11) );
+  ArrayAnyPtr tmp12=(ArrayAny *)tmp10->clone();
+  CPPUNIT_ASSERT( (*tmp12==*tmp10) );
+  CPPUNIT_ASSERT((*tmp11)[3]->getStringValue()=="jkl");
+  CPPUNIT_ASSERT((*tmp11)[4]->getStringValue()=="mno");
+}
+
+/*!
+ * Test of ArrayAny on multi-levels. To test recursion.
+ */
+void EngineTest::checkAny7()
+{
+  const int lgth=8;
+  const int tab1[lgth]={0,1,1,9,2,7,2,3};
+  const int tab2[lgth]={7,8,8,16,9,14,9,10};
+  //Testing Arrays of arrays
+  ArrayAnyPtr tmp11(ArrayAny::New(tab1,lgth));
+  ArrayAnyPtr tmp12(ArrayAny::New(tab2,lgth));
+  ArrayAnyPtr tmp12Throw(ArrayAny::New(tab2,lgth+1));
+  ArrayAnyPtr tmp2(ArrayAny::New(tmp11->getType(),2));
+  tmp2->setEltAtRank(0,tmp11);
+  CPPUNIT_ASSERT_THROW(tmp2->setEltAtRank(1,tmp12Throw),Exception);
+  tmp2->setEltAtRank(1,tmp12);
+  CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
+  CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
+  //    Show deep copy process of arrays
+  AnyPtr tmp=AtomAny::New(49);
+  tmp11->setEltAtRank(0,tmp);
+  CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
+  CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
+  ArrayAnyPtr tmp2Cloned=(ArrayAny *)(tmp2->clone());
+  CPPUNIT_ASSERT_EQUAL(0,(*tmp2Cloned)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2Cloned)[1][0]->getIntValue());
+  CPPUNIT_ASSERT_EQUAL(9,(*tmp2Cloned)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2Cloned)[1][3]->getIntValue());
+  CPPUNIT_ASSERT( *tmp2==*tmp2Cloned );
+  CPPUNIT_ASSERT( *tmp2==*tmp2 );
+  //Testing Array of Sequences
+  SequenceAnyPtr tmp13(SequenceAny::New((int *)tab1,lgth,0));
+  SequenceAnyPtr tmp14(SequenceAny::New((int *)tab2,lgth,0));
+  tmp2=ArrayAny::New(tmp13->getType(),2);
+  tmp2->setEltAtRank(0,tmp13);
+  tmp2->setEltAtRank(1,tmp14);
+  CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
+  CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
+  tmp13->setEltAtRank(0,tmp);
+  //    No deep copy here contrary to 14 lines ahead.
+  CPPUNIT_ASSERT_EQUAL(49,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
+  CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
+  tmp2Cloned=(ArrayAny *)(tmp2->clone());
+  CPPUNIT_ASSERT_EQUAL(49,(*tmp2Cloned)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2Cloned)[1][0]->getIntValue());
+  CPPUNIT_ASSERT_EQUAL(9,(*tmp2Cloned)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2Cloned)[1][3]->getIntValue());
+  CPPUNIT_ASSERT( *tmp2==*tmp2Cloned );
+  CPPUNIT_ASSERT( *tmp2==*tmp2 );
+  //Testing Sequence of array
+  tmp13=SequenceAny::New(tmp11->getType(),2);
+  tmp13->setEltAtRank(0,tmp11);
+  tmp13->setEltAtRank(1,tmp12);
+  CPPUNIT_ASSERT_EQUAL(49,(*tmp13)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp13)[1][0]->getIntValue());
+  CPPUNIT_ASSERT_EQUAL(9,(*tmp13)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp13)[1][3]->getIntValue());
+  tmp14=(SequenceAny *)tmp13->clone();
+  CPPUNIT_ASSERT_EQUAL(49,(*tmp14)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp14)[1][0]->getIntValue());
+  CPPUNIT_ASSERT_EQUAL(9,(*tmp14)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp14)[1][3]->getIntValue());
+  CPPUNIT_ASSERT( *tmp13==*tmp14 );
+  CPPUNIT_ASSERT( *tmp13==*tmp13 );
+}
+
+/*!
+ * First test of structs.
+ */
+void EngineTest::checkAny8()
+{
+  TypeCodeStruct *tc=new TypeCodeStruct("","");
+  tc->addMember("MyInt",Runtime::_tc_int);
+  tc->addMember("MyDouble",Runtime::_tc_double);
+  tc->addMember("MyBool",Runtime::_tc_bool);
+  tc->addMember("MyStr",Runtime::_tc_string);
+  StructAnyPtr tmp1=StructAny::New(tc);
+  tmp1=StructAny::New(tc);
+  AnyPtr tmpAtom=AtomAny::New(3791);
+  tmp1->setEltAtRank("MyInt",tmpAtom);
+  CPPUNIT_ASSERT_THROW(tmp1->setEltAtRank(1,tmpAtom),Exception);
+  tmpAtom=AtomAny::New(3.14);
+  CPPUNIT_ASSERT_THROW(tmp1->setEltAtRank("MyDoubl",tmpAtom),Exception);
+  tmp1->setEltAtRank("MyDouble",tmpAtom);
+  tmpAtom=AtomAny::New(false);
+  tmp1->setEltAtRank("MyBool",tmpAtom);
+  tmpAtom=AtomAny::New("abcdef");
+  tmp1->setEltAtRank("MyStr",tmpAtom);
+  CPPUNIT_ASSERT_EQUAL(3791,(*tmp1)["MyInt"]->getIntValue());
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp1)["MyDouble"]->getDoubleValue(),1e-12);
+  CPPUNIT_ASSERT_THROW((*tmp1)["MyIntT"],Exception);
+  CPPUNIT_ASSERT(!(*tmp1)["MyBool"]->getBoolValue());
+  CPPUNIT_ASSERT_THROW((*tmp1)["MyBool"]->getStringValue(),Exception);
+  CPPUNIT_ASSERT((*tmp1)["MyStr"]->getStringValue()=="abcdef");
+  tmpAtom=AtomAny::New("ghijklm");
+  tmp1->setEltAtRank("MyStr",tmpAtom);
+  CPPUNIT_ASSERT((*tmp1)["MyStr"]->getStringValue()=="ghijklm");
+  //Introduce some recursive structure.
+  SequenceAnyPtr tmp2=SequenceAny::New(tc,2);
+  tmp2->setEltAtRank(0,tmp1);
+  tmpAtom=AtomAny::New("opqrst");
+  tmp1->setEltAtRank("MyStr",tmpAtom);
+  tmp2->setEltAtRank(1,tmp1);
+  CPPUNIT_ASSERT_EQUAL(3791,(*tmp2)[1]["MyInt"]->getIntValue());
+  CPPUNIT_ASSERT((*tmp2)[0]["MyStr"]->getStringValue()=="ghijklm");
+  CPPUNIT_ASSERT((*tmp2)[1]["MyStr"]->getStringValue()=="opqrst");
+  CPPUNIT_ASSERT(*tmp2==*tmp2);
+  AnyPtr tmp3=tmp2->clone();
+  CPPUNIT_ASSERT(*tmp2==*tmp3);
+  CPPUNIT_ASSERT((*tmp3)[0]["MyStr"]->getStringValue()=="ghijklm");
+  CPPUNIT_ASSERT((*tmp3)[1]["MyStr"]->getStringValue()=="opqrst");
+  tc->decrRef();
+}
+
 void EngineTest::checkInGateOutGate()
 {
   string nodeName = "Node1";
@@ -569,7 +792,7 @@ void EngineTest::checkAddNodesToBloc()
   bloc1->edAddChild(_nodeMap["Node_1"]);
   bloc1->edAddChild(_nodeMap["Node_2"]);
   {
-    set<ElementaryNode *> setelem = bloc1->getRecursiveConstituents();
+    list<ElementaryNode *> setelem = bloc1->getRecursiveConstituents();
     CPPUNIT_ASSERT(setelem.size() == 2);
   }
 }
@@ -609,9 +832,9 @@ void EngineTest::checkRecursiveBlocs_NumberOfNodes()
   bloc3->edAddChild((bloc2));  // 1 elementary node
   bloc3->edAddChild(_nodeMap["Node_4"]);   // 1 elementary node
   {
-    set<ElementaryNode *> setelem = bloc3->getRecursiveConstituents();
+    list<ElementaryNode *> setelem = bloc3->getRecursiveConstituents();
     CPPUNIT_ASSERT(setelem.size() == 4);
-    for (set<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
+    for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
       {
         DEBTRACE("     elem name = " << (*it)->getName());
       }
@@ -669,10 +892,10 @@ void EngineTest::checkRemoveNode()
   bloc->edAddChild(_nodeMap["Node_7"]);
 
   {
-    set<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
+    list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
     CPPUNIT_ASSERT(setelem.size() == 3);
 
-    for (set<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
+    for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
       {
         DEBTRACE("     elem name = " << (*it)->getName());
       }
@@ -681,9 +904,9 @@ void EngineTest::checkRemoveNode()
   ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_6"]);
 
   {
-    set<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
+    list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
     CPPUNIT_ASSERT(setelem.size() == 2);
-    for (set<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
+    for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
       {
         DEBTRACE("     elem name         = " << (*it)->getName());
         DEBTRACE("     elem name in Bloc = " << ((Bloc *)_nodeMap["blocR"])->getChildName(*it));
@@ -708,7 +931,7 @@ void EngineTest::checkRemoveNode()
   ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_5"]);
   ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_7"]);
   {
-    set<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
+    list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
     CPPUNIT_ASSERT(setelem.size() == 0);
   }
 }
@@ -756,9 +979,9 @@ void EngineTest::RecursiveBlocs_multipleRecursion()
   }
 
   {
-    set<ElementaryNode *> setelem = _nodeMap["graphe"]->getRecursiveConstituents();
+    list<ElementaryNode *> setelem = _nodeMap["graphe"]->getRecursiveConstituents();
     CPPUNIT_ASSERT(setelem.size() == 9);
-    for (set<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
+    for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
       {
         DEBTRACE("     elem name = " << (*it)->getName());
       }
@@ -778,7 +1001,10 @@ void EngineTest::RecursiveBlocs_multipleRecursion()
         DEBTRACE("     output port name for graphe = " << _nodeMap["graphe"]->getOutPortName(*it));
       }
     YACS::ENGINE::VisitorSaveState vst(_compoMap["graphe"]);
-    vst.openFileDump("dumpState.xml");
+    std::string logDir = std::string("/tmp/")+ getlogin();
+    std::string cmd = "mkdir -p " + logDir;
+    system( cmd.c_str() );
+    vst.openFileDump(logDir + std::string("/RecursiveBlocs_multipleRecursion_dumpState.xml"));
     _compoMap["graphe"]->accept(&vst);
     vst.closeFileDump();
   }
@@ -795,7 +1021,7 @@ void EngineTest::RecursiveBlocs_removeNodes()
 //   }
 
   {
-    set<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
+    list<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
     CPPUNIT_ASSERT(setNode.size() == 16);
     list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
     list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
@@ -808,9 +1034,9 @@ void EngineTest::RecursiveBlocs_removeNodes()
   ((Bloc *)_nodeMap["bloc7"])->edRemoveChild(_nodeMap["bloc6"]);
 
   {
-    set<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
+    list<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
     CPPUNIT_ASSERT(setNode.size() == 9);
-    for (set<Node*>::iterator it=setNode.begin(); it!=setNode.end(); it++)
+    for (list<Node*>::iterator it=setNode.begin(); it!=setNode.end(); it++)
       {
         DEBTRACE("     elem name = " << ((Bloc *)_nodeMap["graphe"])->getChildName(*it));
       }
@@ -823,3 +1049,400 @@ void EngineTest::RecursiveBlocs_removeNodes()
   }
 
 }
+
+void EngineTest::checkLogger()
+{
+  Proc* proc=new Proc("proc");
+  Logger* logger=proc->getLogger("parser");
+  logger->error("error1","file.cxx",324);
+  logger->error("error2","file.cxx",852);
+  CPPUNIT_ASSERT(logger->hasErrors()==true);
+  CPPUNIT_ASSERT(logger->isEmpty()==false);
+  const char* expected1="LogRecord: parser:ERROR:error1 (file.cxx:324)\n"
+                        "LogRecord: parser:ERROR:error2 (file.cxx:852)\n";
+  CPPUNIT_ASSERT(logger->getStr()==expected1);
+
+  logger->reset();
+  CPPUNIT_ASSERT(logger->hasErrors()==false);
+  CPPUNIT_ASSERT(logger->isEmpty()==true);
+
+  logger->error("error1","file.cxx",324);
+  logger->error("error2","file.cxx",852);
+  logger->error("error3","file.cxx",978);
+  CPPUNIT_ASSERT(logger->hasErrors()==true);
+  CPPUNIT_ASSERT(logger->isEmpty()==false);
+  const char* expected2="LogRecord: parser:ERROR:error1 (file.cxx:324)\n"
+                        "LogRecord: parser:ERROR:error2 (file.cxx:852)\n"
+                        "LogRecord: parser:ERROR:error3 (file.cxx:978)\n";
+  CPPUNIT_ASSERT(logger->getStr()==expected2);
+  delete proc;
+}
+
+void EngineTest::checkGraphAnalyser0()
+{
+  {
+    static const int N=2;
+    Bloc *t[N];
+    Bloc proc("proc");
+    for(int i=0;i<N;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        t[i]=new Bloc(oss.str());
+        proc.edAddChild(t[i]);
+      }
+    proc.edAddCFLink(t[0],t[1]);
+    std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
+    CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
+    SetOfPoints sop(r[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(n1+n2) - ");
+  }
+}
+
+void EngineTest::checkGraphAnalyser1()
+{
+  {
+    static const int N=24;
+    Bloc *t[N];
+    Bloc proc("proc");
+    for(int i=0;i<N;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        t[i]=new Bloc(oss.str());
+        proc.edAddChild(t[i]);
+      }
+    proc.edAddCFLink(t[20],t[21]); proc.edAddCFLink(t[21],t[15]); proc.edAddCFLink(t[15],t[14]); proc.edAddCFLink(t[14],t[0]); proc.edAddCFLink(t[0],t[1]); proc.edAddCFLink(t[1],t[23]); proc.edAddCFLink(t[23],t[5]);
+    proc.edAddCFLink(t[14],t[13]); proc.edAddCFLink(t[13],t[5]);
+    proc.edAddCFLink(t[15],t[12]); proc.edAddCFLink(t[12],t[11]); proc.edAddCFLink(t[11],t[9]); proc.edAddCFLink(t[9],t[8]); proc.edAddCFLink(t[8],t[7]); proc.edAddCFLink(t[7],t[6]); proc.edAddCFLink(t[6],t[5]);
+    proc.edAddCFLink(t[11],t[10]); proc.edAddCFLink(t[10],t[8]);
+    proc.edAddCFLink(t[15],t[16]); proc.edAddCFLink(t[16],t[17]); proc.edAddCFLink(t[17],t[19]); proc.edAddCFLink(t[19],t[2]); proc.edAddCFLink(t[2],t[4]); proc.edAddCFLink(t[4],t[5]);
+    proc.edAddCFLink(t[19],t[18]); proc.edAddCFLink(t[18],t[4]);
+    proc.edAddCFLink(t[19],t[3]); proc.edAddCFLink(t[3],t[4]);
+    proc.edAddCFLink(t[22],t[21]);
+    std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
+    CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
+    SetOfPoints sop(r[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="([n21*n23]+(n22+n16+[((n13+n12)+[n10*n11]+(n9+n8+n7))*((n17+n18+n20)+[n19*n3*n4]+n5)*(n15+[(n1+n2+n24)*n14])]+n6)) - ");
+  }
+  //
+  {
+    static const int N=10;
+    Bloc *t[N];
+    Bloc proc("proc");
+    for(int i=0;i<N;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        t[i]=new Bloc(oss.str());
+        proc.edAddChild(t[i]);
+      }
+    proc.edAddCFLink(t[9],t[0]); proc.edAddCFLink(t[0],t[2]); proc.edAddCFLink(t[2],t[4]); proc.edAddCFLink(t[4],t[5]);
+    proc.edAddCFLink(t[0],t[1]); proc.edAddCFLink(t[1],t[6]); proc.edAddCFLink(t[6],t[7]); proc.edAddCFLink(t[7],t[5]);
+    proc.edAddCFLink(t[0],t[8]); proc.edAddCFLink(t[8],t[3]); proc.edAddCFLink(t[3],t[4]);
+    std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
+    CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
+    SetOfPoints sop(r[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="((n10+n1)+[([(n9+n4)*n3]+n5)*(n2+n7+n8)]+n6) - ");
+  }
+}
+
+void EngineTest::checkGraphAnalyser2()
+{
+  {
+    static const int N=8;
+    Bloc *t[N];
+    Bloc proc("proc");
+    for(int i=0;i<N;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        t[i]=new Bloc(oss.str());
+        proc.edAddChild(t[i]);
+      }
+    proc.edAddCFLink(t[7],t[4]); proc.edAddCFLink(t[4],t[0]); proc.edAddCFLink(t[0],t[1]); proc.edAddCFLink(t[1],t[5]); proc.edAddCFLink(t[5],t[6]);
+    proc.edAddCFLink(t[4],t[2]); proc.edAddCFLink(t[2],t[3]); proc.edAddCFLink(t[3],t[5]);
+    std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
+    CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
+    SetOfPoints sop(r[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="((n8+n5)+[(n1+n2)*(n3+n4)]+(n6+n7)) - ");
+  }
+  //
+  {
+    static const int NN=6;
+    Bloc *tt[NN];
+    Bloc proc2("proc2");
+    tt[0]=new Bloc("n21") ; tt[1]=new Bloc("n22") ; tt[2]=new Bloc("n23") ; tt[3]=new Bloc("n16"); tt[4]=new Bloc("n21@1"); tt[5]=new Bloc("n23@1");
+    for(int i=0;i<NN;i++)
+      proc2.edAddChild(tt[i]);
+    proc2.edAddCFLink(tt[0],tt[4]); proc2.edAddCFLink(tt[4],tt[1]); proc2.edAddCFLink(tt[2],tt[5]); proc2.edAddCFLink(tt[5],tt[1]); proc2.edAddCFLink(tt[1],tt[3]);
+    std::vector< std::list<Node *> > rr(proc2.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rr.size());
+    CPPUNIT_ASSERT_EQUAL(NN,(int)rr[0].size());
+    SetOfPoints sop2(rr[0]);
+    sop2.simplify();
+    CPPUNIT_ASSERT(sop2.getRepr()=="([(n21+n21@1)*(n23+n23@1)]+(n22+n16)) - ");
+  }
+  //
+  {
+    static const int NNN=6;
+    Bloc *ttt[NNN];
+    Bloc proc3("proc3");
+    ttt[0]=new Bloc("n21") ; ttt[1]=new Bloc("n22") ; ttt[2]=new Bloc("n23") ; ttt[3]=new Bloc("n16"); ttt[4]=new Bloc("n21@1"); ttt[5]=new Bloc("n23@1");
+    for(int i=0;i<NNN;i++)
+      proc3.edAddChild(ttt[i]);
+    proc3.edAddCFLink(ttt[0],ttt[4]); proc3.edAddCFLink(ttt[3],ttt[0]); proc3.edAddCFLink(ttt[2],ttt[5]); proc3.edAddCFLink(ttt[3],ttt[2]); proc3.edAddCFLink(ttt[1],ttt[3]);
+    std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
+    SetOfPoints sop3(rrr[0]);
+    sop3.simplify();
+    CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
+  }
+}
+
+void EngineTest::checkGraphAnalyser3()
+{
+  {
+    static const int NNN=6;
+    Bloc *ttt[NNN];
+    Bloc proc3("proc3");
+    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[0],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[4]);
+    proc3.edAddCFLink(ttt[0],ttt[2]); proc3.edAddCFLink(ttt[2],ttt[3]); proc3.edAddCFLink(ttt[3],ttt[4]);
+    proc3.edAddCFLink(ttt[5],ttt[3]);
+    std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
+    SetOfPoints sop3(rrr[0]);
+    //sop3.simplify();
+    //std:cerr  << std::endl << sop3.getRepr() << std::endl;
+    //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();
+    //"(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - "
+    CPPUNIT_ASSERT(sop.getRepr()=="[(A+[[B*C]*[C*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();
+    //"(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - "
+    CPPUNIT_ASSERT(sop.getRepr()=="[(A+[[B*C]*[C*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();
+    //"(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]]]]) - "
+    CPPUNIT_ASSERT(sop.getRepr()=="[([(A+[([[B*C]*[C*E]]+(F+G))*[C*I]])*H]+J)*D] - ");
+  }
+  //
+  {
+    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();
+    //"(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]]]]) - "
+    CPPUNIT_ASSERT(sop.getRepr()=="[([(A+[([[B*C]*[C*E]]+(F+G))*[C*I]])*H]+(J+K+L))*D] - ");
+  }
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"B","C","D","E","F","G","H","I","J","K"};
+    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]);//B -> C
+    proc.edAddCFLink(vn[0],vn[3]);//B -> E
+    proc.edAddCFLink(vn[0],vn[5]);//B -> G
+    proc.edAddCFLink(vn[2],vn[3]);//D -> E
+    proc.edAddCFLink(vn[4],vn[5]);//F -> G
+    proc.edAddCFLink(vn[6],vn[7]);//H -> I
+    proc.edAddCFLink(vn[0],vn[7]);//B -> I
+    proc.edAddCFLink(vn[8],vn[9]);//J -> K
+    proc.edAddCFLink(vn[0],vn[9]);//B -> K
+    //
+    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()=="[([B*D]+E)*([B*F]+G)*([B*H]+I)*([B*J]+K)*C] - ");
+  }
+}