1 // Copyright (C) 2006-2016 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"
44 #include "YacsTrace.hxx"
46 using namespace YACS::ENGINE;
50 map<string, Node*> EngineTest::_nodeMap;
51 map<string, ComposedNode*> EngineTest::_compoMap;
55 TypeCode *EngineTest::_tc_bool = new TypeCode(Bool);
56 TypeCode *EngineTest::_tc_int = new TypeCode(Int);
57 TypeCode *EngineTest::_tc_double = new TypeCode(Double);
60 void EngineTest::setUp()
64 void EngineTest::tearDown()
68 void EngineTest::cleanUp()
70 map<string, ComposedNode*>::iterator iter2,iter3;
71 for(map<string, Node*>::iterator iter=_nodeMap.begin();iter!=_nodeMap.end();iter++)
72 if((*iter).second->getFather()==0)
73 delete (*iter).second;
76 void EngineTest::checkGetRuntime()
78 CPPUNIT_ASSERT_THROW(Runtime *myrun = getRuntime(), YACS::Exception);
79 RuntimeForEngineTest::setRuntime();
80 Runtime *myrun1 = getRuntime();
81 CPPUNIT_ASSERT(myrun1);
82 Runtime *myrun2 = getRuntime();
83 CPPUNIT_ASSERT_EQUAL(myrun1, myrun2);
96 void EngineTest::checkAny1()
98 char *toto=new char[10];
99 strcpy(toto,"lkjlkj");
100 Any *tmp=AtomAny::New(toto,toto2);//no copy here
101 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
102 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
104 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
105 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
107 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
108 CPPUNIT_ASSERT( tmp->getStringValue() == "lkjlkj");
110 const char tmp2[]="coucou";
111 tmp=AtomAny::New((char *)tmp2,0);
112 CPPUNIT_ASSERT( tmp->getStringValue() == "coucou");
113 CPPUNIT_ASSERT( tmp->getStringValue() == "coucou");
115 tmp=AtomAny::New(string("abcdef"));
116 CPPUNIT_ASSERT( tmp->getStringValue() == "abcdef");
117 CPPUNIT_ASSERT( tmp->getStringValue() == "abcdef");
119 tmp=AtomAny::New("ghijk");
120 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
121 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
123 tmp=AtomAny::New((char *)"ghijk");
124 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
125 CPPUNIT_ASSERT( tmp->getStringValue() == "ghijk");
135 A7(double toto):_d(toto),_cnt(1) { }
136 static A7 *New(double toto) { return new A7(toto); }
137 double getToto() const { return _d; }
138 void setToto(double val) { _d=val; }
139 void incrRef() { _cnt++; }
152 void checkSharedPtrFct2(const A7& a)
157 void checkSharedPtrFct1(const SharedPtr<A7>& a)
159 checkSharedPtrFct2(a);
163 void EngineTest::checkSharedPtr()
165 SharedPtr<A7> titi=A7::New(5.);
166 SharedPtr<A7> toto=A7::New(5.1);
167 SharedPtr<A7> tutu(toto);
168 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.,titi->getToto(),1e-12);
170 CPPUNIT_ASSERT_DOUBLES_EQUAL(7.1,titi->getToto(),1e-12);
171 checkSharedPtrFct2(titi);
172 checkSharedPtrFct2(toto);
174 checkSharedPtrFct2(titi);
175 checkSharedPtrFct2(tutu);
178 void EngineTest::checkAny2()
180 double tabStack[8]={1.2, 3.4, 5.6, 7.8, 9.0, 2.3, 4.5, 6.7};
181 double *tabHeap=new double[8];
182 memcpy(tabHeap,tabStack,8*sizeof(double));
183 SequenceAnyPtr tmp(SequenceAny::New(tabStack,8,0));
184 CPPUNIT_ASSERT_EQUAL(8,(int)tmp->size());
185 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.6,(*tmp)[2]->getDoubleValue(),1e-12);
186 CPPUNIT_ASSERT_DOUBLES_EQUAL(6.7,(*tmp)[7]->getDoubleValue(),1e-12);
187 AtomAnyPtr tmp2(AtomAny::New(8.9));
189 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
190 tmp2=AtomAny::New(10.2);
192 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
193 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.9,(*tmp)[8]->getDoubleValue(),1e-12);
194 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.2,(*tmp)[9]->getDoubleValue(),1e-12);
196 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
197 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.9,(*tmp)[8]->getDoubleValue(),1e-12);
198 tmp2=AtomAny::New(10.3);
200 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
201 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.9,(*tmp)[8]->getDoubleValue(),1e-12);
202 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.3,(*tmp)[9]->getDoubleValue(),1e-12);
203 tmp=SequenceAny::New(tabHeap,8,toto2);
204 CPPUNIT_ASSERT_DOUBLES_EQUAL(5.6,(*tmp)[2]->getDoubleValue(),1e-12);
205 CPPUNIT_ASSERT_DOUBLES_EQUAL(6.7,(*tmp)[7]->getDoubleValue(),1e-12);
206 tmp2=AtomAny::New(8.5);
208 tmp2=AtomAny::New(10.27);
210 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,(*tmp)[8]->getDoubleValue(),1e-12);
211 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.27,(*tmp)[9]->getDoubleValue(),1e-12);
212 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
214 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
215 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,(*tmp)[8]->getDoubleValue(),1e-12);
216 tmp2=AtomAny::New(10.445);
218 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
219 CPPUNIT_ASSERT_DOUBLES_EQUAL(8.5,(*tmp)[8]->getDoubleValue(),1e-12);
220 CPPUNIT_ASSERT_DOUBLES_EQUAL(10.445,(*tmp)[9]->getDoubleValue(),1e-12);
222 int tabStackI[8]={1, 3, 5, 7, 9, 2, 4, 6};
223 int *tabHeapI=new int[8];
224 memcpy(tabHeapI,tabStackI,8*sizeof(int));
225 tmp=SequenceAny::New(tabStackI,8,0);
226 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
227 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
228 tmp2=AtomAny::New(8);
230 tmp2=AtomAny::New(25);
232 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
233 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
234 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
235 CPPUNIT_ASSERT_EQUAL(25,(*tmp)[9]->getIntValue());
236 //Same with no copy constructor
237 tmp=SequenceAny::New(tabHeapI,8,toto3);
238 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
239 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
240 tmp2=AtomAny::New(8);
242 tmp2=AtomAny::New(27);
244 CPPUNIT_ASSERT_EQUAL(5,(*tmp)[2]->getIntValue());
245 CPPUNIT_ASSERT_EQUAL(6,(*tmp)[7]->getIntValue());
246 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
247 CPPUNIT_ASSERT_EQUAL(27,(*tmp)[9]->getIntValue());
248 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
250 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
251 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
252 tmp2=AtomAny::New(202);
254 CPPUNIT_ASSERT_EQUAL(10,(int)tmp->size());
255 CPPUNIT_ASSERT_EQUAL(8,(*tmp)[8]->getIntValue());
256 CPPUNIT_ASSERT_EQUAL(202,(*tmp)[9]->getIntValue());
259 double d=(*tmp)[2]->getDoubleValue();
264 CPPUNIT_ASSERT(std::string(e.what())=="Value is not a double");
266 SequenceAnyPtr tmp3=SequenceAny::New(tmp->getType());
269 tmp3->pushBack(tmp2);
274 CPPUNIT_ASSERT(std::string(e.what())=="Invalid runtime of YACS::Any struct : having int and you want Sequence");
276 CPPUNIT_ASSERT_EQUAL(0,(int)tmp3->size());
277 CPPUNIT_ASSERT_EQUAL(202,(*tmp)[9]->getIntValue());
279 CPPUNIT_ASSERT_EQUAL(1,(int)tmp3->size());
280 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
281 tmp=SequenceAny::New(tabStackI,8,0);
283 CPPUNIT_ASSERT_EQUAL(2,(int)tmp3->size());
284 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
285 CPPUNIT_ASSERT_EQUAL(7,(*tmp3)[1][3]->getIntValue());
288 CPPUNIT_ASSERT_EQUAL(4,(int)tmp3->size());
289 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
290 CPPUNIT_ASSERT_EQUAL(7,(*tmp3)[1][3]->getIntValue());
291 CPPUNIT_ASSERT_EQUAL(7,(*tmp3)[3][3]->getIntValue());
292 tmp2=AtomAny::New(89);
294 CPPUNIT_ASSERT_EQUAL(4,(int)tmp3->size());
295 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
296 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
297 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[1][8]->getIntValue());
298 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[2][8]->getIntValue());
299 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[3][8]->getIntValue());
301 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
302 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
303 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
304 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[1][8]->getIntValue());
305 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[2][8]->getIntValue());
306 SequenceAnyPtr tmp4=(SequenceAny *)tmp3->clone();
307 CPPUNIT_ASSERT_EQUAL(3,(int)tmp4->size());
308 CPPUNIT_ASSERT_EQUAL(202,(*tmp4)[0][9]->getIntValue());
309 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[1][8]->getIntValue());
310 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[2][8]->getIntValue());
312 CPPUNIT_ASSERT_EQUAL(2,(int)tmp4->size());
313 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
314 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
315 CPPUNIT_ASSERT_EQUAL(202,(*tmp4)[0][9]->getIntValue());
316 CPPUNIT_ASSERT_EQUAL(89,(*tmp3)[1][8]->getIntValue());
317 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[1][8]->getIntValue());
319 tmp2=AtomAny::New(107);
321 CPPUNIT_ASSERT_EQUAL(2,(int)tmp4->size());
322 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
323 CPPUNIT_ASSERT_EQUAL(202,(*tmp3)[0][9]->getIntValue());
324 CPPUNIT_ASSERT_EQUAL(202,(*tmp4)[0][9]->getIntValue());
325 CPPUNIT_ASSERT_EQUAL(107,(*tmp3)[1][8]->getIntValue());//These 2 lines to show that deepCpy has been done
326 CPPUNIT_ASSERT_EQUAL(89,(*tmp4)[1][8]->getIntValue());
329 void EngineTest::checkAny3()
332 vec.push_back("tata00000"); vec.push_back("toto"); vec.push_back("tutu");
333 SequenceAnyPtr tmp(SequenceAny::New(vec));
334 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
335 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
336 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
337 CPPUNIT_ASSERT((*tmp)[2]->getStringValue()=="tutu");
338 tmp->pushBack(AtomAnyPtr(AtomAny::New("abcdefgh")));
339 CPPUNIT_ASSERT_EQUAL(4,(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 CPPUNIT_ASSERT((*tmp)[3]->getStringValue()=="abcdefgh");
345 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
346 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
347 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
348 CPPUNIT_ASSERT((*tmp)[2]->getStringValue()=="tutu");
350 CPPUNIT_ASSERT_EQUAL(2,(int)tmp->size());
351 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
352 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="toto");
354 CPPUNIT_ASSERT_EQUAL(1,(int)tmp->size());
355 CPPUNIT_ASSERT((*tmp)[0]->getStringValue()=="tata00000");
357 CPPUNIT_ASSERT_EQUAL(0,(int)tmp->size());
360 tmp=SequenceAny::New(vec2);
361 CPPUNIT_ASSERT_EQUAL(0,(int)tmp->size());
362 vec2.push_back(true); vec2.push_back(false); vec2.push_back(true); vec2.push_back(true); vec2.push_back(true);
363 tmp=SequenceAny::New(vec2);
364 CPPUNIT_ASSERT_EQUAL(5,(int)tmp->size());
365 CPPUNIT_ASSERT((*tmp)[0]->getBoolValue() && !(*tmp)[1]->getBoolValue() && (*tmp)[2]->getBoolValue() && (*tmp)[3]->getBoolValue() && (*tmp)[4]->getBoolValue());
366 //in perspective of SequenceAny of bool were optimized as std::vector<bool> does.
367 tmp->pushBack(AtomAnyPtr(AtomAny::New(false))); tmp->pushBack(AtomAnyPtr(AtomAny::New(true))); tmp->pushBack(AtomAnyPtr(AtomAny::New(false)));
368 tmp->pushBack(AtomAnyPtr(AtomAny::New(true)));
369 CPPUNIT_ASSERT_EQUAL(9,(int)tmp->size());
370 CPPUNIT_ASSERT((*tmp)[0]->getBoolValue() && !(*tmp)[1]->getBoolValue() && (*tmp)[2]->getBoolValue() && (*tmp)[3]->getBoolValue() && (*tmp)[4]->getBoolValue());
371 CPPUNIT_ASSERT(!(*tmp)[5]->getBoolValue() && (*tmp)[6]->getBoolValue() && !(*tmp)[7]->getBoolValue() && (*tmp)[8]->getBoolValue());
374 vec3.push_back(2); vec3.push_back(5); vec3.push_back(7); vec3.push_back(1); vec3.push_back(66); vec3.push_back(26);
375 tmp=SequenceAny::New(vec3);
376 CPPUNIT_ASSERT_EQUAL(6,(int)tmp->size());
377 CPPUNIT_ASSERT_EQUAL(26,(*tmp)[5]->getIntValue());
379 CPPUNIT_ASSERT_EQUAL(5,(int)tmp->size());
382 vec4.push_back(2.78); vec4.push_back(3.14); vec4.push_back(0.07);
383 tmp=SequenceAny::New(vec4);
384 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
385 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.07,(*tmp)[2]->getDoubleValue(),1e-12);
387 CPPUNIT_ASSERT_EQUAL(2,(int)tmp->size());
388 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp)[1]->getDoubleValue(),1e-12);
391 void EngineTest::checkAny4()
393 SequenceAnyPtr tmp(SequenceAny::New(Runtime::_tc_int,8));
394 tmp=SequenceAny::New(Runtime::_tc_int,4);
395 tmp=SequenceAny::New(Runtime::_tc_int);
396 tmp=SequenceAny::New(Runtime::_tc_int,7);
397 AnyPtr tmp2=AtomAny::New(107);
398 tmp->setEltAtRank(3,tmp2);
399 CPPUNIT_ASSERT_EQUAL(107,(*tmp)[3]->getIntValue());
400 tmp=SequenceAny::New(Runtime::_tc_string,2);
401 const char tmpSt[]="titi";
402 tmp2=AtomAny::New((char*)tmpSt,0);
403 tmp->setEltAtRank(1,tmp2);
404 CPPUNIT_ASSERT((*tmp)[1]->getStringValue()=="titi");
406 vec4.push_back(2.78); vec4.push_back(3.14); vec4.push_back(0.07);
407 tmp2=SequenceAny::New(vec4);
408 tmp=SequenceAny::New(tmp2->getType(),3);
409 tmp->setEltAtRank(0,tmp2);
410 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp)[0][1]->getDoubleValue(),1e-12);
411 CPPUNIT_ASSERT_EQUAL(3,(int)tmp->size());
413 CPPUNIT_ASSERT_EQUAL(0,(int)tmp->size());
416 CPPUNIT_ASSERT_EQUAL(2,(int)tmp->size());
417 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp)[1][1]->getDoubleValue(),1e-12);
421 * Testing Any::operator ==
423 void EngineTest::checkAny5()
426 AnyPtr tmp1=AtomAny::New(107);
427 AnyPtr tmp2=AtomAny::New(107);
428 CPPUNIT_ASSERT( *tmp1==*tmp2 );
429 tmp1=AtomAny::New(106);
430 CPPUNIT_ASSERT( ! (*tmp1==*tmp2) );
431 CPPUNIT_ASSERT( ! (*tmp2==*tmp1) );
432 tmp1=AtomAny::New("toto");
433 CPPUNIT_ASSERT( ! (*tmp1==*tmp2) );
434 tmp2=AtomAny::New("tot");
435 CPPUNIT_ASSERT( ! (*tmp1==*tmp2) );
436 tmp2=AtomAny::New("toto");
437 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
438 tmp1=AtomAny::New("mmmmmlll");
440 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
443 vec.push_back("tata00000"); vec.push_back("toto"); vec.push_back("tutu");
444 SequenceAnyPtr tmp3=(SequenceAny::New(vec));
445 CPPUNIT_ASSERT_EQUAL(3,(int)tmp3->size());
446 CPPUNIT_ASSERT((*tmp3)[0]->getStringValue()=="tata00000");
447 CPPUNIT_ASSERT((*tmp3)[1]->getStringValue()=="toto");
448 CPPUNIT_ASSERT((*tmp3)[2]->getStringValue()=="tutu");
449 AnyPtr tmp4=tmp3->clone();
450 CPPUNIT_ASSERT( (*tmp3==*tmp4) );
451 CPPUNIT_ASSERT( (*tmp3==*tmp3) );
453 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
454 tmp1=AtomAny::New("tutu");
455 tmp3->pushBack(tmp1);
456 CPPUNIT_ASSERT( (*tmp3==*tmp4) );
457 tmp3->pushBack(tmp1);
458 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
460 CPPUNIT_ASSERT( *tmp3==*tmp4 );
462 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
463 tmp1=AtomAny::New("tutug");
464 tmp3->pushBack(tmp1);
465 CPPUNIT_ASSERT( !(*tmp3==*tmp4) );
469 * Test of ArrayAny. Only one level.
471 void EngineTest::checkAny6()
474 const int tab[lgth]={0,1,1,9,2,7,2,3};
475 const int tab2[lgth]={13,1,1,9,2,7,2,3};
476 ArrayAnyPtr tmp1(ArrayAny::New(tab,lgth));
477 ArrayAnyPtr tmp2(ArrayAny::New(tab,lgth));
478 CPPUNIT_ASSERT((*tmp1)[3]->getIntValue()==9);
479 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
480 CPPUNIT_ASSERT( (*tmp1==*tmp1) );
481 CPPUNIT_ASSERT( 8==tmp1->size() );
482 CPPUNIT_ASSERT( 8==tmp2->size() );
483 tmp2=ArrayAny::New(tab,lgth-1);
484 CPPUNIT_ASSERT( 7==tmp2->size() );
485 CPPUNIT_ASSERT( !(*tmp1==*tmp2) );
486 tmp2=ArrayAny::New(tab2,lgth);
487 CPPUNIT_ASSERT( !(*tmp1==*tmp2) );
488 tmp2=ArrayAny::New(tab,lgth);
489 CPPUNIT_ASSERT( (*tmp1==*tmp2) );
490 ArrayAnyPtr tmp3=(ArrayAny *)tmp1->clone();
491 CPPUNIT_ASSERT( (*tmp1==*tmp3) );
492 CPPUNIT_ASSERT((*tmp3)[3]->getIntValue()==9); CPPUNIT_ASSERT((*tmp3)[4]->getIntValue()==2);
493 // Ok let's test with double.
494 const double tab3[lgth]={0.1,1.1,1.1,9.1,2.1,7.1,2.1,3.1};
495 const double tab4[lgth]={13.1,1.1,1.1,9.1,2.1,7.1,2.1,3.1};
496 ArrayAnyPtr tmp4(ArrayAny::New(tab3,lgth));
497 ArrayAnyPtr tmp5(ArrayAny::New(tab3,lgth));
498 CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp4)[3]->getDoubleValue(),9.1,1e-12);
499 CPPUNIT_ASSERT( (*tmp4==*tmp5) );
500 CPPUNIT_ASSERT( (*tmp4==*tmp4) );
501 CPPUNIT_ASSERT( 8==tmp4->size() );
502 CPPUNIT_ASSERT( 8==tmp5->size() );
503 tmp5=ArrayAny::New(tab3,lgth-1);
504 CPPUNIT_ASSERT( 7==tmp5->size() );
505 CPPUNIT_ASSERT( !(*tmp4==*tmp5) );
506 tmp5=ArrayAny::New(tab4,lgth);
507 CPPUNIT_ASSERT( !(*tmp4==*tmp5) );
508 tmp5=ArrayAny::New(tab3,lgth);
509 CPPUNIT_ASSERT( (*tmp4==*tmp5) );
510 ArrayAnyPtr tmp6=(ArrayAny *)tmp4->clone();
511 CPPUNIT_ASSERT( (*tmp4==*tmp6) );
512 CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp6)[3]->getDoubleValue(),9.1,1e-12);
513 CPPUNIT_ASSERT_DOUBLES_EQUAL((*tmp6)[4]->getDoubleValue(),2.1,1e-12);
514 //Ok let's test with bool.
515 const bool tab5[lgth]={false,true,false,true,false,false,false,false};
516 const bool tab6[lgth]={true ,true,false,true,false,false,false,false};
517 ArrayAnyPtr tmp7(ArrayAny::New(tab5,lgth));
518 ArrayAnyPtr tmp8(ArrayAny::New(tab5,lgth));
519 CPPUNIT_ASSERT((*tmp7)[3]->getBoolValue());
520 CPPUNIT_ASSERT( (*tmp7==*tmp8) );
521 CPPUNIT_ASSERT( (*tmp7==*tmp7) );
522 CPPUNIT_ASSERT( 8==tmp7->size() );
523 CPPUNIT_ASSERT( 8==tmp8->size() );
524 tmp8=ArrayAny::New(tab5,lgth-1);
525 CPPUNIT_ASSERT( 7==tmp8->size() );
526 CPPUNIT_ASSERT( !(*tmp7==*tmp8) );
527 tmp8=ArrayAny::New(tab6,lgth);
528 CPPUNIT_ASSERT( !(*tmp7==*tmp8) );
529 tmp8=ArrayAny::New(tab5,lgth);
530 CPPUNIT_ASSERT( (*tmp7==*tmp8) );
531 ArrayAnyPtr tmp9=(ArrayAny *)tmp7->clone();
532 CPPUNIT_ASSERT( (*tmp9==*tmp7) );
533 CPPUNIT_ASSERT((*tmp8)[3]->getBoolValue());
534 CPPUNIT_ASSERT(!(*tmp8)[4]->getBoolValue());
535 //Ok let's test with strings.
536 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";
537 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";
538 ArrayAnyPtr tmp10(ArrayAny::New(tab7));
539 ArrayAnyPtr tmp11(ArrayAny::New(tab7));
540 CPPUNIT_ASSERT((*tmp10)[3]->getStringValue()=="jkl");
541 CPPUNIT_ASSERT( (*tmp10==*tmp11) );
542 CPPUNIT_ASSERT( (*tmp10==*tmp10) );
543 CPPUNIT_ASSERT( 8==tmp10->size() );
544 CPPUNIT_ASSERT( 8==tmp11->size() );
545 vector<string> tab9(tab7); tab9.pop_back();
546 tmp11=ArrayAny::New(tab9);
547 CPPUNIT_ASSERT( 7==tmp11->size() );
548 CPPUNIT_ASSERT( !(*tmp10==*tmp11) );
549 tmp11=ArrayAny::New(tab8);
550 CPPUNIT_ASSERT( !(*tmp10==*tmp11) );
551 tmp11=ArrayAny::New(tab7);
552 CPPUNIT_ASSERT( (*tmp10==*tmp11) );
553 ArrayAnyPtr tmp12=(ArrayAny *)tmp10->clone();
554 CPPUNIT_ASSERT( (*tmp12==*tmp10) );
555 CPPUNIT_ASSERT((*tmp11)[3]->getStringValue()=="jkl");
556 CPPUNIT_ASSERT((*tmp11)[4]->getStringValue()=="mno");
560 * Test of ArrayAny on multi-levels. To test recursion.
562 void EngineTest::checkAny7()
565 const int tab1[lgth]={0,1,1,9,2,7,2,3};
566 const int tab2[lgth]={7,8,8,16,9,14,9,10};
567 //Testing Arrays of arrays
568 ArrayAnyPtr tmp11(ArrayAny::New(tab1,lgth));
569 ArrayAnyPtr tmp12(ArrayAny::New(tab2,lgth));
570 ArrayAnyPtr tmp12Throw(ArrayAny::New(tab2,lgth+1));
571 ArrayAnyPtr tmp2(ArrayAny::New(tmp11->getType(),2));
572 tmp2->setEltAtRank(0,tmp11);
573 CPPUNIT_ASSERT_THROW(tmp2->setEltAtRank(1,tmp12Throw),Exception);
574 tmp2->setEltAtRank(1,tmp12);
575 CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
576 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
577 // Show deep copy process of arrays
578 AnyPtr tmp=AtomAny::New(49);
579 tmp11->setEltAtRank(0,tmp);
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 ArrayAnyPtr tmp2Cloned=(ArrayAny *)(tmp2->clone());
583 CPPUNIT_ASSERT_EQUAL(0,(*tmp2Cloned)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2Cloned)[1][0]->getIntValue());
584 CPPUNIT_ASSERT_EQUAL(9,(*tmp2Cloned)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2Cloned)[1][3]->getIntValue());
585 CPPUNIT_ASSERT( *tmp2==*tmp2Cloned );
586 CPPUNIT_ASSERT( *tmp2==*tmp2 );
587 //Testing Array of Sequences
588 SequenceAnyPtr tmp13(SequenceAny::New((int *)tab1,lgth,0));
589 SequenceAnyPtr tmp14(SequenceAny::New((int *)tab2,lgth,0));
590 tmp2=ArrayAny::New(tmp13->getType(),2);
591 tmp2->setEltAtRank(0,tmp13);
592 tmp2->setEltAtRank(1,tmp14);
593 CPPUNIT_ASSERT_EQUAL(0,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
594 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
595 tmp13->setEltAtRank(0,tmp);
596 // No deep copy here contrary to 14 lines ahead.
597 CPPUNIT_ASSERT_EQUAL(49,(*tmp2)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2)[1][0]->getIntValue());
598 CPPUNIT_ASSERT_EQUAL(9,(*tmp2)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2)[1][3]->getIntValue());
599 tmp2Cloned=(ArrayAny *)(tmp2->clone());
600 CPPUNIT_ASSERT_EQUAL(49,(*tmp2Cloned)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp2Cloned)[1][0]->getIntValue());
601 CPPUNIT_ASSERT_EQUAL(9,(*tmp2Cloned)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp2Cloned)[1][3]->getIntValue());
602 CPPUNIT_ASSERT( *tmp2==*tmp2Cloned );
603 CPPUNIT_ASSERT( *tmp2==*tmp2 );
604 //Testing Sequence of array
605 tmp13=SequenceAny::New(tmp11->getType(),2);
606 tmp13->setEltAtRank(0,tmp11);
607 tmp13->setEltAtRank(1,tmp12);
608 CPPUNIT_ASSERT_EQUAL(49,(*tmp13)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp13)[1][0]->getIntValue());
609 CPPUNIT_ASSERT_EQUAL(9,(*tmp13)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp13)[1][3]->getIntValue());
610 tmp14=(SequenceAny *)tmp13->clone();
611 CPPUNIT_ASSERT_EQUAL(49,(*tmp14)[0][0]->getIntValue()); CPPUNIT_ASSERT_EQUAL(7,(*tmp14)[1][0]->getIntValue());
612 CPPUNIT_ASSERT_EQUAL(9,(*tmp14)[0][3]->getIntValue()); CPPUNIT_ASSERT_EQUAL(16,(*tmp14)[1][3]->getIntValue());
613 CPPUNIT_ASSERT( *tmp13==*tmp14 );
614 CPPUNIT_ASSERT( *tmp13==*tmp13 );
618 * First test of structs.
620 void EngineTest::checkAny8()
622 TypeCodeStruct *tc=new TypeCodeStruct("","");
623 tc->addMember("MyInt",Runtime::_tc_int);
624 tc->addMember("MyDouble",Runtime::_tc_double);
625 tc->addMember("MyBool",Runtime::_tc_bool);
626 tc->addMember("MyStr",Runtime::_tc_string);
627 StructAnyPtr tmp1=StructAny::New(tc);
628 tmp1=StructAny::New(tc);
629 AnyPtr tmpAtom=AtomAny::New(3791);
630 tmp1->setEltAtRank("MyInt",tmpAtom);
631 CPPUNIT_ASSERT_THROW(tmp1->setEltAtRank(1,tmpAtom),Exception);
632 tmpAtom=AtomAny::New(3.14);
633 CPPUNIT_ASSERT_THROW(tmp1->setEltAtRank("MyDoubl",tmpAtom),Exception);
634 tmp1->setEltAtRank("MyDouble",tmpAtom);
635 tmpAtom=AtomAny::New(false);
636 tmp1->setEltAtRank("MyBool",tmpAtom);
637 tmpAtom=AtomAny::New("abcdef");
638 tmp1->setEltAtRank("MyStr",tmpAtom);
639 CPPUNIT_ASSERT_EQUAL(3791,(*tmp1)["MyInt"]->getIntValue());
640 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.14,(*tmp1)["MyDouble"]->getDoubleValue(),1e-12);
641 CPPUNIT_ASSERT_THROW((*tmp1)["MyIntT"],Exception);
642 CPPUNIT_ASSERT(!(*tmp1)["MyBool"]->getBoolValue());
643 CPPUNIT_ASSERT_THROW((*tmp1)["MyBool"]->getStringValue(),Exception);
644 CPPUNIT_ASSERT((*tmp1)["MyStr"]->getStringValue()=="abcdef");
645 tmpAtom=AtomAny::New("ghijklm");
646 tmp1->setEltAtRank("MyStr",tmpAtom);
647 CPPUNIT_ASSERT((*tmp1)["MyStr"]->getStringValue()=="ghijklm");
648 //Introduce some recursive structure.
649 SequenceAnyPtr tmp2=SequenceAny::New(tc,2);
650 tmp2->setEltAtRank(0,tmp1);
651 tmpAtom=AtomAny::New("opqrst");
652 tmp1->setEltAtRank("MyStr",tmpAtom);
653 tmp2->setEltAtRank(1,tmp1);
654 CPPUNIT_ASSERT_EQUAL(3791,(*tmp2)[1]["MyInt"]->getIntValue());
655 CPPUNIT_ASSERT((*tmp2)[0]["MyStr"]->getStringValue()=="ghijklm");
656 CPPUNIT_ASSERT((*tmp2)[1]["MyStr"]->getStringValue()=="opqrst");
657 CPPUNIT_ASSERT(*tmp2==*tmp2);
658 AnyPtr tmp3=tmp2->clone();
659 CPPUNIT_ASSERT(*tmp2==*tmp3);
660 CPPUNIT_ASSERT((*tmp3)[0]["MyStr"]->getStringValue()=="ghijklm");
661 CPPUNIT_ASSERT((*tmp3)[1]["MyStr"]->getStringValue()=="opqrst");
665 void EngineTest::checkInGateOutGate()
667 string nodeName = "Node1";
668 ElementaryNode* node1 = new TestElemNode(nodeName);
669 _nodeMap[nodeName] = node1;
672 ElementaryNode* node2 = new TestElemNode(nodeName);
673 _nodeMap[nodeName] = node2;
675 DEBTRACE(" --- check InGate OK after node creation" );
677 InGate *node1Ingate = node1->getInGate();
678 CPPUNIT_ASSERT(node1Ingate);
679 string name=node1Ingate->getNameOfTypeOfCurrentInstance();
680 string expected="InGate";
681 CPPUNIT_ASSERT_EQUAL(name,expected);
684 DEBTRACE(" --- check OutGate OK after node creation" );
686 OutGate *node1Outgate = node1->getOutGate();
687 CPPUNIT_ASSERT(node1Outgate);
688 string name=node1Outgate->getNameOfTypeOfCurrentInstance();
689 string expected="OutGate";
690 CPPUNIT_ASSERT_EQUAL(name,expected);
694 void EngineTest::checkNodePortNumber()
696 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
698 DEBTRACE(" --- check number of ports = 0 after node creation" );
699 CPPUNIT_ASSERT(node1->getNumberOfInputPorts() == 0);
700 CPPUNIT_ASSERT(node1->getNumberOfOutputPorts() == 0);
702 InputPort *in1 = node1->edAddInputPort("ib1",_tc_bool);
703 InputPort *in2 = node1->edAddInputPort("ii1",_tc_int);
704 InputPort *in3 = node1->edAddInputPort("ii2",_tc_int);
705 InputPort *in4 = node1->edAddInputPort("id1",_tc_double);
707 OutputPort *ou1 = node1->edAddOutputPort("ob1",_tc_bool);
708 OutputPort *ou2 = node1->edAddOutputPort("oi1",_tc_int);
709 OutputPort *ou3 = node1->edAddOutputPort("od1",_tc_double);
711 DEBTRACE(" --- check number of ports after ports creation" );
712 // DEBTRACE(" node1->getNumberOfInputPorts(): "
713 // << node1->getNumberOfInputPorts());
714 // DEBTRACE(" node1->getNumberOfOutputPorts(): "
715 // << node1->getNumberOfOutputPorts());
716 CPPUNIT_ASSERT(node1->getNumberOfInputPorts() == 4);
717 CPPUNIT_ASSERT(node1->getNumberOfOutputPorts() == 3);
720 void EngineTest::checkPortTypeName()
722 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
724 DEBTRACE(" --- check InputPort name OK" );
726 string name=node1->getInputPort("ib1")->NAME;
727 string expected="InputPort";
728 CPPUNIT_ASSERT_EQUAL(name,expected);
731 DEBTRACE(" --- check OutputPort name OK" );
733 string name=node1->getOutputPort("ob1")->NAME;
734 string expected="OutputPort";
735 CPPUNIT_ASSERT_EQUAL(name,expected);
739 void EngineTest::checkDuplicatePortName()
741 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
742 DEBTRACE(" --- check duplicated name throws exception" );
743 CPPUNIT_ASSERT_THROW(InputPort *in5=node1->edAddInputPort("ii2",_tc_int),
747 void EngineTest::checkRemovePort()
749 ElementaryNode* node1 = (ElementaryNode*) _nodeMap["Node1"];
750 ElementaryNode* node2 = (ElementaryNode*) _nodeMap["Node2"];
752 DEBTRACE(" --- check remove port" );
754 node1->edRemovePort(node1->getInputPort("ib1"));
755 CPPUNIT_ASSERT(node1->getNumberOfInputPorts() == 3);
756 CPPUNIT_ASSERT(node1->getNumberOfOutputPorts() == 3);
759 DEBTRACE(" --- check remove wrong port throws exception" )
761 CPPUNIT_ASSERT_THROW(node1->edRemovePort(node1->getInputPort("ib1")),
766 void EngineTest::checkAddNodesToBloc()
768 DEBTRACE(" --- delete node; // ====== NOT OK : done by bloc" );
770 for (int i=0; i<10; i++)
775 ElementaryNode* node = new TestElemNode(s);
777 InputPort *i1 = node->edAddInputPort("ib1",_tc_bool);
778 InputPort *i2 = node->edAddInputPort("ii1",_tc_int);
779 InputPort *i3 = node->edAddInputPort("ii2",_tc_int);
780 InputPort *i4 = node->edAddInputPort("id1",_tc_double);
781 OutputPort *o1 = node->edAddOutputPort("ob1",_tc_bool);
782 OutputPort *o2 = node->edAddOutputPort("oi1",_tc_int);
783 OutputPort *o3 = node->edAddOutputPort("od1",_tc_double);
786 DEBTRACE(" --- create bloc, add two nodes, check constituants" );
788 Bloc* bloc1 = new Bloc("bloc1");
789 _nodeMap["bloc1"] = bloc1;
790 _compoMap["bloc1"] = bloc1;
791 bloc1->edAddChild(_nodeMap["Node_1"]);
792 bloc1->edAddChild(_nodeMap["Node_2"]);
794 list<ElementaryNode *> setelem = bloc1->getRecursiveConstituents();
795 CPPUNIT_ASSERT(setelem.size() == 2);
799 void EngineTest::checkAddingTwiceSameNodeInSameBloc()
801 DEBTRACE(" --- add the same node two times does nothing: return false" );
803 CPPUNIT_ASSERT(! ((Bloc*)_compoMap["bloc1"])->edAddChild(_nodeMap["Node_1"]));
806 void EngineTest::checkAddingTwiceSameNodeInTwoBlocs()
808 DEBTRACE(" --- add a node already used elsewhere raises exception" );
810 Bloc* bloc2 = new Bloc("bloc2");
811 _nodeMap["bloc2"] = bloc2;
812 _compoMap["bloc2"] = bloc2;
813 bloc2->edAddChild(_nodeMap["Node_3"]);
815 CPPUNIT_ASSERT_THROW(bloc2->edAddChild(_nodeMap["Node_1"]),
820 void EngineTest::checkRecursiveBlocs_NumberOfNodes()
822 Bloc *bloc1 = (Bloc*)_compoMap["bloc1"];
823 Bloc *bloc2 = (Bloc*)_compoMap["bloc2"];
825 DEBTRACE(" --- recursive blocs, check constituants" );
827 Bloc* bloc3 = new Bloc("bloc3");
828 _nodeMap["bloc3"] = bloc3;
829 _compoMap["bloc3"] = bloc3;
830 bloc3->edAddChild((bloc1)); // 2 elementary nodes
831 bloc3->edAddChild((bloc2)); // 1 elementary node
832 bloc3->edAddChild(_nodeMap["Node_4"]); // 1 elementary node
834 list<ElementaryNode *> setelem = bloc3->getRecursiveConstituents();
835 CPPUNIT_ASSERT(setelem.size() == 4);
836 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
838 DEBTRACE(" elem name = " << (*it)->getName());
843 void EngineTest::checkRecursiveBlocs_NumberOfPorts()
845 Bloc *bloc3 = (Bloc*)_compoMap["bloc3"];
847 DEBTRACE(" --- recursive blocs, check input & output ports // COMPLETER" );
848 CPPUNIT_ASSERT(bloc3->getNumberOfInputPorts() == 4*4);
849 DEBTRACE(" number of input ports: " << bloc3->getNumberOfInputPorts());
850 DEBTRACE(" number of output ports: " << bloc3->getNumberOfOutputPorts());
852 list<InputPort *> inset = bloc3->getSetOfInputPort();
853 list<OutputPort *> outset = bloc3->getSetOfOutputPort();
854 for (list<InputPort *>::iterator it=inset.begin(); it!=inset.end(); it++)
856 DEBTRACE(" input port name = " << bloc3->getInPortName(*it));
858 for (list<OutputPort *>::iterator it=outset.begin(); it!=outset.end(); it++)
860 DEBTRACE(" output port name = " << bloc3->getOutPortName(*it));
865 void EngineTest::checkPortNameInBloc()
868 DEBTRACE(" --- recursive blocs, check port names" );
870 InputPort *inport = _nodeMap["Node_1"]->getInputPort("id1");
871 CPPUNIT_ASSERT(_nodeMap["bloc3"]->getInPortName(inport) == "bloc1.Node_1.id1");
872 CPPUNIT_ASSERT(((Bloc*)_nodeMap["bloc3"])->getChildName(_nodeMap["Node_1"]) == "bloc1.Node_1");
875 void EngineTest::checkGetNameOfPortNotInBloc()
877 InputPort *inport = _nodeMap["Node_5"]->getInputPort("id1");
878 CPPUNIT_ASSERT_THROW(string name = _nodeMap["bloc3"]->getInPortName(inport),
882 void EngineTest::checkRemoveNode()
884 DEBTRACE(" --- bloc and port inventory must be OK after bloc remove" );
886 Bloc* bloc = new Bloc("blocR");
887 _nodeMap["blocR"] = bloc;
888 _compoMap["blocR"] = bloc;
889 bloc->edAddChild(_nodeMap["Node_5"]);
890 bloc->edAddChild(_nodeMap["Node_6"]);
891 bloc->edAddChild(_nodeMap["Node_7"]);
894 list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
895 CPPUNIT_ASSERT(setelem.size() == 3);
897 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
899 DEBTRACE(" elem name = " << (*it)->getName());
903 ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_6"]);
906 list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
907 CPPUNIT_ASSERT(setelem.size() == 2);
908 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
910 DEBTRACE(" elem name = " << (*it)->getName());
911 DEBTRACE(" elem name in Bloc = " << ((Bloc *)_nodeMap["blocR"])->getChildName(*it));
916 list<InputPort *> inset = _nodeMap["blocR"]->getSetOfInputPort();
917 list<OutputPort *> outset = _nodeMap["blocR"]->getSetOfOutputPort();
918 CPPUNIT_ASSERT(inset.size() == 8);
919 CPPUNIT_ASSERT(outset.size() == 6);
920 for (list<InputPort *>::iterator it=inset.begin(); it!=inset.end(); it++)
922 DEBTRACE(" input port name for blocR = " << _nodeMap["blocR"]->getInPortName(*it));
924 for (list<OutputPort *>::iterator it=outset.begin(); it!=outset.end(); it++)
926 DEBTRACE(" output port name for blocR = " << _nodeMap["blocR"]->getOutPortName(*it));
930 ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_5"]);
931 ((Bloc *)_nodeMap["blocR"])->edRemoveChild(_nodeMap["Node_7"]);
933 list<ElementaryNode *> setelem = _nodeMap["blocR"]->getRecursiveConstituents();
934 CPPUNIT_ASSERT(setelem.size() == 0);
938 void EngineTest::RecursiveBlocs_multipleRecursion()
941 Bloc* bloc = new Bloc("bloc4");
942 _nodeMap["bloc4"] = bloc;
943 _compoMap["bloc4"] = bloc;
944 bloc->edAddChild(_nodeMap["Node_5"]);
945 bloc->edAddChild(_nodeMap["Node_6"]);
949 Bloc* bloc = new Bloc("bloc5");
950 _nodeMap["bloc5"] = bloc;
951 _compoMap["bloc5"] = bloc;
952 bloc->edAddChild(_nodeMap["Node_7"]);
953 bloc->edAddChild(_nodeMap["Node_8"]);
957 Bloc* bloc = new Bloc("bloc6");
958 _nodeMap["bloc6"] = bloc;
959 _compoMap["bloc6"] = bloc;
960 bloc->edAddChild(_nodeMap["bloc4"]);
961 bloc->edAddChild(_nodeMap["bloc5"]);
965 Bloc* bloc = new Bloc("bloc7");
966 _nodeMap["bloc7"] = bloc;
967 _compoMap["bloc7"] = bloc;
968 bloc->edAddChild(_nodeMap["bloc3"]);
969 bloc->edAddChild(_nodeMap["bloc6"]);
973 Bloc* bloc = new Bloc("graphe");
974 _nodeMap["graphe"] = bloc;
975 _compoMap["graphe"] = bloc;
976 bloc->edAddChild(_nodeMap["bloc7"]);
977 bloc->edAddChild(_nodeMap["Node_9"]);
981 list<ElementaryNode *> setelem = _nodeMap["graphe"]->getRecursiveConstituents();
982 CPPUNIT_ASSERT(setelem.size() == 9);
983 for (list<ElementaryNode*>::iterator it=setelem.begin(); it!=setelem.end(); it++)
985 DEBTRACE(" elem name = " << (*it)->getName());
990 list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
991 list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
992 for (list<InputPort *>::iterator it=inset.begin(); it!=inset.end(); it++)
994 DEBTRACE(" input port name for bloc7 = " << _nodeMap["bloc7"]->getInPortName(*it));
995 DEBTRACE(" input port name for graphe = " << _nodeMap["graphe"]->getInPortName(*it));
997 for (list<OutputPort *>::iterator it=outset.begin(); it!=outset.end(); it++)
999 DEBTRACE(" output port name for bloc7 = " << _nodeMap["bloc7"]->getOutPortName(*it));
1000 DEBTRACE(" output port name for graphe = " << _nodeMap["graphe"]->getOutPortName(*it));
1002 YACS::ENGINE::VisitorSaveState vst(_compoMap["graphe"]);
1003 vst.openFileDump("dumpState.xml");
1004 _compoMap["graphe"]->accept(&vst);
1005 vst.closeFileDump();
1009 void EngineTest::RecursiveBlocs_removeNodes()
1012 // set<Node *> setNodes = ((Bloc*)_nodeMap["graphe"])->getChildren();
1013 // for (set<Node*>::iterator it=setNodes.begin(); it!=setNodes.end(); it++)
1015 // DEBTRACE(" child name = " << (*it)->getName());
1020 list<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
1021 CPPUNIT_ASSERT(setNode.size() == 16);
1022 list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
1023 list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
1024 DEBTRACE(" input port number in graph: " <<inset.size());
1025 DEBTRACE(" output port number in graph: " <<outset.size());
1026 CPPUNIT_ASSERT(inset.size() == 32);
1027 CPPUNIT_ASSERT(outset.size() == 24);
1030 ((Bloc *)_nodeMap["bloc7"])->edRemoveChild(_nodeMap["bloc6"]);
1033 list<Node *> setNode = ((Bloc*)_nodeMap["graphe"])->getAllRecursiveConstituents();
1034 CPPUNIT_ASSERT(setNode.size() == 9);
1035 for (list<Node*>::iterator it=setNode.begin(); it!=setNode.end(); it++)
1037 DEBTRACE(" elem name = " << ((Bloc *)_nodeMap["graphe"])->getChildName(*it));
1039 list<InputPort *> inset = _nodeMap["bloc7"]->getSetOfInputPort();
1040 list<OutputPort *> outset = _nodeMap["bloc7"]->getSetOfOutputPort();
1041 DEBTRACE(" input port number in graph: " <<inset.size());
1042 DEBTRACE(" output port number in graph: " <<outset.size());
1043 CPPUNIT_ASSERT(inset.size() == 16);
1044 CPPUNIT_ASSERT(outset.size() == 12);
1049 void EngineTest::checkLogger()
1051 Proc* proc=new Proc("proc");
1052 Logger* logger=proc->getLogger("parser");
1053 logger->error("error1","file.cxx",324);
1054 logger->error("error2","file.cxx",852);
1055 CPPUNIT_ASSERT(logger->hasErrors()==true);
1056 CPPUNIT_ASSERT(logger->isEmpty()==false);
1057 const char* expected1="LogRecord: parser:ERROR:error1 (file.cxx:324)\n"
1058 "LogRecord: parser:ERROR:error2 (file.cxx:852)\n";
1059 CPPUNIT_ASSERT(logger->getStr()==expected1);
1062 CPPUNIT_ASSERT(logger->hasErrors()==false);
1063 CPPUNIT_ASSERT(logger->isEmpty()==true);
1065 logger->error("error1","file.cxx",324);
1066 logger->error("error2","file.cxx",852);
1067 logger->error("error3","file.cxx",978);
1068 CPPUNIT_ASSERT(logger->hasErrors()==true);
1069 CPPUNIT_ASSERT(logger->isEmpty()==false);
1070 const char* expected2="LogRecord: parser:ERROR:error1 (file.cxx:324)\n"
1071 "LogRecord: parser:ERROR:error2 (file.cxx:852)\n"
1072 "LogRecord: parser:ERROR:error3 (file.cxx:978)\n";
1073 CPPUNIT_ASSERT(logger->getStr()==expected2);
1077 void EngineTest::checkGraphAnalyser0()
1080 static const int N=2;
1083 for(int i=0;i<N;i++)
1085 std::ostringstream oss; oss << "n" << i+1;
1086 t[i]=new Bloc(oss.str());
1087 proc.edAddChild(t[i]);
1089 proc.edAddCFLink(t[0],t[1]);
1090 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1091 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1092 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1093 SetOfPoints sop(r[0]);
1095 CPPUNIT_ASSERT(sop.getRepr()=="(n1+n2) - ");
1099 void EngineTest::checkGraphAnalyser1()
1102 static const int N=24;
1105 for(int i=0;i<N;i++)
1107 std::ostringstream oss; oss << "n" << i+1;
1108 t[i]=new Bloc(oss.str());
1109 proc.edAddChild(t[i]);
1111 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]);
1112 proc.edAddCFLink(t[14],t[13]); proc.edAddCFLink(t[13],t[5]);
1113 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]);
1114 proc.edAddCFLink(t[11],t[10]); proc.edAddCFLink(t[10],t[8]);
1115 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]);
1116 proc.edAddCFLink(t[19],t[18]); proc.edAddCFLink(t[18],t[4]);
1117 proc.edAddCFLink(t[19],t[3]); proc.edAddCFLink(t[3],t[4]);
1118 proc.edAddCFLink(t[22],t[21]);
1119 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1120 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1121 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1122 SetOfPoints sop(r[0]);
1124 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)) - ");
1128 static const int N=10;
1131 for(int i=0;i<N;i++)
1133 std::ostringstream oss; oss << "n" << i+1;
1134 t[i]=new Bloc(oss.str());
1135 proc.edAddChild(t[i]);
1137 proc.edAddCFLink(t[9],t[0]); proc.edAddCFLink(t[0],t[2]); proc.edAddCFLink(t[2],t[4]); proc.edAddCFLink(t[4],t[5]);
1138 proc.edAddCFLink(t[0],t[1]); proc.edAddCFLink(t[1],t[6]); proc.edAddCFLink(t[6],t[7]); proc.edAddCFLink(t[7],t[5]);
1139 proc.edAddCFLink(t[0],t[8]); proc.edAddCFLink(t[8],t[3]); proc.edAddCFLink(t[3],t[4]);
1140 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1141 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1142 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1143 SetOfPoints sop(r[0]);
1145 CPPUNIT_ASSERT(sop.getRepr()=="((n10+n1)+[([(n9+n4)*n3]+n5)*(n2+n7+n8)]+n6) - ");
1149 void EngineTest::checkGraphAnalyser2()
1152 static const int N=8;
1155 for(int i=0;i<N;i++)
1157 std::ostringstream oss; oss << "n" << i+1;
1158 t[i]=new Bloc(oss.str());
1159 proc.edAddChild(t[i]);
1161 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]);
1162 proc.edAddCFLink(t[4],t[2]); proc.edAddCFLink(t[2],t[3]); proc.edAddCFLink(t[3],t[5]);
1163 std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
1164 CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
1165 CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
1166 SetOfPoints sop(r[0]);
1168 CPPUNIT_ASSERT(sop.getRepr()=="((n8+n5)+[(n1+n2)*(n3+n4)]+(n6+n7)) - ");
1172 static const int NN=6;
1174 Bloc proc2("proc2");
1175 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");
1176 for(int i=0;i<NN;i++)
1177 proc2.edAddChild(tt[i]);
1178 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]);
1179 std::vector< std::list<Node *> > rr(proc2.splitIntoIndependantGraph());
1180 CPPUNIT_ASSERT_EQUAL(1,(int)rr.size());
1181 CPPUNIT_ASSERT_EQUAL(NN,(int)rr[0].size());
1182 SetOfPoints sop2(rr[0]);
1184 CPPUNIT_ASSERT(sop2.getRepr()=="([(n21+n21@1)*(n23+n23@1)]+(n22+n16)) - ");
1188 static const int NNN=6;
1190 Bloc proc3("proc3");
1191 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");
1192 for(int i=0;i<NNN;i++)
1193 proc3.edAddChild(ttt[i]);
1194 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]);
1195 std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
1196 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1197 CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
1198 SetOfPoints sop3(rrr[0]);
1200 CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
1204 void EngineTest::checkGraphAnalyser3()
1207 static const int NNN=6;
1209 Bloc proc3("proc3");
1210 for(int i=0;i<NNN;i++)
1212 std::ostringstream oss; oss << "n" << i+1;
1213 ttt[i]=new Bloc(oss.str());
1214 proc3.edAddChild(ttt[i]);
1216 proc3.edAddCFLink(ttt[0],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[4]);
1217 proc3.edAddCFLink(ttt[0],ttt[2]); proc3.edAddCFLink(ttt[2],ttt[3]); proc3.edAddCFLink(ttt[3],ttt[4]);
1218 proc3.edAddCFLink(ttt[5],ttt[3]);
1219 std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
1220 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1221 CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
1222 SetOfPoints sop3(rrr[0]);
1224 //std:cerr << std::endl << sop3.getRepr() << std::endl;
1225 //CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
1229 void EngineTest::checkGraphAnalyser4()
1232 static const int NNN=3;
1235 for(int i=0;i<NNN;i++)
1237 std::ostringstream oss; oss << "n" << i+1;
1238 ttt[i]=new Bloc(oss.str());
1239 proc3.edAddChild(ttt[i]);
1241 proc3.edAddCFLink(ttt[2],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[0]);
1242 std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
1243 CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
1244 CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
1245 SetOfPoints sop(rrr[0]);
1247 CPPUNIT_ASSERT(sop.getRepr()=="(n3+n2+n1) - ");