END_TEST


START_TEST (test_CubicBezier_setEnd_NULL )
{
    CubicBezier_setEnd(CB,NULL);
    Point_t *pos=CubicBezier_getEnd(CB);
    fail_unless(pos != NULL);
    fail_unless(Point_getXOffset(pos) == 0.0);
    fail_unless(Point_getYOffset(pos) == 0.0);
    fail_unless(Point_getZOffset(pos) == 0.0);
}
END_TEST

START_TEST (test_CubicBezier_setEnd )
{
    Point_t *pos= new (std::nothrow) Point(LN,-4.4,5.5,-6.6);
    CubicBezier_setEnd(CB,pos);

    Point_t* POS=CubicBezier_getEnd(CB);

    fail_unless(Point_getXOffset(pos) == Point_getXOffset(POS));
    fail_unless(Point_getYOffset(pos) == Point_getYOffset(POS));
    fail_unless(Point_getZOffset(pos) == Point_getZOffset(POS));
    Point_free(pos);
}
END_TEST

START_TEST ( test_CubicBezier_createWithPoints )
{
   Point_t *start= new (std::nothrow) Point(LN,1.1,-2.2,3.3); 
   Point_t *base1= new (std::nothrow) Point(LN,-0.5,2.4,5.6); 
   Point_t *base2= new (std::nothrow) Point(LN,7.8,-0.3,-1.2); 
   Point_t *end  = new (std::nothrow) Point(LN,-4.4,5.5,-6.6);

   CubicBezier_t *cb= new CubicBezier(LN,start,base1,base2,end);
   
   fail_unless( cb->getPackageName() == "layout");
   fail_unless( cb->getTypeCode() == SBML_LAYOUT_CUBICBEZIER);
   fail_unless( SBase_getMetaId     ((SBase_t*) cb) == NULL );

   Point_t *pos=CubicBezier_getStart(cb);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == Point_getXOffset(start));  
   fail_unless(Point_getYOffset(pos) == Point_getYOffset(start));  
   fail_unless(Point_getZOffset(pos) == Point_getZOffset(start));  
   
   pos=CubicBezier_getBasePoint1(cb);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == Point_getXOffset(base1));  
   fail_unless(Point_getYOffset(pos) == Point_getYOffset(base1));  
   fail_unless(Point_getZOffset(pos) == Point_getZOffset(base1));  

   pos=CubicBezier_getBasePoint2(cb);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == Point_getXOffset(base2));  
   fail_unless(Point_getYOffset(pos) == Point_getYOffset(base2));  
   fail_unless(Point_getZOffset(pos) == Point_getZOffset(base2));  
   
   pos=CubicBezier_getEnd(cb);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == Point_getXOffset(end));  
   fail_unless(Point_getYOffset(pos) == Point_getYOffset(end));  
   fail_unless(Point_getZOffset(pos) == Point_getZOffset(end));  

    Point_free(start);
    Point_free(base1);
    Point_free(base2);
    Point_free(end);
    CubicBezier_free(cb);
}
END_TEST

START_TEST ( test_CubicBezier_createWithPoints_NULL )
{
	Point* nullPoint = NULL;
   CubicBezier_t *cb=new CubicBezier(LN,
									 nullPoint,
									 nullPoint,
									 nullPoint,
									 nullPoint);
   
   fail_unless( cb->getPackageName() == "layout");
   fail_unless( cb->getTypeCode() == SBML_LAYOUT_CUBICBEZIER);
   fail_unless( SBase_getMetaId     ((SBase_t*) cb) == NULL );

   Point_t *pos=CubicBezier_getStart(cb);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == 0.0);  
   fail_unless(Point_getYOffset(pos) == 0.0);  
   fail_unless(Point_getZOffset(pos) == 0.0);  
   
   pos=CubicBezier_getBasePoint1(cb);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == 0.0);  
   fail_unless(Point_getYOffset(pos) == 0.0);  
   fail_unless(Point_getZOffset(pos) == 0.0);  

   pos=CubicBezier_getBasePoint2(cb);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == 0.0);  
   fail_unless(Point_getYOffset(pos) == 0.0);  
   fail_unless(Point_getZOffset(pos) == 0.0);  
   
   pos=CubicBezier_getEnd(cb);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == 0.0);  
   fail_unless(Point_getYOffset(pos) == 0.0);  
   fail_unless(Point_getZOffset(pos) == 0.0);  
 
   CubicBezier_free(cb);
}
END_TEST

