1 // Copyright (C) 2006-2020 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // --- include from engine first, to avoid redifinition warning _POSIX_C_SOURCE
25 #include "ElementaryNode.hxx"
28 #include "VisitorSaveState.hxx"
29 #include "SetOfPoints.hxx"
31 #include "SharedPtr.hxx"
32 #include "RuntimeForEngineTest.hxx"
34 #include "engineTest.hxx"
45 #include "YacsTrace.hxx"
47 using namespace YACS::ENGINE;
51 map<string, Node*> EngineTest::_nodeMap;
52 map<string, ComposedNode*> EngineTest::_compoMap;
56 TypeCode *EngineTest::_tc_bool = new TypeCode(Bool);
57 TypeCode *EngineTest::_tc_int = new TypeCode(Int);
58 TypeCode *EngineTest::_tc_double = new TypeCode(Double);
61 void EngineTest::setUp()
65 void EngineTest::tearDown()
69 void EngineTest::cleanUp()
71 map<string, ComposedNode*>::iterator iter2,iter3;
72 for(map<string, Node*>::iterator iter=_nodeMap.begin();iter!=_nodeMap.end();iter++)
73 if((*iter).second->getFather()==0)
74 delete (*iter).second;
77 void EngineTest::checkGetRuntime()
79 CPPUNIT_ASSERT_THROW(Runtime *myrun = getRuntime(), YACS::Exception);
80 RuntimeForEngineTest::setRuntime();
81 Runtime *myrun1 = getRuntime();
82 CPPUNIT_ASSERT(myrun1);
83 Runtime *myrun2 = getRuntime();
84 CPPUNIT_ASSERT_EQUAL(myrun1, myrun2);
97 void EngineTest::checkAny1()
99 char *toto=new char[10];
100 strcpy(toto,"lkjlkj");
101 Any *tmp=AtomAny::New(toto,toto2);//no copy here
102 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
103 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
105 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
106 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
108 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
109 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
111 const char tmp2[]="coucou";
112 tmp=AtomAny::New((char *)tmp2,0);
113 CPPUNIT_ASSERT( tmp->getStringValue() == "coucou");
114 CPPUNIT_ASSERT( tmp->getStringValue() == "coucou");
116 tmp=AtomAny::New(string("abcdef"));
117 CPPUNIT_ASSERT( tmp->getStringValue() == "abcdef");
118 CPPUNIT_ASSERT( tmp->getStringValue() == "abcdef");
120 tmp=AtomAny::New("ghijk");
121 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
122 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
124 tmp=AtomAny::New((char *)"ghijk");
125 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
126 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
136 A7(double toto):_d(toto),_cnt(1) { }
137 static A7 *New(double toto) { return new A7(toto); }
138 double getToto() const { return _d; }
139 void setToto(double val) { _d=val; }
140 void incrRef() { _cnt++; }
153 void checkSharedPtrFct2(const A7& a)
158 void checkSharedPtrFct1(const SharedPtr<A7>& a)
160 checkSharedPtrFct2(a);
164 void EngineTest::checkSharedPtr()
166 SharedPtr<A7> titi=A7::New(5.);
167 SharedPtr<A7> toto=A7::New(5.1);
168 SharedPtr<A7> tutu(toto);
169 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.,titi->getToto(),1e-12);
171 CPPUNIT_ASSERT_DOUBLES_EQUAL(7.1,titi->getToto(),1e-12);
172 checkSharedPtrFct2(titi);
173 checkSharedPtrFct2(toto);
175 checkSharedPtrFct2(titi);
176 checkSharedPtrFct2(tutu);
179 void EngineTest::checkAny2()
181 double tabStack[8]={1.2, 3.4, 5.6, 7.8, 9.0, 2.3, 4.5, 6.7};
182 double *tabHeap=new double[8];
183 memcpy(tabHeap,tabStack,8*sizeof(double));
184 SequenceAnyPtr tmp(SequenceAny::New(tabStack,8,0));
185 CPPUNIT_ASSERT_EQUAL(8,(int)tmp->size());
186 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.6,(*tmp)[2]->getDoubleValue(),1e-12);
187 CPPUNIT_ASSERT_DOUBLES_EQUAL(6.7,(*tmp)[7]->getDoubleValue(),1e-12);
188 AtomAnyPtr tmp2(AtomAny::New(8.9));
190 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
191 tmp2=AtomAny::New(10.2);
193 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
194 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.9,(*tmp)[8]->getDoubleValue(),1e-12);
195 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.2,(*tmp)[9]->getDoubleValue(),1e-12);
197 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
198 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.9,(*tmp)[8]->getDoubleValue(),1e-12);
199 tmp2=AtomAny::New(10.3);
201 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
202 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.9,(*tmp)[8]->getDoubleValue(),1e-12);
203 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.3,(*tmp)[9]->getDoubleValue(),1e-12);
204 tmp=SequenceAny::New(tabHeap,8,toto2);
205 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.6,(*tmp)[2]->getDoubleValue(),1e-12);
206 CPPUNIT_ASSERT_DOUBLES_EQUAL(6.7,(*tmp)[7]->getDoubleValue(),1e-12);
207 tmp2=AtomAny::New(8.5);
209 tmp2=AtomAny::New(10.27);
211 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,(*tmp)[8]->getDoubleValue(),1e-12);
212 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.27,(*tmp)[9]->getDoubleValue(),1e-12);
213 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
215 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
216 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,(*tmp)[8]->getDoubleValue(),1e-12);
217 tmp2=AtomAny::New(10.445);
219 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
220 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,(*tmp)[8]->getDoubleValue(),1e-12);
221 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.445,(*tmp)[9]->getDoubleValue(),1e-12);
223 int tabStackI[8]={1, 3, 5, 7, 9, 2, 4, 6};
224 int *tabHeapI=new int[8];
225 memcpy(tabHeapI,tabStackI,8*sizeof(int));
226 tmp=SequenceAny::New(tabStackI,8,0);
227 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
228 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
229 tmp2=AtomAny::New(8);
231 tmp2=AtomAny::New(25);
233 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
234 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
235 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
236 CPPUNIT_ASSERT_EQUAL(25,(*tmp)[9]->getIntValue());
237 //Same with no copy constructor
238 tmp=SequenceAny::New(tabHeapI,8,toto3);
239 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
240 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
241 tmp2=AtomAny::New(8);
243 tmp2=AtomAny::New(27);
245 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
246 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
247 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
248 CPPUNIT_ASSERT_EQUAL(27,(*tmp)[9]->getIntValue());
249 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
251 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
252 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
253 tmp2=AtomAny::New(202);
255 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
256 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
257 CPPUNIT_ASSERT_EQUAL(202,(*tmp)[9]->getIntValue());
260 double d=(*tmp)[2]->getDoubleValue();
265 CPPUNIT_ASSERT(std::string(e.what())=="Value is not a double");
267 SequenceAnyPtr tmp3=SequenceAny::New(tmp->getType());
270 tmp3->pushBack(tmp2);
275 CPPUNIT_ASSERT(std::string(e.what())=="Invalid runtime of YACS::Any struct : having int and you want Sequence");
277 CPPUNIT_ASSERT_EQUAL(0,(int)tmp3->size());
278 CPPUNIT_ASSERT_EQUAL(202,(*tmp)[9]->getIntValue());
280 CPPUNIT_ASSERT_EQUAL(1,(int)tmp3->size());
281 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
282 tmp=SequenceAny::New(tabStackI,8,0);
284 CPPUNIT_ASSERT_EQUAL(2,(int)tmp3->size());
285 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
286 CPPUNIT_ASSERT_EQUAL(7,(*tmp3)[1][3]->getIntValue());
289 CPPUNIT_ASSERT_EQUAL(4,(int)tmp3->size());
290 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
291 CPPUNIT_ASSERT_EQUAL(7,(*tmp3)[1][3]->getIntValue());
292 CPPUNIT_ASSERT_EQUAL(7,(*tmp3)[3][3]->getIntValue());
293 tmp2=AtomAny::New(89);
295 CPPUNIT_ASSERT_EQUAL(4,(int)tmp3->size());
296 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
297 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
298 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[1][8]->getIntValue());
299 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[2][8]->getIntValue());
300 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[3][8]->getIntValue());
302 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
303 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
304 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
305 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[1][8]->getIntValue());
306 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[2][8]->getIntValue());
307 SequenceAnyPtr tmp4=(SequenceAny *)tmp3->clone();
308 CPPUNIT_ASSERT_EQUAL(3,(int)tmp4->size());
309 CPPUNIT_ASSERT_EQUAL(202,(*tmp4)[0][9]->getIntValue());
310 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[1][8]->getIntValue());
311 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[2][8]->getIntValue());
313 CPPUNIT_ASSERT_EQUAL(2,(int)tmp4->size());
314 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
315 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
316 CPPUNIT_ASSERT_EQUAL(202,(*tmp4)[0][9]->getIntValue());
317 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[1][8]->getIntValue());
318 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[1][8]->getIntValue());
320 tmp2=AtomAny::New(107);
322 CPPUNIT_ASSERT_EQUAL(2,(int)tmp4->size());
323 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
324 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
325 CPPUNIT_ASSERT_EQUAL(202,(*tmp4)[0][9]->getIntValue());
326 CPPUNIT_ASSERT_EQUAL(107,(*tmp3)[1][8]->getIntValue());//These 2 lines to show that deepCpy has been done
327 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[1][8]->getIntValue());
330 void EngineTest::checkAny3()
333 vec.push_back("tata00000"); vec.push_back("toto"); vec.push_back("tutu");
334 SequenceAnyPtr tmp(SequenceAny::New(vec));
335 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
336 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
337 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
338 CPPUNIT_ASSERT((*tmp)[2]->getStringValue()=="tutu");
339 tmp->pushBack(AtomAnyPtr(AtomAny::New("abcdefgh")));
340 CPPUNIT_ASSERT_EQUAL(4,(int)tmp->size());
341 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
342 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
343 CPPUNIT_ASSERT((*tmp)[2]->getStringValue()=="tutu");
344 CPPUNIT_ASSERT((*tmp)[3]->getStringValue()=="abcdefgh");
346 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
347 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
348 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
349 CPPUNIT_ASSERT((*tmp)[2]->getStringValue()=="tutu");
351 CPPUNIT_ASSERT_EQUAL(2,(int)tmp->size());
352 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
353 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
355 CPPUNIT_ASSERT_EQUAL(1,(int)tmp->size());
356 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
358 CPPUNIT_ASSERT_EQUAL(0,(int)tmp->size());
361 tmp=SequenceAny::New(vec2);
362 CPPUNIT_ASSERT_EQUAL(0,(int)tmp->size());
363 vec2.push_back(true); vec2.push_back(false); vec2.push_back(true); vec2.push_back(true); vec2.push_back(true);
364 tmp=SequenceAny::New(vec2);
365 CPPUNIT_ASSERT_EQUAL(5,(int)tmp->size());
366 CPPUNIT_ASSERT((*tmp)[0]->getBoolValue() && !(*tmp)[1]->getBoolValue() && (*tmp)[2]->getBoolValue() && (*tmp)[3]->getBoolValue() && (*tmp)[4]->getBoolValue());
367 //in perspective of SequenceAny of bool were optimized as std::vector<bool> does.
368 tmp->pushBack(AtomAnyPtr(AtomAny::New(false))); tmp->pushBack(AtomAnyPtr(AtomAny::New(true))); tmp->pushBack(AtomAnyPtr(AtomAny::New(false)));
369 tmp->pushBack(AtomAnyPtr(AtomAny::New(true)));
370 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
371 CPPUNIT_ASSERT((*tmp)[0]->getBoolValue() && !(*tmp)[1]->getBoolValue() && (*tmp)[2]->getBoolValue() && (*tmp)[3]->getBoolValue() && (*tmp)[4]->getBoolValue());
372 CPPUNIT_ASSERT(!(*tmp)[5]->getBoolValue() && (*tmp)[6]->getBoolValue() && !(*tmp)[7]->getBoolValue() && (*tmp)[8]->getBoolValue());
375 vec3.push_back(2); vec3.push_back(5); vec3.push_back(7); vec3.push_back(1); vec3.push_back(66); vec3.push_back(26);
376 tmp=SequenceAny::New(vec3);
377 CPPUNIT_ASSERT_EQUAL(6,(int)tmp->size());
378 CPPUNIT_ASSERT_EQUAL(26,(*tmp)[5]->getIntValue());
380 CPPUNIT_ASSERT_EQUAL(5,(int)tmp->size());
383 vec4.push_back(2.78); vec4.push_back(3.14); vec4.push_back(0.07);
384 tmp=SequenceAny::New(vec4);
385 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
386 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.07,(*tmp)[2]->getDoubleValue(),1e-12);
388 CPPUNIT_ASSERT_EQUAL(2,(int)tmp->size());
389 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp)[1]->getDoubleValue(),1e-12);
392 void EngineTest::checkAny4()
394 SequenceAnyPtr tmp(SequenceAny::New(Runtime::_tc_int,8));
395 tmp=SequenceAny::New(Runtime::_tc_int,4);
396 tmp=SequenceAny::New(Runtime::_tc_int);
397 tmp=SequenceAny::New(Runtime::_tc_int,7);
398 AnyPtr tmp2=AtomAny::New(107);
399 tmp->setEltAtRank(3,tmp2);
400 CPPUNIT_ASSERT_EQUAL(107,(*tmp)[3]->getIntValue());
401 tmp=SequenceAny::New(Runtime::_tc_string,2);
402 const char tmpSt[]="titi";
403 tmp2=AtomAny::New((char*)tmpSt,0);
404 tmp->setEltAtRank(1,tmp2);
405 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="titi");
407 vec4.push_back(2.78); vec4.push_back(3.14); vec4.push_back(0.07);
408 tmp2=SequenceAny::New(vec4);
409 tmp=SequenceAny::New(tmp2->getType(),3);
410 tmp->setEltAtRank(0,tmp2);
411 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp)[0][1]->getDoubleValue(),1e-12);
412 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
414 CPPUNIT_ASSERT_EQUAL(0,(int)tmp->size());
417 CPPUNIT_ASSERT_EQUAL(2,(int)tmp->size());
418 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp)[1][1]->getDoubleValue(),1e-12);
422 * Testing Any::operator ==
424 void EngineTest::checkAny5()
427 AnyPtr tmp1=AtomAny::New(107);
428 AnyPtr tmp2=AtomAny::New(107);
429 CPPUNIT_ASSERT( *tmp1==*tmp2 );
430 tmp1=AtomAny::New(106);
431 CPPUNIT_ASSERT( ! (*tmp1==*tmp2) );
432 CPPUNIT_ASSERT( ! (*tmp2==*tmp1) );
433 tmp1=AtomAny::New("toto");
434 CPPUNIT_ASSERT( ! (*tmp1==*tmp2) );
435 tmp2=AtomAny::New("tot");
436 CPPUNIT_ASSERT( ! (*tmp1==*tmp2) );
437 tmp2=AtomAny::New("toto");
438 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
439 tmp1=AtomAny::New("mmmmmlll");
441 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
444 vec.push_back("tata00000"); vec.push_back("toto"); vec.push_back("tutu");
445 SequenceAnyPtr tmp3=(SequenceAny::New(vec));
446 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
447 CPPUNIT_ASSERT((*tmp3)[0]->getStringValue()=="tata00000");
448 CPPUNIT_ASSERT((*tmp3)[1]->getStringValue()=="toto");
449 CPPUNIT_ASSERT((*tmp3)[2]->getStringValue()=="tutu");
450 AnyPtr tmp4=tmp3->clone();
451 CPPUNIT_ASSERT( (*tmp3==*tmp4) );
452 CPPUNIT_ASSERT( (*tmp3==*tmp3) );
454 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
455 tmp1=AtomAny::New("tutu");
456 tmp3->pushBack(tmp1);
457 CPPUNIT_ASSERT( (*tmp3==*tmp4) );
458 tmp3->pushBack(tmp1);
459 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
461 CPPUNIT_ASSERT( *tmp3==*tmp4 );
463 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
464 tmp1=AtomAny::New("tutug");
465 tmp3->pushBack(tmp1);
466 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
470 * Test of ArrayAny. Only one level.
472 void EngineTest::checkAny6()
475 const int tab[lgth]={0,1,1,9,2,7,2,3};
476 const int tab2[lgth]={13,1,1,9,2,7,2,3};
477 ArrayAnyPtr tmp1(ArrayAny::New(tab,lgth));
478 ArrayAnyPtr tmp2(ArrayAny::New(tab,lgth));
479 CPPUNIT_ASSERT((*tmp1)[3]->getIntValue()==9);
480 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
481 CPPUNIT_ASSERT( (*tmp1==*tmp1) );
482 CPPUNIT_ASSERT( 8==tmp1->size() );
483 CPPUNIT_ASSERT( 8==tmp2->size() );
484 tmp2=ArrayAny::New(tab,lgth-1);
485 CPPUNIT_ASSERT( 7==tmp2->size() );
486 CPPUNIT_ASSERT( !(*tmp1==*tmp2) );
487 tmp2=ArrayAny::New(tab2,lgth);
488 CPPUNIT_ASSERT( !(*tmp1==*tmp2) );
489 tmp2=ArrayAny::New(tab,lgth);
490 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
491 ArrayAnyPtr tmp3=(ArrayAny *)tmp1->clone();
492 CPPUNIT_ASSERT( (*tmp1==*tmp3) );
493 CPPUNIT_ASSERT((*tmp3)[3]->getIntValue()==9); CPPUNIT_ASSERT((*tmp3)[4]->getIntValue()==2);
494 // Ok let's test with double.
495 const double tab3[lgth]={0.1,1.1,1.1,9.1,2.1,7.1,2.1,3.1};
496 const double tab4[lgth]={13.1,1.1,1.1,9.1,2.1,7.1,2.1,3.1};
497 ArrayAnyPtr tmp4(ArrayAny::New(tab3,lgth));
498 ArrayAnyPtr tmp5(ArrayAny::New(tab3,lgth));
499 CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp4)[3]->getDoubleValue(),9.1,1e-12);
500 CPPUNIT_ASSERT( (*tmp4==*tmp5) );
501 CPPUNIT_ASSERT( (*tmp4==*tmp4) );
502 CPPUNIT_ASSERT( 8==tmp4->size() );
503 CPPUNIT_ASSERT( 8==tmp5->size() );
504 tmp5=ArrayAny::New(tab3,lgth-1);
505 CPPUNIT_ASSERT( 7==tmp5->size() );
506 CPPUNIT_ASSERT( !(*tmp4==*tmp5) );
507 tmp5=ArrayAny::New(tab4,lgth);
508 CPPUNIT_ASSERT( !(*tmp4==*tmp5) );
509 tmp5=ArrayAny::New(tab3,lgth);
510 CPPUNIT_ASSERT( (*tmp4==*tmp5) );
511 ArrayAnyPtr tmp6=(ArrayAny *)tmp4->clone();
512 CPPUNIT_ASSERT( (*tmp4==*tmp6) );
513 CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp6)[3]->getDoubleValue(),9.1,1e-12);
514 CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp6)[4]->getDoubleValue(),2.1,1e-12);
515 //Ok let's test with bool.
516 const bool tab5[lgth]={false,true,false,true,false,false,false,false};
517 const bool tab6[lgth]={true ,true,false,true,false,false,false,false};
518 ArrayAnyPtr tmp7(ArrayAny::New(tab5,lgth));
519 ArrayAnyPtr tmp8(ArrayAny::New(tab5,lgth));
520 CPPUNIT_ASSERT((*tmp7)[3]->getBoolValue());
521 CPPUNIT_ASSERT( (*tmp7==*tmp8) );
522 CPPUNIT_ASSERT( (*tmp7==*tmp7) );
523 CPPUNIT_ASSERT( 8==tmp7->size() );
524 CPPUNIT_ASSERT( 8==tmp8->size() );
525 tmp8=ArrayAny::New(tab5,lgth-1);
526 CPPUNIT_ASSERT( 7==tmp8->size() );
527 CPPUNIT_ASSERT( !(*tmp7==*tmp8) );
528 tmp8=ArrayAny::New(tab6,lgth);
529 CPPUNIT_ASSERT( !(*tmp7==*tmp8) );
530 tmp8=ArrayAny::New(tab5,lgth);
531 CPPUNIT_ASSERT( (*tmp7==*tmp8) );
532 ArrayAnyPtr tmp9=(ArrayAny *)tmp7->clone();
533 CPPUNIT_ASSERT( (*tmp9==*tmp7) );
534 CPPUNIT_ASSERT((*tmp8)[3]->getBoolValue());
535 CPPUNIT_ASSERT(!(*tmp8)[4]->getBoolValue());
536 //Ok let's test with strings.
537 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";
538 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";
539 ArrayAnyPtr tmp10(ArrayAny::New(tab7));
540 ArrayAnyPtr tmp11(ArrayAny::New(tab7));
541 CPPUNIT_ASSERT((*tmp10)[3]->getStringValue()=="jkl");
542 CPPUNIT_ASSERT( (*tmp10==*tmp11) );
543 CPPUNIT_ASSERT( (*tmp10==*tmp10) );
544 CPPUNIT_ASSERT( 8==tmp10->size() );
545 CPPUNIT_ASSERT( 8==tmp11->size() );
546 vector<string> tab9(tab7); tab9.pop_back();
547 tmp11=ArrayAny::New(tab9);
548 CPPUNIT_ASSERT( 7==tmp11->size() );
549 CPPUNIT_ASSERT( !(*tmp10==*tmp11) );
550 tmp11=ArrayAny::New(tab8);
551 CPPUNIT_ASSERT( !(*tmp10==*tmp11) );
552 tmp11=ArrayAny::New(tab7);
553 CPPUNIT_ASSERT( (*tmp10==*tmp11) );
554 ArrayAnyPtr tmp12=(ArrayAny *)tmp10->clone();
555 CPPUNIT_ASSERT( (*tmp12==*tmp10) );
556 CPPUNIT_ASSERT((*tmp11)[3]->getStringValue()=="jkl");
557 CPPUNIT_ASSERT((*tmp11)[4]->getStringValue()=="mno");
561 * Test of ArrayAny on multi-levels. To test recursion.
563 void EngineTest::checkAny7()
566 const int tab1[lgth]={0,1,1,9,2,7,2,3};
567 const int tab2[lgth]={7,8,8,16,9,14,9,10};
568 //Testing Arrays of arrays
569 ArrayAnyPtr tmp11(ArrayAny::New(tab1,lgth));
570 ArrayAnyPtr tmp12(ArrayAny::New(tab2,lgth));
571 ArrayAnyPtr tmp12Throw(ArrayAny::New(tab2,lgth+1));
572 ArrayAnyPtr tmp2(ArrayAny::New(tmp11->getType(),2));
573 tmp2->setEltAtRank(0,tmp11);
574 CPPUNIT_ASSERT_THROW(tmp2->setEltAtRank(1,tmp12Throw),Exception);
575 tmp2->setEltAtRank(1,tmp12);
576 CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
577 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
578 // Show deep copy process of arrays
579 AnyPtr tmp=AtomAny::New(49);
580 tmp11->setEltAtRank(0,tmp);
581 CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
582 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
583 ArrayAnyPtr tmp2Cloned=(ArrayAny *)(tmp2->clone());
584 CPPUNIT_ASSERT_EQUAL(0,(*tmp2Cloned)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2Cloned)[1][0]->getIntValue());
585 CPPUNIT_ASSERT_EQUAL(9,(*tmp2Cloned)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2Cloned)[1][3]->getIntValue());
586 CPPUNIT_ASSERT( *tmp2==*tmp2Cloned );
587 CPPUNIT_ASSERT( *tmp2==*tmp2 );
588 //Testing Array of Sequences
589 SequenceAnyPtr tmp13(SequenceAny::New((int *)tab1,lgth,0));
590 SequenceAnyPtr tmp14(SequenceAny::New((int *)tab2,lgth,0));
591 tmp2=ArrayAny::New(tmp13->getType(),2);
592 tmp2->setEltAtRank(0,tmp13);
593 tmp2->setEltAtRank(1,tmp14);
594 CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
595 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
596 tmp13->setEltAtRank(0,tmp);
597 // No deep copy here contrary to 14 lines ahead.
598 CPPUNIT_ASSERT_EQUAL(49,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
599 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
600 tmp2Cloned=(ArrayAny *)(tmp2->clone());
601 CPPUNIT_ASSERT_EQUAL(49,(*tmp2Cloned)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2Cloned)[1][0]->getIntValue());
602 CPPUNIT_ASSERT_EQUAL(9,(*tmp2Cloned)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2Cloned)[1][3]->getIntValue());
603 CPPUNIT_ASSERT( *tmp2==*tmp2Cloned );
604 CPPUNIT_ASSERT( *tmp2==*tmp2 );
605 //Testing Sequence of array
606 tmp13=SequenceAny::New(tmp11->getType(),2);
607 tmp13->setEltAtRank(0,tmp11);
608 tmp13->setEltAtRank(1,tmp12);
609 CPPUNIT_ASSERT_EQUAL(49,(*tmp13)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp13)[1][0]->getIntValue());
610 CPPUNIT_ASSERT_EQUAL(9,(*tmp13)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp13)[1][3]->getIntValue());
611 tmp14=(SequenceAny *)tmp13->clone();
612 CPPUNIT_ASSERT_EQUAL(49,(*tmp14)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp14)[1][0]->getIntValue());
613 CPPUNIT_ASSERT_EQUAL(9,(*tmp14)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp14)[1][3]->getIntValue());
614 CPPUNIT_ASSERT( *tmp13==*tmp14 );
615 CPPUNIT_ASSERT( *tmp13==*tmp13 );
619 * First test of structs.
621 void EngineTest::checkAny8()
623 TypeCodeStruct *tc=new TypeCodeStruct("","");
624 tc->addMember("MyInt",Runtime::_tc_int);
625 tc->addMember("MyDouble",Runtime::_tc_double);
626 tc->addMember("MyBool",Runtime::_tc_bool);
627 tc->addMember("MyStr",Runtime::_tc_string);
628 StructAnyPtr tmp1=StructAny::New(tc);
629 tmp1=StructAny::New(tc);
630 AnyPtr tmpAtom=AtomAny::New(3791);
631 tmp1->setEltAtRank("MyInt",tmpAtom);
632 CPPUNIT_ASSERT_THROW(tmp1->setEltAtRank(1,tmpAtom),Exception);
633 tmpAtom=AtomAny::New(3.14);
634 CPPUNIT_ASSERT_THROW(tmp1->setEltAtRank("MyDoubl",tmpAtom),Exception);
635 tmp1->setEltAtRank("MyDouble",tmpAtom);
636 tmpAtom=AtomAny::New(false);
637 tmp1->setEltAtRank("MyBool",tmpAtom);
638 tmpAtom=AtomAny::New("abcdef");
639 tmp1->setEltAtRank("MyStr",tmpAtom);
640 CPPUNIT_ASSERT_EQUAL(3791,(*tmp1)["MyInt"]->getIntValue());
641 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp1)["MyDouble"]->getDoubleValue(),1e-12);
642 CPPUNIT_ASSERT_THROW((*tmp1)["MyIntT"],Exception);
643 CPPUNIT_ASSERT(!(*tmp1)["MyBool"]->getBoolValue());
644 CPPUNIT_ASSERT_THROW((*tmp1)["MyBool"]->getStringValue(),Exception);
645 CPPUNIT_ASSERT((*tmp1)["MyStr"]->getStringValue()=="abcdef");
646 tmpAtom=AtomAny::New("ghijklm");
647 tmp1->setEltAtRank("MyStr",tmpAtom);
648 CPPUNIT_ASSERT((*tmp1)["MyStr"]->getStringValue()=="ghijklm");
649 //Introduce some recursive structure.
650 SequenceAnyPtr tmp2=SequenceAny::New(tc,2);
651 tmp2->setEltAtRank(0,tmp1);
652 tmpAtom=AtomAny::New("opqrst");
653 tmp1->setEltAtRank("MyStr",tmpAtom);
654 tmp2->setEltAtRank(1,tmp1);
655 CPPUNIT_ASSERT_EQUAL(3791,(*tmp2)[1]["MyInt"]->getIntValue());
656 CPPUNIT_ASSERT((*tmp2)[0]["MyStr"]->getStringValue()=="ghijklm");
657 CPPUNIT_ASSERT((*tmp2)[1]["MyStr"]->getStringValue()=="opqrst");
658 CPPUNIT_ASSERT(*tmp2==*tmp2);
659 AnyPtr tmp3=tmp2->clone();
660 CPPUNIT_ASSERT(*tmp2==*tmp3);
661 CPPUNIT_ASSERT((*tmp3)[0]["MyStr"]->getStringValue()=="ghijklm");
662 CPPUNIT_ASSERT((*tmp3)[1]["MyStr"]->getStringValue()=="opqrst");
666 void EngineTest::checkInGateOutGate()
668 string nodeName = "Node1";
669 ElementaryNode* node1 = new TestElemNode(nodeName);
670 _nodeMap[nodeName] = node1;
673 ElementaryNode* node2 = new TestElemNode(nodeName);
674 _nodeMap[nodeName] = node2;
676 DEBTRACE(" --- check InGate OK after node creation" );
678 InGate *node1Ingate = node1->getInGate();
679 CPPUNIT_ASSERT(node1Ingate);
680 string name=node1Ingate->getNameOfTypeOfCurrentInstance();
681 string expected="InGate";
682 CPPUNIT_ASSERT_EQUAL(name,expected);
685 DEBTRACE(" --- check OutGate OK after node creation" );
687 OutGate *node1Outgate = node1->getOutGate();
688 CPPUNIT_ASSERT(node1Outgate);
689 string name=node1Outgate->getNameOfTypeOfCurrentInstance();
690 string expected="OutGate";
691 CPPUNIT_ASSERT_EQUAL(name,expected);
695 void EngineTest::checkNodePortNumber()
697 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
699 DEBTRACE(" --- check number of ports = 0 after node creation" );
700 CPPUNIT_ASSERT(node1->getNumberOfInputPorts() == 0);
701 CPPUNIT_ASSERT(node1->getNumberOfOutputPorts() == 0);
703 InputPort *in1 = node1->edAddInputPort("ib1",_tc_bool);
704 InputPort *in2 = node1->edAddInputPort("ii1",_tc_int);
705 InputPort *in3 = node1->edAddInputPort("ii2",_tc_int);
706 InputPort *in4 = node1->edAddInputPort("id1",_tc_double);
708 OutputPort *ou1 = node1->edAddOutputPort("ob1",_tc_bool);
709 OutputPort *ou2 = node1->edAddOutputPort("oi1",_tc_int);
710 OutputPort *ou3 = node1->edAddOutputPort("od1",_tc_double);
712 DEBTRACE(" --- check number of ports after ports creation" );
713 // DEBTRACE(" node1->getNumberOfInputPorts(): "
714 // << node1->getNumberOfInputPorts());
715 // DEBTRACE(" node1->getNumberOfOutputPorts(): "
716 // << node1->getNumberOfOutputPorts());
717 CPPUNIT_ASSERT(node1->getNumberOfInputPorts() == 4);
718 CPPUNIT_ASSERT(node1->getNumberOfOutputPorts() == 3);
721 void EngineTest::checkPortTypeName()
723 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
725 DEBTRACE(" --- check InputPort name OK" );
727 string name=node1->getInputPort("ib1")->NAME;
728 string expected="InputPort";
729 CPPUNIT_ASSERT_EQUAL(name,expected);
732 DEBTRACE(" --- check OutputPort name OK" );
734 string name=node1->getOutputPort("ob1")->NAME;
735 string expected="OutputPort";
736 CPPUNIT_ASSERT_EQUAL(name,expected);
740 void EngineTest::checkDuplicatePortName()
742 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
743 DEBTRACE(" --- check duplicated name throws exception" );
744 CPPUNIT_ASSERT_THROW(InputPort *in5=node1->edAddInputPort("ii2",_tc_int),
748 void EngineTest::checkRemovePort()
750 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
751 ElementaryNode* node2 = (ElementaryNode*) _nodeMap["Node2"];
753 DEBTRACE(" --- check remove port" );
755 node1->edRemovePort(node1->getInputPort("ib1"));
756 CPPUNIT_ASSERT(node1->getNumberOfInputPorts() == 3);
757 CPPUNIT_ASSERT(node1->getNumberOfOutputPorts() == 3);
760 DEBTRACE(" --- check remove wrong port throws exception" )
762 CPPUNIT_ASSERT_THROW(node1->edRemovePort(node1->getInputPort("ib1")),
767 void EngineTest::checkAddNodesToBloc()
769 DEBTRACE(" --- delete node; // ====== NOT OK : done by bloc" );
771 for (int i=0; i<10; i++)
776 ElementaryNode* node = new TestElemNode(s);
778 InputPort *i1 = node->edAddInputPort("ib1",_tc_bool);
779 InputPort *i2 = node->edAddInputPort("ii1",_tc_int);
780 InputPort *i3 = node->edAddInputPort("ii2",_tc_int);
781 InputPort *i4 = node->edAddInputPort("id1",_tc_double);
782 OutputPort *o1 = node->edAddOutputPort("ob1",_tc_bool);
783 OutputPort *o2 = node->edAddOutputPort("oi1",_tc_int);
784 OutputPort *o3 = node->edAddOutputPort("od1",_tc_double);
787 DEBTRACE(" --- create bloc, add two nodes, check constituants" );
789 Bloc* bloc1 = new Bloc("bloc1");
790 _nodeMap["bloc1"] = bloc1;
791 _compoMap["bloc1"] = bloc1;
792 bloc1->edAddChild(_nodeMap["Node_1"]);
793 bloc1->edAddChild(_nodeMap["Node_2"]);
795 list<ElementaryNode *> setelem = bloc1->getRecursiveConstituents();
796 CPPUNIT_ASSERT(setelem.size() == 2);
800 void EngineTest::checkAddingTwiceSameNodeInSameBloc()
802 DEBTRACE(" --- add the same node two times does nothing: return false" );
804 CPPUNIT_ASSERT(! ((Bloc*)_compoMap["bloc1"])->edAddChild(_nodeMap["Node_1"]));
807 void EngineTest::checkAddingTwiceSameNodeInTwoBlocs()
809 DEBTRACE(" --- add a node already used elsewhere raises exception" );
811 Bloc* bloc2 = new Bloc("bloc2");
812 _nodeMap["bloc2"] = bloc2;
813 _compoMap["bloc2"] = bloc2;
814 bloc2->edAddChild(_nodeMap["Node_3"]);
816 CPPUNIT_ASSERT_THROW(bloc2->edAddChild(_nodeMap["Node_1"]),
821 void EngineTest::checkRecursiveBlocs_NumberOfNodes()
823 Bloc *bloc1 = (Bloc*)_compoMap["bloc1"];
824 Bloc *bloc2 = (Bloc*)_compoMap["bloc2"];
826 DEBTRACE(" --- recursive blocs, check constituants" );
828 Bloc* bloc3 = new Bloc("bloc3");
829 _nodeMap["bloc3"] = bloc3;
830 _compoMap["bloc3"] = bloc3;
831 bloc3->edAddChild((bloc1)); // 2 elementary nodes
832 bloc3->edAddChild((bloc2)); // 1 elementary node
833 bloc3->edAddChild(_nodeMap["Node_4"]); // 1 elementary node
835 list<ElementaryNode *> setelem = bloc3->getRecursiveConstituents();
836 CPPUNIT_ASSERT(setelem.size() == 4);
837 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
839 DEBTRACE(" elem name = " << (*it)->getName());
844 void EngineTest::checkRecursiveBlocs_NumberOfPorts()
846 Bloc *bloc3 = (Bloc*)_compoMap["bloc3"];
848 DEBTRACE(" --- recursive blocs, check input & output ports // COMPLETER" );
849 CPPUNIT_ASSERT(bloc3->getNumberOfInputPorts() == 4*4);
850 DEBTRACE(" number of input ports: " << bloc3->getNumberOfInputPorts());
851 DEBTRACE(" number of output ports: " << bloc3->getNumberOfOutputPorts());
853 list<InputPort *> inset = bloc3->getSetOfInputPort();
854 list<OutputPort *> outset = bloc3->getSetOfOutputPort();
855 for (list<InputPort *>::iterator it=inset.begin(); it!=inset.end(); it++)
857 DEBTRACE(" input port name = " << bloc3->getInPortName(*it));
859 for (list<OutputPort *>::iterator it=outset.begin(); it!=outset.end(); it++)
861 DEBTRACE(" output port name = " << bloc3->getOutPortName(*it));
866 void EngineTest::checkPortNameInBloc()
869 DEBTRACE(" --- recursive blocs, check port names" );
871 InputPort *inport = _nodeMap["Node_1"]->getInputPort("id1");
872 CPPUNIT_ASSERT(_nodeMap["bloc3"]->getInPortName(inport) == "bloc1.Node_1.id1");
873 CPPUNIT_ASSERT(((Bloc*)_nodeMap["bloc3"])->getChildName(_nodeMap["Node_1"]) == "bloc1.Node_1");
876 void EngineTest::checkGetNameOfPortNotInBloc()
878 InputPort *inport = _nodeMap["Node_5"]->getInputPort("id1");
879 CPPUNIT_ASSERT_THROW(string name = _nodeMap["bloc3"]->getInPortName(inport),
883 void EngineTest::checkRemoveNode()
885 DEBTRACE(" --- bloc and port inventory must be OK after bloc remove" );
887 Bloc* bloc = new Bloc("blocR");
888 _nodeMap["blocR"] = bloc;
889 _compoMap["blocR"] = bloc;
890 bloc->edAddChild(_nodeMap["Node_5"]);
891 bloc->edAddChild(_nodeMap["Node_6"]);
892 bloc->edAddChild(_nodeMap["Node_7"]);
895 list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
896 CPPUNIT_ASSERT(setelem.size() == 3);
898 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
900 DEBTRACE(" elem name = " << (*it)->getName());
904 ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_6"]);
907 list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
908 CPPUNIT_ASSERT(setelem.size() == 2);
909 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
911 DEBTRACE(" elem name = " << (*it)->getName());
912 DEBTRACE(" elem name in Bloc = " << ((Bloc *)_nodeMap["blocR"])->getChildName(*it));
917 list<InputPort *> inset = _nodeMap["blocR"]->getSetOfInputPort();
918 list<OutputPort *> outset = _nodeMap["blocR"]->getSetOfOutputPort();
919 CPPUNIT_ASSERT(inset.size() == 8);
920 CPPUNIT_ASSERT(outset.size() == 6);
921 for (list<InputPort *>::iterator it=inset.begin(); it!=inset.end(); it++)
923 DEBTRACE(" input port name for blocR = " << _nodeMap["blocR"]->getInPortName(*it));
925 for (list<OutputPort *>::iterator it=outset.begin(); it!=outset.end(); it++)
927 DEBTRACE(" output port name for blocR = " << _nodeMap["blocR"]->getOutPortName(*it));
931 ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_5"]);
932 ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_7"]);
934 list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
935 CPPUNIT_ASSERT(setelem.size() == 0);
939 void EngineTest::RecursiveBlocs_multipleRecursion()
942 Bloc* bloc = new Bloc("bloc4");
943 _nodeMap["bloc4"] = bloc;
944 _compoMap["bloc4"] = bloc;
945 bloc->edAddChild(_nodeMap["Node_5"]);
946 bloc->edAddChild(_nodeMap["Node_6"]);
950 Bloc* bloc = new Bloc("bloc5");
951 _nodeMap["bloc5"] = bloc;
952 _compoMap["bloc5"] = bloc;
953 bloc->edAddChild(_nodeMap["Node_7"]);
954 bloc->edAddChild(_nodeMap["Node_8"]);
958 Bloc* bloc = new Bloc("bloc6");
959 _nodeMap["bloc6"] = bloc;
960 _compoMap["bloc6"] = bloc;
961 bloc->edAddChild(_nodeMap["bloc4"]);
962 bloc->edAddChild(_nodeMap["bloc5"]);
966 Bloc* bloc = new Bloc("bloc7");
967 _nodeMap["bloc7"] = bloc;
968 _compoMap["bloc7"] = bloc;
969 bloc->edAddChild(_nodeMap["bloc3"]);
970 bloc->edAddChild(_nodeMap["bloc6"]);
974 Bloc* bloc = new Bloc("graphe");
975 _nodeMap["graphe"] = bloc;
976 _compoMap["graphe"] = bloc;
977 bloc->edAddChild(_nodeMap["bloc7"]);
978 bloc->edAddChild(_nodeMap["Node_9"]);
982 list<ElementaryNode *> setelem = _nodeMap["graphe"]->getRecursiveConstituents();
983 CPPUNIT_ASSERT(setelem.size() == 9);
984 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
986 DEBTRACE(" elem name = " << (*it)->getName());
991 list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
992 list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
993 for (list<InputPort *>::iterator it=inset.begin(); it!=inset.end(); it++)
995 DEBTRACE(" input port name for bloc7 = " << _nodeMap["bloc7"]->getInPortName(*it));
996 DEBTRACE(" input port name for graphe = " << _nodeMap["graphe"]->getInPortName(*it));
998 for (list<OutputPort *>::iterator it=outset.begin(); it!=outset.end(); it++)
1000 DEBTRACE(" output port name for bloc7 = " << _nodeMap["bloc7"]->getOutPortName(*it));
1001 DEBTRACE(" output port name for graphe = " << _nodeMap["graphe"]->getOutPortName(*it));
1003 YACS::ENGINE::VisitorSaveState vst(_compoMap["graphe"]);
1004 std::string logDir = std::string("/tmp/")+ getlogin();
1005 std::string cmd = "mkdir -p " + logDir;
1006 system( cmd.c_str() );
1007 vst.openFileDump(logDir + std::string("/RecursiveBlocs_multipleRecursion_dumpState.xml"));
1008 _compoMap["graphe"]->accept(&vst);
1009 vst.closeFileDump();
1013 void EngineTest::RecursiveBlocs_removeNodes()
1016 // set<Node *> setNodes = ((Bloc*)_nodeMap["graphe"])->getChildren();
1017 // for (set<Node*>::iterator it=setNodes.begin(); it!=setNodes.end(); it++)
1019 // DEBTRACE(" child name = " << (*it)->getName());
1024 list<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
1025 CPPUNIT_ASSERT(setNode.size() == 16);
1026 list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
1027 list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
1028 DEBTRACE(" input port number in graph: " <<inset.size());
1029 DEBTRACE(" output port number in graph: " <<outset.size());
1030 CPPUNIT_ASSERT(inset.size() == 32);
1031 CPPUNIT_ASSERT(outset.size() == 24);
1034 ((Bloc *)_nodeMap["bloc7"])->edRemoveChild(_nodeMap["bloc6"]);
1037 list<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
1038 CPPUNIT_ASSERT(setNode.size() == 9);
1039 for (list<Node*>::iterator it=setNode.begin(); it!=setNode.end(); it++)
1041 DEBTRACE(" elem name = " << ((Bloc *)_nodeMap["graphe"])->getChildName(*it));
1043 list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
1044 list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
1045 DEBTRACE(" input port number in graph: " <<inset.size());
1046 DEBTRACE(" output port number in graph: " <<outset.size());
1047 CPPUNIT_ASSERT(inset.size() == 16);
1048 CPPUNIT_ASSERT(outset.size() == 12);
1053 void EngineTest::checkLogger()
1055 Proc* proc=new Proc("proc");
1056 Logger* logger=proc->getLogger("parser");
1057 logger->error("error1","file.cxx",324);
1058 logger->error("error2","file.cxx",852);
1059 CPPUNIT_ASSERT(logger->hasErrors()==true);
1060 CPPUNIT_ASSERT(logger->isEmpty()==false);
1061 const char* expected1="LogRecord: parser:ERROR:error1 (file.cxx:324)\n"
1062 "LogRecord: parser:ERROR:error2 (file.cxx:852)\n";
1063 CPPUNIT_ASSERT(logger->getStr()==expected1);
1066 CPPUNIT_ASSERT(logger->hasErrors()==false);
1067 CPPUNIT_ASSERT(logger->isEmpty()==true);
1069 logger->error("error1","file.cxx",324);
1070 logger->error("error2","file.cxx",852);
1071 logger->error("error3","file.cxx",978);
1072 CPPUNIT_ASSERT(logger->hasErrors()==true);
1073 CPPUNIT_ASSERT(logger->isEmpty()==false);
1074 const char* expected2="LogRecord: parser:ERROR:error1 (file.cxx:324)\n"
1075 "LogRecord: parser:ERROR:error2 (file.cxx:852)\n"
1076 "LogRecord: parser:ERROR:error3 (file.cxx:978)\n";
1077 CPPUNIT_ASSERT(logger->getStr()==expected2);
1081 void EngineTest::checkGraphAnalyser0()
1084 static const int N=2;
1087 for(int i=0;i<N;i++)
1089 std::ostringstream oss; oss << "n" << i+1;
1090 t[i]=new Bloc(oss.str());
1091 proc.edAddChild(t[i]);
1093 proc.edAddCFLink(t[0],t[1]);
1094 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1095 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1096 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1097 SetOfPoints sop(r[0]);
1099 CPPUNIT_ASSERT(sop.getRepr()=="(n1+n2) - ");
1103 void EngineTest::checkGraphAnalyser1()
1106 static const int N=24;
1109 for(int i=0;i<N;i++)
1111 std::ostringstream oss; oss << "n" << i+1;
1112 t[i]=new Bloc(oss.str());
1113 proc.edAddChild(t[i]);
1115 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]);
1116 proc.edAddCFLink(t[14],t[13]); proc.edAddCFLink(t[13],t[5]);
1117 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]);
1118 proc.edAddCFLink(t[11],t[10]); proc.edAddCFLink(t[10],t[8]);
1119 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]);
1120 proc.edAddCFLink(t[19],t[18]); proc.edAddCFLink(t[18],t[4]);
1121 proc.edAddCFLink(t[19],t[3]); proc.edAddCFLink(t[3],t[4]);
1122 proc.edAddCFLink(t[22],t[21]);
1123 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1124 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1125 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1126 SetOfPoints sop(r[0]);
1128 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)) - ");
1132 static const int N=10;
1135 for(int i=0;i<N;i++)
1137 std::ostringstream oss; oss << "n" << i+1;
1138 t[i]=new Bloc(oss.str());
1139 proc.edAddChild(t[i]);
1141 proc.edAddCFLink(t[9],t[0]); proc.edAddCFLink(t[0],t[2]); proc.edAddCFLink(t[2],t[4]); proc.edAddCFLink(t[4],t[5]);
1142 proc.edAddCFLink(t[0],t[1]); proc.edAddCFLink(t[1],t[6]); proc.edAddCFLink(t[6],t[7]); proc.edAddCFLink(t[7],t[5]);
1143 proc.edAddCFLink(t[0],t[8]); proc.edAddCFLink(t[8],t[3]); proc.edAddCFLink(t[3],t[4]);
1144 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1145 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1146 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1147 SetOfPoints sop(r[0]);
1149 CPPUNIT_ASSERT(sop.getRepr()=="((n10+n1)+[([(n9+n4)*n3]+n5)*(n2+n7+n8)]+n6) - ");
1153 void EngineTest::checkGraphAnalyser2()
1156 static const int N=8;
1159 for(int i=0;i<N;i++)
1161 std::ostringstream oss; oss << "n" << i+1;
1162 t[i]=new Bloc(oss.str());
1163 proc.edAddChild(t[i]);
1165 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]);
1166 proc.edAddCFLink(t[4],t[2]); proc.edAddCFLink(t[2],t[3]); proc.edAddCFLink(t[3],t[5]);
1167 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1168 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1169 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1170 SetOfPoints sop(r[0]);
1172 CPPUNIT_ASSERT(sop.getRepr()=="((n8+n5)+[(n1+n2)*(n3+n4)]+(n6+n7)) - ");
1176 static const int NN=6;
1178 Bloc proc2("proc2");
1179 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");
1180 for(int i=0;i<NN;i++)
1181 proc2.edAddChild(tt[i]);
1182 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]);
1183 std::vector< std::list<Node *> > rr(proc2.splitIntoIndependantGraph());
1184 CPPUNIT_ASSERT_EQUAL(1,(int)rr.size());
1185 CPPUNIT_ASSERT_EQUAL(NN,(int)rr[0].size());
1186 SetOfPoints sop2(rr[0]);
1188 CPPUNIT_ASSERT(sop2.getRepr()=="([(n21+n21@1)*(n23+n23@1)]+(n22+n16)) - ");
1192 static const int NNN=6;
1194 Bloc proc3("proc3");
1195 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");
1196 for(int i=0;i<NNN;i++)
1197 proc3.edAddChild(ttt[i]);
1198 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]);
1199 std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
1200 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1201 CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
1202 SetOfPoints sop3(rrr[0]);
1204 CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
1208 void EngineTest::checkGraphAnalyser3()
1211 static const int NNN=6;
1213 Bloc proc3("proc3");
1214 for(int i=0;i<NNN;i++)
1216 std::ostringstream oss; oss << "n" << i+1;
1217 ttt[i]=new Bloc(oss.str());
1218 proc3.edAddChild(ttt[i]);
1220 proc3.edAddCFLink(ttt[0],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[4]);
1221 proc3.edAddCFLink(ttt[0],ttt[2]); proc3.edAddCFLink(ttt[2],ttt[3]); proc3.edAddCFLink(ttt[3],ttt[4]);
1222 proc3.edAddCFLink(ttt[5],ttt[3]);
1223 std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
1224 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1225 CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
1226 SetOfPoints sop3(rrr[0]);
1228 //std:cerr << std::endl << sop3.getRepr() << std::endl;
1229 //CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
1233 void EngineTest::checkGraphAnalyser4()
1236 static const int NNN=3;
1239 for(int i=0;i<NNN;i++)
1241 std::ostringstream oss; oss << "n" << i+1;
1242 ttt[i]=new Bloc(oss.str());
1243 proc3.edAddChild(ttt[i]);
1245 proc3.edAddCFLink(ttt[2],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[0]);
1246 std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
1247 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1248 CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
1249 SetOfPoints sop(rrr[0]);
1251 CPPUNIT_ASSERT(sop.getRepr()=="(n3+n2+n1) - ");
1256 * Case revealed by EmC2 on complex managers.
1257 * Here basic combination of Link/Fork is not enough.
1259 void EngineTest::checkGraphAnalyser5()
1263 std::vector<Bloc *> vn;
1264 std::vector<std::string> v{"A","E","C","F","D","G"};
1268 Bloc *pt(new Bloc(v[i++]));
1269 proc.edAddChild(pt);
1273 proc.edAddCFLink(vn[0],vn[1]);//A -> E
1274 proc.edAddCFLink(vn[0],vn[2]);//A -> C
1275 proc.edAddCFLink(vn[2],vn[3]);//C -> F
1276 proc.edAddCFLink(vn[2],vn[4]);//C -> D
1277 proc.edAddCFLink(vn[1],vn[3]);//E -> F
1278 proc.edAddCFLink(vn[3],vn[5]);//F -> G
1280 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1281 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1282 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1283 SetOfPoints sop(rrr[0]);
1285 CPPUNIT_ASSERT(sop.getRepr()=="((A+[C*E])+[(F+G)*[D*E]]) - ");
1290 std::vector<Bloc *> vn;
1291 std::vector<std::string> v{"A","E","C","B","F","D","G"};
1295 Bloc *pt(new Bloc(v[i++]));
1296 proc.edAddChild(pt);
1300 proc.edAddCFLink(vn[0],vn[1]);//A -> E
1301 proc.edAddCFLink(vn[0],vn[2]);//A -> C
1302 proc.edAddCFLink(vn[0],vn[3]);//A -> B
1303 proc.edAddCFLink(vn[3],vn[4]);//B -> F
1304 proc.edAddCFLink(vn[2],vn[4]);//C -> F
1305 proc.edAddCFLink(vn[2],vn[5]);//C -> D
1306 proc.edAddCFLink(vn[1],vn[4]);//E -> F
1307 proc.edAddCFLink(vn[4],vn[6]);//F -> G
1309 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1310 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1311 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1312 SetOfPoints sop(rrr[0]);
1314 //"(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - "
1315 CPPUNIT_ASSERT(sop.getRepr()=="[(A+[[B*C]*[C*E]]+(F+G))*D] - ");
1320 std::vector<Bloc *> vn;
1321 std::vector<std::string> v{"A","E","C","B","F","D","G"};
1325 Bloc *pt(new Bloc(v[i++]));
1326 proc.edAddChild(pt);
1330 proc.edAddCFLink(vn[0],vn[1]);//A -> E
1331 proc.edAddCFLink(vn[0],vn[2]);//A -> C
1332 proc.edAddCFLink(vn[0],vn[3]);//A -> B
1333 proc.edAddCFLink(vn[3],vn[4]);//B -> F
1334 proc.edAddCFLink(vn[2],vn[4]);//C -> F
1335 proc.edAddCFLink(vn[2],vn[5]);//C -> D
1336 proc.edAddCFLink(vn[1],vn[4]);//E -> F
1337 proc.edAddCFLink(vn[4],vn[6]);//F -> G
1339 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1340 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1341 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1342 SetOfPoints sop(rrr[0]);
1344 //"(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - "
1345 CPPUNIT_ASSERT(sop.getRepr()=="[(A+[[B*C]*[C*E]]+(F+G))*D] - ");
1350 std::vector<Bloc *> vn;
1351 std::vector<std::string> v{"A","I","E","C","B","J","F","H","D","G"};
1355 Bloc *pt(new Bloc(v[i++]));
1356 proc.edAddChild(pt);
1360 proc.edAddCFLink(vn[0],vn[1]);//A -> I
1361 proc.edAddCFLink(vn[0],vn[2]);//A -> E
1362 proc.edAddCFLink(vn[0],vn[3]);//A -> C
1363 proc.edAddCFLink(vn[0],vn[4]);//A -> B
1364 proc.edAddCFLink(vn[4],vn[6]);//B -> F
1365 proc.edAddCFLink(vn[3],vn[7]);//C -> H
1366 proc.edAddCFLink(vn[3],vn[6]);//C -> F
1367 proc.edAddCFLink(vn[3],vn[8]);//C -> D
1368 proc.edAddCFLink(vn[2],vn[6]);//E -> F
1369 proc.edAddCFLink(vn[6],vn[9]);//F -> G
1370 proc.edAddCFLink(vn[9],vn[5]);//G -> J
1371 proc.edAddCFLink(vn[7],vn[5]);//H -> J
1372 proc.edAddCFLink(vn[1],vn[5]);//I -> J
1374 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1375 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1376 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1377 SetOfPoints sop(rrr[0]);
1379 //"(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]]]]) - "
1380 CPPUNIT_ASSERT(sop.getRepr()=="[([(A+[([[B*C]*[C*E]]+(F+G))*[C*I]])*H]+J)*D] - ");
1385 std::vector<Bloc *> vn;
1386 std::vector<std::string> v{"A","I","E","C","B","J","F","H","D","K","G","L"};
1390 Bloc *pt(new Bloc(v[i++]));
1391 proc.edAddChild(pt);
1395 proc.edAddCFLink(vn[0],vn[1]);//A -> I
1396 proc.edAddCFLink(vn[0],vn[2]);//A -> E
1397 proc.edAddCFLink(vn[0],vn[3]);//A -> C
1398 proc.edAddCFLink(vn[0],vn[4]);//A -> B
1399 proc.edAddCFLink(vn[4],vn[6]);//B -> F
1400 proc.edAddCFLink(vn[3],vn[7]);//C -> H
1401 proc.edAddCFLink(vn[3],vn[6]);//C -> F
1402 proc.edAddCFLink(vn[3],vn[8]);//C -> D
1403 proc.edAddCFLink(vn[2],vn[6]);//E -> F
1404 proc.edAddCFLink(vn[6],vn[10]);//F -> G
1405 proc.edAddCFLink(vn[10],vn[5]);//G -> J
1406 proc.edAddCFLink(vn[7],vn[5]);//H -> J
1407 proc.edAddCFLink(vn[1],vn[5]);//I -> J
1408 proc.edAddCFLink(vn[5],vn[9]);//J -> K
1409 proc.edAddCFLink(vn[9],vn[11]);//K -> L
1411 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1412 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1413 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1414 SetOfPoints sop(rrr[0]);
1416 //"(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]]]]) - "
1417 CPPUNIT_ASSERT(sop.getRepr()=="[([(A+[([[B*C]*[C*E]]+(F+G))*[C*I]])*H]+(J+K+L))*D] - ");
1421 std::vector<Bloc *> vn;
1422 std::vector<std::string> v{"B","C","D","E","F","G","H","I","J","K"};
1426 Bloc *pt(new Bloc(v[i++]));
1427 proc.edAddChild(pt);
1431 proc.edAddCFLink(vn[0],vn[1]);//B -> C
1432 proc.edAddCFLink(vn[0],vn[3]);//B -> E
1433 proc.edAddCFLink(vn[0],vn[5]);//B -> G
1434 proc.edAddCFLink(vn[2],vn[3]);//D -> E
1435 proc.edAddCFLink(vn[4],vn[5]);//F -> G
1436 proc.edAddCFLink(vn[6],vn[7]);//H -> I
1437 proc.edAddCFLink(vn[0],vn[7]);//B -> I
1438 proc.edAddCFLink(vn[8],vn[9]);//J -> K
1439 proc.edAddCFLink(vn[0],vn[9]);//B -> K
1441 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1442 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1443 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1444 SetOfPoints sop(rrr[0]);
1446 CPPUNIT_ASSERT(sop.getRepr()=="[([B*D]+E)*([B*F]+G)*([B*H]+I)*([B*J]+K)*C] - ");