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"
49 #include "YacsTrace.hxx"
51 using namespace YACS::ENGINE;
55 map<string, Node*> EngineTest::_nodeMap;
56 map<string, ComposedNode*> EngineTest::_compoMap;
60 TypeCode *EngineTest::_tc_bool = new TypeCode(Bool);
61 TypeCode *EngineTest::_tc_int = new TypeCode(Int);
62 TypeCode *EngineTest::_tc_double = new TypeCode(Double);
65 void EngineTest::setUp()
69 void EngineTest::tearDown()
73 void EngineTest::cleanUp()
75 map<string, ComposedNode*>::iterator iter2,iter3;
76 for(map<string, Node*>::iterator iter=_nodeMap.begin();iter!=_nodeMap.end();iter++)
77 if((*iter).second->getFather()==0)
78 delete (*iter).second;
81 void EngineTest::checkGetRuntime()
83 CPPUNIT_ASSERT_THROW(Runtime *myrun = getRuntime(), YACS::Exception);
84 RuntimeForEngineTest::setRuntime();
85 Runtime *myrun1 = getRuntime();
86 CPPUNIT_ASSERT(myrun1);
87 Runtime *myrun2 = getRuntime();
88 CPPUNIT_ASSERT_EQUAL(myrun1, myrun2);
101 void EngineTest::checkAny1()
103 char *toto=new char[10];
104 strcpy(toto,"lkjlkj");
105 Any *tmp=AtomAny::New(toto,toto2);//no copy here
106 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
107 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
109 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
110 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
112 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
113 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
115 const char tmp2[]="coucou";
116 tmp=AtomAny::New((char *)tmp2,0);
117 CPPUNIT_ASSERT( tmp->getStringValue() == "coucou");
118 CPPUNIT_ASSERT( tmp->getStringValue() == "coucou");
120 tmp=AtomAny::New(string("abcdef"));
121 CPPUNIT_ASSERT( tmp->getStringValue() == "abcdef");
122 CPPUNIT_ASSERT( tmp->getStringValue() == "abcdef");
124 tmp=AtomAny::New("ghijk");
125 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
126 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
128 tmp=AtomAny::New((char *)"ghijk");
129 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
130 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
140 A7(double toto):_d(toto),_cnt(1) { }
141 static A7 *New(double toto) { return new A7(toto); }
142 double getToto() const { return _d; }
143 void setToto(double val) { _d=val; }
144 void incrRef() { _cnt++; }
157 void checkSharedPtrFct2(const A7& a)
162 void checkSharedPtrFct1(const SharedPtr<A7>& a)
164 checkSharedPtrFct2(a);
168 void EngineTest::checkSharedPtr()
170 SharedPtr<A7> titi=A7::New(5.);
171 SharedPtr<A7> toto=A7::New(5.1);
172 SharedPtr<A7> tutu(toto);
173 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.,titi->getToto(),1e-12);
175 CPPUNIT_ASSERT_DOUBLES_EQUAL(7.1,titi->getToto(),1e-12);
176 checkSharedPtrFct2(titi);
177 checkSharedPtrFct2(toto);
179 checkSharedPtrFct2(titi);
180 checkSharedPtrFct2(tutu);
183 void EngineTest::checkAny2()
185 double tabStack[8]={1.2, 3.4, 5.6, 7.8, 9.0, 2.3, 4.5, 6.7};
186 double *tabHeap=new double[8];
187 memcpy(tabHeap,tabStack,8*sizeof(double));
188 SequenceAnyPtr tmp(SequenceAny::New(tabStack,8,0));
189 CPPUNIT_ASSERT_EQUAL(8,(int)tmp->size());
190 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.6,(*tmp)[2]->getDoubleValue(),1e-12);
191 CPPUNIT_ASSERT_DOUBLES_EQUAL(6.7,(*tmp)[7]->getDoubleValue(),1e-12);
192 AtomAnyPtr tmp2(AtomAny::New(8.9));
194 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
195 tmp2=AtomAny::New(10.2);
197 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
198 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.9,(*tmp)[8]->getDoubleValue(),1e-12);
199 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.2,(*tmp)[9]->getDoubleValue(),1e-12);
201 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
202 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.9,(*tmp)[8]->getDoubleValue(),1e-12);
203 tmp2=AtomAny::New(10.3);
205 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
206 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.9,(*tmp)[8]->getDoubleValue(),1e-12);
207 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.3,(*tmp)[9]->getDoubleValue(),1e-12);
208 tmp=SequenceAny::New(tabHeap,8,toto2);
209 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.6,(*tmp)[2]->getDoubleValue(),1e-12);
210 CPPUNIT_ASSERT_DOUBLES_EQUAL(6.7,(*tmp)[7]->getDoubleValue(),1e-12);
211 tmp2=AtomAny::New(8.5);
213 tmp2=AtomAny::New(10.27);
215 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,(*tmp)[8]->getDoubleValue(),1e-12);
216 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.27,(*tmp)[9]->getDoubleValue(),1e-12);
217 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
219 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
220 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,(*tmp)[8]->getDoubleValue(),1e-12);
221 tmp2=AtomAny::New(10.445);
223 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
224 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,(*tmp)[8]->getDoubleValue(),1e-12);
225 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.445,(*tmp)[9]->getDoubleValue(),1e-12);
227 int tabStackI[8]={1, 3, 5, 7, 9, 2, 4, 6};
228 int *tabHeapI=new int[8];
229 memcpy(tabHeapI,tabStackI,8*sizeof(int));
230 tmp=SequenceAny::New(tabStackI,8,0);
231 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
232 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
233 tmp2=AtomAny::New(8);
235 tmp2=AtomAny::New(25);
237 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
238 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
239 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
240 CPPUNIT_ASSERT_EQUAL(25,(*tmp)[9]->getIntValue());
241 //Same with no copy constructor
242 tmp=SequenceAny::New(tabHeapI,8,toto3);
243 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
244 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
245 tmp2=AtomAny::New(8);
247 tmp2=AtomAny::New(27);
249 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
250 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
251 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
252 CPPUNIT_ASSERT_EQUAL(27,(*tmp)[9]->getIntValue());
253 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
255 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
256 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
257 tmp2=AtomAny::New(202);
259 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
260 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
261 CPPUNIT_ASSERT_EQUAL(202,(*tmp)[9]->getIntValue());
264 double d=(*tmp)[2]->getDoubleValue();
269 CPPUNIT_ASSERT(std::string(e.what())=="Value is not a double");
271 SequenceAnyPtr tmp3=SequenceAny::New(tmp->getType());
274 tmp3->pushBack(tmp2);
279 CPPUNIT_ASSERT(std::string(e.what())=="Invalid runtime of YACS::Any struct : having int and you want Sequence");
281 CPPUNIT_ASSERT_EQUAL(0,(int)tmp3->size());
282 CPPUNIT_ASSERT_EQUAL(202,(*tmp)[9]->getIntValue());
284 CPPUNIT_ASSERT_EQUAL(1,(int)tmp3->size());
285 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
286 tmp=SequenceAny::New(tabStackI,8,0);
288 CPPUNIT_ASSERT_EQUAL(2,(int)tmp3->size());
289 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
290 CPPUNIT_ASSERT_EQUAL(7,(*tmp3)[1][3]->getIntValue());
293 CPPUNIT_ASSERT_EQUAL(4,(int)tmp3->size());
294 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
295 CPPUNIT_ASSERT_EQUAL(7,(*tmp3)[1][3]->getIntValue());
296 CPPUNIT_ASSERT_EQUAL(7,(*tmp3)[3][3]->getIntValue());
297 tmp2=AtomAny::New(89);
299 CPPUNIT_ASSERT_EQUAL(4,(int)tmp3->size());
300 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
301 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
302 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[1][8]->getIntValue());
303 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[2][8]->getIntValue());
304 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[3][8]->getIntValue());
306 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
307 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
308 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
309 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[1][8]->getIntValue());
310 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[2][8]->getIntValue());
311 SequenceAnyPtr tmp4=(SequenceAny *)tmp3->clone();
312 CPPUNIT_ASSERT_EQUAL(3,(int)tmp4->size());
313 CPPUNIT_ASSERT_EQUAL(202,(*tmp4)[0][9]->getIntValue());
314 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[1][8]->getIntValue());
315 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[2][8]->getIntValue());
317 CPPUNIT_ASSERT_EQUAL(2,(int)tmp4->size());
318 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
319 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
320 CPPUNIT_ASSERT_EQUAL(202,(*tmp4)[0][9]->getIntValue());
321 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[1][8]->getIntValue());
322 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[1][8]->getIntValue());
324 tmp2=AtomAny::New(107);
326 CPPUNIT_ASSERT_EQUAL(2,(int)tmp4->size());
327 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
328 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
329 CPPUNIT_ASSERT_EQUAL(202,(*tmp4)[0][9]->getIntValue());
330 CPPUNIT_ASSERT_EQUAL(107,(*tmp3)[1][8]->getIntValue());//These 2 lines to show that deepCpy has been done
331 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[1][8]->getIntValue());
334 void EngineTest::checkAny3()
337 vec.push_back("tata00000"); vec.push_back("toto"); vec.push_back("tutu");
338 SequenceAnyPtr tmp(SequenceAny::New(vec));
339 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
340 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
341 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
342 CPPUNIT_ASSERT((*tmp)[2]->getStringValue()=="tutu");
343 tmp->pushBack(AtomAnyPtr(AtomAny::New("abcdefgh")));
344 CPPUNIT_ASSERT_EQUAL(4,(int)tmp->size());
345 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
346 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
347 CPPUNIT_ASSERT((*tmp)[2]->getStringValue()=="tutu");
348 CPPUNIT_ASSERT((*tmp)[3]->getStringValue()=="abcdefgh");
350 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
351 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
352 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
353 CPPUNIT_ASSERT((*tmp)[2]->getStringValue()=="tutu");
355 CPPUNIT_ASSERT_EQUAL(2,(int)tmp->size());
356 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
357 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
359 CPPUNIT_ASSERT_EQUAL(1,(int)tmp->size());
360 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
362 CPPUNIT_ASSERT_EQUAL(0,(int)tmp->size());
365 tmp=SequenceAny::New(vec2);
366 CPPUNIT_ASSERT_EQUAL(0,(int)tmp->size());
367 vec2.push_back(true); vec2.push_back(false); vec2.push_back(true); vec2.push_back(true); vec2.push_back(true);
368 tmp=SequenceAny::New(vec2);
369 CPPUNIT_ASSERT_EQUAL(5,(int)tmp->size());
370 CPPUNIT_ASSERT((*tmp)[0]->getBoolValue() && !(*tmp)[1]->getBoolValue() && (*tmp)[2]->getBoolValue() && (*tmp)[3]->getBoolValue() && (*tmp)[4]->getBoolValue());
371 //in perspective of SequenceAny of bool were optimized as std::vector<bool> does.
372 tmp->pushBack(AtomAnyPtr(AtomAny::New(false))); tmp->pushBack(AtomAnyPtr(AtomAny::New(true))); tmp->pushBack(AtomAnyPtr(AtomAny::New(false)));
373 tmp->pushBack(AtomAnyPtr(AtomAny::New(true)));
374 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
375 CPPUNIT_ASSERT((*tmp)[0]->getBoolValue() && !(*tmp)[1]->getBoolValue() && (*tmp)[2]->getBoolValue() && (*tmp)[3]->getBoolValue() && (*tmp)[4]->getBoolValue());
376 CPPUNIT_ASSERT(!(*tmp)[5]->getBoolValue() && (*tmp)[6]->getBoolValue() && !(*tmp)[7]->getBoolValue() && (*tmp)[8]->getBoolValue());
379 vec3.push_back(2); vec3.push_back(5); vec3.push_back(7); vec3.push_back(1); vec3.push_back(66); vec3.push_back(26);
380 tmp=SequenceAny::New(vec3);
381 CPPUNIT_ASSERT_EQUAL(6,(int)tmp->size());
382 CPPUNIT_ASSERT_EQUAL(26,(*tmp)[5]->getIntValue());
384 CPPUNIT_ASSERT_EQUAL(5,(int)tmp->size());
387 vec4.push_back(2.78); vec4.push_back(3.14); vec4.push_back(0.07);
388 tmp=SequenceAny::New(vec4);
389 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
390 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.07,(*tmp)[2]->getDoubleValue(),1e-12);
392 CPPUNIT_ASSERT_EQUAL(2,(int)tmp->size());
393 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp)[1]->getDoubleValue(),1e-12);
396 void EngineTest::checkAny4()
398 SequenceAnyPtr tmp(SequenceAny::New(Runtime::_tc_int,8));
399 tmp=SequenceAny::New(Runtime::_tc_int,4);
400 tmp=SequenceAny::New(Runtime::_tc_int);
401 tmp=SequenceAny::New(Runtime::_tc_int,7);
402 AnyPtr tmp2=AtomAny::New(107);
403 tmp->setEltAtRank(3,tmp2);
404 CPPUNIT_ASSERT_EQUAL(107,(*tmp)[3]->getIntValue());
405 tmp=SequenceAny::New(Runtime::_tc_string,2);
406 const char tmpSt[]="titi";
407 tmp2=AtomAny::New((char*)tmpSt,0);
408 tmp->setEltAtRank(1,tmp2);
409 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="titi");
411 vec4.push_back(2.78); vec4.push_back(3.14); vec4.push_back(0.07);
412 tmp2=SequenceAny::New(vec4);
413 tmp=SequenceAny::New(tmp2->getType(),3);
414 tmp->setEltAtRank(0,tmp2);
415 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp)[0][1]->getDoubleValue(),1e-12);
416 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
418 CPPUNIT_ASSERT_EQUAL(0,(int)tmp->size());
421 CPPUNIT_ASSERT_EQUAL(2,(int)tmp->size());
422 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp)[1][1]->getDoubleValue(),1e-12);
426 * Testing Any::operator ==
428 void EngineTest::checkAny5()
431 AnyPtr tmp1=AtomAny::New(107);
432 AnyPtr tmp2=AtomAny::New(107);
433 CPPUNIT_ASSERT( *tmp1==*tmp2 );
434 tmp1=AtomAny::New(106);
435 CPPUNIT_ASSERT( ! (*tmp1==*tmp2) );
436 CPPUNIT_ASSERT( ! (*tmp2==*tmp1) );
437 tmp1=AtomAny::New("toto");
438 CPPUNIT_ASSERT( ! (*tmp1==*tmp2) );
439 tmp2=AtomAny::New("tot");
440 CPPUNIT_ASSERT( ! (*tmp1==*tmp2) );
441 tmp2=AtomAny::New("toto");
442 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
443 tmp1=AtomAny::New("mmmmmlll");
445 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
448 vec.push_back("tata00000"); vec.push_back("toto"); vec.push_back("tutu");
449 SequenceAnyPtr tmp3=(SequenceAny::New(vec));
450 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
451 CPPUNIT_ASSERT((*tmp3)[0]->getStringValue()=="tata00000");
452 CPPUNIT_ASSERT((*tmp3)[1]->getStringValue()=="toto");
453 CPPUNIT_ASSERT((*tmp3)[2]->getStringValue()=="tutu");
454 AnyPtr tmp4=tmp3->clone();
455 CPPUNIT_ASSERT( (*tmp3==*tmp4) );
456 CPPUNIT_ASSERT( (*tmp3==*tmp3) );
458 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
459 tmp1=AtomAny::New("tutu");
460 tmp3->pushBack(tmp1);
461 CPPUNIT_ASSERT( (*tmp3==*tmp4) );
462 tmp3->pushBack(tmp1);
463 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
465 CPPUNIT_ASSERT( *tmp3==*tmp4 );
467 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
468 tmp1=AtomAny::New("tutug");
469 tmp3->pushBack(tmp1);
470 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
474 * Test of ArrayAny. Only one level.
476 void EngineTest::checkAny6()
479 const int tab[lgth]={0,1,1,9,2,7,2,3};
480 const int tab2[lgth]={13,1,1,9,2,7,2,3};
481 ArrayAnyPtr tmp1(ArrayAny::New(tab,lgth));
482 ArrayAnyPtr tmp2(ArrayAny::New(tab,lgth));
483 CPPUNIT_ASSERT((*tmp1)[3]->getIntValue()==9);
484 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
485 CPPUNIT_ASSERT( (*tmp1==*tmp1) );
486 CPPUNIT_ASSERT( 8==tmp1->size() );
487 CPPUNIT_ASSERT( 8==tmp2->size() );
488 tmp2=ArrayAny::New(tab,lgth-1);
489 CPPUNIT_ASSERT( 7==tmp2->size() );
490 CPPUNIT_ASSERT( !(*tmp1==*tmp2) );
491 tmp2=ArrayAny::New(tab2,lgth);
492 CPPUNIT_ASSERT( !(*tmp1==*tmp2) );
493 tmp2=ArrayAny::New(tab,lgth);
494 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
495 ArrayAnyPtr tmp3=(ArrayAny *)tmp1->clone();
496 CPPUNIT_ASSERT( (*tmp1==*tmp3) );
497 CPPUNIT_ASSERT((*tmp3)[3]->getIntValue()==9); CPPUNIT_ASSERT((*tmp3)[4]->getIntValue()==2);
498 // Ok let's test with double.
499 const double tab3[lgth]={0.1,1.1,1.1,9.1,2.1,7.1,2.1,3.1};
500 const double tab4[lgth]={13.1,1.1,1.1,9.1,2.1,7.1,2.1,3.1};
501 ArrayAnyPtr tmp4(ArrayAny::New(tab3,lgth));
502 ArrayAnyPtr tmp5(ArrayAny::New(tab3,lgth));
503 CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp4)[3]->getDoubleValue(),9.1,1e-12);
504 CPPUNIT_ASSERT( (*tmp4==*tmp5) );
505 CPPUNIT_ASSERT( (*tmp4==*tmp4) );
506 CPPUNIT_ASSERT( 8==tmp4->size() );
507 CPPUNIT_ASSERT( 8==tmp5->size() );
508 tmp5=ArrayAny::New(tab3,lgth-1);
509 CPPUNIT_ASSERT( 7==tmp5->size() );
510 CPPUNIT_ASSERT( !(*tmp4==*tmp5) );
511 tmp5=ArrayAny::New(tab4,lgth);
512 CPPUNIT_ASSERT( !(*tmp4==*tmp5) );
513 tmp5=ArrayAny::New(tab3,lgth);
514 CPPUNIT_ASSERT( (*tmp4==*tmp5) );
515 ArrayAnyPtr tmp6=(ArrayAny *)tmp4->clone();
516 CPPUNIT_ASSERT( (*tmp4==*tmp6) );
517 CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp6)[3]->getDoubleValue(),9.1,1e-12);
518 CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp6)[4]->getDoubleValue(),2.1,1e-12);
519 //Ok let's test with bool.
520 const bool tab5[lgth]={false,true,false,true,false,false,false,false};
521 const bool tab6[lgth]={true ,true,false,true,false,false,false,false};
522 ArrayAnyPtr tmp7(ArrayAny::New(tab5,lgth));
523 ArrayAnyPtr tmp8(ArrayAny::New(tab5,lgth));
524 CPPUNIT_ASSERT((*tmp7)[3]->getBoolValue());
525 CPPUNIT_ASSERT( (*tmp7==*tmp8) );
526 CPPUNIT_ASSERT( (*tmp7==*tmp7) );
527 CPPUNIT_ASSERT( 8==tmp7->size() );
528 CPPUNIT_ASSERT( 8==tmp8->size() );
529 tmp8=ArrayAny::New(tab5,lgth-1);
530 CPPUNIT_ASSERT( 7==tmp8->size() );
531 CPPUNIT_ASSERT( !(*tmp7==*tmp8) );
532 tmp8=ArrayAny::New(tab6,lgth);
533 CPPUNIT_ASSERT( !(*tmp7==*tmp8) );
534 tmp8=ArrayAny::New(tab5,lgth);
535 CPPUNIT_ASSERT( (*tmp7==*tmp8) );
536 ArrayAnyPtr tmp9=(ArrayAny *)tmp7->clone();
537 CPPUNIT_ASSERT( (*tmp9==*tmp7) );
538 CPPUNIT_ASSERT((*tmp8)[3]->getBoolValue());
539 CPPUNIT_ASSERT(!(*tmp8)[4]->getBoolValue());
540 //Ok let's test with strings.
541 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";
542 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";
543 ArrayAnyPtr tmp10(ArrayAny::New(tab7));
544 ArrayAnyPtr tmp11(ArrayAny::New(tab7));
545 CPPUNIT_ASSERT((*tmp10)[3]->getStringValue()=="jkl");
546 CPPUNIT_ASSERT( (*tmp10==*tmp11) );
547 CPPUNIT_ASSERT( (*tmp10==*tmp10) );
548 CPPUNIT_ASSERT( 8==tmp10->size() );
549 CPPUNIT_ASSERT( 8==tmp11->size() );
550 vector<string> tab9(tab7); tab9.pop_back();
551 tmp11=ArrayAny::New(tab9);
552 CPPUNIT_ASSERT( 7==tmp11->size() );
553 CPPUNIT_ASSERT( !(*tmp10==*tmp11) );
554 tmp11=ArrayAny::New(tab8);
555 CPPUNIT_ASSERT( !(*tmp10==*tmp11) );
556 tmp11=ArrayAny::New(tab7);
557 CPPUNIT_ASSERT( (*tmp10==*tmp11) );
558 ArrayAnyPtr tmp12=(ArrayAny *)tmp10->clone();
559 CPPUNIT_ASSERT( (*tmp12==*tmp10) );
560 CPPUNIT_ASSERT((*tmp11)[3]->getStringValue()=="jkl");
561 CPPUNIT_ASSERT((*tmp11)[4]->getStringValue()=="mno");
565 * Test of ArrayAny on multi-levels. To test recursion.
567 void EngineTest::checkAny7()
570 const int tab1[lgth]={0,1,1,9,2,7,2,3};
571 const int tab2[lgth]={7,8,8,16,9,14,9,10};
572 //Testing Arrays of arrays
573 ArrayAnyPtr tmp11(ArrayAny::New(tab1,lgth));
574 ArrayAnyPtr tmp12(ArrayAny::New(tab2,lgth));
575 ArrayAnyPtr tmp12Throw(ArrayAny::New(tab2,lgth+1));
576 ArrayAnyPtr tmp2(ArrayAny::New(tmp11->getType(),2));
577 tmp2->setEltAtRank(0,tmp11);
578 CPPUNIT_ASSERT_THROW(tmp2->setEltAtRank(1,tmp12Throw),Exception);
579 tmp2->setEltAtRank(1,tmp12);
580 CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
581 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
582 // Show deep copy process of arrays
583 AnyPtr tmp=AtomAny::New(49);
584 tmp11->setEltAtRank(0,tmp);
585 CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
586 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
587 ArrayAnyPtr tmp2Cloned=(ArrayAny *)(tmp2->clone());
588 CPPUNIT_ASSERT_EQUAL(0,(*tmp2Cloned)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2Cloned)[1][0]->getIntValue());
589 CPPUNIT_ASSERT_EQUAL(9,(*tmp2Cloned)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2Cloned)[1][3]->getIntValue());
590 CPPUNIT_ASSERT( *tmp2==*tmp2Cloned );
591 CPPUNIT_ASSERT( *tmp2==*tmp2 );
592 //Testing Array of Sequences
593 SequenceAnyPtr tmp13(SequenceAny::New((int *)tab1,lgth,0));
594 SequenceAnyPtr tmp14(SequenceAny::New((int *)tab2,lgth,0));
595 tmp2=ArrayAny::New(tmp13->getType(),2);
596 tmp2->setEltAtRank(0,tmp13);
597 tmp2->setEltAtRank(1,tmp14);
598 CPPUNIT_ASSERT_EQUAL(0,(*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 tmp13->setEltAtRank(0,tmp);
601 // No deep copy here contrary to 14 lines ahead.
602 CPPUNIT_ASSERT_EQUAL(49,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
603 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
604 tmp2Cloned=(ArrayAny *)(tmp2->clone());
605 CPPUNIT_ASSERT_EQUAL(49,(*tmp2Cloned)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2Cloned)[1][0]->getIntValue());
606 CPPUNIT_ASSERT_EQUAL(9,(*tmp2Cloned)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2Cloned)[1][3]->getIntValue());
607 CPPUNIT_ASSERT( *tmp2==*tmp2Cloned );
608 CPPUNIT_ASSERT( *tmp2==*tmp2 );
609 //Testing Sequence of array
610 tmp13=SequenceAny::New(tmp11->getType(),2);
611 tmp13->setEltAtRank(0,tmp11);
612 tmp13->setEltAtRank(1,tmp12);
613 CPPUNIT_ASSERT_EQUAL(49,(*tmp13)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp13)[1][0]->getIntValue());
614 CPPUNIT_ASSERT_EQUAL(9,(*tmp13)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp13)[1][3]->getIntValue());
615 tmp14=(SequenceAny *)tmp13->clone();
616 CPPUNIT_ASSERT_EQUAL(49,(*tmp14)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp14)[1][0]->getIntValue());
617 CPPUNIT_ASSERT_EQUAL(9,(*tmp14)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp14)[1][3]->getIntValue());
618 CPPUNIT_ASSERT( *tmp13==*tmp14 );
619 CPPUNIT_ASSERT( *tmp13==*tmp13 );
623 * First test of structs.
625 void EngineTest::checkAny8()
627 TypeCodeStruct *tc=new TypeCodeStruct("","");
628 tc->addMember("MyInt",Runtime::_tc_int);
629 tc->addMember("MyDouble",Runtime::_tc_double);
630 tc->addMember("MyBool",Runtime::_tc_bool);
631 tc->addMember("MyStr",Runtime::_tc_string);
632 StructAnyPtr tmp1=StructAny::New(tc);
633 tmp1=StructAny::New(tc);
634 AnyPtr tmpAtom=AtomAny::New(3791);
635 tmp1->setEltAtRank("MyInt",tmpAtom);
636 CPPUNIT_ASSERT_THROW(tmp1->setEltAtRank(1,tmpAtom),Exception);
637 tmpAtom=AtomAny::New(3.14);
638 CPPUNIT_ASSERT_THROW(tmp1->setEltAtRank("MyDoubl",tmpAtom),Exception);
639 tmp1->setEltAtRank("MyDouble",tmpAtom);
640 tmpAtom=AtomAny::New(false);
641 tmp1->setEltAtRank("MyBool",tmpAtom);
642 tmpAtom=AtomAny::New("abcdef");
643 tmp1->setEltAtRank("MyStr",tmpAtom);
644 CPPUNIT_ASSERT_EQUAL(3791,(*tmp1)["MyInt"]->getIntValue());
645 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp1)["MyDouble"]->getDoubleValue(),1e-12);
646 CPPUNIT_ASSERT_THROW((*tmp1)["MyIntT"],Exception);
647 CPPUNIT_ASSERT(!(*tmp1)["MyBool"]->getBoolValue());
648 CPPUNIT_ASSERT_THROW((*tmp1)["MyBool"]->getStringValue(),Exception);
649 CPPUNIT_ASSERT((*tmp1)["MyStr"]->getStringValue()=="abcdef");
650 tmpAtom=AtomAny::New("ghijklm");
651 tmp1->setEltAtRank("MyStr",tmpAtom);
652 CPPUNIT_ASSERT((*tmp1)["MyStr"]->getStringValue()=="ghijklm");
653 //Introduce some recursive structure.
654 SequenceAnyPtr tmp2=SequenceAny::New(tc,2);
655 tmp2->setEltAtRank(0,tmp1);
656 tmpAtom=AtomAny::New("opqrst");
657 tmp1->setEltAtRank("MyStr",tmpAtom);
658 tmp2->setEltAtRank(1,tmp1);
659 CPPUNIT_ASSERT_EQUAL(3791,(*tmp2)[1]["MyInt"]->getIntValue());
660 CPPUNIT_ASSERT((*tmp2)[0]["MyStr"]->getStringValue()=="ghijklm");
661 CPPUNIT_ASSERT((*tmp2)[1]["MyStr"]->getStringValue()=="opqrst");
662 CPPUNIT_ASSERT(*tmp2==*tmp2);
663 AnyPtr tmp3=tmp2->clone();
664 CPPUNIT_ASSERT(*tmp2==*tmp3);
665 CPPUNIT_ASSERT((*tmp3)[0]["MyStr"]->getStringValue()=="ghijklm");
666 CPPUNIT_ASSERT((*tmp3)[1]["MyStr"]->getStringValue()=="opqrst");
670 void EngineTest::checkInGateOutGate()
672 string nodeName = "Node1";
673 ElementaryNode* node1 = new TestElemNode(nodeName);
674 _nodeMap[nodeName] = node1;
677 ElementaryNode* node2 = new TestElemNode(nodeName);
678 _nodeMap[nodeName] = node2;
680 DEBTRACE(" --- check InGate OK after node creation" );
682 InGate *node1Ingate = node1->getInGate();
683 CPPUNIT_ASSERT(node1Ingate);
684 string name=node1Ingate->getNameOfTypeOfCurrentInstance();
685 string expected="InGate";
686 CPPUNIT_ASSERT_EQUAL(name,expected);
689 DEBTRACE(" --- check OutGate OK after node creation" );
691 OutGate *node1Outgate = node1->getOutGate();
692 CPPUNIT_ASSERT(node1Outgate);
693 string name=node1Outgate->getNameOfTypeOfCurrentInstance();
694 string expected="OutGate";
695 CPPUNIT_ASSERT_EQUAL(name,expected);
699 void EngineTest::checkNodePortNumber()
701 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
703 DEBTRACE(" --- check number of ports = 0 after node creation" );
704 CPPUNIT_ASSERT(node1->getNumberOfInputPorts() == 0);
705 CPPUNIT_ASSERT(node1->getNumberOfOutputPorts() == 0);
707 InputPort *in1 = node1->edAddInputPort("ib1",_tc_bool);
708 InputPort *in2 = node1->edAddInputPort("ii1",_tc_int);
709 InputPort *in3 = node1->edAddInputPort("ii2",_tc_int);
710 InputPort *in4 = node1->edAddInputPort("id1",_tc_double);
712 OutputPort *ou1 = node1->edAddOutputPort("ob1",_tc_bool);
713 OutputPort *ou2 = node1->edAddOutputPort("oi1",_tc_int);
714 OutputPort *ou3 = node1->edAddOutputPort("od1",_tc_double);
716 DEBTRACE(" --- check number of ports after ports creation" );
717 // DEBTRACE(" node1->getNumberOfInputPorts(): "
718 // << node1->getNumberOfInputPorts());
719 // DEBTRACE(" node1->getNumberOfOutputPorts(): "
720 // << node1->getNumberOfOutputPorts());
721 CPPUNIT_ASSERT(node1->getNumberOfInputPorts() == 4);
722 CPPUNIT_ASSERT(node1->getNumberOfOutputPorts() == 3);
725 void EngineTest::checkPortTypeName()
727 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
729 DEBTRACE(" --- check InputPort name OK" );
731 string name=node1->getInputPort("ib1")->NAME;
732 string expected="InputPort";
733 CPPUNIT_ASSERT_EQUAL(name,expected);
736 DEBTRACE(" --- check OutputPort name OK" );
738 string name=node1->getOutputPort("ob1")->NAME;
739 string expected="OutputPort";
740 CPPUNIT_ASSERT_EQUAL(name,expected);
744 void EngineTest::checkDuplicatePortName()
746 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
747 DEBTRACE(" --- check duplicated name throws exception" );
748 CPPUNIT_ASSERT_THROW(InputPort *in5=node1->edAddInputPort("ii2",_tc_int),
752 void EngineTest::checkRemovePort()
754 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
755 ElementaryNode* node2 = (ElementaryNode*) _nodeMap["Node2"];
757 DEBTRACE(" --- check remove port" );
759 node1->edRemovePort(node1->getInputPort("ib1"));
760 CPPUNIT_ASSERT(node1->getNumberOfInputPorts() == 3);
761 CPPUNIT_ASSERT(node1->getNumberOfOutputPorts() == 3);
764 DEBTRACE(" --- check remove wrong port throws exception" )
766 CPPUNIT_ASSERT_THROW(node1->edRemovePort(node1->getInputPort("ib1")),
771 void EngineTest::checkAddNodesToBloc()
773 DEBTRACE(" --- delete node; // ====== NOT OK : done by bloc" );
775 for (int i=0; i<10; i++)
780 ElementaryNode* node = new TestElemNode(s);
782 InputPort *i1 = node->edAddInputPort("ib1",_tc_bool);
783 InputPort *i2 = node->edAddInputPort("ii1",_tc_int);
784 InputPort *i3 = node->edAddInputPort("ii2",_tc_int);
785 InputPort *i4 = node->edAddInputPort("id1",_tc_double);
786 OutputPort *o1 = node->edAddOutputPort("ob1",_tc_bool);
787 OutputPort *o2 = node->edAddOutputPort("oi1",_tc_int);
788 OutputPort *o3 = node->edAddOutputPort("od1",_tc_double);
791 DEBTRACE(" --- create bloc, add two nodes, check constituants" );
793 Bloc* bloc1 = new Bloc("bloc1");
794 _nodeMap["bloc1"] = bloc1;
795 _compoMap["bloc1"] = bloc1;
796 bloc1->edAddChild(_nodeMap["Node_1"]);
797 bloc1->edAddChild(_nodeMap["Node_2"]);
799 list<ElementaryNode *> setelem = bloc1->getRecursiveConstituents();
800 CPPUNIT_ASSERT(setelem.size() == 2);
804 void EngineTest::checkAddingTwiceSameNodeInSameBloc()
806 DEBTRACE(" --- add the same node two times does nothing: return false" );
808 CPPUNIT_ASSERT(! ((Bloc*)_compoMap["bloc1"])->edAddChild(_nodeMap["Node_1"]));
811 void EngineTest::checkAddingTwiceSameNodeInTwoBlocs()
813 DEBTRACE(" --- add a node already used elsewhere raises exception" );
815 Bloc* bloc2 = new Bloc("bloc2");
816 _nodeMap["bloc2"] = bloc2;
817 _compoMap["bloc2"] = bloc2;
818 bloc2->edAddChild(_nodeMap["Node_3"]);
820 CPPUNIT_ASSERT_THROW(bloc2->edAddChild(_nodeMap["Node_1"]),
825 void EngineTest::checkRecursiveBlocs_NumberOfNodes()
827 Bloc *bloc1 = (Bloc*)_compoMap["bloc1"];
828 Bloc *bloc2 = (Bloc*)_compoMap["bloc2"];
830 DEBTRACE(" --- recursive blocs, check constituants" );
832 Bloc* bloc3 = new Bloc("bloc3");
833 _nodeMap["bloc3"] = bloc3;
834 _compoMap["bloc3"] = bloc3;
835 bloc3->edAddChild((bloc1)); // 2 elementary nodes
836 bloc3->edAddChild((bloc2)); // 1 elementary node
837 bloc3->edAddChild(_nodeMap["Node_4"]); // 1 elementary node
839 list<ElementaryNode *> setelem = bloc3->getRecursiveConstituents();
840 CPPUNIT_ASSERT(setelem.size() == 4);
841 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
843 DEBTRACE(" elem name = " << (*it)->getName());
848 void EngineTest::checkRecursiveBlocs_NumberOfPorts()
850 Bloc *bloc3 = (Bloc*)_compoMap["bloc3"];
852 DEBTRACE(" --- recursive blocs, check input & output ports // COMPLETER" );
853 CPPUNIT_ASSERT(bloc3->getNumberOfInputPorts() == 4*4);
854 DEBTRACE(" number of input ports: " << bloc3->getNumberOfInputPorts());
855 DEBTRACE(" number of output ports: " << bloc3->getNumberOfOutputPorts());
857 list<InputPort *> inset = bloc3->getSetOfInputPort();
858 list<OutputPort *> outset = bloc3->getSetOfOutputPort();
859 for (list<InputPort *>::iterator it=inset.begin(); it!=inset.end(); it++)
861 DEBTRACE(" input port name = " << bloc3->getInPortName(*it));
863 for (list<OutputPort *>::iterator it=outset.begin(); it!=outset.end(); it++)
865 DEBTRACE(" output port name = " << bloc3->getOutPortName(*it));
870 void EngineTest::checkPortNameInBloc()
873 DEBTRACE(" --- recursive blocs, check port names" );
875 InputPort *inport = _nodeMap["Node_1"]->getInputPort("id1");
876 CPPUNIT_ASSERT(_nodeMap["bloc3"]->getInPortName(inport) == "bloc1.Node_1.id1");
877 CPPUNIT_ASSERT(((Bloc*)_nodeMap["bloc3"])->getChildName(_nodeMap["Node_1"]) == "bloc1.Node_1");
880 void EngineTest::checkGetNameOfPortNotInBloc()
882 InputPort *inport = _nodeMap["Node_5"]->getInputPort("id1");
883 CPPUNIT_ASSERT_THROW(string name = _nodeMap["bloc3"]->getInPortName(inport),
887 void EngineTest::checkRemoveNode()
889 DEBTRACE(" --- bloc and port inventory must be OK after bloc remove" );
891 Bloc* bloc = new Bloc("blocR");
892 _nodeMap["blocR"] = bloc;
893 _compoMap["blocR"] = bloc;
894 bloc->edAddChild(_nodeMap["Node_5"]);
895 bloc->edAddChild(_nodeMap["Node_6"]);
896 bloc->edAddChild(_nodeMap["Node_7"]);
899 list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
900 CPPUNIT_ASSERT(setelem.size() == 3);
902 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
904 DEBTRACE(" elem name = " << (*it)->getName());
908 ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_6"]);
911 list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
912 CPPUNIT_ASSERT(setelem.size() == 2);
913 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
915 DEBTRACE(" elem name = " << (*it)->getName());
916 DEBTRACE(" elem name in Bloc = " << ((Bloc *)_nodeMap["blocR"])->getChildName(*it));
921 list<InputPort *> inset = _nodeMap["blocR"]->getSetOfInputPort();
922 list<OutputPort *> outset = _nodeMap["blocR"]->getSetOfOutputPort();
923 CPPUNIT_ASSERT(inset.size() == 8);
924 CPPUNIT_ASSERT(outset.size() == 6);
925 for (list<InputPort *>::iterator it=inset.begin(); it!=inset.end(); it++)
927 DEBTRACE(" input port name for blocR = " << _nodeMap["blocR"]->getInPortName(*it));
929 for (list<OutputPort *>::iterator it=outset.begin(); it!=outset.end(); it++)
931 DEBTRACE(" output port name for blocR = " << _nodeMap["blocR"]->getOutPortName(*it));
935 ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_5"]);
936 ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_7"]);
938 list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
939 CPPUNIT_ASSERT(setelem.size() == 0);
943 void EngineTest::RecursiveBlocs_multipleRecursion()
946 Bloc* bloc = new Bloc("bloc4");
947 _nodeMap["bloc4"] = bloc;
948 _compoMap["bloc4"] = bloc;
949 bloc->edAddChild(_nodeMap["Node_5"]);
950 bloc->edAddChild(_nodeMap["Node_6"]);
954 Bloc* bloc = new Bloc("bloc5");
955 _nodeMap["bloc5"] = bloc;
956 _compoMap["bloc5"] = bloc;
957 bloc->edAddChild(_nodeMap["Node_7"]);
958 bloc->edAddChild(_nodeMap["Node_8"]);
962 Bloc* bloc = new Bloc("bloc6");
963 _nodeMap["bloc6"] = bloc;
964 _compoMap["bloc6"] = bloc;
965 bloc->edAddChild(_nodeMap["bloc4"]);
966 bloc->edAddChild(_nodeMap["bloc5"]);
970 Bloc* bloc = new Bloc("bloc7");
971 _nodeMap["bloc7"] = bloc;
972 _compoMap["bloc7"] = bloc;
973 bloc->edAddChild(_nodeMap["bloc3"]);
974 bloc->edAddChild(_nodeMap["bloc6"]);
978 Bloc* bloc = new Bloc("graphe");
979 _nodeMap["graphe"] = bloc;
980 _compoMap["graphe"] = bloc;
981 bloc->edAddChild(_nodeMap["bloc7"]);
982 bloc->edAddChild(_nodeMap["Node_9"]);
986 list<ElementaryNode *> setelem = _nodeMap["graphe"]->getRecursiveConstituents();
987 CPPUNIT_ASSERT(setelem.size() == 9);
988 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
990 DEBTRACE(" elem name = " << (*it)->getName());
995 list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
996 list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
997 for (list<InputPort *>::iterator it=inset.begin(); it!=inset.end(); it++)
999 DEBTRACE(" input port name for bloc7 = " << _nodeMap["bloc7"]->getInPortName(*it));
1000 DEBTRACE(" input port name for graphe = " << _nodeMap["graphe"]->getInPortName(*it));
1002 for (list<OutputPort *>::iterator it=outset.begin(); it!=outset.end(); it++)
1004 DEBTRACE(" output port name for bloc7 = " << _nodeMap["bloc7"]->getOutPortName(*it));
1005 DEBTRACE(" output port name for graphe = " << _nodeMap["graphe"]->getOutPortName(*it));
1007 YACS::ENGINE::VisitorSaveState vst(_compoMap["graphe"]);
1009 std::string logDir=getenv("SALOME_TMP_DIR");
1012 std::string logDir = std::string("/tmp/")+ getlogin();
1013 std::string cmd = "mkdir -p " + logDir;
1014 system( cmd.c_str() );
1017 vst.openFileDump(logDir + std::string("RecursiveBlocs_multipleRecursion_dumpState.xml"));
1018 _compoMap["graphe"]->accept(&vst);
1019 vst.closeFileDump();
1023 void EngineTest::RecursiveBlocs_removeNodes()
1026 // set<Node *> setNodes = ((Bloc*)_nodeMap["graphe"])->getChildren();
1027 // for (set<Node*>::iterator it=setNodes.begin(); it!=setNodes.end(); it++)
1029 // DEBTRACE(" child name = " << (*it)->getName());
1034 list<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
1035 CPPUNIT_ASSERT(setNode.size() == 16);
1036 list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
1037 list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
1038 DEBTRACE(" input port number in graph: " <<inset.size());
1039 DEBTRACE(" output port number in graph: " <<outset.size());
1040 CPPUNIT_ASSERT(inset.size() == 32);
1041 CPPUNIT_ASSERT(outset.size() == 24);
1044 ((Bloc *)_nodeMap["bloc7"])->edRemoveChild(_nodeMap["bloc6"]);
1047 list<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
1048 CPPUNIT_ASSERT(setNode.size() == 9);
1049 for (list<Node*>::iterator it=setNode.begin(); it!=setNode.end(); it++)
1051 DEBTRACE(" elem name = " << ((Bloc *)_nodeMap["graphe"])->getChildName(*it));
1053 list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
1054 list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
1055 DEBTRACE(" input port number in graph: " <<inset.size());
1056 DEBTRACE(" output port number in graph: " <<outset.size());
1057 CPPUNIT_ASSERT(inset.size() == 16);
1058 CPPUNIT_ASSERT(outset.size() == 12);
1063 void EngineTest::checkLogger()
1065 Proc* proc=new Proc("proc");
1066 Logger* logger=proc->getLogger("parser");
1067 logger->error("error1","file.cxx",324);
1068 logger->error("error2","file.cxx",852);
1069 CPPUNIT_ASSERT(logger->hasErrors()==true);
1070 CPPUNIT_ASSERT(logger->isEmpty()==false);
1071 const char* expected1="LogRecord: parser:ERROR:error1 (file.cxx:324)\n"
1072 "LogRecord: parser:ERROR:error2 (file.cxx:852)\n";
1073 CPPUNIT_ASSERT(logger->getStr()==expected1);
1076 CPPUNIT_ASSERT(logger->hasErrors()==false);
1077 CPPUNIT_ASSERT(logger->isEmpty()==true);
1079 logger->error("error1","file.cxx",324);
1080 logger->error("error2","file.cxx",852);
1081 logger->error("error3","file.cxx",978);
1082 CPPUNIT_ASSERT(logger->hasErrors()==true);
1083 CPPUNIT_ASSERT(logger->isEmpty()==false);
1084 const char* expected2="LogRecord: parser:ERROR:error1 (file.cxx:324)\n"
1085 "LogRecord: parser:ERROR:error2 (file.cxx:852)\n"
1086 "LogRecord: parser:ERROR:error3 (file.cxx:978)\n";
1087 CPPUNIT_ASSERT(logger->getStr()==expected2);
1091 void EngineTest::checkGraphAnalyser0()
1094 static const int N=2;
1097 for(int i=0;i<N;i++)
1099 std::ostringstream oss; oss << "n" << i+1;
1100 t[i]=new Bloc(oss.str());
1101 proc.edAddChild(t[i]);
1103 proc.edAddCFLink(t[0],t[1]);
1104 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1105 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1106 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1107 SetOfPoints sop(r[0]);
1109 CPPUNIT_ASSERT(sop.getRepr()=="(n1+n2) - ");
1113 void EngineTest::checkGraphAnalyser1()
1116 static const int N=24;
1119 for(int i=0;i<N;i++)
1121 std::ostringstream oss; oss << "n" << i+1;
1122 t[i]=new Bloc(oss.str());
1123 proc.edAddChild(t[i]);
1125 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]);
1126 proc.edAddCFLink(t[14],t[13]); proc.edAddCFLink(t[13],t[5]);
1127 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]);
1128 proc.edAddCFLink(t[11],t[10]); proc.edAddCFLink(t[10],t[8]);
1129 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]);
1130 proc.edAddCFLink(t[19],t[18]); proc.edAddCFLink(t[18],t[4]);
1131 proc.edAddCFLink(t[19],t[3]); proc.edAddCFLink(t[3],t[4]);
1132 proc.edAddCFLink(t[22],t[21]);
1133 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1134 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1135 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1136 SetOfPoints sop(r[0]);
1138 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)) - ");
1142 static const int N=10;
1145 for(int i=0;i<N;i++)
1147 std::ostringstream oss; oss << "n" << i+1;
1148 t[i]=new Bloc(oss.str());
1149 proc.edAddChild(t[i]);
1151 proc.edAddCFLink(t[9],t[0]); proc.edAddCFLink(t[0],t[2]); proc.edAddCFLink(t[2],t[4]); proc.edAddCFLink(t[4],t[5]);
1152 proc.edAddCFLink(t[0],t[1]); proc.edAddCFLink(t[1],t[6]); proc.edAddCFLink(t[6],t[7]); proc.edAddCFLink(t[7],t[5]);
1153 proc.edAddCFLink(t[0],t[8]); proc.edAddCFLink(t[8],t[3]); proc.edAddCFLink(t[3],t[4]);
1154 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1155 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1156 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1157 SetOfPoints sop(r[0]);
1159 CPPUNIT_ASSERT(sop.getRepr()=="((n10+n1)+[([(n9+n4)*n3]+n5)*(n2+n7+n8)]+n6) - ");
1163 void EngineTest::checkGraphAnalyser2()
1166 static const int N=8;
1169 for(int i=0;i<N;i++)
1171 std::ostringstream oss; oss << "n" << i+1;
1172 t[i]=new Bloc(oss.str());
1173 proc.edAddChild(t[i]);
1175 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]);
1176 proc.edAddCFLink(t[4],t[2]); proc.edAddCFLink(t[2],t[3]); proc.edAddCFLink(t[3],t[5]);
1177 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1178 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1179 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1180 SetOfPoints sop(r[0]);
1182 CPPUNIT_ASSERT(sop.getRepr()=="((n8+n5)+[(n1+n2)*(n3+n4)]+(n6+n7)) - ");
1186 static const int NN=6;
1188 Bloc proc2("proc2");
1189 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");
1190 for(int i=0;i<NN;i++)
1191 proc2.edAddChild(tt[i]);
1192 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]);
1193 std::vector< std::list<Node *> > rr(proc2.splitIntoIndependantGraph());
1194 CPPUNIT_ASSERT_EQUAL(1,(int)rr.size());
1195 CPPUNIT_ASSERT_EQUAL(NN,(int)rr[0].size());
1196 SetOfPoints sop2(rr[0]);
1198 CPPUNIT_ASSERT(sop2.getRepr()=="([(n21+n21@1)*(n23+n23@1)]+(n22+n16)) - ");
1202 static const int NNN=6;
1204 Bloc proc3("proc3");
1205 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");
1206 for(int i=0;i<NNN;i++)
1207 proc3.edAddChild(ttt[i]);
1208 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]);
1209 std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
1210 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1211 CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
1212 SetOfPoints sop3(rrr[0]);
1214 CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
1218 void EngineTest::checkGraphAnalyser3()
1221 static const int NNN=6;
1223 Bloc proc3("proc3");
1224 for(int i=0;i<NNN;i++)
1226 std::ostringstream oss; oss << "n" << i+1;
1227 ttt[i]=new Bloc(oss.str());
1228 proc3.edAddChild(ttt[i]);
1230 proc3.edAddCFLink(ttt[0],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[4]);
1231 proc3.edAddCFLink(ttt[0],ttt[2]); proc3.edAddCFLink(ttt[2],ttt[3]); proc3.edAddCFLink(ttt[3],ttt[4]);
1232 proc3.edAddCFLink(ttt[5],ttt[3]);
1233 std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
1234 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1235 CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
1236 SetOfPoints sop3(rrr[0]);
1238 //std:cerr << std::endl << sop3.getRepr() << std::endl;
1239 //CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
1243 void EngineTest::checkGraphAnalyser4()
1246 static const int NNN=3;
1249 for(int i=0;i<NNN;i++)
1251 std::ostringstream oss; oss << "n" << i+1;
1252 ttt[i]=new Bloc(oss.str());
1253 proc3.edAddChild(ttt[i]);
1255 proc3.edAddCFLink(ttt[2],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[0]);
1256 std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
1257 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1258 CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
1259 SetOfPoints sop(rrr[0]);
1261 CPPUNIT_ASSERT(sop.getRepr()=="(n3+n2+n1) - ");
1266 * Case revealed by EmC2 on complex managers.
1267 * Here basic combination of Link/Fork is not enough.
1269 void EngineTest::checkGraphAnalyser5()
1273 std::vector<Bloc *> vn;
1274 std::vector<std::string> v{"A","E","C","F","D","G"};
1278 Bloc *pt(new Bloc(v[i++]));
1279 proc.edAddChild(pt);
1283 proc.edAddCFLink(vn[0],vn[1]);//A -> E
1284 proc.edAddCFLink(vn[0],vn[2]);//A -> C
1285 proc.edAddCFLink(vn[2],vn[3]);//C -> F
1286 proc.edAddCFLink(vn[2],vn[4]);//C -> D
1287 proc.edAddCFLink(vn[1],vn[3]);//E -> F
1288 proc.edAddCFLink(vn[3],vn[5]);//F -> G
1290 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1291 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1292 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1293 SetOfPoints sop(rrr[0]);
1295 CPPUNIT_ASSERT(sop.getRepr()=="((A+[C*E])+[(F+G)*[D*E]]) - ");
1300 std::vector<Bloc *> vn;
1301 std::vector<std::string> v{"A","E","C","B","F","D","G"};
1305 Bloc *pt(new Bloc(v[i++]));
1306 proc.edAddChild(pt);
1310 proc.edAddCFLink(vn[0],vn[1]);//A -> E
1311 proc.edAddCFLink(vn[0],vn[2]);//A -> C
1312 proc.edAddCFLink(vn[0],vn[3]);//A -> B
1313 proc.edAddCFLink(vn[3],vn[4]);//B -> F
1314 proc.edAddCFLink(vn[2],vn[4]);//C -> F
1315 proc.edAddCFLink(vn[2],vn[5]);//C -> D
1316 proc.edAddCFLink(vn[1],vn[4]);//E -> F
1317 proc.edAddCFLink(vn[4],vn[6]);//F -> G
1319 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1320 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1321 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1322 SetOfPoints sop(rrr[0]);
1324 //"(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - "
1325 CPPUNIT_ASSERT(sop.getRepr()=="[(A+[[B*C]*[C*E]]+(F+G))*D] - ");
1330 std::vector<Bloc *> vn;
1331 std::vector<std::string> v{"A","E","C","B","F","D","G"};
1335 Bloc *pt(new Bloc(v[i++]));
1336 proc.edAddChild(pt);
1340 proc.edAddCFLink(vn[0],vn[1]);//A -> E
1341 proc.edAddCFLink(vn[0],vn[2]);//A -> C
1342 proc.edAddCFLink(vn[0],vn[3]);//A -> B
1343 proc.edAddCFLink(vn[3],vn[4]);//B -> F
1344 proc.edAddCFLink(vn[2],vn[4]);//C -> F
1345 proc.edAddCFLink(vn[2],vn[5]);//C -> D
1346 proc.edAddCFLink(vn[1],vn[4]);//E -> F
1347 proc.edAddCFLink(vn[4],vn[6]);//F -> G
1349 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1350 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1351 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1352 SetOfPoints sop(rrr[0]);
1354 //"(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - "
1355 CPPUNIT_ASSERT(sop.getRepr()=="[(A+[[B*C]*[C*E]]+(F+G))*D] - ");
1360 std::vector<Bloc *> vn;
1361 std::vector<std::string> v{"A","I","E","C","B","J","F","H","D","G"};
1365 Bloc *pt(new Bloc(v[i++]));
1366 proc.edAddChild(pt);
1370 proc.edAddCFLink(vn[0],vn[1]);//A -> I
1371 proc.edAddCFLink(vn[0],vn[2]);//A -> E
1372 proc.edAddCFLink(vn[0],vn[3]);//A -> C
1373 proc.edAddCFLink(vn[0],vn[4]);//A -> B
1374 proc.edAddCFLink(vn[4],vn[6]);//B -> F
1375 proc.edAddCFLink(vn[3],vn[7]);//C -> H
1376 proc.edAddCFLink(vn[3],vn[6]);//C -> F
1377 proc.edAddCFLink(vn[3],vn[8]);//C -> D
1378 proc.edAddCFLink(vn[2],vn[6]);//E -> F
1379 proc.edAddCFLink(vn[6],vn[9]);//F -> G
1380 proc.edAddCFLink(vn[9],vn[5]);//G -> J
1381 proc.edAddCFLink(vn[7],vn[5]);//H -> J
1382 proc.edAddCFLink(vn[1],vn[5]);//I -> J
1384 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1385 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1386 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1387 SetOfPoints sop(rrr[0]);
1389 //"(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]]]]) - "
1390 CPPUNIT_ASSERT(sop.getRepr()=="[([(A+[([[B*C]*[C*E]]+(F+G))*[C*I]])*H]+J)*D] - ");
1395 std::vector<Bloc *> vn;
1396 std::vector<std::string> v{"A","I","E","C","B","J","F","H","D","K","G","L"};
1400 Bloc *pt(new Bloc(v[i++]));
1401 proc.edAddChild(pt);
1405 proc.edAddCFLink(vn[0],vn[1]);//A -> I
1406 proc.edAddCFLink(vn[0],vn[2]);//A -> E
1407 proc.edAddCFLink(vn[0],vn[3]);//A -> C
1408 proc.edAddCFLink(vn[0],vn[4]);//A -> B
1409 proc.edAddCFLink(vn[4],vn[6]);//B -> F
1410 proc.edAddCFLink(vn[3],vn[7]);//C -> H
1411 proc.edAddCFLink(vn[3],vn[6]);//C -> F
1412 proc.edAddCFLink(vn[3],vn[8]);//C -> D
1413 proc.edAddCFLink(vn[2],vn[6]);//E -> F
1414 proc.edAddCFLink(vn[6],vn[10]);//F -> G
1415 proc.edAddCFLink(vn[10],vn[5]);//G -> J
1416 proc.edAddCFLink(vn[7],vn[5]);//H -> J
1417 proc.edAddCFLink(vn[1],vn[5]);//I -> J
1418 proc.edAddCFLink(vn[5],vn[9]);//J -> K
1419 proc.edAddCFLink(vn[9],vn[11]);//K -> L
1421 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1422 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1423 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1424 SetOfPoints sop(rrr[0]);
1426 //"(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]]]]) - "
1427 CPPUNIT_ASSERT(sop.getRepr()=="[([(A+[([[B*C]*[C*E]]+(F+G))*[C*I]])*H]+(J+K+L))*D] - ");
1431 std::vector<Bloc *> vn;
1432 std::vector<std::string> v{"B","C","D","E","F","G","H","I","J","K"};
1436 Bloc *pt(new Bloc(v[i++]));
1437 proc.edAddChild(pt);
1441 proc.edAddCFLink(vn[0],vn[1]);//B -> C
1442 proc.edAddCFLink(vn[0],vn[3]);//B -> E
1443 proc.edAddCFLink(vn[0],vn[5]);//B -> G
1444 proc.edAddCFLink(vn[2],vn[3]);//D -> E
1445 proc.edAddCFLink(vn[4],vn[5]);//F -> G
1446 proc.edAddCFLink(vn[6],vn[7]);//H -> I
1447 proc.edAddCFLink(vn[0],vn[7]);//B -> I
1448 proc.edAddCFLink(vn[8],vn[9]);//J -> K
1449 proc.edAddCFLink(vn[0],vn[9]);//B -> K
1451 std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
1452 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1453 CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
1454 SetOfPoints sop(rrr[0]);
1456 CPPUNIT_ASSERT(sop.getRepr()=="[([B*D]+E)*([B*F]+G)*([B*H]+I)*([B*J]+K)*C] - ");