START_TEST ( test_CubicBezier_createWithCoordinates )
{
  Point p1(LN,1.1,-2.2,3.3);
  Point p2(LN,-4.4,5.5,-6.6);
  Point p3(LN,7.7,-8.8,9.9);
  Point p4(LN,-10.10,11.11,-12.12);

  CubicBezier_t* cb= new CubicBezier(LN, &p1, &p2, &p3, &p4);
  
  fail_unless( cb->getPackageName() == "layout");
  fail_unless( cb->getTypeCode() == SBML_LAYOUT_CUBICBEZIER);
  fail_unless( SBase_getMetaId     ((SBase_t*) cb) == NULL );
  
  Point_t *pos=CubicBezier_getStart(cb);
  fail_unless(pos != NULL);
  fail_unless(pos->getXOffset() ==  1.1);
  fail_unless(pos->getYOffset() == -2.2);
  fail_unless(pos->getZOffset() ==  3.3);
  
  pos=CubicBezier_getBasePoint1(cb);
  fail_unless(pos != NULL);
  fail_unless(pos->getXOffset() == -4.4);
  fail_unless(pos->getYOffset() ==  5.5);
  fail_unless(pos->getZOffset() == -6.6);
  
  pos=CubicBezier_getBasePoint2(cb);
  fail_unless(pos != NULL);
  fail_unless(pos->getXOffset() ==  7.7);
  fail_unless(pos->getYOffset() == -8.8);
  fail_unless(pos->getZOffset() ==  9.9);
  
  pos=CubicBezier_getEnd(cb);
  fail_unless(pos != NULL);
  fail_unless(pos->getXOffset() == -10.10);
  fail_unless(pos->getYOffset() ==  11.11);
  fail_unless(pos->getZOffset() == -12.12);
  
  CubicBezier_free(cb);
}
END_TEST

START_TEST ( test_CubicBezier_createFrom )
{
   Point_t* start= new (std::nothrow) Point(LN,1.1,-2.2,3.3);
   Point_t* base1= new (std::nothrow) Point(LN,-4.4,5.5,-6.6);
   Point_t* base2= new (std::nothrow) Point(LN,7.7,-8.8,9.9);
   Point_t* end= new (std::nothrow) Point(LN,-10.10,11.11,-12.12);
   CubicBezier_setStart(CB,start);
   CubicBezier_setBasePoint1(CB,base1);
   CubicBezier_setBasePoint2(CB,base2);
   CubicBezier_setEnd(CB,end);
   CubicBezier_t* cb=CubicBezier_createFrom(CB);
   fail_unless( cb->getPackageName() == "layout");
   fail_unless( cb->getTypeCode() == SBML_LAYOUT_CUBICBEZIER);
   if(SBase_isSetMetaId((SBase_t*)CB))
   {
	   std::string c1=SBase_getMetaId((SBase_t*)CB);
	   std::string c2=SBase_getMetaId((SBase_t*)cb);
       fail_unless( c1 == c2 );
   }

//   c1=SBase_getNotes((SBase_t*)CB);
//   c2=SBase_getNotes((SBase_t*)cb);
//   if(SBase_isSetNotes((SBase_t*)CB))
//   {
//       fail_unless( strncmp(c1 , c2 ,strlen( c1)+1 )==0 );
//   }
//   else{
//       fail_unless(!(c1 || c2));
//   }

//   c1=SBase_getAnnotation((SBase_t*)CB);
//   c2=SBase_getAnnotation((SBase_t*)cb);
//   if(SBase_isSetAnnotation((SBase_t*)CB))
//   {
//       fail_unless( strncmp(c1 , c2 ,strlen( c1)+1 )==0 );
//   }
//   else{
//       fail_unless(!(c1 || c2));
//   }

   Point_t *pos=CubicBezier_getStart(cb);
   Point_t *POS=CubicBezier_getStart(CB);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == Point_getXOffset(POS));  
   fail_unless(Point_getYOffset(pos) == Point_getYOffset(POS));  
   fail_unless(Point_getZOffset(pos) == Point_getZOffset(POS));  

   pos=CubicBezier_getBasePoint1(cb);
   POS=CubicBezier_getBasePoint1(CB);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == Point_getXOffset(POS));  
   fail_unless(Point_getYOffset(pos) == Point_getYOffset(POS));  
   fail_unless(Point_getZOffset(pos) == Point_getZOffset(POS));  
   
   pos=CubicBezier_getBasePoint2(cb);
   POS=CubicBezier_getBasePoint2(CB);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == Point_getXOffset(POS));  
   fail_unless(Point_getYOffset(pos) == Point_getYOffset(POS));  
   fail_unless(Point_getZOffset(pos) == Point_getZOffset(POS));  
    
   pos=CubicBezier_getEnd(cb);
   POS=CubicBezier_getEnd(CB);
   fail_unless(pos != NULL);
   fail_unless(Point_getXOffset(pos) == Point_getXOffset(POS));  
   fail_unless(Point_getYOffset(pos) == Point_getYOffset(POS));  
   fail_unless(Point_getZOffset(pos) == Point_getZOffset(POS));  
   Point_free(start);
   Point_free(base1);
   Point_free(base2);
   Point_free(end);

  CubicBezier_free(cb); 
}