1 //
2 // Filename    : TestRenderCurve.cpp
3 // Description : Tests for the RenderCurve class
4 // Organization: University of Heidelberg
5 // Created     : 2009-09-30
6 //
7 // Copyright 2008 University of Heidelberg
8 //
9 // This library is free software; you can redistribute it and/or modify it
10 // under the terms of the GNU Lesser General Public License as published
11 // by the Free Software Foundation; either version 2.1 of the License, or
12 // any later version.
13 //
14 // This library is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF
16 // MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  The software and
17 // documentation provided hereunder is on an "as is" basis, and the
18 // University of Heidelberg have no obligations to
19 // provide maintenance, support, updates, enhancements or modifications.
20 // In no event shall the University of Heidelberg be
21 // liable to any party for direct, indirect, special, incidental or
22 // consequential damages, including lost profits, arising out of the use of
23 // this software and its documentation, even if the University of
24 // Heidelberg have been advised of the possibility of such
25 // damage.  See the GNU Lesser General Public License for more details.
26 //
27 // You should have received a copy of the GNU Lesser General Public License
28 // along with this library; if not, write to the Free Software Foundation,
29 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
30 //
31 // The original code contained here was initially developed by:
32 //
33 //     Ralph Gauges
34 //     BIOQUANT/BQ0018
35 //     Im Neuenheimer Feld 267
36 //     69120 Heidelberg
37 //     Germany
38 //
39 //     mailto:ralph.gauges@bioquant.uni-heidelberg.de
40 //
41 // Contributor(s):
42 
43 
44 #include <sbml/common/common.h>
45 #include <sbml/common/extern.h>
46 #include <sbml/xml/XMLNode.h>
47 #include <sbml/xml/XMLInputStream.h>
48 #include <sbml/packages/layout/sbml/test/utility.h>
49 #include <sbml/packages/render/extension/RenderExtension.h>
50 #include <sbml/packages/render/common/RenderExtensionTypes.h>
51 
52 #include <check.h>
53 #include <limits>
54 #include <string>
55 
56 
57 LIBSBML_CPP_NAMESPACE_USE
58 
59 BEGIN_C_DECLS
60 
61 static RenderCurve *C;
62 static RenderPkgNamespaces *renderns;
63 
64 void
RenderCurveTest_setup(void)65 RenderCurveTest_setup (void)
66 {
67   renderns = new (std::nothrow) RenderPkgNamespaces();
68     C = new (std::nothrow) RenderCurve(renderns);
69 
70     if (C == NULL)
71     {
72         fail("new(std::nothrow)RenderCurve(renderns) returned a NULL pointer.");
73     }
74 
75 }
76 
77 void
RenderCurveTest_teardown(void)78 RenderCurveTest_teardown (void)
79 {
80     delete C;
81     delete renderns;
82 }
83 
START_TEST(test_RenderCurve_createMethods)84 START_TEST (test_RenderCurve_createMethods )
85 {
86     fail_unless( C->getNumElements() == 0);
87     RenderPoint* pP=C->createPoint();
88     fail_unless(pP != NULL);
89     fail_unless(C->getNumElements() == 1);
90     RenderCubicBezier* pC=C->createCubicBezier();
91     fail_unless(pC != NULL);
92     fail_unless(C->getNumElements() == 2);
93     pP=NULL;
94     pP=C->getElement(0);
95     fail_unless(pP != NULL);
96     fail_unless(dynamic_cast<RenderCubicBezier*>(pP) == NULL);
97     pP=NULL;
98     pP=C->getElement(1);
99     fail_unless(pP != NULL);
100     fail_unless(dynamic_cast<RenderCubicBezier*>(pP) != NULL);
101 }
102 END_TEST
103 
104 
START_TEST(test_RenderCurve_addElement)105 START_TEST ( test_RenderCurve_addElement )
106 {
107     fail_unless(C->getNumElements() == 0);
108     RenderPoint* pP=new RenderPoint(renderns);
109     fail_unless(pP != NULL);
110     fail_unless( C->addElement(pP) == LIBSBML_OPERATION_SUCCESS);
111     fail_unless( C->getNumElements() == 1);
112     fail_unless( C->getElement(0) != pP );
113     fail_unless( dynamic_cast<RenderCubicBezier*>(C->getElement(0)) == NULL );
114     delete pP;
115     pP = new RenderPoint(2,1);
116     fail_unless ( pP != NULL );
117     fail_unless( C->addElement(pP) == LIBSBML_LEVEL_MISMATCH);
118     fail_unless( C->getNumElements() == 1);
119     delete pP;
120     RenderCubicBezier* pCB = new RenderCubicBezier( renderns );
121     fail_unless( pCB != NULL);
122     fail_unless( C->addElement(pCB) == LIBSBML_OPERATION_SUCCESS );
123     fail_unless( C->getNumElements() == 2 );
124     fail_unless( C->getElement(1) != pCB );
125     fail_unless( dynamic_cast<RenderCubicBezier*>(C->getElement(1)) != NULL );
126     delete pCB;
127     pCB = new RenderCubicBezier(2,1);
128     fail_unless( pCB != NULL);
129     fail_unless( C->addElement(pCB) == LIBSBML_LEVEL_MISMATCH);
130     fail_unless( C->getNumElements() == 2 );
131     delete pCB;
132 }
133 END_TEST
134 
START_TEST(test_RenderCurve_heads)135 START_TEST ( test_RenderCurve_heads )
136 {
137     fail_unless( ! C->isSetStartHead() );
138     fail_unless( ! C->isSetEndHead() );
139     fail_unless( C->getStartHead() == "" );
140     fail_unless( C->getEndHead() == "" );
141     C->setStartHead("SimpleArrow");
142     fail_unless(C->isSetStartHead());
143     fail_unless(C->getStartHead() == "SimpleArrow");
144     C->setEndHead("SimpleCircle");
145     fail_unless(C->isSetEndHead());
146     fail_unless(C->getEndHead() == "SimpleCircle");
147     C->setStartHead("none");
148     fail_unless(! C->isSetStartHead());
149     fail_unless( C->getStartHead() == "none");
150     C->setEndHead("none");
151     fail_unless(! C->isSetEndHead());
152     fail_unless( C->getEndHead() == "none");
153 }
154 END_TEST
155 
START_TEST(test_RenderCurve_read)156 START_TEST ( test_RenderCurve_read )
157 {
158   std::string s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
159                   "<curve xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" >\n"
160                   "  <listOfElements>\n"
161                   "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"0\"/>\n"
162                   "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
163                   "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
164                   "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"100%\"/>\n"
165                   "  </listOfElements>\n"
166                   "</curve>\n"
167                 ;
168 
169   XMLInputStream* pStream= new XMLInputStream(s.c_str(),false);
170   XMLNode* pNode = new XMLNode(*pStream);
171 
172   // no attributes
173   RenderCurve c(*pNode);
174   fail_unless(c.getNumElements() == 4);
175   fail_unless(!c.isSetMatrix());
176   fail_unless(!c.isSetStroke());
177   fail_unless(!c.isSetStrokeWidth());
178   fail_unless(!c.isSetDashArray());
179 
180   delete pNode;
181   delete pStream;
182 
183   // 2D transformation attributes
184   s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
185       "<curve xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" transform=\"0.984808,0.173648,-0.173648,0.984808,0,0\">\n"
186       "  <listOfElements>\n"
187       "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"0\"/>\n"
188       "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
189       "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
190       "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"100%\"/>\n"
191       "  </listOfElements>\n"
192       "</curve>\n"
193     ;
194 
195   pStream= new XMLInputStream(s.c_str(),false);
196   pNode = new XMLNode(*pStream);
197 
198   c = RenderCurve(*pNode);
199   fail_unless(c.getNumElements() == 4);
200   fail_unless(c.isSetMatrix());
201   const double* pMatrix=c.getMatrix2D();
202   fail_unless(pMatrix != NULL);
203   fail_unless(fabs((pMatrix[0] - 0.984808) / 0.984808) < 1e-9);
204   fail_unless(fabs((pMatrix[1] - 0.173648) / 0.173648) < 1e-9);
205   fail_unless(fabs((pMatrix[2] - -0.173648) / -0.173648) < 1e-9);
206   fail_unless(fabs((pMatrix[3] - 0.984808) / 0.984808) < 1e-9);
207   fail_unless(pMatrix[4] < 1e-9);
208   fail_unless(pMatrix[5] < 1e-9);
209   fail_unless(!c.isSetStroke());
210   fail_unless(!c.isSetStrokeWidth());
211   fail_unless(!c.isSetDashArray());
212 
213   delete pNode;
214   delete pStream;
215 
216   // 1D attributes (stroke, stroke_width, stroke-dasharray
217 
218   s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
219       "<curve xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" stroke=\"#00FF00\" stroke-width=\"3\" stroke-dasharray=\"32 , 20\">\n"
220       "  <listOfElements>\n"
221       "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"0\"/>\n"
222       "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
223       "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
224       "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"100%\"/>\n"
225       "  </listOfElements>\n"
226       "</curve>\n"
227     ;
228 
229   pStream= new XMLInputStream(s.c_str(),false);
230   pNode = new XMLNode(*pStream);
231 
232   c = RenderCurve(*pNode);
233   fail_unless(c.getNumElements() == 4);
234   fail_unless(!c.isSetMatrix());
235   fail_unless(c.isSetStroke());
236   fail_unless(c.getStroke() == "#00FF00");
237   fail_unless(c.isSetStrokeWidth());
238   fail_unless(fabs((c.getStrokeWidth() - 3.0) / 3.0) < 1e-9);
239   fail_unless(c.isSetDashArray());
240   const std::vector<unsigned int>& array = c.getDashArray();
241   fail_unless(array.size() == 2);
242   fail_unless(array[0] == 32);
243   fail_unless(array[1] == 20);
244 
245   delete pNode;
246   delete pStream;
247 }
248 END_TEST
249 
START_TEST(test_RenderCurve_write)250 START_TEST ( test_RenderCurve_write )
251 {
252   std::string s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
253                   "<curve xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" >\n"
254                   "  <listOfElements>\n"
255                   "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"0\"/>\n"
256                   "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
257                   "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
258                   "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"100%\"/>\n"
259                   "  </listOfElements>\n"
260                   "</curve>\n"
261                 ;
262 
263   XMLInputStream* pStream = new XMLInputStream(s.c_str(),false);
264   XMLNode* pNode1 = new XMLNode(*pStream);
265   fail_unless(pNode1 != NULL);
266   RenderCurve* pC = new RenderCurve(*pNode1);
267   fail_unless(pC != NULL);
268   // create the XMLNode from the object
269   XMLNode* pNode2 = new XMLNode(pC->toXML());
270   fail_unless(pNode1 != NULL);
271   // compare the two nodes
272   fail_unless(pNode1->equals(*pNode2, true));
273   delete pNode1;
274   delete pNode2;
275   delete pStream;
276   delete pC;
277 
278   s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
279       "<curve xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" transform=\"0.984808,0.173648,-0.173648,0.984808,0,0\">\n"
280       "  <listOfElements>\n"
281       "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"0\"/>\n"
282       "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
283       "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
284       "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"100%\"/>\n"
285       "  </listOfElements>\n"
286       "</curve>\n"
287     ;
288 
289   pStream = new XMLInputStream(s.c_str(),false);
290   pNode1 = new XMLNode(*pStream);
291   fail_unless(pNode1 != NULL);
292   pC = new RenderCurve(*pNode1);
293   fail_unless(pC != NULL);
294   // create the XMLNode from the object
295   pNode2 = new XMLNode(pC->toXML());
296   fail_unless(pNode1 != NULL);
297   // compare the two nodes
298   fail_unless(pNode1->equals(*pNode2, true));
299   delete pNode1;
300   delete pNode2;
301   delete pStream;
302   delete pC;
303 
304   s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
305       "<curve xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" stroke=\"#00FF00\" stroke-width=\"3\" stroke-dasharray=\"32 , 20\">\n"
306       "  <listOfElements>\n"
307       "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"0\"/>\n"
308       "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
309       "    <element xsi:type=\"RenderPoint\" x=\"100%\" y=\"50%\"/>\n"
310       "    <element xsi:type=\"RenderPoint\" x=\"0\" y=\"100%\"/>\n"
311       "  </listOfElements>\n"
312       "</curve>\n"
313     ;
314 
315   pStream = new XMLInputStream(s.c_str(),false);
316   pNode1 = new XMLNode(*pStream);
317   fail_unless(pNode1 != NULL);
318   pC = new RenderCurve(*pNode1);
319   fail_unless(pC != NULL);
320   // create the XMLNode from the object
321   pNode2 = new XMLNode(pC->toXML());
322   fail_unless(pNode1 != NULL);
323   // compare the two nodes
324   fail_unless(pNode1->equals(*pNode2, true));
325   delete pNode1;
326   delete pNode2;
327   delete pStream;
328   delete pC;
329 
330 }
331 END_TEST
332 
START_TEST(test_RenderCurve_read_old_style)333 START_TEST ( test_RenderCurve_read_old_style )
334 {
335   // we need to pack the curve in a group because the code to read "old style"
336   // curves is in the Group class.
337   std::string s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
338                   "<g xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
339                   "  <curve>\n"
340                   "    <listOfCurveSegments>\n"
341                   "      <curveSegment xsi:type=\"LineSegment\">\n"
342                   "        <start x=\"0\" y=\"0\" />\n"
343                   "        <end x=\"10\" y=\"3\" />\n"
344                   "      </curveSegment>\n"
345                   "      <curveSegment xsi:type=\"LineSegment\">\n"
346                   "        <start x=\"10\" y=\"3\" />\n"
347                   "        <end x=\"0\" y=\"6\" />\n"
348                   "      </curveSegment>\n"
349                   "    </listOfCurveSegments>\n"
350                   "  </curve>\n"
351                   "</g>\n"
352                 ;
353 
354   XMLInputStream* pStream= new XMLInputStream(s.c_str(),false);
355   XMLNode* pNode = new XMLNode(*pStream);
356 
357   RenderGroup g = RenderGroup(*pNode);
358   fail_unless(g.getNumElements() == 1);
359   const Transformation2D* pElement=g.getElement(0);
360   fail_unless(pElement != NULL);
361   if (pElement == NULL) return;
362   fail_unless(pElement->getTypeCode() == SBML_RENDER_CURVE);
363   const RenderCurve* pC=dynamic_cast<const RenderCurve*>(pElement);
364   fail_unless(!pC->isSetMatrix());
365   fail_unless(!pC->isSetStroke());
366   fail_unless(!pC->isSetStrokeWidth());
367   fail_unless(!pC->isSetDashArray());
368   fail_unless(pC->getNumElements() == 3);
369   const RenderPoint* pP=pC->getElement(0);
370   fail_unless( pP != NULL );
371   fail_unless( pP->getTypeCode() == SBML_RENDER_POINT );
372   fail_unless( dynamic_cast<const RenderCubicBezier*>(pP) == NULL);
373   fail_unless( pP->x().getAbsoluteValue() < 1e-9);
374   fail_unless( pP->x().getRelativeValue() < 1e-9);
375   fail_unless( pP->y().getAbsoluteValue() < 1e-9);
376   fail_unless( pP->y().getRelativeValue() < 1e-9);
377   fail_unless( pP->z().getAbsoluteValue() < 1e-9);
378   fail_unless( pP->z().getRelativeValue() < 1e-9);
379   pP=pC->getElement(1);
380   fail_unless( pP != NULL );
381   fail_unless( pP->getTypeCode() == SBML_RENDER_POINT );
382   fail_unless( dynamic_cast<const RenderCubicBezier*>(pP) == NULL);
383   fail_unless( fabs((pP->x().getAbsoluteValue() - 10.0 ) / 10.0) < 1e-9);
384   fail_unless( pP->x().getRelativeValue() < 1e-9);
385   fail_unless( fabs((pP->y().getAbsoluteValue() - 3.0) / 3.0) < 1e-9);
386   fail_unless( pP->y().getRelativeValue() < 1e-9);
387   fail_unless( pP->z().getAbsoluteValue() < 1e-9);
388   fail_unless( pP->z().getRelativeValue() < 1e-9);
389   pP=pC->getElement(2);
390   fail_unless( pP != NULL );
391   fail_unless( pP->getTypeCode() == SBML_RENDER_POINT );
392   fail_unless( dynamic_cast<const RenderCubicBezier*>(pP) == NULL);
393   fail_unless( pP->x().getAbsoluteValue() < 1e-9);
394   fail_unless( pP->x().getRelativeValue() < 1e-9);
395   fail_unless( fabs((pP->y().getAbsoluteValue() - 6.0) / 6.0) < 1e-9);
396   fail_unless( pP->y().getRelativeValue() < 1e-9);
397   fail_unless( pP->z().getAbsoluteValue() < 1e-9);
398   fail_unless( pP->z().getRelativeValue() < 1e-9);
399   delete pNode;
400   delete pStream;
401 
402 
403   s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
404       "<g xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
405       " <curve xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
406       "    <listOfCurveSegments>\n"
407       "      <curveSegment xsi:type=\"CubicBezier\">\n"
408       "        <start x=\"2.0\" y=\"7.71428\"/>\n"
409       "        <basePoint1 x=\"10.21428\" y=\"12.0\"/>\n"
410       "        <basePoint2 x=\"15.21428\" y=\"17.04464\"/>\n"
411       "        <end x=\"24.05357\" y=\"15.83928\"/>\n"
412       "      </curveSegment>\n"
413       "      <curveSegment xsi:type=\"CubicBezier\">\n"
414       "        <start x=\"24.05357\" y=\"15.83928\"/>\n"
415       "        <basePoint1 x=\"32.89285\" y=\"14.63392\"/>\n"
416       "        <basePoint2 x=\"45.57142\" y=\"7.17856\"/>\n"
417       "        <end x=\"45.57142\" y=\"7.17856\"/>\n"
418       "      </curveSegment>\n"
419       "      <curveSegment xsi:type=\"LineSegment\">\n"
420       "        <start x=\"45.57142\" y=\"7.17856\"/>\n"
421       "        <end x=\"41.46427\" y=\"2.0\"/>\n"
422       "      </curveSegment>\n"
423       "      <curveSegment xsi:type=\"CubicBezier\">\n"
424       "        <start x=\"41.46427\" y=\"2.0\"/>\n"
425       "        <basePoint1 x=\"41.46427\" y=\"2.0\"/>\n"
426       "        <basePoint2 x=\"31.9107\" y=\"9.14285\"/>\n"
427       "        <end x=\"23.42856\" y=\"9.32142\"/>\n"
428       "      </curveSegment>\n"
429       "      <curveSegment xsi:type=\"CubicBezier\">\n"
430       "        <start x=\"23.42856\" y=\"9.32142\"/>\n"
431       "        <basePoint1 x=\"14.94642\" y=\"9.49999\"/>\n"
432       "        <basePoint2 x=\"7.5357\" y=\"2.71428\"/>\n"
433       "        <end x=\"7.5357\" y=\"2.71428\"/>\n"
434       "      </curveSegment>\n"
435       "      <curveSegment xsi:type=\"LineSegment\">\n"
436       "        <start x=\"7.5357\" y=\"2.71428\"/>\n"
437       "        <end x=\"2.0\" y=\"7.71428\"/>\n"
438       "      </curveSegment>\n"
439       "    </listOfCurveSegments>\n"
440       "  </curve>\n"
441       "</g>\n"
442     ;
443 
444   pStream= new XMLInputStream(s.c_str(),false);
445   pNode = new XMLNode(*pStream);
446 
447   g = RenderGroup(*pNode);
448   fail_unless(g.getNumElements() == 1);
449   pElement=g.getElement(0);
450   fail_unless(pElement != NULL);
451   fail_unless(pElement->getTypeCode() == SBML_RENDER_CURVE);
452   pC=dynamic_cast<const RenderCurve*>(pElement);
453   fail_unless(!pC->isSetMatrix());
454   fail_unless(!pC->isSetStroke());
455   fail_unless(!pC->isSetStrokeWidth());
456   fail_unless(!pC->isSetDashArray());
457   fail_unless(pC->getNumElements() == 7);
458   pP=pC->getElement(0);
459   fail_unless( pP != NULL );
460   fail_unless( pP->getTypeCode() == SBML_RENDER_POINT );
461   fail_unless( dynamic_cast<const RenderCubicBezier*>(pP) == NULL);
462   fail_unless( fabs((pP->x().getAbsoluteValue() - 2.0) / 2.0) < 1e-9);
463   fail_unless( pP->x().getRelativeValue() < 1e-9);
464   fail_unless( fabs((pP->y().getAbsoluteValue() - 7.71428) / 7.71428) < 1e-9);
465   fail_unless( pP->y().getRelativeValue() < 1e-9);
466   fail_unless( pP->z().getAbsoluteValue() < 1e-9);
467   fail_unless( pP->z().getRelativeValue() < 1e-9);
468   pP=pC->getElement(1);
469   fail_unless( pP != NULL );
470   fail_unless( pP->getTypeCode() == SBML_RENDER_CUBICBEZIER );
471   const RenderCubicBezier* pCB = dynamic_cast<const RenderCubicBezier*>(pP);
472   fail_unless( pCB != NULL);
473   fail_unless( fabs((pCB->basePoint1_X().getAbsoluteValue() - 10.21428) / 10.21428) < 1e-9);
474   fail_unless( pCB->basePoint1_X().getRelativeValue() < 1e-9);
475   fail_unless( fabs((pCB->basePoint1_Y().getAbsoluteValue() - 12.0) / 12.0) < 1e-9);
476   fail_unless( pCB->basePoint1_Y().getRelativeValue() < 1e-9);
477   fail_unless( pCB->basePoint1_Z().getAbsoluteValue() < 1e-9);
478   fail_unless( pCB->basePoint1_Z().getRelativeValue() < 1e-9);
479   fail_unless( fabs((pCB->basePoint2_X().getAbsoluteValue() - 15.21428) / 15.21428) < 1e-9);
480   fail_unless( pCB->basePoint2_X().getRelativeValue() < 1e-9);
481   fail_unless( fabs((pCB->basePoint2_Y().getAbsoluteValue() - 17.04464) / 17.04464) < 1e-9);
482   fail_unless( pCB->basePoint2_Y().getRelativeValue() < 1e-9);
483   fail_unless( pCB->basePoint2_Z().getAbsoluteValue() < 1e-9);
484   fail_unless( pCB->basePoint2_Z().getRelativeValue() < 1e-9);
485   fail_unless( fabs((pCB->x().getAbsoluteValue() - 24.05357) / 24.05357) < 1e-9);
486   fail_unless( pCB->x().getRelativeValue() < 1e-9);
487   fail_unless( fabs((pCB->y().getAbsoluteValue() - 15.83928) / 15.83928) < 1e-9);
488   fail_unless( pCB->y().getRelativeValue() < 1e-9);
489   fail_unless( pCB->z().getAbsoluteValue() < 1e-9);
490   fail_unless( pCB->z().getRelativeValue() < 1e-9);
491   pP=pC->getElement(2);
492   fail_unless( pP != NULL );
493   fail_unless( pP->getTypeCode() == SBML_RENDER_CUBICBEZIER );
494   pCB = dynamic_cast<const RenderCubicBezier*>(pP);
495   fail_unless( pCB != NULL);
496   fail_unless( fabs((pCB->basePoint1_X().getAbsoluteValue() - 32.89285) / 32.89285) < 1e-9);
497   fail_unless( pCB->basePoint1_X().getRelativeValue() < 1e-9);
498   fail_unless( fabs((pCB->basePoint1_Y().getAbsoluteValue() - 14.63392) / 14.63392) < 1e-9);
499   fail_unless( pCB->basePoint1_Y().getRelativeValue() < 1e-9);
500   fail_unless( pCB->basePoint1_Z().getAbsoluteValue() < 1e-9);
501   fail_unless( pCB->basePoint1_Z().getRelativeValue() < 1e-9);
502   fail_unless( fabs((pCB->basePoint2_X().getAbsoluteValue() - 45.57142) / 45.57142) < 1e-9);
503   fail_unless( pCB->basePoint2_X().getRelativeValue() < 1e-9);
504   fail_unless( fabs((pCB->basePoint2_Y().getAbsoluteValue() - 7.17856) / 7.17856) < 1e-9);
505   fail_unless( pCB->basePoint2_Y().getRelativeValue() < 1e-9);
506   fail_unless( pCB->basePoint2_Z().getAbsoluteValue() < 1e-9);
507   fail_unless( pCB->basePoint2_Z().getRelativeValue() < 1e-9);
508   fail_unless( fabs((pCB->x().getAbsoluteValue() - 45.57142) / 45.57142) < 1e-9);
509   fail_unless( pCB->x().getRelativeValue() < 1e-9);
510   fail_unless( fabs((pCB->y().getAbsoluteValue() - 7.17856) / 7.17856) < 1e-9);
511   fail_unless( pCB->y().getRelativeValue() < 1e-9);
512   fail_unless( pCB->z().getAbsoluteValue() < 1e-9);
513   fail_unless( pCB->z().getRelativeValue() < 1e-9);
514   pP=pC->getElement(3);
515   fail_unless( pP != NULL );
516   fail_unless( pP->getTypeCode() == SBML_RENDER_POINT );
517   fail_unless( dynamic_cast<const RenderCubicBezier*>(pP) == NULL);
518   fail_unless( fabs((pP->x().getAbsoluteValue() - 41.46427) / 41.46427) < 1e-9);
519   fail_unless( pP->x().getRelativeValue() < 1e-9);
520   fail_unless( fabs((pP->y().getAbsoluteValue() - 2.0) / 2.0) < 1e-9);
521   fail_unless( pP->y().getRelativeValue() < 1e-9);
522   fail_unless( pP->z().getAbsoluteValue() < 1e-9);
523   fail_unless( pP->z().getRelativeValue() < 1e-9);
524   pP=pC->getElement(4);
525   fail_unless( pP != NULL );
526   fail_unless( pP->getTypeCode() == SBML_RENDER_CUBICBEZIER );
527   pCB = dynamic_cast<const RenderCubicBezier*>(pP);
528   fail_unless( pCB != NULL);
529   fail_unless( fabs((pCB->basePoint1_X().getAbsoluteValue() - 41.46427) / 41.46427) < 1e-9);
530   fail_unless( pCB->basePoint1_X().getRelativeValue() < 1e-9);
531   fail_unless( fabs((pCB->basePoint1_Y().getAbsoluteValue() - 2.0) / 2.0) < 1e-9);
532   fail_unless( pCB->basePoint1_Y().getRelativeValue() < 1e-9);
533   fail_unless( pCB->basePoint1_Z().getAbsoluteValue() < 1e-9);
534   fail_unless( pCB->basePoint1_Z().getRelativeValue() < 1e-9);
535   fail_unless( fabs((pCB->basePoint2_X().getAbsoluteValue() - 31.9107) / 31.9107) < 1e-9);
536   fail_unless( pCB->basePoint2_X().getRelativeValue() < 1e-9);
537   fail_unless( fabs((pCB->basePoint2_Y().getAbsoluteValue() - 9.14285) / 9.14285) < 1e-9);
538   fail_unless( pCB->basePoint2_Y().getRelativeValue() < 1e-9);
539   fail_unless( pCB->basePoint2_Z().getAbsoluteValue() < 1e-9);
540   fail_unless( pCB->basePoint2_Z().getRelativeValue() < 1e-9);
541   fail_unless( fabs((pCB->x().getAbsoluteValue() - 23.42856) / 23.42856) < 1e-9);
542   fail_unless( pCB->x().getRelativeValue() < 1e-9);
543   fail_unless( fabs((pCB->y().getAbsoluteValue() - 9.32142) / 9.32142) < 1e-9);
544   fail_unless( pCB->y().getRelativeValue() < 1e-9);
545   fail_unless( pCB->z().getAbsoluteValue() < 1e-9);
546   fail_unless( pCB->z().getRelativeValue() < 1e-9);
547   pP=pC->getElement(5);
548   fail_unless( pP != NULL );
549   fail_unless( pP->getTypeCode() == SBML_RENDER_CUBICBEZIER );
550   pCB = dynamic_cast<const RenderCubicBezier*>(pP);
551   fail_unless( pCB != NULL);
552   fail_unless( fabs((pCB->basePoint1_X().getAbsoluteValue() - 14.94642) / 14.94642) < 1e-9);
553   fail_unless( pCB->basePoint1_X().getRelativeValue() < 1e-9);
554   fail_unless( fabs((pCB->basePoint1_Y().getAbsoluteValue() - 9.49999) / 9.49999) < 1e-9);
555   fail_unless( pCB->basePoint1_Y().getRelativeValue() < 1e-9);
556   fail_unless( pCB->basePoint1_Z().getAbsoluteValue() < 1e-9);
557   fail_unless( pCB->basePoint1_Z().getRelativeValue() < 1e-9);
558   fail_unless( fabs((pCB->basePoint2_X().getAbsoluteValue() - 7.5357) / 7.5357) < 1e-9);
559   fail_unless( pCB->basePoint2_X().getRelativeValue() < 1e-9);
560   fail_unless( fabs((pCB->basePoint2_Y().getAbsoluteValue() - 2.71428) / 2.71428) < 1e-9);
561   fail_unless( pCB->basePoint2_Y().getRelativeValue() < 1e-9);
562   fail_unless( pCB->basePoint2_Z().getAbsoluteValue() < 1e-9);
563   fail_unless( pCB->basePoint2_Z().getRelativeValue() < 1e-9);
564   fail_unless( fabs((pCB->x().getAbsoluteValue() - 7.5357) / 7.5357) < 1e-9);
565   fail_unless( pCB->x().getRelativeValue() < 1e-9);
566   fail_unless( fabs((pCB->y().getAbsoluteValue() - 2.71428) / 2.71428) < 1e-9);
567   fail_unless( pCB->y().getRelativeValue() < 1e-9);
568   fail_unless( pCB->z().getAbsoluteValue() < 1e-9);
569   fail_unless( pCB->z().getRelativeValue() < 1e-9);
570   pP=pC->getElement(6);
571   fail_unless( pP != NULL );
572   fail_unless( pP->getTypeCode() == SBML_RENDER_POINT );
573   fail_unless( dynamic_cast<const RenderCubicBezier*>(pP) == NULL);
574   fail_unless( fabs((pP->x().getAbsoluteValue() - 2.0) / 2.0) < 1e-9);
575   fail_unless( pP->x().getRelativeValue() < 1e-9);
576   fail_unless( fabs((pP->y().getAbsoluteValue() - 7.71428) / 7.71428) < 1e-9);
577   fail_unless( pP->y().getRelativeValue() < 1e-9);
578   fail_unless( pP->z().getAbsoluteValue() < 1e-9);
579   fail_unless( pP->z().getRelativeValue() < 1e-9);
580   delete pNode;
581   delete pStream;
582 }
583 END_TEST
584 
585 
586 Suite *
create_suite_RenderCurve(void)587 create_suite_RenderCurve (void)
588 {
589   Suite *suite = suite_create("RenderCurve");
590   TCase *tcase = tcase_create("RenderCurve");
591 
592 
593   tcase_add_checked_fixture( tcase,
594                              RenderCurveTest_setup,
595                              RenderCurveTest_teardown );
596 
597   tcase_add_test( tcase, test_RenderCurve_createMethods      );
598   tcase_add_test( tcase, test_RenderCurve_addElement         );
599   tcase_add_test( tcase, test_RenderCurve_heads              );
600   tcase_add_test( tcase, test_RenderCurve_read               );
601   tcase_add_test( tcase, test_RenderCurve_read_old_style     );
602   tcase_add_test( tcase, test_RenderCurve_write              );
603 
604   suite_add_tcase(suite, tcase);
605 
606   return suite;
607 }
608 
609 END_C_DECLS
610