1 /**
2  * Filename    : TestLayoutCreation.cpp
3  * Description : Unit tests for the creation of the layout struvtures from XMLNodes.
4  * Organization: European Media Laboratories Research gGmbH
5  * Created     : 2007-02-21
6  *
7  * <!--------------------------------------------------------------------------
8  * This file is part of libSBML.  Please visit http://sbml.org for more
9  * information about SBML, and the latest version of libSBML.
10  *
11  * Copyright (C) 2020 jointly by the following organizations:
12  *     1. California Institute of Technology, Pasadena, CA, USA
13  *     2. University of Heidelberg, Heidelberg, Germany
14  *     3. University College London, London, UK
15  *
16  * Copyright (C) 2019 jointly by the following organizations:
17  *     1. California Institute of Technology, Pasadena, CA, USA
18  *     2. University of Heidelberg, Heidelberg, Germany
19  *
20  * Copyright (C) 2013-2018 jointly by the following organizations:
21  *     1. California Institute of Technology, Pasadena, CA, USA
22  *     2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
23  *     3. University of Heidelberg, Heidelberg, Germany
24  *
25  * Copyright (C) 2009-2013 jointly by the following organizations:
26  *     1. California Institute of Technology, Pasadena, CA, USA
27  *     2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
28  *
29  * Copyright (C) 2004-2008 by European Media Laboratories Research gGmbH,
30  *     Heidelberg, Germany
31  *
32  * This library is free software; you can redistribute it and/or modify it
33  * under the terms of the GNU Lesser General Public License as published by
34  * the Free Software Foundation.  A copy of the license agreement is provided
35  * in the file named "LICENSE.txt" included with this software distribution
36  * and also available online as http://sbml.org/software/libsbml/license.html
37  * ------------------------------------------------------------------------ -->
38  */
39 
40 #include <iostream>
41 
42 #include <sbml/common/common.h>
43 #include <sbml/common/extern.h>
44 
45 #include <sbml/packages/layout/sbml/Layout.h>
46 #include <sbml/packages/layout/sbml/LineSegment.h>
47 #include <sbml/packages/layout/sbml/CubicBezier.h>
48 #include <sbml/packages/layout/util/LayoutAnnotation.h>
49 
50 #include <sbml/xml/XMLInputStream.h>
51 #include <sbml/xml/XMLNode.h>
52 
53 #include <check.h>
54 
55 #include "utility.h"
56 
57 using namespace std;
58 
59 LIBSBML_CPP_NAMESPACE_USE
60 
61 BEGIN_C_DECLS
62 
63 static string NOTES;
64 
65 
66 static void
LayoutCreationTest_setup(void)67 LayoutCreationTest_setup (void)
68 {
69 	NOTES = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<notes><body xmlns=\"http://www.w3.org/1999/xhtml\">\n <p>Testnote</p>\n</body></notes>";
70 }
71 
72 static void
LayoutCreationTest_teardown(void)73 LayoutCreationTest_teardown (void)
74 {
75 }
76 
77 
START_TEST(test_LayoutCreation_Layout)78 START_TEST (test_LayoutCreation_Layout)
79 {
80 	const char* content =
81   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
82   "<annotation>\n"
83   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\" >\n"
84   "  <layout id=\"layout_1\">\n"
85   "    <dimensions width=\"200\" height=\"400\"/>\n"
86   "    <listOfCompartmentGlyphs>\n"
87   "      <compartmentGlyph id=\"compartmentGlyph_1\">\n"
88   "        <boundingBox>\n"
89   "          <position x=\"0\" y=\"0\"/>\n"
90   "          <dimensions width=\"0\" height=\"0\"/>\n"
91   "        </boundingBox>\n"
92   "      </compartmentGlyph>\n"
93   "    </listOfCompartmentGlyphs>\n"
94   "    <listOfSpeciesGlyphs>\n"
95   "      <speciesGlyph id=\"speciesGlyph_1\">\n"
96   "        <boundingBox>\n"
97   "          <position x=\"0\" y=\"0\"/>\n"
98   "          <dimensions width=\"0\" height=\"0\"/>\n"
99   "        </boundingBox>\n"
100   "      </speciesGlyph>\n"
101   "    </listOfSpeciesGlyphs>\n"
102   "    <listOfReactionGlyphs>\n"
103   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
104   "        <boundingBox>\n"
105   "          <position x=\"0\" y=\"0\"/>\n"
106   "          <dimensions width=\"0\" height=\"0\"/>\n"
107   "        </boundingBox>\n"
108   "      </reactionGlyph>\n"
109   "    </listOfReactionGlyphs>\n"
110   "    <listOfTextGlyphs>\n"
111   "      <textGlyph id=\"textGlyph_1\" text=\"test\">\n"
112   "        <boundingBox>\n"
113   "          <position x=\"0\" y=\"0\"/>\n"
114   "          <dimensions width=\"0\" height=\"0\"/>\n"
115   "        </boundingBox>\n"
116   "      </textGlyph>\n"
117   "    </listOfTextGlyphs>\n"
118   "    <listOfAdditionalGraphicalObjects>\n"
119   "      <graphicalObject id=\"graphicalObject_1\">\n"
120   "        <boundingBox>\n"
121   "          <position x=\"0\" y=\"0\"/>\n"
122   "          <dimensions width=\"0\" height=\"0\"/>\n"
123   "        </boundingBox>\n"
124   "      </graphicalObject>\n"
125   "    </listOfAdditionalGraphicalObjects>\n"
126   "  </layout>\n"
127   "</listOfLayouts>\n"
128   "</annotation>\n"
129   ;
130 	XMLInputStream *stream= new XMLInputStream(content,false);
131 	fail_unless(stream->isError() == false);
132 	fail_unless(stream->isGood() == true);
133 	XMLNode node=XMLNode(*stream);
134 	ListOfLayouts pListOfLayouts;
135 	parseLayoutAnnotation(&node, pListOfLayouts );
136 
137 	fail_unless(pListOfLayouts.size()==1);
138 
139 	Layout* l=(Layout*)pListOfLayouts.get(0);
140 
141 	fail_unless(l!=NULL);
142 
143 	Dimensions* dimensions=l->getDimensions();
144 	fail_unless(dimensions->getWidth()==200.0);
145 	fail_unless(dimensions->getHeight()==400.0);
146 	fail_unless(dimensions->getDepth()==0.0);
147 
148 	fail_unless(l->getNumCompartmentGlyphs()==1);
149 	CompartmentGlyph* cg=l->getCompartmentGlyph(0);
150 	fail_unless(cg!=NULL);
151 	fail_unless(cg->getId()=="compartmentGlyph_1");
152 	BoundingBox* box=cg->getBoundingBox();
153 	fail_unless(!box->isSetId());
154 	Point* position=box->getPosition();
155 	fail_unless(position->getXOffset()==0.0);
156 	fail_unless(position->getYOffset()==0.0);
157 	fail_unless(position->getZOffset()==0.0);
158 	dimensions=box->getDimensions();
159 	fail_unless(dimensions->getWidth()==0.0);
160 	fail_unless(dimensions->getHeight()==0.0);
161 	fail_unless(dimensions->getDepth()==0.0);
162 
163 	fail_unless(l->getNumSpeciesGlyphs()==1);
164 	SpeciesGlyph* sg=l->getSpeciesGlyph(0);
165 	fail_unless(sg!=NULL);
166 	fail_unless(sg->getId()=="speciesGlyph_1");
167 	box=sg->getBoundingBox();
168 	fail_unless(!box->isSetId());
169 	position=box->getPosition();
170 	fail_unless(position->getXOffset()==0.0);
171 	fail_unless(position->getYOffset()==0.0);
172 	fail_unless(position->getZOffset()==0.0);
173 	dimensions=box->getDimensions();
174 	fail_unless(dimensions->getWidth()==0.0);
175 	fail_unless(dimensions->getHeight()==0.0);
176 	fail_unless(dimensions->getDepth()==0.0);
177 
178 	fail_unless(l->getNumReactionGlyphs()==1);
179 	ReactionGlyph* rg=l->getReactionGlyph(0);
180 	fail_unless(rg!=NULL);
181 	fail_unless(rg->getId()=="reactionGlyph_1");
182 	box=rg->getBoundingBox();
183 	fail_unless(!box->isSetId());
184 	position=box->getPosition();
185 	fail_unless(position->getXOffset()==0.0);
186 	fail_unless(position->getYOffset()==0.0);
187 	fail_unless(position->getZOffset()==0.0);
188 	dimensions=box->getDimensions();
189 	fail_unless(dimensions->getWidth()==0.0);
190 	fail_unless(dimensions->getHeight()==0.0);
191 	fail_unless(dimensions->getDepth()==0.0);
192 
193 
194 	fail_unless(l->getNumTextGlyphs()==1);
195 	TextGlyph* tg=l->getTextGlyph(0);
196 	fail_unless(tg!=NULL);
197 	fail_unless(tg->getId()=="textGlyph_1");
198 	box=tg->getBoundingBox();
199 	fail_unless(!box->isSetId());
200 	position=box->getPosition();
201 	fail_unless(position->getXOffset()==0.0);
202 	fail_unless(position->getYOffset()==0.0);
203 	fail_unless(position->getZOffset()==0.0);
204 	dimensions=box->getDimensions();
205 	fail_unless(dimensions->getWidth()==0.0);
206 	fail_unless(dimensions->getHeight()==0.0);
207 	fail_unless(dimensions->getDepth()==0.0);
208 
209 
210 	fail_unless(l->getNumAdditionalGraphicalObjects()==1);
211 	GraphicalObject* go=l->getAdditionalGraphicalObject(0);
212 	fail_unless(go!=NULL);
213 	fail_unless(go->getId()=="graphicalObject_1");
214 	box=go->getBoundingBox();
215 	fail_unless(!box->isSetId());
216 	position=box->getPosition();
217 	fail_unless(position->getXOffset()==0.0);
218 	fail_unless(position->getYOffset()==0.0);
219 	fail_unless(position->getZOffset()==0.0);
220 	dimensions=box->getDimensions();
221 	fail_unless(dimensions->getWidth()==0.0);
222 	fail_unless(dimensions->getHeight()==0.0);
223 	fail_unless(dimensions->getDepth()==0.0);
224 
225 	delete stream;
226 }
227 END_TEST
228 
229 
START_TEST(test_LayoutCreation_Layout_notes)230 START_TEST (test_LayoutCreation_Layout_notes)
231 {
232 
233 
234 	const char* content=
235   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
236   "<annotation>\n"
237   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
238   "  <layout id=\"layout_1\">\n"
239   "    <notes>"
240   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
241   "   <p>Testnote</p>\n"
242   "  </body>"
243   "  </notes>\n"
244   "    <dimensions width=\"200\" height=\"400\"/>\n"
245   "  </layout>\n"
246   "</listOfLayouts>\n"
247   "</annotation>\n"
248   ;
249 
250 	XMLInputStream *stream=new XMLInputStream(content,false);
251 	XMLNode node=XMLNode(*stream);
252 	ListOfLayouts pListOfLayouts;
253 	parseLayoutAnnotation(&node,pListOfLayouts);
254 
255 	fail_unless(pListOfLayouts.size()==1);
256 
257 	Layout* l=(Layout*)pListOfLayouts.get(0);
258 
259 	fail_unless(l!=NULL);
260 
261 	Dimensions* dimensions=l->getDimensions();
262 	fail_unless(dimensions->getWidth()==200.0);
263 	fail_unless(dimensions->getHeight()==400.0);
264 	fail_unless(dimensions->getDepth()==0.0);
265 
266 	fail_unless(l->isSetNotes());
267 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
268 	XMLNode notes=XMLNode(*stream2);
269 	fail_unless(l->getNotes()->equals(notes, true));
270 
271 	delete stream2;
272 	delete stream;
273 }
274 END_TEST
275 
START_TEST(test_LayoutCreation_Layout_annotation)276 START_TEST (test_LayoutCreation_Layout_annotation)
277 {
278 	const char* content=
279   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
280   "<annotation>\n"
281   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
282   "  <layout id=\"layout_1\">\n"
283   "    <annotation>\n"
284   "      <this-is-a-test>\n"
285   "        <another-level> level2 </another-level>\n"
286   "      </this-is-a-test>\n"
287   "    </annotation>\n"
288   "    <dimensions width=\"200\" height=\"400\"/>\n"
289   "  </layout>\n"
290   "</listOfLayouts>\n"
291   "</annotation>\n"
292   ;
293 
294 	const char* a =
295   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
296   "<annotation>\n"
297   "    <this-is-a-test>\n"
298   "      <another-level> level2 </another-level>\n"
299   "    </this-is-a-test>\n"
300   "  </annotation>";
301 
302 
303 	XMLInputStream *stream=new XMLInputStream(content,false);
304 	XMLNode node=XMLNode(*stream);
305 	ListOfLayouts pListOfLayouts;
306 	parseLayoutAnnotation(&node,pListOfLayouts);
307 
308 	fail_unless(pListOfLayouts.size()==1);
309 
310 	Layout* l=(Layout*)pListOfLayouts.get(0);
311 
312 	fail_unless(l!=NULL);
313 
314 	Dimensions* dimensions=l->getDimensions();
315 	fail_unless(dimensions->getWidth()==200.0);
316 	fail_unless(dimensions->getHeight()==400.0);
317 	fail_unless(dimensions->getDepth()==0.0);
318 
319 	fail_unless(l->isSetAnnotation());
320 	XMLInputStream stream2(a,false);
321 	XMLNode aNode=XMLNode(stream2);
322 	fail_unless(l->getAnnotation()->equals(aNode, true));
323 
324 
325 	delete stream;
326 }
327 END_TEST
328 
START_TEST(test_LayoutCreation_Layout_skipOptional)329 START_TEST (test_LayoutCreation_Layout_skipOptional)
330 {
331 	const char* content=
332   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
333   "<annotation>\n"
334   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
335   "  <layout id=\"layout_1\">\n"
336   "    <dimensions width=\"200\" height=\"400\"/>\n"
337   "  </layout>\n"
338   "</listOfLayouts>\n"
339   "</annotation>\n"
340   ;
341 
342 
343 	XMLInputStream *stream=new XMLInputStream(content,false);
344 	XMLNode node=XMLNode(*stream);
345 	ListOfLayouts pListOfLayouts;
346 	parseLayoutAnnotation(&node,pListOfLayouts);
347 
348 	fail_unless(pListOfLayouts.size()==1);
349 
350 	Layout* l=(Layout*)pListOfLayouts.get(0);
351 
352 	fail_unless(l!=NULL);
353 
354 	Dimensions* dimensions=l->getDimensions();
355 	fail_unless(dimensions->getWidth()==200.0);
356 	fail_unless(dimensions->getHeight()==400.0);
357 	fail_unless(dimensions->getDepth()==0.0);
358 
359 	fail_unless(l->getNumCompartmentGlyphs()==0);
360 	fail_unless(l->getNumSpeciesGlyphs()==0);
361 	fail_unless(l->getNumReactionGlyphs()==0);
362 	fail_unless(l->getNumTextGlyphs()==0);
363 	fail_unless(l->getNumAdditionalGraphicalObjects()==0);
364 
365 
366 	delete stream;
367 }
368 END_TEST
369 
370 
START_TEST(test_LayoutCreation_CompartmentGlyph)371 START_TEST (test_LayoutCreation_CompartmentGlyph)
372 {
373   const char* content=
374   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
375   "<annotation>\n"
376   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
377   "  <layout id=\"layout_1\">\n"
378   "    <dimensions width=\"200\" height=\"400\"/>\n"
379   "    <listOfCompartmentGlyphs>\n"
380   "      <compartmentGlyph id=\"compartmentGlyph_1\" compartment=\"compartment_1\">\n"
381   "        <boundingBox>\n"
382   "          <position x=\"10.3\" y=\"20\"/>\n"
383   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
384   "        </boundingBox>\n"
385   "      </compartmentGlyph>\n"
386   "    </listOfCompartmentGlyphs>\n"
387   "  </layout>\n"
388   "</listOfLayouts>\n"
389   "</annotation>\n"
390   ;
391 
392 
393 	XMLInputStream *stream=new XMLInputStream(content,false);
394 	XMLNode node=XMLNode(*stream);
395 	ListOfLayouts pListOfLayouts;
396 	parseLayoutAnnotation(&node,pListOfLayouts);
397 
398 	fail_unless(pListOfLayouts.size()==1);
399 
400 	Layout* l=(Layout*)pListOfLayouts.get(0);
401 
402 	fail_unless(l!=NULL);
403 
404 	Dimensions* dimensions=l->getDimensions();
405 	fail_unless(dimensions->getWidth()==200.0);
406 	fail_unless(dimensions->getHeight()==400.0);
407 	fail_unless(dimensions->getDepth()==0.0);
408 
409 	fail_unless(l->getId()=="layout_1");
410 
411 	fail_unless(l->getNumCompartmentGlyphs()==1);
412 	CompartmentGlyph* cg=l->getCompartmentGlyph(0);
413 	fail_unless(cg->getId()=="compartmentGlyph_1");
414 	fail_unless(cg->getCompartmentId()=="compartment_1");
415 
416 	BoundingBox* bb=cg->getBoundingBox();
417 	Point* position=bb->getPosition();
418 	fail_unless(position->getXOffset()==10.3);
419 	fail_unless(position->getYOffset()==20.0);
420 	fail_unless(position->getZOffset()==0.0);
421 	Dimensions* dimensions2=bb->getDimensions();
422 	fail_unless(dimensions2->getWidth()==200.5);
423 	fail_unless(dimensions2->getHeight()==400.5);
424 	fail_unless(dimensions2->getDepth()==0.0);
425 
426 
427 	delete stream;
428 }
429 END_TEST
430 
START_TEST(test_LayoutCreation_CompartmentGlyph_notes)431 START_TEST (test_LayoutCreation_CompartmentGlyph_notes)
432 {
433   const char* content=
434   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
435   "<annotation>\n"
436   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
437   "  <layout id=\"layout_1\">\n"
438   "    <dimensions width=\"200\" height=\"400\"/>\n"
439   "    <listOfCompartmentGlyphs>\n"
440   "      <compartmentGlyph id=\"compartmentGlyph_1\">\n"
441   "        <notes>"
442   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
443   "   <p>Testnote</p>\n"
444   "  </body>"
445   "  </notes>\n"
446   "        <boundingBox>\n"
447   "          <position x=\"10.3\" y=\"20\"/>\n"
448   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
449   "        </boundingBox>\n"
450   "      </compartmentGlyph>\n"
451   "    </listOfCompartmentGlyphs>\n"
452   "  </layout>\n"
453   "</listOfLayouts>\n"
454   "</annotation>\n"
455   ;
456 
457 
458 	XMLInputStream *stream= new XMLInputStream(content,false);
459 	XMLNode node=XMLNode(*stream);
460 	ListOfLayouts pListOfLayouts;
461 	parseLayoutAnnotation(&node,pListOfLayouts);
462 
463 	fail_unless(pListOfLayouts.size()==1);
464 
465 	Layout* l=(Layout*)pListOfLayouts.get(0);
466 
467 	fail_unless(l!=NULL);
468 
469 	Dimensions* dimensions=l->getDimensions();
470 	fail_unless(dimensions->getWidth()==200.0);
471 	fail_unless(dimensions->getHeight()==400.0);
472 	fail_unless(dimensions->getDepth()==0.0);
473 
474 	fail_unless(l->getId()=="layout_1");
475 
476 	fail_unless(l->getNumCompartmentGlyphs()==1);
477 	CompartmentGlyph* cg=l->getCompartmentGlyph(0);
478 	fail_unless(cg->getId()=="compartmentGlyph_1");
479 	fail_unless(!cg->isSetCompartmentId());
480 
481 	BoundingBox* bb=cg->getBoundingBox();
482 	Point* position=bb->getPosition();
483 	fail_unless(position->getXOffset()==10.3);
484 	fail_unless(position->getYOffset()==20.0);
485 	fail_unless(position->getZOffset()==0.0);
486 	Dimensions* dimensions2=bb->getDimensions();
487 	fail_unless(dimensions2->getWidth()==200.5);
488 	fail_unless(dimensions2->getHeight()==400.5);
489 	fail_unless(dimensions2->getDepth()==0.0);
490 
491 	fail_unless(cg->isSetNotes());
492 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
493 	XMLNode notes=XMLNode(*stream2);
494 	fail_unless(cg->getNotes()->equals(notes, true));
495 
496 
497 	delete stream2;
498 	delete stream;
499 }
500 END_TEST
501 
START_TEST(test_LayoutCreation_CompartmentGlyph_annotation)502 START_TEST (test_LayoutCreation_CompartmentGlyph_annotation)
503 {
504 	const char* a =
505   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
506   "<annotation>\n"
507   "        <this-is-a-test>\n"
508   "          <another-level> level2 </another-level>\n"
509   "        </this-is-a-test>\n"
510   "      </annotation>";
511 
512   const char* content=
513   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
514   "<annotation>\n"
515   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
516   "  <layout id=\"layout_1\">\n"
517   "    <dimensions width=\"200\" height=\"400\"/>\n"
518   "    <listOfCompartmentGlyphs>\n"
519   "      <compartmentGlyph id=\"compartmentGlyph_1\">\n"
520   "        <annotation>\n"
521   "          <this-is-a-test>\n"
522   "            <another-level> level2 </another-level>\n"
523   "          </this-is-a-test>\n"
524   "        </annotation>\n"
525   "        <boundingBox>\n"
526   "          <position x=\"10.3\" y=\"20\"/>\n"
527   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
528   "        </boundingBox>\n"
529   "      </compartmentGlyph>\n"
530   "    </listOfCompartmentGlyphs>\n"
531   "  </layout>\n"
532   "</listOfLayouts>\n"
533   "</annotation>\n"
534   ;
535 
536 
537 	XMLInputStream *stream=new XMLInputStream(content,false);
538 	XMLNode node=XMLNode(*stream);
539 	ListOfLayouts pListOfLayouts;
540 	parseLayoutAnnotation(&node,pListOfLayouts);
541 
542 	fail_unless(pListOfLayouts.size()==1);
543 
544 	Layout* l=(Layout*)pListOfLayouts.get(0);
545 
546 	fail_unless(l!=NULL);
547 
548 	Dimensions* dimensions=l->getDimensions();
549 	fail_unless(dimensions->getWidth()==200.0);
550 	fail_unless(dimensions->getHeight()==400.0);
551 	fail_unless(dimensions->getDepth()==0.0);
552 
553 	fail_unless(l->getId()=="layout_1");
554 
555 	fail_unless(l->getNumCompartmentGlyphs()==1);
556 	CompartmentGlyph* cg=l->getCompartmentGlyph(0);
557 	fail_unless(cg->getId()=="compartmentGlyph_1");
558 	fail_unless(!cg->isSetCompartmentId());
559 
560 	BoundingBox* bb=cg->getBoundingBox();
561 	Point* position=bb->getPosition();
562 	fail_unless(position->getXOffset()==10.3);
563 	fail_unless(position->getYOffset()==20.0);
564 	fail_unless(position->getZOffset()==0.0);
565 	Dimensions* dimensions2=bb->getDimensions();
566 	fail_unless(dimensions2->getWidth()==200.5);
567 	fail_unless(dimensions2->getHeight()==400.5);
568 	fail_unless(dimensions2->getDepth()==0.0);
569 
570 	fail_unless(cg->isSetAnnotation());
571 	XMLInputStream *stream2 = new XMLInputStream(a,false);
572 	XMLNode aNode=XMLNode(*stream2);
573 	fail_unless(cg->getAnnotation()->equals(aNode, true));
574 
575 	delete stream2;
576 	delete stream;
577 
578 }
579 END_TEST
580 
START_TEST(test_LayoutCreation_CompartmentGlyph_skipOptional)581 START_TEST (test_LayoutCreation_CompartmentGlyph_skipOptional)
582 {
583   const char* content=
584   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
585   "<annotation>\n"
586   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
587   "  <layout id=\"layout_1\">\n"
588   "    <dimensions width=\"200\" height=\"400\"/>\n"
589   "    <listOfCompartmentGlyphs>\n"
590   "      <compartmentGlyph id=\"compartmentGlyph_1\">\n"
591   "        <boundingBox>\n"
592   "          <position x=\"10.3\" y=\"20\"/>\n"
593   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
594   "        </boundingBox>\n"
595   "      </compartmentGlyph>\n"
596   "    </listOfCompartmentGlyphs>\n"
597   "  </layout>\n"
598   "</listOfLayouts>\n"
599   "</annotation>\n"
600   ;
601 
602 
603 	XMLInputStream *stream=new XMLInputStream(content,false);
604 	XMLNode node=XMLNode(*stream);
605 	ListOfLayouts pListOfLayouts;
606 	parseLayoutAnnotation(&node,pListOfLayouts);
607 
608 	fail_unless(pListOfLayouts.size()==1);
609 
610 	Layout* l=(Layout*)pListOfLayouts.get(0);
611 
612 	fail_unless(l!=NULL);
613 
614 	Dimensions* dimensions=l->getDimensions();
615 	fail_unless(dimensions->getWidth()==200.0);
616 	fail_unless(dimensions->getHeight()==400.0);
617 	fail_unless(dimensions->getDepth()==0.0);
618 
619 	fail_unless(l->getId()=="layout_1");
620 
621 	fail_unless(l->getNumCompartmentGlyphs()==1);
622 	CompartmentGlyph* cg=l->getCompartmentGlyph(0);
623 	fail_unless(cg->getId()=="compartmentGlyph_1");
624 	fail_unless(!cg->isSetCompartmentId());
625 
626 	BoundingBox* bb=cg->getBoundingBox();
627 	Point* position=bb->getPosition();
628 	fail_unless(position->getXOffset()==10.3);
629 	fail_unless(position->getYOffset()==20.0);
630 	fail_unless(position->getZOffset()==0.0);
631 	Dimensions* dimensions2=bb->getDimensions();
632 	fail_unless(dimensions2->getWidth()==200.5);
633 	fail_unless(dimensions2->getHeight()==400.5);
634 	fail_unless(dimensions2->getDepth()==0.0);
635 
636 
637 	delete stream;
638 }
639 END_TEST
640 
START_TEST(test_LayoutCreation_SpeciesGlyph)641 START_TEST (test_LayoutCreation_SpeciesGlyph)
642 {
643   const char* content=
644   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
645   "<annotation>\n"
646   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
647   "  <layout id=\"layout_1\">\n"
648   "    <dimensions width=\"200\" height=\"400\"/>\n"
649   "    <listOfSpeciesGlyphs>\n"
650   "      <speciesGlyph id=\"speciesGlyph_1\" species=\"species_1\">\n"
651   "        <boundingBox>\n"
652   "          <position x=\"10.3\" y=\"20\"/>\n"
653   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
654   "        </boundingBox>\n"
655   "      </speciesGlyph>\n"
656   "    </listOfSpeciesGlyphs>\n"
657   "  </layout>\n"
658   "</listOfLayouts>\n"
659   "</annotation>\n"
660   ;
661 
662 
663 	XMLInputStream *stream=new XMLInputStream(content,false);
664 	XMLNode node=XMLNode(*stream);
665 	ListOfLayouts pListOfLayouts;
666 	parseLayoutAnnotation(&node,pListOfLayouts);
667 
668 	fail_unless(pListOfLayouts.size()==1);
669 
670 	Layout* l=(Layout*)pListOfLayouts.get(0);
671 
672 	fail_unless(l!=NULL);
673 
674 	Dimensions* dimensions=l->getDimensions();
675 	fail_unless(dimensions->getWidth()==200.0);
676 	fail_unless(dimensions->getHeight()==400.0);
677 	fail_unless(dimensions->getDepth()==0.0);
678 
679 	fail_unless(l->getId()=="layout_1");
680 
681 	fail_unless(l->getNumSpeciesGlyphs()==1);
682 	SpeciesGlyph* sg=l->getSpeciesGlyph(0);
683 	fail_unless(sg->getId()=="speciesGlyph_1");
684 	fail_unless(sg->getSpeciesId()=="species_1");
685 
686 	BoundingBox* bb=sg->getBoundingBox();
687 	Point* position=bb->getPosition();
688 	fail_unless(position->getXOffset()==10.3);
689 	fail_unless(position->getYOffset()==20.0);
690 	fail_unless(position->getZOffset()==0.0);
691 	Dimensions* dimensions2=bb->getDimensions();
692 	fail_unless(dimensions2->getWidth()==200.5);
693 	fail_unless(dimensions2->getHeight()==400.5);
694 	fail_unless(dimensions2->getDepth()==0.0);
695 
696 
697 	delete stream;
698 }
699 END_TEST
700 
START_TEST(test_LayoutCreation_SpeciesGlyph_notes)701 START_TEST (test_LayoutCreation_SpeciesGlyph_notes)
702 {
703   const char* content=
704   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
705   "<annotation>\n"
706   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
707   "  <layout id=\"layout_1\">\n"
708   "    <dimensions width=\"200\" height=\"400\"/>\n"
709   "    <listOfSpeciesGlyphs>\n"
710   "      <speciesGlyph id=\"speciesGlyph_1\">\n"
711   "    <notes>"
712   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
713   "   <p>Testnote</p>\n"
714   "  </body>"
715   "  </notes>\n"
716   "        <boundingBox>\n"
717   "          <position x=\"10.3\" y=\"20\"/>\n"
718   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
719   "        </boundingBox>\n"
720   "      </speciesGlyph>\n"
721   "    </listOfSpeciesGlyphs>\n"
722   "  </layout>\n"
723   "</listOfLayouts>\n"
724   "</annotation>\n"
725   ;
726 
727 
728 	XMLInputStream *stream=new XMLInputStream(content,false);
729 	XMLNode node=XMLNode(*stream);
730 	ListOfLayouts pListOfLayouts;
731 	parseLayoutAnnotation(&node,pListOfLayouts);
732 
733 	fail_unless(pListOfLayouts.size()==1);
734 
735 	Layout* l=(Layout*)pListOfLayouts.get(0);
736 
737 	fail_unless(l!=NULL);
738 
739 	Dimensions* dimensions=l->getDimensions();
740 	fail_unless(dimensions->getWidth()==200.0);
741 	fail_unless(dimensions->getHeight()==400.0);
742 	fail_unless(dimensions->getDepth()==0.0);
743 
744 	fail_unless(l->getId()=="layout_1");
745 
746 	fail_unless(l->getNumSpeciesGlyphs()==1);
747 	SpeciesGlyph* sg=l->getSpeciesGlyph(0);
748 	fail_unless(sg->getId()=="speciesGlyph_1");
749 	fail_unless(!sg->isSetSpeciesId());
750 
751 	BoundingBox* bb=sg->getBoundingBox();
752 	Point* position=bb->getPosition();
753 	fail_unless(position->getXOffset()==10.3);
754 	fail_unless(position->getYOffset()==20.0);
755 	fail_unless(position->getZOffset()==0.0);
756 	Dimensions* dimensions2=bb->getDimensions();
757 	fail_unless(dimensions2->getWidth()==200.5);
758 	fail_unless(dimensions2->getHeight()==400.5);
759 	fail_unless(dimensions2->getDepth()==0.0);
760 
761 	fail_unless(sg->isSetNotes());
762 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
763 	XMLNode notes=XMLNode(*stream2);
764 	fail_unless(sg->getNotes()->equals(notes, true));
765 
766 	delete stream2;
767 	delete stream;
768 
769 }
770 END_TEST
771 
START_TEST(test_LayoutCreation_SpeciesGlyph_annotation)772 START_TEST (test_LayoutCreation_SpeciesGlyph_annotation)
773 {
774 	const char* a =
775   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
776   "<annotation>\n"
777   "        <this-is-a-test>\n"
778   "          <another-level> level2 </another-level>\n"
779   "        </this-is-a-test>\n"
780   "      </annotation>";
781 
782   const char* content=
783   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
784   "<annotation>\n"
785   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
786   "  <layout id=\"layout_1\">\n"
787   "    <dimensions width=\"200\" height=\"400\"/>\n"
788   "    <listOfSpeciesGlyphs>\n"
789   "      <speciesGlyph id=\"speciesGlyph_1\">\n"
790   "        <annotation>\n"
791   "          <this-is-a-test>\n"
792   "            <another-level> level2 </another-level>\n"
793   "          </this-is-a-test>\n"
794   "        </annotation>\n"
795   "        <boundingBox>\n"
796   "          <position x=\"10.3\" y=\"20\"/>\n"
797   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
798   "        </boundingBox>\n"
799   "      </speciesGlyph>\n"
800   "    </listOfSpeciesGlyphs>\n"
801   "  </layout>\n"
802   "</listOfLayouts>\n"
803   "</annotation>\n"
804   ;
805 
806 
807 	XMLInputStream *stream=new XMLInputStream(content,false);
808 	XMLNode node=XMLNode(*stream);
809 	ListOfLayouts pListOfLayouts;
810 	parseLayoutAnnotation(&node,pListOfLayouts);
811 
812 	fail_unless(pListOfLayouts.size()==1);
813 
814 	Layout* l=(Layout*)pListOfLayouts.get(0);
815 
816 	fail_unless(l!=NULL);
817 
818 	Dimensions* dimensions=l->getDimensions();
819 	fail_unless(dimensions->getWidth()==200.0);
820 	fail_unless(dimensions->getHeight()==400.0);
821 	fail_unless(dimensions->getDepth()==0.0);
822 
823 	fail_unless(l->getId()=="layout_1");
824 
825 	fail_unless(l->getNumSpeciesGlyphs()==1);
826 	SpeciesGlyph* sg=l->getSpeciesGlyph(0);
827 	fail_unless(sg->getId()=="speciesGlyph_1");
828 	fail_unless(!sg->isSetSpeciesId());
829 
830 	BoundingBox* bb=sg->getBoundingBox();
831 	Point* position=bb->getPosition();
832 	fail_unless(position->getXOffset()==10.3);
833 	fail_unless(position->getYOffset()==20.0);
834 	fail_unless(position->getZOffset()==0.0);
835 	Dimensions* dimensions2=bb->getDimensions();
836 	fail_unless(dimensions2->getWidth()==200.5);
837 	fail_unless(dimensions2->getHeight()==400.5);
838 	fail_unless(dimensions2->getDepth()==0.0);
839 
840 	fail_unless(sg->isSetAnnotation());
841 	XMLInputStream *stream2 = new XMLInputStream(a,false);
842 	XMLNode aNode=XMLNode(*stream2);
843 	fail_unless(sg->getAnnotation()->equals(aNode, true));
844 
845 	delete stream2;
846 	delete stream;
847 }
848 END_TEST
849 
START_TEST(test_LayoutCreation_SpeciesGlyph_skipOptional)850 START_TEST (test_LayoutCreation_SpeciesGlyph_skipOptional)
851 {
852 	const char* content=
853   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
854   "<annotation>\n"
855   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
856   "  <layout id=\"layout_1\">\n"
857   "    <dimensions width=\"200\" height=\"400\"/>\n"
858   "    <listOfSpeciesGlyphs>\n"
859   "      <speciesGlyph id=\"speciesGlyph_1\">\n"
860   "        <boundingBox>\n"
861   "          <position x=\"10.3\" y=\"20\"/>\n"
862   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
863   "        </boundingBox>\n"
864   "      </speciesGlyph>\n"
865   "    </listOfSpeciesGlyphs>\n"
866   "  </layout>\n"
867   "</listOfLayouts>\n"
868   "</annotation>\n"
869   ;
870 
871 
872 	XMLInputStream *stream=new XMLInputStream(content,false);
873 	XMLNode node=XMLNode(*stream);
874 	ListOfLayouts pListOfLayouts;
875 	parseLayoutAnnotation(&node,pListOfLayouts);
876 
877 	fail_unless(pListOfLayouts.size()==1);
878 
879 	Layout* l=(Layout*)pListOfLayouts.get(0);
880 
881 	fail_unless(l!=NULL);
882 
883 	Dimensions* dimensions=l->getDimensions();
884 	fail_unless(dimensions->getWidth()==200.0);
885 	fail_unless(dimensions->getHeight()==400.0);
886 	fail_unless(dimensions->getDepth()==0.0);
887 
888 	fail_unless(l->getId()=="layout_1");
889 
890 	fail_unless(l->getNumSpeciesGlyphs()==1);
891 	SpeciesGlyph* sg=l->getSpeciesGlyph(0);
892 	fail_unless(sg->getId()=="speciesGlyph_1");
893 
894 	fail_unless(!sg->isSetSpeciesId());
895 
896 	BoundingBox* bb=sg->getBoundingBox();
897 	Point* position=bb->getPosition();
898 	fail_unless(position->getXOffset()==10.3);
899 	fail_unless(position->getYOffset()==20.0);
900 	fail_unless(position->getZOffset()==0.0);
901 	Dimensions* dimensions2=bb->getDimensions();
902 	fail_unless(dimensions2->getWidth()==200.5);
903 	fail_unless(dimensions2->getHeight()==400.5);
904 	fail_unless(dimensions2->getDepth()==0.0);
905 
906 	delete stream;
907 
908 }
909 END_TEST
910 
START_TEST(test_LayoutCreation_ReactionGlyph_Curve)911 START_TEST (test_LayoutCreation_ReactionGlyph_Curve)
912 {
913 	const char* content=
914   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
915   "<annotation>\n"
916   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
917   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
918   "    <dimensions width=\"200\" height=\"400\"/>\n"
919   "    <listOfReactionGlyphs>\n"
920   "      <reactionGlyph id=\"reactionGlyph_1\" reaction=\"reaction_1\">\n"
921   "        <curve>\n"
922   "          <listOfCurveSegments>\n"
923   "            <curveSegment xsi:type=\"LineSegment\">\n"
924   "              <start x=\"10\" y=\"15\"/>\n"
925   "              <end x=\"20\" y=\"30\"/>\n"
926   "            </curveSegment>\n"
927   "          </listOfCurveSegments>\n"
928   "        </curve>\n"
929   "      </reactionGlyph>\n"
930   "    </listOfReactionGlyphs>\n"
931   "  </layout>\n"
932   "</listOfLayouts>\n"
933   "</annotation>\n"
934   ;
935 
936 
937 	XMLInputStream *stream=new XMLInputStream(content,false);
938 	XMLNode node=XMLNode(*stream);
939 	ListOfLayouts pListOfLayouts;
940 	parseLayoutAnnotation(&node,pListOfLayouts);
941 
942 	fail_unless(pListOfLayouts.size()==1);
943 
944 	Layout* l=(Layout*)pListOfLayouts.get(0);
945 
946 	fail_unless(l!=NULL);
947 
948 	Dimensions* dimensions=l->getDimensions();
949 	fail_unless(dimensions->getWidth()==200.0);
950 	fail_unless(dimensions->getHeight()==400.0);
951 	fail_unless(dimensions->getDepth()==0.0);
952 
953 	fail_unless(l->getId()=="layout_1");
954 
955 	fail_unless(l->getNumReactionGlyphs()==1);
956 	ReactionGlyph* rg=l->getReactionGlyph(0);
957 	fail_unless(rg->getId()=="reactionGlyph_1");
958 	fail_unless(rg->getReactionId()=="reaction_1");
959 
960 	fail_unless(rg->isSetCurve());
961 	Curve* curve=rg->getCurve();
962 	fail_unless(curve->getNumCurveSegments()==1);
963 	LineSegment* ls=curve->getCurveSegment(0);
964 	fail_unless(ls->getTypeCode()!=SBML_LAYOUT_CUBICBEZIER);
965 	Point* start=ls->getStart();
966 	fail_unless(start->getXOffset()==10.0);
967 	fail_unless(start->getYOffset()==15.0);
968 	fail_unless(start->getZOffset()==0.0);
969 	Point* end=ls->getEnd();
970 	fail_unless(end->getXOffset()==20.0);
971 	fail_unless(end->getYOffset()==30.0);
972 	fail_unless(end->getZOffset()==0.0);
973 
974 
975 	delete stream;
976 }
977 END_TEST
978 
START_TEST(test_LayoutCreation_ReactionGlyph_BoundingBox)979 START_TEST (test_LayoutCreation_ReactionGlyph_BoundingBox)
980 {
981 	const char* content=
982   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
983   "<annotation>\n"
984   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
985   "  <layout id=\"layout_1\">\n"
986   "    <dimensions width=\"200\" height=\"400\"/>\n"
987   "    <listOfReactionGlyphs>\n"
988   "      <reactionGlyph id=\"reactionGlyph_1\" reaction=\"reaction_1\">\n"
989   "        <boundingBox>\n"
990   "          <position x=\"10.3\" y=\"20\"/>\n"
991   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
992   "        </boundingBox>\n"
993   "      </reactionGlyph>\n"
994   "    </listOfReactionGlyphs>\n"
995   "  </layout>\n"
996   "</listOfLayouts>\n"
997   "</annotation>\n"
998   ;
999 
1000 
1001 	XMLInputStream *stream=new XMLInputStream(content,false);
1002 	XMLNode node=XMLNode(*stream);
1003 	ListOfLayouts pListOfLayouts;
1004 	parseLayoutAnnotation(&node,pListOfLayouts);
1005 
1006 	fail_unless(pListOfLayouts.size()==1);
1007 
1008 	Layout* l=(Layout*)pListOfLayouts.get(0);
1009 
1010 	fail_unless(l!=NULL);
1011 
1012 	Dimensions* dimensions=l->getDimensions();
1013 	fail_unless(dimensions->getWidth()==200.0);
1014 	fail_unless(dimensions->getHeight()==400.0);
1015 	fail_unless(dimensions->getDepth()==0.0);
1016 
1017 	fail_unless(l->getId()=="layout_1");
1018 
1019 	fail_unless(l->getNumReactionGlyphs()==1);
1020 	ReactionGlyph* rg=l->getReactionGlyph(0);
1021 	fail_unless(rg->getId()=="reactionGlyph_1");
1022 	fail_unless(rg->getReactionId()=="reaction_1");
1023 
1024 	BoundingBox* bb=rg->getBoundingBox();
1025 	Point* position=bb->getPosition();
1026 	fail_unless(position->getXOffset()==10.3);
1027 	fail_unless(position->getYOffset()==20.0);
1028 	fail_unless(position->getZOffset()==0.0);
1029 	Dimensions* dimensions2=bb->getDimensions();
1030 	fail_unless(dimensions2->getWidth()==200.5);
1031 	fail_unless(dimensions2->getHeight()==400.5);
1032 	fail_unless(dimensions2->getDepth()==0.0);
1033 
1034 	delete stream;
1035 
1036 }
1037 END_TEST
1038 
START_TEST(test_LayoutCreation_ReactionGlyph_notes)1039 START_TEST (test_LayoutCreation_ReactionGlyph_notes)
1040 {
1041 	const char* content=
1042   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1043   "<annotation>\n"
1044   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1045   "  <layout id=\"layout_1\">\n"
1046   "    <dimensions width=\"200\" height=\"400\"/>\n"
1047   "    <listOfReactionGlyphs>\n"
1048   "      <reactionGlyph id=\"reactionGlyph_1\" reaction=\"reaction_1\">\n"
1049   "        <notes>"
1050   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
1051   "   <p>Testnote</p>\n"
1052   "  </body>"
1053   "  </notes>\n"
1054   "        <boundingBox>\n"
1055   "          <position x=\"10.3\" y=\"20\"/>\n"
1056   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1057   "        </boundingBox>\n"
1058   "      </reactionGlyph>\n"
1059   "    </listOfReactionGlyphs>\n"
1060   "  </layout>\n"
1061   "</listOfLayouts>\n"
1062   "</annotation>\n"
1063   ;
1064 
1065 
1066 	XMLInputStream *stream=new XMLInputStream(content,false);
1067 	XMLNode node=XMLNode(*stream);
1068 	ListOfLayouts pListOfLayouts;
1069 	parseLayoutAnnotation(&node,pListOfLayouts);
1070 
1071 	fail_unless(pListOfLayouts.size()==1);
1072 
1073 	Layout* l=(Layout*)pListOfLayouts.get(0);
1074 
1075 	fail_unless(l!=NULL);
1076 
1077 	Dimensions* dimensions=l->getDimensions();
1078 	fail_unless(dimensions->getWidth()==200.0);
1079 	fail_unless(dimensions->getHeight()==400.0);
1080 	fail_unless(dimensions->getDepth()==0.0);
1081 
1082 	fail_unless(l->getId()=="layout_1");
1083 
1084 	fail_unless(l->getNumReactionGlyphs()==1);
1085 	ReactionGlyph* rg=l->getReactionGlyph(0);
1086 	fail_unless(rg->getId()=="reactionGlyph_1");
1087 	fail_unless(rg->getReactionId()=="reaction_1");
1088 
1089 	BoundingBox* bb=rg->getBoundingBox();
1090 	Point* position=bb->getPosition();
1091 	fail_unless(position->getXOffset()==10.3);
1092 	fail_unless(position->getYOffset()==20.0);
1093 	fail_unless(position->getZOffset()==0.0);
1094 	Dimensions* dimensions2=bb->getDimensions();
1095 	fail_unless(dimensions2->getWidth()==200.5);
1096 	fail_unless(dimensions2->getHeight()==400.5);
1097 	fail_unless(dimensions2->getDepth()==0.0);
1098 	fail_unless(rg->isSetNotes());
1099 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
1100 	XMLNode notes=XMLNode(*stream2);
1101 	fail_unless(rg->getNotes()->equals(notes, true));
1102 
1103 	delete stream2;
1104 	delete stream;
1105 }
1106 END_TEST
1107 
START_TEST(test_LayoutCreation_ReactionGlyph_annotation)1108 START_TEST (test_LayoutCreation_ReactionGlyph_annotation)
1109 {
1110 	const char* a =
1111   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1112   "<annotation>\n"
1113   "        <this-is-a-test>\n"
1114   "          <another-level> level2 </another-level>\n"
1115   "        </this-is-a-test>\n"
1116   "      </annotation>";
1117 
1118 	const char* content=
1119   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1120   "<annotation>\n"
1121   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1122   "  <layout id=\"layout_1\">\n"
1123   "    <dimensions width=\"200\" height=\"400\"/>\n"
1124   "    <listOfReactionGlyphs>\n"
1125   "      <reactionGlyph id=\"reactionGlyph_1\" reaction=\"reaction_1\">\n"
1126   "        <annotation>\n"
1127   "          <this-is-a-test>\n"
1128   "            <another-level> level2 </another-level>\n"
1129   "          </this-is-a-test>\n"
1130   "        </annotation>\n"
1131   "        <boundingBox>\n"
1132   "          <position x=\"10.3\" y=\"20\"/>\n"
1133   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1134   "        </boundingBox>\n"
1135   "      </reactionGlyph>\n"
1136   "    </listOfReactionGlyphs>\n"
1137   "  </layout>\n"
1138   "</listOfLayouts>\n"
1139   "</annotation>\n"
1140   ;
1141 
1142 
1143 	XMLInputStream *stream=new XMLInputStream(content,false);
1144 	XMLNode node=XMLNode(*stream);
1145 	ListOfLayouts pListOfLayouts;
1146 	parseLayoutAnnotation(&node,pListOfLayouts);
1147 
1148 	fail_unless(pListOfLayouts.size()==1);
1149 
1150 	Layout* l=(Layout*)pListOfLayouts.get(0);
1151 
1152 	fail_unless(l!=NULL);
1153 
1154 	Dimensions* dimensions=l->getDimensions();
1155 	fail_unless(dimensions->getWidth()==200.0);
1156 	fail_unless(dimensions->getHeight()==400.0);
1157 	fail_unless(dimensions->getDepth()==0.0);
1158 
1159 	fail_unless(l->getId()=="layout_1");
1160 
1161 	fail_unless(l->getNumReactionGlyphs()==1);
1162 	ReactionGlyph* rg=l->getReactionGlyph(0);
1163 	fail_unless(rg->getId()=="reactionGlyph_1");
1164 	fail_unless(rg->getReactionId()=="reaction_1");
1165 
1166 	BoundingBox* bb=rg->getBoundingBox();
1167 	Point* position=bb->getPosition();
1168 	fail_unless(position->getXOffset()==10.3);
1169 	fail_unless(position->getYOffset()==20.0);
1170 	fail_unless(position->getZOffset()==0.0);
1171 	Dimensions* dimensions2=bb->getDimensions();
1172 	fail_unless(dimensions2->getWidth()==200.5);
1173 	fail_unless(dimensions2->getHeight()==400.5);
1174 	fail_unless(dimensions2->getDepth()==0.0);
1175 
1176 	fail_unless(rg->isSetAnnotation());
1177 	XMLInputStream *stream2 = new XMLInputStream(a,false);
1178 	XMLNode aNode=XMLNode(*stream2);
1179 	fail_unless(rg->getAnnotation()->equals(aNode, true));
1180 
1181 	delete stream2;
1182 	delete stream;
1183 }
1184 END_TEST
1185 
START_TEST(test_LayoutCreation_ReactionGlyph_skipOptional)1186 START_TEST (test_LayoutCreation_ReactionGlyph_skipOptional)
1187 {
1188 	const char* content=
1189   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1190   "<annotation>\n"
1191   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1192   "  <layout id=\"layout_1\">\n"
1193   "    <dimensions width=\"200\" height=\"400\"/>\n"
1194   "    <listOfReactionGlyphs>\n"
1195   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
1196   "        <boundingBox>\n"
1197   "          <position x=\"10.3\" y=\"20\"/>\n"
1198   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1199   "        </boundingBox>\n"
1200   "      </reactionGlyph>\n"
1201   "    </listOfReactionGlyphs>\n"
1202   "  </layout>\n"
1203   "</listOfLayouts>\n"
1204   "</annotation>\n"
1205   ;
1206 
1207 
1208 	XMLInputStream *stream=new XMLInputStream(content,false);
1209 	XMLNode node=XMLNode(*stream);
1210 	ListOfLayouts pListOfLayouts;
1211 	parseLayoutAnnotation(&node,pListOfLayouts);
1212 
1213 	fail_unless(pListOfLayouts.size()==1);
1214 
1215 	Layout* l=(Layout*)pListOfLayouts.get(0);
1216 
1217 	fail_unless(l!=NULL);
1218 
1219 	Dimensions* dimensions=l->getDimensions();
1220 	fail_unless(dimensions->getWidth()==200.0);
1221 	fail_unless(dimensions->getHeight()==400.0);
1222 	fail_unless(dimensions->getDepth()==0.0);
1223 
1224 	fail_unless(l->getId()=="layout_1");
1225 
1226 	fail_unless(l->getNumReactionGlyphs()==1);
1227 	ReactionGlyph* rg=l->getReactionGlyph(0);
1228 	fail_unless(rg->getId()=="reactionGlyph_1");
1229 	fail_unless(!rg->isSetReactionId());
1230 
1231 	BoundingBox* bb=rg->getBoundingBox();
1232 	Point* position=bb->getPosition();
1233 	fail_unless(position->getXOffset()==10.3);
1234 	fail_unless(position->getYOffset()==20.0);
1235 	fail_unless(position->getZOffset()==0.0);
1236 	Dimensions* dimensions2=bb->getDimensions();
1237 	fail_unless(dimensions2->getWidth()==200.5);
1238 	fail_unless(dimensions2->getHeight()==400.5);
1239 	fail_unless(dimensions2->getDepth()==0.0);
1240 
1241 
1242 	delete stream;
1243 }
1244 END_TEST
1245 
START_TEST(test_LayoutCreation_SpeciesReferenceGlyph_Curve)1246 START_TEST (test_LayoutCreation_SpeciesReferenceGlyph_Curve)
1247 {
1248 	const char* content=
1249   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1250   "<annotation>\n"
1251   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1252   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
1253   "    <dimensions width=\"200\" height=\"400\"/>\n"
1254   "    <listOfReactionGlyphs>\n"
1255   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
1256   "        <boundingBox>\n"
1257   "          <position x=\"10.3\" y=\"20\"/>\n"
1258   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1259   "        </boundingBox>\n"
1260   "        <listOfSpeciesReferenceGlyphs>\n"
1261   "          <speciesReferenceGlyph id=\"speciesReferenceGlyph_1\" speciesReference=\"speciesReference_1\" speciesGlyph=\"speciesGlyph_1\" role=\"activator\">\n"
1262   "            <curve>\n"
1263   "              <listOfCurveSegments>\n"
1264   "                <curveSegment xsi:type=\"LineSegment\">\n"
1265   "                  <start x=\"10\" y=\"15\"/>\n"
1266   "                  <end x=\"20\" y=\"30\"/>\n"
1267   "                </curveSegment>\n"
1268   "              </listOfCurveSegments>\n"
1269   "            </curve>\n"
1270   "          </speciesReferenceGlyph>\n"
1271   "        </listOfSpeciesReferenceGlyphs>\n"
1272   "      </reactionGlyph>\n"
1273   "    </listOfReactionGlyphs>\n"
1274   "  </layout>\n"
1275   "</listOfLayouts>\n"
1276   "</annotation>\n"
1277   ;
1278 
1279 
1280 	XMLInputStream *stream=new XMLInputStream(content,false);
1281 	XMLNode node=XMLNode(*stream);
1282 	ListOfLayouts pListOfLayouts;
1283 	parseLayoutAnnotation(&node,pListOfLayouts);
1284 
1285 	fail_unless(pListOfLayouts.size()==1);
1286 
1287 	Layout* l=(Layout*)pListOfLayouts.get(0);
1288 
1289 	fail_unless(l!=NULL);
1290 
1291 	Dimensions* dimensions=l->getDimensions();
1292 	fail_unless(dimensions->getWidth()==200.0);
1293 	fail_unless(dimensions->getHeight()==400.0);
1294 	fail_unless(dimensions->getDepth()==0.0);
1295 
1296 	fail_unless(l->getId()=="layout_1");
1297 
1298 	fail_unless(l->getNumReactionGlyphs()==1);
1299 	ReactionGlyph* rg=l->getReactionGlyph(0);
1300 	fail_unless(rg->getId()=="reactionGlyph_1");
1301 	fail_unless(!rg->isSetReactionId());
1302 
1303 	BoundingBox* bb=rg->getBoundingBox();
1304 	Point* position=bb->getPosition();
1305 	fail_unless(position->getXOffset()==10.3);
1306 	fail_unless(position->getYOffset()==20.0);
1307 	fail_unless(position->getZOffset()==0.0);
1308 	Dimensions* dimensions2=bb->getDimensions();
1309 	fail_unless(dimensions2->getWidth()==200.5);
1310 	fail_unless(dimensions2->getHeight()==400.5);
1311 	fail_unless(dimensions2->getDepth()==0.0);
1312 
1313 	fail_unless(rg->getNumSpeciesReferenceGlyphs()==1);
1314 	SpeciesReferenceGlyph* srg=rg->getSpeciesReferenceGlyph(0);
1315 	fail_unless(srg->getId()=="speciesReferenceGlyph_1");
1316 	fail_unless(srg->getRole()==SPECIES_ROLE_ACTIVATOR);
1317 	fail_unless(srg->getSpeciesGlyphId()=="speciesGlyph_1");
1318 	fail_unless(srg->getSpeciesReferenceId()=="speciesReference_1");
1319 
1320 	fail_unless(srg->isSetCurve());
1321 	Curve* curve=srg->getCurve();
1322 	fail_unless(curve->getNumCurveSegments()==1);
1323 	LineSegment* ls=curve->getCurveSegment(0);
1324 	fail_unless(ls->getTypeCode()!=SBML_LAYOUT_CUBICBEZIER);
1325 	Point* start=ls->getStart();
1326 	fail_unless(start->getXOffset()==10.0);
1327 	fail_unless(start->getYOffset()==15.0);
1328 	fail_unless(start->getZOffset()==0.0);
1329 	Point* end=ls->getEnd();
1330 	fail_unless(end->getXOffset()==20.0);
1331 	fail_unless(end->getYOffset()==30.0);
1332 	fail_unless(end->getZOffset()==0.0);
1333 
1334     delete stream;
1335 }
1336 END_TEST
1337 
START_TEST(test_LayoutCreation_SpeciesReferenceGlyph_BoundingBox)1338 START_TEST (test_LayoutCreation_SpeciesReferenceGlyph_BoundingBox)
1339 {
1340 	const char* content=
1341   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1342   "<annotation>\n"
1343   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1344   "  <layout id=\"layout_1\">\n"
1345   "    <dimensions width=\"200\" height=\"400\"/>\n"
1346   "    <listOfReactionGlyphs>\n"
1347   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
1348   "        <boundingBox>\n"
1349   "          <position x=\"10.3\" y=\"20\"/>\n"
1350   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1351   "        </boundingBox>\n"
1352   "        <listOfSpeciesReferenceGlyphs>\n"
1353   "          <speciesReferenceGlyph id=\"speciesReferenceGlyph_1\" speciesReference=\"speciesReference_1\" speciesGlyph=\"speciesGlyph_1\" role=\"modifier\">\n"
1354   "            <boundingBox>\n"
1355   "              <position x=\"110.3\" y=\"120\"/>\n"
1356   "              <dimensions width=\"20.5\" height=\"40.5\"/>\n"
1357   "            </boundingBox>\n"
1358   "          </speciesReferenceGlyph>\n"
1359   "        </listOfSpeciesReferenceGlyphs>\n"
1360   "      </reactionGlyph>\n"
1361   "    </listOfReactionGlyphs>\n"
1362   "  </layout>\n"
1363   "</listOfLayouts>\n"
1364   "</annotation>\n"
1365   ;
1366 
1367 
1368 	XMLInputStream *stream=new XMLInputStream(content,false);
1369 	XMLNode node=XMLNode(*stream);
1370 	ListOfLayouts pListOfLayouts;
1371 	parseLayoutAnnotation(&node,pListOfLayouts);
1372 
1373 	fail_unless(pListOfLayouts.size()==1);
1374 
1375 	Layout* l=(Layout*)pListOfLayouts.get(0);
1376 
1377 	fail_unless(l!=NULL);
1378 
1379 	Dimensions* dimensions=l->getDimensions();
1380 	fail_unless(dimensions->getWidth()==200.0);
1381 	fail_unless(dimensions->getHeight()==400.0);
1382 	fail_unless(dimensions->getDepth()==0.0);
1383 
1384 	fail_unless(l->getId()=="layout_1");
1385 
1386 	fail_unless(l->getNumReactionGlyphs()==1);
1387 	ReactionGlyph* rg=l->getReactionGlyph(0);
1388 	fail_unless(rg->getId()=="reactionGlyph_1");
1389 	fail_unless(!rg->isSetReactionId());
1390 
1391 	BoundingBox* bb=rg->getBoundingBox();
1392 	Point* position=bb->getPosition();
1393 	fail_unless(position->getXOffset()==10.3);
1394 	fail_unless(position->getYOffset()==20.0);
1395 	fail_unless(position->getZOffset()==0.0);
1396 	Dimensions* dimensions3=bb->getDimensions();
1397 	fail_unless(dimensions3->getWidth()==200.5);
1398 	fail_unless(dimensions3->getHeight()==400.5);
1399 	fail_unless(dimensions3->getDepth()==0.0);
1400 
1401 	fail_unless(rg->getNumSpeciesReferenceGlyphs()==1);
1402 	SpeciesReferenceGlyph* srg=rg->getSpeciesReferenceGlyph(0);
1403 	fail_unless(srg->getId()=="speciesReferenceGlyph_1");
1404 	fail_unless(srg->getRole()==SPECIES_ROLE_MODIFIER);
1405 	fail_unless(srg->getSpeciesGlyphId()=="speciesGlyph_1");
1406 	fail_unless(srg->getSpeciesReferenceId()=="speciesReference_1");
1407 
1408 	BoundingBox* bb2=srg->getBoundingBox();
1409 	Point* position2=bb2->getPosition();
1410 	fail_unless(position2->getXOffset()==110.3);
1411 	fail_unless(position2->getYOffset()==120.0);
1412 	fail_unless(position2->getZOffset()==0.0);
1413 	Dimensions* dimensions2=bb2->getDimensions();
1414 	fail_unless(dimensions2->getWidth()==20.5);
1415 	fail_unless(dimensions2->getHeight()==40.5);
1416 	fail_unless(dimensions2->getDepth()==0.0);
1417 
1418 	delete stream;
1419 }
1420 END_TEST
1421 
START_TEST(test_LayoutCreation_SpeciesReferenceGlyph_notes)1422 START_TEST (test_LayoutCreation_SpeciesReferenceGlyph_notes)
1423 {
1424 	const char* content=
1425   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1426   "<annotation>\n"
1427   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1428   "  <layout id=\"layout_1\">\n"
1429   "    <dimensions width=\"200\" height=\"400\"/>\n"
1430   "    <listOfReactionGlyphs>\n"
1431   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
1432   "        <boundingBox>\n"
1433   "          <position x=\"10.3\" y=\"20\"/>\n"
1434   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1435   "        </boundingBox>\n"
1436   "        <listOfSpeciesReferenceGlyphs>\n"
1437   "          <speciesReferenceGlyph id=\"speciesReferenceGlyph_1\" role=\"substrate\">\n"
1438   "            <notes>"
1439   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
1440   "   <p>Testnote</p>\n"
1441   "  </body>"
1442   "  </notes>\n"
1443   "            <boundingBox>\n"
1444   "              <position x=\"110.3\" y=\"120\"/>\n"
1445   "              <dimensions width=\"20.5\" height=\"40.5\"/>\n"
1446   "            </boundingBox>\n"
1447   "          </speciesReferenceGlyph>\n"
1448   "        </listOfSpeciesReferenceGlyphs>\n"
1449   "      </reactionGlyph>\n"
1450   "    </listOfReactionGlyphs>\n"
1451   "  </layout>\n"
1452   "</listOfLayouts>\n"
1453   "</annotation>\n"
1454   ;
1455 
1456 
1457 	XMLInputStream *stream=new XMLInputStream(content,false);
1458 	XMLNode node=XMLNode(*stream);
1459 	ListOfLayouts pListOfLayouts;
1460 	parseLayoutAnnotation(&node,pListOfLayouts);
1461 
1462 	fail_unless(pListOfLayouts.size()==1);
1463 
1464 	Layout* l=(Layout*)pListOfLayouts.get(0);
1465 
1466 	fail_unless(l!=NULL);
1467 
1468 	Dimensions* dimensions=l->getDimensions();
1469 	fail_unless(dimensions->getWidth()==200.0);
1470 	fail_unless(dimensions->getHeight()==400.0);
1471 	fail_unless(dimensions->getDepth()==0.0);
1472 
1473 	fail_unless(l->getId()=="layout_1");
1474 
1475 	fail_unless(l->getNumReactionGlyphs()==1);
1476 	ReactionGlyph* rg=l->getReactionGlyph(0);
1477 	fail_unless(rg->getId()=="reactionGlyph_1");
1478 	fail_unless(!rg->isSetReactionId());
1479 
1480 	BoundingBox* bb=rg->getBoundingBox();
1481 	Point* position=bb->getPosition();
1482 	fail_unless(position->getXOffset()==10.3);
1483 	fail_unless(position->getYOffset()==20.0);
1484 	fail_unless(position->getZOffset()==0.0);
1485 	Dimensions* dimensions3=bb->getDimensions();
1486 	fail_unless(dimensions3->getWidth()==200.5);
1487 	fail_unless(dimensions3->getHeight()==400.5);
1488 	fail_unless(dimensions3->getDepth()==0.0);
1489 
1490 	fail_unless(rg->getNumSpeciesReferenceGlyphs()==1);
1491 	SpeciesReferenceGlyph* srg=rg->getSpeciesReferenceGlyph(0);
1492 	fail_unless(srg->getId()=="speciesReferenceGlyph_1");
1493 	fail_unless(srg->getRole()==SPECIES_ROLE_SUBSTRATE);
1494 	fail_unless(!srg->isSetSpeciesGlyphId());
1495 	fail_unless(!srg->isSetSpeciesReferenceId());
1496 
1497 	BoundingBox* bb2=srg->getBoundingBox();
1498 	Point* position2=bb2->getPosition();
1499 	fail_unless(position2->getXOffset()==110.3);
1500 	fail_unless(position2->getYOffset()==120.0);
1501 	fail_unless(position2->getZOffset()==0.0);
1502 	Dimensions* dimensions2=bb2->getDimensions();
1503 	fail_unless(dimensions2->getWidth()==20.5);
1504 	fail_unless(dimensions2->getHeight()==40.5);
1505 	fail_unless(dimensions2->getDepth()==0.0);
1506 
1507 	fail_unless(srg->isSetNotes());
1508 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
1509 	XMLNode notes=XMLNode(*stream2);
1510 	fail_unless(srg->getNotes()->equals(notes, true));
1511 
1512 	delete stream2;
1513 	delete stream;
1514 }
1515 END_TEST
1516 
START_TEST(test_LayoutCreation_SpeciesReferenceGlyph_annotation)1517 START_TEST (test_LayoutCreation_SpeciesReferenceGlyph_annotation)
1518 {
1519 	const char* a =
1520   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1521   "<annotation>\n"
1522   "            <this-is-a-test>\n"
1523   "              <another-level> level2 </another-level>\n"
1524   "            </this-is-a-test>\n"
1525   "          </annotation>";
1526 
1527 	const char* content=
1528   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1529   "<annotation>\n"
1530   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1531   "  <layout id=\"layout_1\">\n"
1532   "    <dimensions width=\"200\" height=\"400\"/>\n"
1533   "    <listOfReactionGlyphs>\n"
1534   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
1535   "        <boundingBox>\n"
1536   "          <position x=\"10.3\" y=\"20\"/>\n"
1537   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1538   "        </boundingBox>\n"
1539   "        <listOfSpeciesReferenceGlyphs>\n"
1540   "          <speciesReferenceGlyph id=\"speciesReferenceGlyph_1\" role=\"sideproduct\">\n"
1541   "            <annotation>\n"
1542   "              <this-is-a-test>\n"
1543   "                <another-level> level2 </another-level>\n"
1544   "              </this-is-a-test>\n"
1545   "            </annotation>\n"
1546   "            <boundingBox>\n"
1547   "              <position x=\"110.3\" y=\"120\"/>\n"
1548   "              <dimensions width=\"20.5\" height=\"40.5\"/>\n"
1549   "            </boundingBox>\n"
1550   "          </speciesReferenceGlyph>\n"
1551   "        </listOfSpeciesReferenceGlyphs>\n"
1552   "      </reactionGlyph>\n"
1553   "    </listOfReactionGlyphs>\n"
1554   "  </layout>\n"
1555   "</listOfLayouts>\n"
1556   "</annotation>\n"
1557   ;
1558 
1559 
1560 	XMLInputStream *stream=new XMLInputStream(content,false);
1561 	XMLNode node=XMLNode(*stream);
1562 	ListOfLayouts pListOfLayouts;
1563 	parseLayoutAnnotation(&node,pListOfLayouts);
1564 
1565 	fail_unless(pListOfLayouts.size()==1);
1566 
1567 	Layout* l=(Layout*)pListOfLayouts.get(0);
1568 
1569 	fail_unless(l!=NULL);
1570 
1571 	Dimensions* dimensions=l->getDimensions();
1572 	fail_unless(dimensions->getWidth()==200.0);
1573 	fail_unless(dimensions->getHeight()==400.0);
1574 	fail_unless(dimensions->getDepth()==0.0);
1575 
1576 	fail_unless(l->getId()=="layout_1");
1577 
1578 	fail_unless(l->getNumReactionGlyphs()==1);
1579 	ReactionGlyph* rg=l->getReactionGlyph(0);
1580 	fail_unless(rg->getId()=="reactionGlyph_1");
1581 	fail_unless(!rg->isSetReactionId());
1582 
1583 	BoundingBox* bb=rg->getBoundingBox();
1584 	Point* position=bb->getPosition();
1585 	fail_unless(position->getXOffset()==10.3);
1586 	fail_unless(position->getYOffset()==20.0);
1587 	fail_unless(position->getZOffset()==0.0);
1588 	Dimensions* dimensions3=bb->getDimensions();
1589 	fail_unless(dimensions3->getWidth()==200.5);
1590 	fail_unless(dimensions3->getHeight()==400.5);
1591 	fail_unless(dimensions3->getDepth()==0.0);
1592 
1593 	fail_unless(rg->getNumSpeciesReferenceGlyphs()==1);
1594 	SpeciesReferenceGlyph* srg=rg->getSpeciesReferenceGlyph(0);
1595 	fail_unless(srg->getId()=="speciesReferenceGlyph_1");
1596 	fail_unless(srg->getRole()==SPECIES_ROLE_SIDEPRODUCT);
1597 	fail_unless(!srg->isSetSpeciesGlyphId());
1598 	fail_unless(!srg->isSetSpeciesReferenceId());
1599 
1600 	BoundingBox* bb2=srg->getBoundingBox();
1601 	Point* position2=bb2->getPosition();
1602 	fail_unless(position2->getXOffset()==110.3);
1603 	fail_unless(position2->getYOffset()==120.0);
1604 	fail_unless(position2->getZOffset()==0.0);
1605 	Dimensions* dimensions2=bb2->getDimensions();
1606 	fail_unless(dimensions2->getWidth()==20.5);
1607 	fail_unless(dimensions2->getHeight()==40.5);
1608 	fail_unless(dimensions2->getDepth()==0.0);
1609 
1610 	fail_unless(srg->isSetAnnotation());
1611 	XMLInputStream *stream2 = new XMLInputStream(a,false);
1612 	XMLNode aNode=XMLNode(*stream2);
1613 	fail_unless(srg->getAnnotation()->equals(aNode, true));
1614 
1615 	delete stream2;
1616 	delete stream;
1617 }
1618 END_TEST
1619 
START_TEST(test_LayoutCreation_SpeciesReferenceGlyph_skipOptional)1620 START_TEST (test_LayoutCreation_SpeciesReferenceGlyph_skipOptional)
1621 {
1622 	const char* content=
1623   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1624   "<annotation>\n"
1625   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1626   "  <layout id=\"layout_1\">\n"
1627   "    <dimensions width=\"200\" height=\"400\"/>\n"
1628   "    <listOfReactionGlyphs>\n"
1629   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
1630   "        <boundingBox>\n"
1631   "          <position x=\"10.3\" y=\"20\"/>\n"
1632   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1633   "        </boundingBox>\n"
1634   "        <listOfSpeciesReferenceGlyphs>\n"
1635   "          <speciesReferenceGlyph id=\"speciesReferenceGlyph_1\" role=\"sidesubstrate\">\n"
1636   "            <boundingBox>\n"
1637   "              <position x=\"110.3\" y=\"120\"/>\n"
1638   "              <dimensions width=\"20.5\" height=\"40.5\"/>\n"
1639   "            </boundingBox>\n"
1640   "          </speciesReferenceGlyph>\n"
1641   "        </listOfSpeciesReferenceGlyphs>\n"
1642   "      </reactionGlyph>\n"
1643   "    </listOfReactionGlyphs>\n"
1644   "  </layout>\n"
1645   "</listOfLayouts>\n"
1646   "</annotation>\n"
1647   ;
1648 
1649 
1650 	XMLInputStream *stream=new XMLInputStream(content,false);
1651 	XMLNode node=XMLNode(*stream);
1652 	ListOfLayouts pListOfLayouts;
1653 	parseLayoutAnnotation(&node,pListOfLayouts);
1654 
1655 	fail_unless(pListOfLayouts.size()==1);
1656 
1657 	Layout* l=(Layout*)pListOfLayouts.get(0);
1658 
1659 	fail_unless(l!=NULL);
1660 
1661 	Dimensions* dimensions=l->getDimensions();
1662 	fail_unless(dimensions->getWidth()==200.0);
1663 	fail_unless(dimensions->getHeight()==400.0);
1664 	fail_unless(dimensions->getDepth()==0.0);
1665 
1666 	fail_unless(l->getId()=="layout_1");
1667 
1668 	fail_unless(l->getNumReactionGlyphs()==1);
1669 	ReactionGlyph* rg=l->getReactionGlyph(0);
1670 	fail_unless(rg->getId()=="reactionGlyph_1");
1671 	fail_unless(!rg->isSetReactionId());
1672 
1673 	BoundingBox* bb=rg->getBoundingBox();
1674 	Point* position=bb->getPosition();
1675 	fail_unless(position->getXOffset()==10.3);
1676 	fail_unless(position->getYOffset()==20.0);
1677 	fail_unless(position->getZOffset()==0.0);
1678 	Dimensions* dimensions3=bb->getDimensions();
1679 	fail_unless(dimensions3->getWidth()==200.5);
1680 	fail_unless(dimensions3->getHeight()==400.5);
1681 	fail_unless(dimensions3->getDepth()==0.0);
1682 
1683 	fail_unless(rg->getNumSpeciesReferenceGlyphs()==1);
1684 	SpeciesReferenceGlyph* srg=rg->getSpeciesReferenceGlyph(0);
1685 	fail_unless(srg->getId()=="speciesReferenceGlyph_1");
1686 	fail_unless(srg->getRole()==SPECIES_ROLE_SIDESUBSTRATE);
1687 	fail_unless(!srg->isSetSpeciesGlyphId());
1688 	fail_unless(!srg->isSetSpeciesReferenceId());
1689 
1690 	BoundingBox* bb2=srg->getBoundingBox();
1691 	Point* position2=bb2->getPosition();
1692 	fail_unless(position2->getXOffset()==110.3);
1693 	fail_unless(position2->getYOffset()==120.0);
1694 	fail_unless(position2->getZOffset()==0.0);
1695 	Dimensions* dimensions2=bb2->getDimensions();
1696 	fail_unless(dimensions2->getWidth()==20.5);
1697 	fail_unless(dimensions2->getHeight()==40.5);
1698 	fail_unless(dimensions2->getDepth()==0.0);
1699 
1700 	delete stream;
1701 }
1702 END_TEST
1703 
START_TEST(test_LayoutCreation_TextGlyph_text)1704 START_TEST (test_LayoutCreation_TextGlyph_text)
1705 {
1706 	const char* content=
1707   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1708   "<annotation>\n"
1709   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1710   "  <layout id=\"layout_1\">\n"
1711   "    <dimensions width=\"200\" height=\"400\"/>\n"
1712   "    <listOfTextGlyphs>\n"
1713   "      <textGlyph id=\"textGlyph_1\" graphicalObject=\"speciesGlyph_1\" text=\"test text\">\n"
1714   "        <boundingBox>\n"
1715   "          <position x=\"10.3\" y=\"20\"/>\n"
1716   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1717   "        </boundingBox>\n"
1718   "      </textGlyph>\n"
1719   "    </listOfTextGlyphs>\n"
1720   "  </layout>\n"
1721   "</listOfLayouts>\n"
1722   "</annotation>\n"
1723   ;
1724 
1725 
1726 	XMLInputStream *stream=new XMLInputStream(content,false);
1727 	XMLNode node=XMLNode(*stream);
1728 	ListOfLayouts pListOfLayouts;
1729 	parseLayoutAnnotation(&node,pListOfLayouts);
1730 
1731 	fail_unless(pListOfLayouts.size()==1);
1732 
1733 	Layout* l=(Layout*)pListOfLayouts.get(0);
1734 
1735 	fail_unless(l!=NULL);
1736 
1737 	Dimensions* dimensions=l->getDimensions();
1738 	fail_unless(dimensions->getWidth()==200.0);
1739 	fail_unless(dimensions->getHeight()==400.0);
1740 	fail_unless(dimensions->getDepth()==0.0);
1741 
1742 	fail_unless(l->getId()=="layout_1");
1743 
1744 	fail_unless(l->getNumTextGlyphs()==1);
1745 	TextGlyph* tg=l->getTextGlyph(0);
1746 	fail_unless(tg->getId()=="textGlyph_1");
1747 
1748 	fail_unless(tg->getGraphicalObjectId()=="speciesGlyph_1");
1749 	fail_unless(tg->getText()=="test text");
1750 
1751 	BoundingBox* bb=tg->getBoundingBox();
1752 	Point* position=bb->getPosition();
1753 	fail_unless(position->getXOffset()==10.3);
1754 	fail_unless(position->getYOffset()==20.0);
1755 	fail_unless(position->getZOffset()==0.0);
1756 	Dimensions* dimensions2=bb->getDimensions();
1757 	fail_unless(dimensions2->getWidth()==200.5);
1758 	fail_unless(dimensions2->getHeight()==400.5);
1759 	fail_unless(dimensions2->getDepth()==0.0);
1760 
1761 	delete stream;
1762 
1763 }
1764 END_TEST
1765 
START_TEST(test_LayoutCreation_TextGlyph_originOfText)1766 START_TEST (test_LayoutCreation_TextGlyph_originOfText)
1767 {
1768 	const char* content=
1769   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1770   "<annotation>\n"
1771   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1772   "  <layout id=\"layout_1\">\n"
1773   "    <dimensions width=\"200\" height=\"400\"/>\n"
1774   "    <listOfTextGlyphs>\n"
1775   "      <textGlyph id=\"textGlyph_1\" graphicalObject=\"speciesGlyph_1\" originOfText=\"reactionGlyph_1\">\n"
1776   "        <boundingBox>\n"
1777   "          <position x=\"10.3\" y=\"20\"/>\n"
1778   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1779   "        </boundingBox>\n"
1780   "      </textGlyph>\n"
1781   "    </listOfTextGlyphs>\n"
1782   "  </layout>\n"
1783   "</listOfLayouts>\n"
1784   "</annotation>\n"
1785   ;
1786 
1787 
1788 	XMLInputStream *stream=new XMLInputStream(content,false);
1789 	XMLNode node=XMLNode(*stream);
1790 	ListOfLayouts pListOfLayouts;
1791 	parseLayoutAnnotation(&node,pListOfLayouts);
1792 
1793 	fail_unless(pListOfLayouts.size()==1);
1794 
1795 	Layout* l=(Layout*)pListOfLayouts.get(0);
1796 
1797 	fail_unless(l!=NULL);
1798 
1799 	Dimensions* dimensions=l->getDimensions();
1800 	fail_unless(dimensions->getWidth()==200.0);
1801 	fail_unless(dimensions->getHeight()==400.0);
1802 	fail_unless(dimensions->getDepth()==0.0);
1803 
1804 	fail_unless(l->getId()=="layout_1");
1805 
1806 	fail_unless(l->getNumTextGlyphs()==1);
1807 	TextGlyph* tg=l->getTextGlyph(0);
1808 	fail_unless(tg->getId()=="textGlyph_1");
1809 
1810 	fail_unless(tg->getGraphicalObjectId()=="speciesGlyph_1");
1811 	fail_unless(tg->getOriginOfTextId()=="reactionGlyph_1");
1812 
1813 	BoundingBox* bb=tg->getBoundingBox();
1814 	Point* position=bb->getPosition();
1815 	fail_unless(position->getXOffset()==10.3);
1816 	fail_unless(position->getYOffset()==20.0);
1817 	fail_unless(position->getZOffset()==0.0);
1818 	Dimensions* dimensions2=bb->getDimensions();
1819 	fail_unless(dimensions2->getWidth()==200.5);
1820 	fail_unless(dimensions2->getHeight()==400.5);
1821 	fail_unless(dimensions2->getDepth()==0.0);
1822 
1823 	delete stream;
1824 
1825 }
1826 END_TEST
1827 
START_TEST(test_LayoutCreation_TextGlyph_notes)1828 START_TEST (test_LayoutCreation_TextGlyph_notes)
1829 {
1830 	const char* content=
1831   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1832   "<annotation>\n"
1833   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1834   "  <layout id=\"layout_1\">\n"
1835   "    <dimensions width=\"200\" height=\"400\"/>\n"
1836   "    <listOfTextGlyphs>\n"
1837   "      <textGlyph id=\"textGlyph_1\" graphicalObject=\"speciesGlyph_1\" originOfText=\"reactionGlyph_1\">\n"
1838   "        <notes>"
1839   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
1840   "   <p>Testnote</p>\n"
1841   "  </body>"
1842   "  </notes>\n"
1843   "        <boundingBox>\n"
1844   "          <position x=\"10.3\" y=\"20\"/>\n"
1845   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1846   "        </boundingBox>\n"
1847   "      </textGlyph>\n"
1848   "    </listOfTextGlyphs>\n"
1849   "  </layout>\n"
1850   "</listOfLayouts>\n"
1851   "</annotation>\n"
1852   ;
1853 
1854 
1855 	XMLInputStream *stream= new XMLInputStream(content,false);
1856 	XMLNode node=XMLNode(*stream);
1857 	ListOfLayouts pListOfLayouts;
1858 	parseLayoutAnnotation(&node,pListOfLayouts);
1859 
1860 	fail_unless(pListOfLayouts.size()==1);
1861 
1862 	Layout* l=(Layout*)pListOfLayouts.get(0);
1863 
1864 	fail_unless(l!=NULL);
1865 
1866 	Dimensions* dimensions=l->getDimensions();
1867 	fail_unless(dimensions->getWidth()==200.0);
1868 	fail_unless(dimensions->getHeight()==400.0);
1869 	fail_unless(dimensions->getDepth()==0.0);
1870 
1871 	fail_unless(l->getId()=="layout_1");
1872 
1873 	fail_unless(l->getNumTextGlyphs()==1);
1874 	TextGlyph* tg=l->getTextGlyph(0);
1875 	fail_unless(tg->getId()=="textGlyph_1");
1876 
1877 	fail_unless(tg->getGraphicalObjectId()=="speciesGlyph_1");
1878 	fail_unless(tg->getOriginOfTextId()=="reactionGlyph_1");
1879 
1880 	BoundingBox* bb=tg->getBoundingBox();
1881 	Point* position=bb->getPosition();
1882 	fail_unless(position->getXOffset()==10.3);
1883 	fail_unless(position->getYOffset()==20.0);
1884 	fail_unless(position->getZOffset()==0.0);
1885 	Dimensions* dimensions2=bb->getDimensions();
1886 	fail_unless(dimensions2->getWidth()==200.5);
1887 	fail_unless(dimensions2->getHeight()==400.5);
1888 	fail_unless(dimensions2->getDepth()==0.0);
1889 
1890 	fail_unless(tg->isSetNotes());
1891 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
1892 	XMLNode notes=XMLNode(*stream2);
1893 	fail_unless(tg->getNotes()->equals(notes, true));
1894 
1895 	delete stream2;
1896 	delete stream;
1897 
1898 }
1899 END_TEST
1900 
START_TEST(test_LayoutCreation_TextGlyph_annotation)1901 START_TEST (test_LayoutCreation_TextGlyph_annotation)
1902 {
1903 	const char* a =
1904   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1905   "<annotation>\n"
1906   "        <this-is-a-test>\n"
1907   "          <another-level> level2 </another-level>\n"
1908   "        </this-is-a-test>\n"
1909   "      </annotation>";
1910 
1911 	const char* content=
1912   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1913   "<annotation>\n"
1914   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1915   "  <layout id=\"layout_1\">\n"
1916   "    <dimensions width=\"200\" height=\"400\"/>\n"
1917   "    <listOfTextGlyphs>\n"
1918   "      <textGlyph id=\"textGlyph_1\" graphicalObject=\"speciesGlyph_1\" originOfText=\"reactionGlyph_1\">\n"
1919   "        <annotation>\n"
1920   "          <this-is-a-test>\n"
1921   "            <another-level> level2 </another-level>\n"
1922   "          </this-is-a-test>\n"
1923   "        </annotation>\n"
1924   "        <boundingBox>\n"
1925   "          <position x=\"10.3\" y=\"20\"/>\n"
1926   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1927   "        </boundingBox>\n"
1928   "      </textGlyph>\n"
1929   "    </listOfTextGlyphs>\n"
1930   "  </layout>\n"
1931   "</listOfLayouts>\n"
1932   "</annotation>\n"
1933   ;
1934 
1935 
1936 	XMLInputStream *stream=new XMLInputStream(content,false);
1937 	XMLNode node=XMLNode(*stream);
1938 	ListOfLayouts pListOfLayouts;
1939 	parseLayoutAnnotation(&node,pListOfLayouts);
1940 
1941 	fail_unless(pListOfLayouts.size()==1);
1942 
1943 	Layout* l=(Layout*)pListOfLayouts.get(0);
1944 
1945 	fail_unless(l!=NULL);
1946 
1947 	Dimensions* dimensions=l->getDimensions();
1948 	fail_unless(dimensions->getWidth()==200.0);
1949 	fail_unless(dimensions->getHeight()==400.0);
1950 	fail_unless(dimensions->getDepth()==0.0);
1951 
1952 	fail_unless(l->getId()=="layout_1");
1953 
1954 	fail_unless(l->getNumTextGlyphs()==1);
1955 	TextGlyph* tg=l->getTextGlyph(0);
1956 	fail_unless(tg->getId()=="textGlyph_1");
1957 
1958 	fail_unless(tg->getGraphicalObjectId()=="speciesGlyph_1");
1959 	fail_unless(tg->getOriginOfTextId()=="reactionGlyph_1");
1960 
1961 	BoundingBox* bb=tg->getBoundingBox();
1962 	Point* position=bb->getPosition();
1963 	fail_unless(position->getXOffset()==10.3);
1964 	fail_unless(position->getYOffset()==20.0);
1965 	fail_unless(position->getZOffset()==0.0);
1966 	Dimensions* dimensions2=bb->getDimensions();
1967 	fail_unless(dimensions2->getWidth()==200.5);
1968 	fail_unless(dimensions2->getHeight()==400.5);
1969 	fail_unless(dimensions2->getDepth()==0.0);
1970 
1971 	fail_unless(tg->isSetAnnotation());
1972 	XMLInputStream *stream2 = new XMLInputStream(a,false);
1973 	XMLNode aNode=XMLNode(*stream2);
1974 	fail_unless(tg->getAnnotation()->equals(aNode, true));
1975 
1976 	delete stream2;
1977 	delete stream;
1978 
1979 }
1980 END_TEST
1981 
START_TEST(test_LayoutCreation_TextGlyph_skipOptional)1982 START_TEST (test_LayoutCreation_TextGlyph_skipOptional)
1983 {
1984 	const char* content=
1985   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1986   "<annotation>\n"
1987   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
1988   "  <layout id=\"layout_1\">\n"
1989   "    <dimensions width=\"200\" height=\"400\"/>\n"
1990   "    <listOfTextGlyphs>\n"
1991   "      <textGlyph id=\"textGlyph_1\">\n"
1992   "        <boundingBox>\n"
1993   "          <position x=\"10.3\" y=\"20\"/>\n"
1994   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
1995   "        </boundingBox>\n"
1996   "      </textGlyph>\n"
1997   "   </listOfTextGlyphs>\n"
1998   "  </layout>\n"
1999   "</listOfLayouts>\n"
2000   "</annotation>\n"
2001   ;
2002 
2003 
2004 	XMLInputStream *stream=new XMLInputStream(content,false);
2005 	XMLNode node=XMLNode(*stream);
2006 	ListOfLayouts pListOfLayouts;
2007 	parseLayoutAnnotation(&node,pListOfLayouts);
2008 
2009 	fail_unless(pListOfLayouts.size()==1);
2010 
2011 	Layout* l=(Layout*)pListOfLayouts.get(0);
2012 
2013 	fail_unless(l!=NULL);
2014 
2015 	Dimensions* dimensions=l->getDimensions();
2016 	fail_unless(dimensions->getWidth()==200.0);
2017 	fail_unless(dimensions->getHeight()==400.0);
2018 	fail_unless(dimensions->getDepth()==0.0);
2019 
2020 	fail_unless(l->getId()=="layout_1");
2021 
2022 	fail_unless(l->getNumTextGlyphs()==1);
2023 	TextGlyph* tg=l->getTextGlyph(0);
2024 	fail_unless(tg->getId()=="textGlyph_1");
2025 
2026 	fail_unless(!tg->isSetGraphicalObjectId());
2027 	fail_unless(!tg->isSetOriginOfTextId());
2028 	fail_unless(!tg->isSetText());
2029 
2030 	BoundingBox* bb=tg->getBoundingBox();
2031 	Point* position=bb->getPosition();
2032 	fail_unless(position->getXOffset()==10.3);
2033 	fail_unless(position->getYOffset()==20.0);
2034 	fail_unless(position->getZOffset()==0.0);
2035 	Dimensions* dimensions2=bb->getDimensions();
2036 	fail_unless(dimensions2->getWidth()==200.5);
2037 	fail_unless(dimensions2->getHeight()==400.5);
2038 	fail_unless(dimensions2->getDepth()==0.0);
2039 
2040 	delete stream;
2041 
2042 }
2043 END_TEST
2044 
START_TEST(test_LayoutCreation_GraphicalObject)2045 START_TEST (test_LayoutCreation_GraphicalObject)
2046 {
2047 	const char* content=
2048   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2049   "<annotation>\n"
2050   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2051   "  <layout id=\"layout_1\">\n"
2052   "    <dimensions width=\"200\" height=\"400\"/>\n"
2053   "    <listOfAdditionalGraphicalObjects>\n"
2054   "      <graphicalObject id=\"graphicalObject_1\">\n"
2055   "        <boundingBox>\n"
2056   "          <position x=\"10.3\" y=\"20\"/>\n"
2057   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
2058   "        </boundingBox>\n"
2059   "      </graphicalObject>\n"
2060   "    </listOfAdditionalGraphicalObjects>\n"
2061   "  </layout>\n"
2062   "</listOfLayouts>\n"
2063   "</annotation>\n"
2064   ;
2065 
2066 
2067 	XMLInputStream *stream=new XMLInputStream(content,false);
2068 	XMLNode node=XMLNode(*stream);
2069 	ListOfLayouts pListOfLayouts;
2070 	parseLayoutAnnotation(&node,pListOfLayouts);
2071 
2072 	fail_unless(pListOfLayouts.size()==1);
2073 
2074 	Layout* l=(Layout*)pListOfLayouts.get(0);
2075 
2076 	fail_unless(l!=NULL);
2077 
2078 	Dimensions* dimensions=l->getDimensions();
2079 	fail_unless(dimensions->getWidth()==200.0);
2080 	fail_unless(dimensions->getHeight()==400.0);
2081 	fail_unless(dimensions->getDepth()==0.0);
2082 
2083 	fail_unless(l->getId()=="layout_1");
2084 
2085 	fail_unless(l->getNumAdditionalGraphicalObjects()==1);
2086 	GraphicalObject* go=l->getAdditionalGraphicalObject(0);
2087 	fail_unless(go->getId()=="graphicalObject_1");
2088 	BoundingBox* bb=go->getBoundingBox();
2089 	Point* position=bb->getPosition();
2090 	fail_unless(position->getXOffset()==10.3);
2091 	fail_unless(position->getYOffset()==20.0);
2092 	fail_unless(position->getZOffset()==0.0);
2093 	Dimensions* dimensions2=bb->getDimensions();
2094 	fail_unless(dimensions2->getWidth()==200.5);
2095 	fail_unless(dimensions2->getHeight()==400.5);
2096 	fail_unless(dimensions2->getDepth()==0.0);
2097 
2098 	delete stream;
2099 
2100 }
2101 END_TEST
2102 
START_TEST(test_LayoutCreation_GraphicalObject_notes)2103 START_TEST (test_LayoutCreation_GraphicalObject_notes)
2104 {
2105 	const char* content=
2106   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2107   "<annotation>\n"
2108   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2109   "  <layout id=\"layout_1\">\n"
2110   "    <dimensions width=\"200\" height=\"400\"/>\n"
2111   "    <listOfAdditionalGraphicalObjects>\n"
2112   "      <graphicalObject id=\"graphicalObject_1\">\n"
2113   "        <notes>"
2114   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
2115   "   <p>Testnote</p>\n"
2116   "  </body>"
2117   "  </notes>\n"
2118   "        <boundingBox>\n"
2119   "          <position x=\"10.3\" y=\"20\"/>\n"
2120   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
2121   "        </boundingBox>\n"
2122   "      </graphicalObject>\n"
2123   "    </listOfAdditionalGraphicalObjects>\n"
2124   "  </layout>\n"
2125   "</listOfLayouts>\n"
2126   "</annotation>\n"
2127   ;
2128 
2129 
2130 	XMLInputStream *stream=new XMLInputStream(content,false);
2131 	XMLNode node=XMLNode(*stream);
2132 	ListOfLayouts pListOfLayouts;
2133 	parseLayoutAnnotation(&node,pListOfLayouts);
2134 
2135 	fail_unless(pListOfLayouts.size()==1);
2136 
2137 	Layout* l=(Layout*)pListOfLayouts.get(0);
2138 
2139 	fail_unless(l!=NULL);
2140 
2141 	Dimensions* dimensions=l->getDimensions();
2142 	fail_unless(dimensions->getWidth()==200.0);
2143 	fail_unless(dimensions->getHeight()==400.0);
2144 	fail_unless(dimensions->getDepth()==0.0);
2145 
2146 	fail_unless(l->getId()=="layout_1");
2147 
2148 	fail_unless(l->getNumAdditionalGraphicalObjects()==1);
2149 	GraphicalObject* go=l->getAdditionalGraphicalObject(0);
2150 	fail_unless(go->getId()=="graphicalObject_1");
2151 	BoundingBox* bb=go->getBoundingBox();
2152 	Point* position=bb->getPosition();
2153 	fail_unless(position->getXOffset()==10.3);
2154 	fail_unless(position->getYOffset()==20.0);
2155 	fail_unless(position->getZOffset()==0.0);
2156 	Dimensions* dimensions2=bb->getDimensions();
2157 	fail_unless(dimensions2->getWidth()==200.5);
2158 	fail_unless(dimensions2->getHeight()==400.5);
2159 	fail_unless(dimensions2->getDepth()==0.0);
2160 	fail_unless(go->isSetNotes());
2161 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
2162 	XMLNode notes=XMLNode(*stream2);
2163 	fail_unless(go->getNotes()->equals(notes, true));
2164 
2165 
2166 	delete stream2;
2167 	delete stream;
2168 
2169 }
2170 END_TEST
2171 
START_TEST(test_LayoutCreation_GraphicalObject_annotation)2172 START_TEST (test_LayoutCreation_GraphicalObject_annotation)
2173 {
2174 	const char* a =
2175   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2176   "<annotation>\n"
2177   "        <this-is-a-test>\n"
2178   "          <another-level> level2 </another-level>\n"
2179   "        </this-is-a-test>\n"
2180   "      </annotation>";
2181 
2182 	const char* content=
2183   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2184   "<annotation>\n"
2185   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2186   "  <layout id=\"layout_1\">\n"
2187   "    <dimensions width=\"200\" height=\"400\"/>\n"
2188   "    <listOfAdditionalGraphicalObjects>\n"
2189   "      <graphicalObject id=\"graphicalObject_1\">\n"
2190   "        <annotation>\n"
2191   "          <this-is-a-test>\n"
2192   "            <another-level> level2 </another-level>\n"
2193   "          </this-is-a-test>\n"
2194   "        </annotation>\n"
2195   "        <boundingBox>\n"
2196   "          <position x=\"10.3\" y=\"20\"/>\n"
2197   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
2198   "        </boundingBox>\n"
2199   "      </graphicalObject>\n"
2200   "    </listOfAdditionalGraphicalObjects>\n"
2201   "  </layout>\n"
2202   "</listOfLayouts>\n"
2203   "</annotation>\n"
2204   ;
2205 
2206 
2207 
2208 	XMLInputStream *stream=new XMLInputStream(content,false);
2209 	XMLNode node=XMLNode(*stream);
2210 	ListOfLayouts pListOfLayouts;
2211 	parseLayoutAnnotation(&node,pListOfLayouts);
2212 
2213 	fail_unless(pListOfLayouts.size()==1);
2214 
2215 	Layout* l=(Layout*)pListOfLayouts.get(0);
2216 
2217 	fail_unless(l!=NULL);
2218 
2219 	Dimensions* dimensions=l->getDimensions();
2220 	fail_unless(dimensions->getWidth()==200.0);
2221 	fail_unless(dimensions->getHeight()==400.0);
2222 	fail_unless(dimensions->getDepth()==0.0);
2223 
2224 	fail_unless(l->getId()=="layout_1");
2225 
2226 	fail_unless(l->getNumAdditionalGraphicalObjects()==1);
2227 	GraphicalObject* go=l->getAdditionalGraphicalObject(0);
2228 	fail_unless(go->getId()=="graphicalObject_1");
2229 	BoundingBox* bb=go->getBoundingBox();
2230 	Point* position=bb->getPosition();
2231 	fail_unless(position->getXOffset()==10.3);
2232 	fail_unless(position->getYOffset()==20.0);
2233 	fail_unless(position->getZOffset()==0.0);
2234 	Dimensions* dimensions2=bb->getDimensions();
2235 	fail_unless(dimensions2->getWidth()==200.5);
2236 	fail_unless(dimensions2->getHeight()==400.5);
2237 	fail_unless(dimensions2->getDepth()==0.0);
2238 
2239 	fail_unless(go->isSetAnnotation());
2240 	XMLInputStream *stream2 = new XMLInputStream(a,false);
2241 	XMLNode aNode=XMLNode(*stream2);
2242 	fail_unless(go->getAnnotation()->equals(aNode, true));
2243 
2244 	delete stream2;
2245 	delete stream;
2246 
2247 }
2248 END_TEST
2249 
START_TEST(test_LayoutCreation_Curve)2250 START_TEST (test_LayoutCreation_Curve)
2251 {
2252 	const char* content=
2253   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2254   "<annotation>\n"
2255   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2256   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
2257   "    <dimensions width=\"200\" height=\"400\"/>\n"
2258   "    <listOfReactionGlyphs>\n"
2259   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2260   "        <curve>\n"
2261   "          <listOfCurveSegments>\n"
2262   "            <curveSegment xsi:type=\"LineSegment\">\n"
2263   "              <start x=\"10\" y=\"15\"/>\n"
2264   "              <end x=\"20\" y=\"30\"/>\n"
2265   "            </curveSegment>\n"
2266   "          </listOfCurveSegments>\n"
2267   "        </curve>\n"
2268   "      </reactionGlyph>\n"
2269   "    </listOfReactionGlyphs>\n"
2270   "  </layout>\n"
2271   "</listOfLayouts>\n"
2272   "</annotation>\n"
2273   ;
2274 
2275 
2276 	XMLInputStream *stream=new XMLInputStream(content,false);
2277 	XMLNode node=XMLNode(*stream);
2278 	ListOfLayouts pListOfLayouts;
2279 	parseLayoutAnnotation(&node,pListOfLayouts);
2280 
2281 	fail_unless(pListOfLayouts.size()==1);
2282 
2283 	Layout* l=(Layout*)pListOfLayouts.get(0);
2284 
2285 	fail_unless(l!=NULL);
2286 
2287 	Dimensions* dimensions=l->getDimensions();
2288 	fail_unless(dimensions->getWidth()==200.0);
2289 	fail_unless(dimensions->getHeight()==400.0);
2290 	fail_unless(dimensions->getDepth()==0.0);
2291 
2292 	fail_unless(l->getId()=="layout_1");
2293 
2294 	fail_unless(l->getNumReactionGlyphs()==1);
2295 	ReactionGlyph* rg=l->getReactionGlyph(0);
2296 	fail_unless(rg->getId()=="reactionGlyph_1");
2297 	fail_unless(!rg->isSetReactionId());
2298 
2299 	fail_unless(rg->isSetCurve());
2300 	Curve* curve=rg->getCurve();
2301 	fail_unless(curve->getNumCurveSegments()==1);
2302 	LineSegment* ls=curve->getCurveSegment(0);
2303 	fail_unless(ls->getTypeCode()!=SBML_LAYOUT_CUBICBEZIER);
2304 	Point* start=ls->getStart();
2305 	fail_unless(start->getXOffset()==10.0);
2306 	fail_unless(start->getYOffset()==15.0);
2307 	fail_unless(start->getZOffset()==0.0);
2308 	Point* end=ls->getEnd();
2309 	fail_unless(end->getXOffset()==20.0);
2310 	fail_unless(end->getYOffset()==30.0);
2311 	fail_unless(end->getZOffset()==0.0);
2312 
2313 	delete stream;
2314 
2315 }
2316 END_TEST
2317 
START_TEST(test_LayoutCreation_Curve_notes)2318 START_TEST (test_LayoutCreation_Curve_notes)
2319 {
2320 	const char* content=
2321   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2322   "<annotation>\n"
2323   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2324   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
2325   "    <dimensions width=\"200\" height=\"400\"/>\n"
2326   "    <listOfReactionGlyphs>\n"
2327   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2328   "        <curve>\n"
2329   "          <notes>"
2330   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
2331   "   <p>Testnote</p>\n"
2332   "  </body>"
2333   "  </notes>\n"
2334   "          <listOfCurveSegments>\n"
2335   "            <curveSegment xsi:type=\"LineSegment\">\n"
2336   "              <start x=\"10\" y=\"15\"/>\n"
2337   "              <end x=\"20\" y=\"30\"/>\n"
2338   "            </curveSegment>\n"
2339   "          </listOfCurveSegments>\n"
2340   "        </curve>\n"
2341   "      </reactionGlyph>\n"
2342   "    </listOfReactionGlyphs>\n"
2343   "  </layout>\n"
2344   "</listOfLayouts>\n"
2345   "</annotation>\n"
2346   ;
2347 
2348 
2349 	XMLInputStream *stream=new XMLInputStream(content,false);
2350 	XMLNode node=XMLNode(*stream);
2351 	ListOfLayouts pListOfLayouts;
2352 	parseLayoutAnnotation(&node,pListOfLayouts);
2353 
2354 	fail_unless(pListOfLayouts.size()==1);
2355 
2356 	Layout* l=(Layout*)pListOfLayouts.get(0);
2357 
2358 	fail_unless(l!=NULL);
2359 
2360 	Dimensions* dimensions=l->getDimensions();
2361 	fail_unless(dimensions->getWidth()==200.0);
2362 	fail_unless(dimensions->getHeight()==400.0);
2363 	fail_unless(dimensions->getDepth()==0.0);
2364 
2365 	fail_unless(l->getId()=="layout_1");
2366 
2367 	fail_unless(l->getNumReactionGlyphs()==1);
2368 	ReactionGlyph* rg=l->getReactionGlyph(0);
2369 	fail_unless(rg->getId()=="reactionGlyph_1");
2370 	fail_unless(!rg->isSetReactionId());
2371 
2372 	fail_unless(rg->isSetCurve());
2373 	Curve* curve=rg->getCurve();
2374 	fail_unless(curve->getNumCurveSegments()==1);
2375 	LineSegment* ls=curve->getCurveSegment(0);
2376 	fail_unless(ls->getTypeCode()!=SBML_LAYOUT_CUBICBEZIER);
2377 	Point* start=ls->getStart();
2378 	fail_unless(start->getXOffset()==10.0);
2379 	fail_unless(start->getYOffset()==15.0);
2380 	fail_unless(start->getZOffset()==0.0);
2381 	Point* end=ls->getEnd();
2382 	fail_unless(end->getXOffset()==20.0);
2383 	fail_unless(end->getYOffset()==30.0);
2384 	fail_unless(end->getZOffset()==0.0);
2385 	fail_unless(curve->isSetNotes()==true);
2386 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
2387 	XMLNode notes=XMLNode(*stream2);
2388 	fail_unless(curve->getNotes()->equals(notes, true));
2389 
2390 	delete stream;
2391 	delete stream2;
2392 
2393 }
2394 END_TEST
2395 
START_TEST(test_LayoutCreation_Curve_annotation)2396 START_TEST (test_LayoutCreation_Curve_annotation)
2397 {
2398 	const char* a =
2399   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2400   "<annotation>\n"
2401   "          <this-is-a-test>\n"
2402   "            <another-level> level2 </another-level>\n"
2403   "          </this-is-a-test>\n"
2404   "        </annotation>";
2405 
2406 	const char* content=
2407   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2408   "<annotation>\n"
2409   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2410   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
2411   "    <dimensions width=\"200\" height=\"400\"/>\n"
2412   "    <listOfReactionGlyphs>\n"
2413   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2414   "        <curve>\n"
2415   "          <annotation>\n"
2416   "            <this-is-a-test>\n"
2417   "              <another-level> level2 </another-level>\n"
2418   "            </this-is-a-test>\n"
2419   "          </annotation>\n"
2420   "          <listOfCurveSegments>\n"
2421   "            <curveSegment xsi:type=\"LineSegment\">\n"
2422   "              <start x=\"10\" y=\"15\"/>\n"
2423   "              <end x=\"20\" y=\"30\"/>\n"
2424   "            </curveSegment>\n"
2425   "          </listOfCurveSegments>\n"
2426   "        </curve>\n"
2427   "      </reactionGlyph>\n"
2428   "    </listOfReactionGlyphs>\n"
2429   "  </layout>\n"
2430   "</listOfLayouts>\n"
2431   "</annotation>\n"
2432   ;
2433 
2434 
2435 	XMLInputStream *stream=new XMLInputStream(content,false);
2436 	XMLNode node=XMLNode(*stream);
2437 	ListOfLayouts pListOfLayouts;
2438 	parseLayoutAnnotation(&node,pListOfLayouts);
2439 
2440 	fail_unless(pListOfLayouts.size()==1);
2441 
2442 	Layout* l=(Layout*)pListOfLayouts.get(0);
2443 
2444 	fail_unless(l!=NULL);
2445 
2446 	Dimensions* dimensions=l->getDimensions();
2447 	fail_unless(dimensions->getWidth()==200.0);
2448 	fail_unless(dimensions->getHeight()==400.0);
2449 	fail_unless(dimensions->getDepth()==0.0);
2450 
2451 	fail_unless(l->getId()=="layout_1");
2452 
2453 	fail_unless(l->getNumReactionGlyphs()==1);
2454 	ReactionGlyph* rg=l->getReactionGlyph(0);
2455 	fail_unless(rg->getId()=="reactionGlyph_1");
2456 	fail_unless(!rg->isSetReactionId());
2457 
2458 	fail_unless(rg->isSetCurve());
2459 	Curve* curve=rg->getCurve();
2460 	fail_unless(curve->getNumCurveSegments()==1);
2461 	LineSegment* ls=curve->getCurveSegment(0);
2462 	fail_unless(ls->getTypeCode()!=SBML_LAYOUT_CUBICBEZIER);
2463 	Point* start=ls->getStart();
2464 	fail_unless(start->getXOffset()==10.0);
2465 	fail_unless(start->getYOffset()==15.0);
2466 	Point* end=ls->getEnd();
2467 	fail_unless(end->getXOffset()==20.0);
2468 	fail_unless(end->getYOffset()==30.0);
2469 
2470 	fail_unless(curve->isSetAnnotation());
2471 	XMLInputStream *stream2 = new XMLInputStream(a,false);
2472 	XMLNode aNode=XMLNode(*stream2);
2473 	fail_unless(curve->getAnnotation()->equals(aNode, true));
2474 
2475 	delete stream2;
2476 	delete stream;
2477 }
2478 END_TEST
2479 
START_TEST(test_LayoutCreation_Curve_skipOptional)2480 START_TEST (test_LayoutCreation_Curve_skipOptional)
2481 {
2482 	const char* content=
2483   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2484   "<annotation>\n"
2485   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2486   "  <layout id=\"layout_1\">\n"
2487   "    <dimensions width=\"200\" height=\"400\"/>\n"
2488   "    <listOfReactionGlyphs>\n"
2489   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2490   "        <curve>\n"
2491   "        </curve>\n"
2492   "      </reactionGlyph>\n"
2493   "    </listOfReactionGlyphs>\n"
2494   "  </layout>\n"
2495   "</listOfLayouts>\n"
2496   "</annotation>\n"
2497   ;
2498 
2499 
2500 	XMLInputStream *stream=new XMLInputStream(content,false);
2501 	XMLNode node=XMLNode(*stream);
2502 	ListOfLayouts pListOfLayouts;
2503 	parseLayoutAnnotation(&node,pListOfLayouts);
2504 
2505 	fail_unless(pListOfLayouts.size()==1);
2506 
2507 	Layout* l=(Layout*)pListOfLayouts.get(0);
2508 
2509 	fail_unless(l!=NULL);
2510 
2511 	Dimensions* dimensions=l->getDimensions();
2512 	fail_unless(dimensions->getWidth()==200.0);
2513 	fail_unless(dimensions->getHeight()==400.0);
2514 	fail_unless(dimensions->getDepth()==0.0);
2515 
2516 	fail_unless(l->getId()=="layout_1");
2517 
2518 	fail_unless(l->getNumReactionGlyphs()==1);
2519 	ReactionGlyph* rg=l->getReactionGlyph(0);
2520 	fail_unless(rg->getId()=="reactionGlyph_1");
2521 	fail_unless(!rg->isSetReactionId());
2522 
2523 	fail_unless(!rg->isSetCurve());
2524 	delete stream;
2525 }
2526 END_TEST
2527 
START_TEST(test_LayoutCreation_LineSegment)2528 START_TEST (test_LayoutCreation_LineSegment)
2529 {
2530 	const char* content=
2531   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2532   "<annotation>\n"
2533   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2534   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
2535   "    <dimensions width=\"200\" height=\"400\"/>\n"
2536   "    <listOfReactionGlyphs>\n"
2537   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2538   "        <curve>\n"
2539   "          <listOfCurveSegments>\n"
2540   "            <curveSegment xsi:type=\"LineSegment\">\n"
2541   "              <start x=\"10\" y=\"15\"/>\n"
2542   "              <end x=\"20\" y=\"30\"/>\n"
2543   "            </curveSegment>\n"
2544   "          </listOfCurveSegments>\n"
2545   "        </curve>\n"
2546   "      </reactionGlyph>\n"
2547   "    </listOfReactionGlyphs>\n"
2548   "  </layout>\n"
2549   "</listOfLayouts>\n"
2550   "</annotation>\n"
2551   ;
2552 
2553 
2554 	XMLInputStream *stream=new XMLInputStream(content,false);
2555 	XMLNode node=XMLNode(*stream);
2556 	ListOfLayouts pListOfLayouts;
2557 	parseLayoutAnnotation(&node,pListOfLayouts);
2558 
2559 	fail_unless(pListOfLayouts.size()==1);
2560 
2561 	Layout* l=(Layout*)pListOfLayouts.get(0);
2562 
2563 	fail_unless(l!=NULL);
2564 
2565 	Dimensions* dimensions=l->getDimensions();
2566 	fail_unless(dimensions->getWidth()==200.0);
2567 	fail_unless(dimensions->getHeight()==400.0);
2568 	fail_unless(dimensions->getDepth()==0.0);
2569 
2570 	fail_unless(l->getId()=="layout_1");
2571 
2572 	fail_unless(l->getNumReactionGlyphs()==1);
2573 	ReactionGlyph* rg=l->getReactionGlyph(0);
2574 	fail_unless(rg->getId()=="reactionGlyph_1");
2575 	fail_unless(!rg->isSetReactionId());
2576 
2577 	fail_unless(rg->isSetCurve());
2578 	Curve* curve=rg->getCurve();
2579 	fail_unless(curve->getNumCurveSegments()==1);
2580 	LineSegment* ls=curve->getCurveSegment(0);
2581 	fail_unless(ls->getTypeCode()!=SBML_LAYOUT_CUBICBEZIER);
2582 	Point* start=ls->getStart();
2583 	fail_unless(start->getXOffset()==10.0);
2584 	fail_unless(start->getYOffset()==15.0);
2585 	Point* end=ls->getEnd();
2586 	fail_unless(end->getXOffset()==20.0);
2587 	fail_unless(end->getYOffset()==30.0);
2588 	delete stream;
2589 }
2590 END_TEST
2591 
START_TEST(test_LayoutCreation_LineSegment_notes)2592 START_TEST (test_LayoutCreation_LineSegment_notes)
2593 {
2594 	const char* content=
2595   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2596   "<annotation>\n"
2597   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2598   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
2599   "    <dimensions width=\"200\" height=\"400\"/>\n"
2600   "    <listOfReactionGlyphs>\n"
2601   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2602   "        <curve>\n"
2603   "          <listOfCurveSegments>\n"
2604   "            <curveSegment xsi:type=\"LineSegment\">\n"
2605   "              <notes>"
2606   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
2607   "   <p>Testnote</p>\n"
2608   "  </body>"
2609   "  </notes>\n"
2610   "                    <start x=\"10\" y=\"15\"/>\n"
2611   "              <end x=\"20\" y=\"30\"/>\n"
2612   "            </curveSegment>\n"
2613   "          </listOfCurveSegments>\n"
2614   "        </curve>\n"
2615   "      </reactionGlyph>\n"
2616   "    </listOfReactionGlyphs>\n"
2617   "  </layout>\n"
2618   "</listOfLayouts>\n"
2619   "</annotation>\n"
2620   ;
2621 
2622 
2623 	XMLInputStream *stream=new XMLInputStream(content,false);
2624 	XMLNode node=XMLNode(*stream);
2625 	ListOfLayouts pListOfLayouts;
2626 	parseLayoutAnnotation(&node,pListOfLayouts);
2627 
2628 	fail_unless(pListOfLayouts.size()==1);
2629 
2630 	Layout* l=(Layout*)pListOfLayouts.get(0);
2631 
2632 	fail_unless(l!=NULL);
2633 
2634 	Dimensions* dimensions=l->getDimensions();
2635 	fail_unless(dimensions->getWidth()==200.0);
2636 	fail_unless(dimensions->getHeight()==400.0);
2637 	fail_unless(dimensions->getDepth()==0.0);
2638 
2639 	fail_unless(l->getId()=="layout_1");
2640 
2641 	fail_unless(l->getNumReactionGlyphs()==1);
2642 	ReactionGlyph* rg=l->getReactionGlyph(0);
2643 	fail_unless(rg->getId()=="reactionGlyph_1");
2644 	fail_unless(!rg->isSetReactionId());
2645 
2646 	fail_unless(rg->isSetCurve());
2647 	Curve* curve=rg->getCurve();
2648 	fail_unless(curve->getNumCurveSegments()==1);
2649 	LineSegment* ls=curve->getCurveSegment(0);
2650 	fail_unless(ls->getTypeCode()!=SBML_LAYOUT_CUBICBEZIER);
2651 	Point* start=ls->getStart();
2652 	fail_unless(start->getXOffset()==10.0);
2653 	fail_unless(start->getYOffset()==15.0);
2654 	Point* end=ls->getEnd();
2655 	fail_unless(end->getXOffset()==20.0);
2656 	fail_unless(end->getYOffset()==30.0);
2657 	fail_unless(ls->isSetNotes());
2658 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
2659 	XMLNode notes=XMLNode(*stream2);
2660 	fail_unless(ls->getNotes()->equals(notes, true));
2661 	delete stream2;
2662 	delete stream;
2663 
2664 }
2665 END_TEST
2666 
START_TEST(test_LayoutCreation_LineSegment_annotation)2667 START_TEST (test_LayoutCreation_LineSegment_annotation)
2668 {
2669 	const char* a =
2670   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2671   "<annotation>\n"
2672   "              <this-is-a-test>\n"
2673   "                <another-level> level2 </another-level>\n"
2674   "              </this-is-a-test>\n"
2675   "            </annotation>";
2676 
2677 	const char* content=
2678   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2679   "<annotation>\n"
2680   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2681   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
2682   "    <dimensions width=\"200\" height=\"400\"/>\n"
2683   "    <listOfReactionGlyphs>\n"
2684   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2685   "        <curve>\n"
2686   "          <listOfCurveSegments>\n"
2687   "            <curveSegment xsi:type=\"LineSegment\">\n"
2688   "              <annotation>\n"
2689   "                <this-is-a-test>\n"
2690   "                  <another-level> level2 </another-level>\n"
2691   "                </this-is-a-test>\n"
2692   "              </annotation>\n"
2693   "              <start x=\"10\" y=\"15\"/>\n"
2694   "              <end x=\"20\" y=\"30\"/>\n"
2695   "            </curveSegment>\n"
2696   "          </listOfCurveSegments>\n"
2697   "        </curve>\n"
2698   "      </reactionGlyph>\n"
2699   "    </listOfReactionGlyphs>\n"
2700   "  </layout>\n"
2701   "</listOfLayouts>\n"
2702   "</annotation>\n"
2703   ;
2704 
2705 
2706 	XMLInputStream *stream=new XMLInputStream(content,false);
2707 	XMLNode node=XMLNode(*stream);
2708 	ListOfLayouts pListOfLayouts;
2709 	parseLayoutAnnotation(&node,pListOfLayouts);
2710 
2711 	fail_unless(pListOfLayouts.size()==1);
2712 
2713 	Layout* l=(Layout*)pListOfLayouts.get(0);
2714 
2715 	fail_unless(l!=NULL);
2716 
2717 	Dimensions* dimensions=l->getDimensions();
2718 	fail_unless(dimensions->getWidth()==200.0);
2719 	fail_unless(dimensions->getHeight()==400.0);
2720 	fail_unless(dimensions->getDepth()==0.0);
2721 
2722 	fail_unless(l->getId()=="layout_1");
2723 
2724 	fail_unless(l->getNumReactionGlyphs()==1);
2725 	ReactionGlyph* rg=l->getReactionGlyph(0);
2726 	fail_unless(rg->getId()=="reactionGlyph_1");
2727 	fail_unless(!rg->isSetReactionId());
2728 
2729 	fail_unless(rg->isSetCurve());
2730 	Curve* curve=rg->getCurve();
2731 	fail_unless(curve->getNumCurveSegments()==1);
2732 	LineSegment* ls=curve->getCurveSegment(0);
2733 	fail_unless(ls->getTypeCode()!=SBML_LAYOUT_CUBICBEZIER);
2734 	Point* start=ls->getStart();
2735 	fail_unless(start->getXOffset()==10.0);
2736 	fail_unless(start->getYOffset()==15.0);
2737 	Point* end=ls->getEnd();
2738 	fail_unless(end->getXOffset()==20.0);
2739 	fail_unless(end->getYOffset()==30.0);
2740 
2741 	fail_unless(ls->isSetAnnotation());
2742 	XMLInputStream *stream2 = new XMLInputStream(a,false);
2743 	XMLNode aNode=XMLNode(*stream2);
2744 	fail_unless(ls->getAnnotation()->equals(aNode, true));
2745 	delete stream2;
2746 	delete stream;
2747 }
2748 END_TEST
2749 
START_TEST(test_LayoutCreation_CubicBezier)2750 START_TEST (test_LayoutCreation_CubicBezier)
2751 {
2752 	const char* content=
2753   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2754   "<annotation>\n"
2755   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2756   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
2757   "    <dimensions width=\"200\" height=\"400\"/>\n"
2758   "    <listOfReactionGlyphs>\n"
2759   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2760   "        <curve>\n"
2761   "          <listOfCurveSegments>\n"
2762   "            <curveSegment xsi:type=\"CubicBezier\">\n"
2763   "              <start x=\"10\" y=\"15\"/>\n"
2764   "              <end x=\"20\" y=\"30\"/>\n"
2765   "              <basePoint1 x=\"15\" y=\"5\"/>\n"
2766   "              <basePoint2 x=\"15\" y=\"17\"/>\n"
2767   "            </curveSegment>\n"
2768   "          </listOfCurveSegments>\n"
2769   "        </curve>\n"
2770   "      </reactionGlyph>\n"
2771   "    </listOfReactionGlyphs>\n"
2772   "  </layout>\n"
2773   "</listOfLayouts>\n"
2774   "</annotation>\n"
2775   ;
2776 
2777 
2778 	XMLInputStream *stream=new XMLInputStream(content,false);
2779 	XMLNode node=XMLNode(*stream);
2780 	ListOfLayouts pListOfLayouts;
2781 	parseLayoutAnnotation(&node,pListOfLayouts);
2782 
2783 	fail_unless(pListOfLayouts.size()==1);
2784 
2785 	Layout* l=(Layout*)pListOfLayouts.get(0);
2786 
2787 	fail_unless(l!=NULL);
2788 
2789 	Dimensions* dimensions=l->getDimensions();
2790 	fail_unless(dimensions->getWidth()==200.0);
2791 	fail_unless(dimensions->getHeight()==400.0);
2792 	fail_unless(dimensions->getDepth()==0.0);
2793 
2794 	fail_unless(l->getId()=="layout_1");
2795 
2796 	fail_unless(l->getNumReactionGlyphs()==1);
2797 	ReactionGlyph* rg=l->getReactionGlyph(0);
2798 	fail_unless(rg->getId()=="reactionGlyph_1");
2799 	fail_unless(!rg->isSetReactionId());
2800 
2801 	fail_unless(rg->isSetCurve());
2802 	Curve* curve=rg->getCurve();
2803 	fail_unless(curve->getNumCurveSegments()==1);
2804 	LineSegment* ls=curve->getCurveSegment(0);
2805 	CubicBezier* cb=static_cast< CubicBezier*>(ls);
2806 	fail_unless(cb!=NULL);
2807 	Point* start=cb->getStart();
2808 	fail_unless(start!=NULL);
2809 	fail_unless(start->getXOffset()==10.0);
2810 	fail_unless(start->getYOffset()==15.0);
2811 	fail_unless(start->getZOffset()==0.0);
2812 	Point* end=cb->getEnd();
2813 	fail_unless(end->getXOffset()==20.0);
2814 	fail_unless(end->getYOffset()==30.0);
2815 	fail_unless(end->getZOffset()==0.0);
2816 	Point* base1=cb->getBasePoint1();
2817 	fail_unless(base1->getXOffset()==15.0);
2818 	fail_unless(base1->getYOffset()==5.0);
2819 	fail_unless(base1->getZOffset()==0.0);
2820 	Point* base2=cb->getBasePoint2();
2821 	fail_unless(base2->getXOffset()==15.0);
2822 	fail_unless(base2->getYOffset()==17.0);
2823 	fail_unless(base2->getZOffset()==0.0);
2824 
2825 	delete stream;
2826 }
2827 END_TEST
2828 
START_TEST(test_LayoutCreation_CubicBezier_notes)2829 START_TEST (test_LayoutCreation_CubicBezier_notes)
2830 {
2831 	const char* content=
2832   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2833   "<annotation>\n"
2834   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2835   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
2836   "    <dimensions width=\"200\" height=\"400\"/>\n"
2837   "    <listOfReactionGlyphs>\n"
2838   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2839   "        <curve>\n"
2840   "          <listOfCurveSegments>\n"
2841   "            <curveSegment xsi:type=\"CubicBezier\">\n"
2842   "              <notes>"
2843   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
2844   "   <p>Testnote</p>\n"
2845   "  </body>"
2846   "  </notes>\n"
2847   "                    <start x=\"10\" y=\"15\"/>\n"
2848   "              <end x=\"20\" y=\"30\"/>\n"
2849   "              <basePoint1 x=\"15\" y=\"5\"/>\n"
2850   "              <basePoint2 x=\"16\" y=\"17\"/>\n"
2851   "            </curveSegment>\n"
2852   "          </listOfCurveSegments>\n"
2853   "        </curve>\n"
2854   "      </reactionGlyph>\n"
2855   "    </listOfReactionGlyphs>\n"
2856   "  </layout>\n"
2857   "</listOfLayouts>\n"
2858   "</annotation>\n"
2859   ;
2860 
2861 
2862 	XMLInputStream *stream=new XMLInputStream(content,false);
2863 	XMLNode node=XMLNode(*stream);
2864 	ListOfLayouts pListOfLayouts;
2865 	parseLayoutAnnotation(&node,pListOfLayouts);
2866 
2867 	fail_unless(pListOfLayouts.size()==1);
2868 
2869 	Layout* l=(Layout*)pListOfLayouts.get(0);
2870 
2871 	fail_unless(l!=NULL);
2872 
2873 	Dimensions* dimensions=l->getDimensions();
2874 	fail_unless(dimensions->getWidth()==200.0);
2875 	fail_unless(dimensions->getHeight()==400.0);
2876 	fail_unless(dimensions->getDepth()==0.0);
2877 
2878 	fail_unless(l->getId()=="layout_1");
2879 
2880 	fail_unless(l->getNumReactionGlyphs()==1);
2881 	ReactionGlyph* rg=l->getReactionGlyph(0);
2882 	fail_unless(rg->getId()=="reactionGlyph_1");
2883 	fail_unless(!rg->isSetReactionId());
2884 
2885 	fail_unless(rg->isSetCurve());
2886 	Curve* curve=rg->getCurve();
2887 	fail_unless(curve->getNumCurveSegments()==1);
2888 	LineSegment* ls=curve->getCurveSegment(0);
2889 	CubicBezier* cb=static_cast< CubicBezier*>(ls);
2890 	fail_unless(cb!=NULL);
2891 	Point* start=cb->getStart();
2892 	fail_unless(start->getXOffset()==10.0);
2893 	fail_unless(start->getYOffset()==15.0);
2894 	fail_unless(start->getZOffset()==0.0);
2895 	Point* end=cb->getEnd();
2896 	fail_unless(end->getXOffset()==20.0);
2897 	fail_unless(end->getYOffset()==30.0);
2898 	fail_unless(end->getZOffset()==0.0);
2899 	Point* base1=cb->getBasePoint1();
2900 	fail_unless(base1->getXOffset()==15.0);
2901 	fail_unless(base1->getYOffset()==5.0);
2902 	fail_unless(base1->getZOffset()==0.0);
2903 	Point* base2=cb->getBasePoint2();
2904 	fail_unless(base2->getXOffset()==16.0);
2905 	fail_unless(base2->getYOffset()==17.0);
2906 	fail_unless(base2->getZOffset()==0.0);
2907 	fail_unless(cb->isSetNotes());
2908 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
2909 	XMLNode notes=XMLNode(*stream2);
2910 	fail_unless(cb->getNotes()->equals(notes, true)==true);
2911 
2912 	delete stream2;
2913 	delete stream;
2914 }
2915 END_TEST
2916 
START_TEST(test_LayoutCreation_CubicBezier_annotation)2917 START_TEST (test_LayoutCreation_CubicBezier_annotation)
2918 {
2919 	const char* a =
2920   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2921   "<annotation>\n"
2922   "              <this-is-a-test>\n"
2923   "                <another-level> level2 </another-level>\n"
2924   "              </this-is-a-test>\n"
2925   "            </annotation>";
2926 
2927 	const char* content=
2928   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
2929   "<annotation>\n"
2930   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
2931   "  <layout id=\"layout_1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
2932   "    <dimensions width=\"200\" height=\"400\"/>\n"
2933   "    <listOfReactionGlyphs>\n"
2934   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
2935   "        <curve>\n"
2936   "          <listOfCurveSegments>\n"
2937   "            <curveSegment xsi:type=\"CubicBezier\">\n"
2938   "              <annotation>\n"
2939   "                <this-is-a-test>\n"
2940   "                  <another-level> level2 </another-level>\n"
2941   "                </this-is-a-test>\n"
2942   "              </annotation>\n"
2943   "              <start x=\"10\" y=\"15\"/>\n"
2944   "              <end x=\"20\" y=\"30\"/>\n"
2945   "              <basePoint1 x=\"15\" y=\"5\"/>\n"
2946   "              <basePoint2 x=\"16\" y=\"17\"/>\n"
2947   "            </curveSegment>\n"
2948   "          </listOfCurveSegments>\n"
2949   "        </curve>\n"
2950   "      </reactionGlyph>\n"
2951   "    </listOfReactionGlyphs>\n"
2952   "  </layout>\n"
2953   "</listOfLayouts>\n"
2954   "</annotation>\n"
2955   ;
2956 
2957 
2958 	XMLInputStream *stream=new XMLInputStream(content,false);
2959 	XMLNode node=XMLNode(*stream);
2960 	ListOfLayouts pListOfLayouts;
2961 	parseLayoutAnnotation(&node,pListOfLayouts);
2962 
2963 	fail_unless(pListOfLayouts.size()==1);
2964 
2965 	Layout* l=(Layout*)pListOfLayouts.get(0);
2966 
2967 	fail_unless(l!=NULL);
2968 
2969 	Dimensions* dimensions=l->getDimensions();
2970 	fail_unless(dimensions->getWidth()==200.0);
2971 	fail_unless(dimensions->getHeight()==400.0);
2972 	fail_unless(dimensions->getDepth()==0.0);
2973 
2974 	fail_unless(l->getId()=="layout_1");
2975 
2976 	fail_unless(l->getNumReactionGlyphs()==1);
2977 	ReactionGlyph* rg=l->getReactionGlyph(0);
2978 	fail_unless(rg->getId()=="reactionGlyph_1");
2979 	fail_unless(!rg->isSetReactionId());
2980 
2981 	fail_unless(rg->isSetCurve());
2982 	Curve* curve=rg->getCurve();
2983 	fail_unless(curve->getNumCurveSegments()==1);
2984 	LineSegment* ls=curve->getCurveSegment(0);
2985 	CubicBezier* cb=static_cast< CubicBezier*>(ls);
2986 	fail_unless(cb!=NULL);
2987 	Point* start=cb->getStart();
2988 	fail_unless(start->getXOffset()==10.0);
2989 	fail_unless(start->getYOffset()==15.0);
2990 	fail_unless(start->getZOffset()==0.0);
2991 	Point* end=cb->getEnd();
2992 	fail_unless(end->getXOffset()==20.0);
2993 	fail_unless(end->getYOffset()==30.0);
2994 	fail_unless(end->getZOffset()==0.0);
2995 	Point* base1=cb->getBasePoint1();
2996 	fail_unless(base1->getXOffset()==15.0);
2997 	fail_unless(base1->getYOffset()==5.0);
2998 	fail_unless(base1->getZOffset()==0.0);
2999 	Point* base2=cb->getBasePoint2();
3000 	fail_unless(base2->getXOffset()==16.0);
3001 	fail_unless(base2->getYOffset()==17.0);
3002 	fail_unless(base2->getZOffset()==0.0);
3003 
3004 	fail_unless(cb->isSetAnnotation());
3005 	XMLInputStream *stream2= new XMLInputStream(a,false);
3006 	XMLNode aNode=XMLNode(*stream2);
3007 	fail_unless(cb->getAnnotation()->equals(aNode, true)==true);
3008 	delete stream2;
3009 	delete stream;
3010 }
3011 END_TEST
3012 
START_TEST(test_LayoutCreation_Dimensions)3013 START_TEST (test_LayoutCreation_Dimensions)
3014 {
3015 	const char* content=
3016   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3017   "<annotation>\n"
3018   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
3019   "  <layout id=\"layout_1\">\n"
3020   "    <dimensions width=\"200.5\" height=\"400.5\" depth=\"455.2\"/>\n"
3021   "  </layout>\n"
3022   "</listOfLayouts>\n"
3023   "</annotation>\n"
3024   ;
3025 
3026 
3027 	XMLInputStream *stream=new XMLInputStream(content,false);
3028 	XMLNode node=XMLNode(*stream);
3029 	ListOfLayouts pListOfLayouts;
3030 	parseLayoutAnnotation(&node,pListOfLayouts);
3031 
3032 	fail_unless(pListOfLayouts.size()==1);
3033 
3034 	Layout* l=(Layout*)pListOfLayouts.get(0);
3035 
3036 	fail_unless(l!=NULL);
3037 
3038 	fail_unless(l->getId()=="layout_1");
3039 
3040 	Dimensions* dimensions=l->getDimensions();
3041 	fail_unless(dimensions->getWidth()==200.5);
3042 	fail_unless(dimensions->getHeight()==400.5);
3043 	fail_unless(dimensions->getDepth()==455.2);
3044 
3045 	delete stream;
3046 }
3047 END_TEST
3048 
START_TEST(test_LayoutCreation_Dimensions_notes)3049 START_TEST (test_LayoutCreation_Dimensions_notes)
3050 {
3051 	const char* content=
3052   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3053   "<annotation>\n"
3054   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
3055   "  <layout id=\"layout_1\">\n"
3056   "    <dimensions width=\"200.5\" height=\"400.5\" depth=\"455.2\">\n"
3057   "      <notes>"
3058   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
3059   "   <p>Testnote</p>\n"
3060   "  </body>"
3061   "  </notes>\n"
3062   "    </dimensions>\n"
3063   "  </layout>\n"
3064   "</listOfLayouts>\n"
3065   "</annotation>\n"
3066   ;
3067 
3068 
3069 
3070 	XMLInputStream *stream=new XMLInputStream(content,false);
3071 	XMLNode node=XMLNode(*stream);
3072 	ListOfLayouts pListOfLayouts;
3073 	parseLayoutAnnotation(&node,pListOfLayouts);
3074 
3075 	fail_unless(pListOfLayouts.size()==1);
3076 
3077 	Layout* l=(Layout*)pListOfLayouts.get(0);
3078 
3079 	fail_unless(l!=NULL);
3080 
3081 	fail_unless(l->getId()=="layout_1");
3082 
3083 	Dimensions* dimensions=l->getDimensions();
3084 	fail_unless(dimensions->getWidth()==200.5);
3085 	fail_unless(dimensions->getHeight()==400.5);
3086 	fail_unless(dimensions->getDepth()==455.2);
3087 	fail_unless(dimensions->isSetNotes());
3088 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
3089 	XMLNode notes=XMLNode(*stream2);
3090 	fail_unless(dimensions->getNotes()->equals(notes, true)==true);
3091 
3092 
3093 	delete stream2;
3094 	delete stream;
3095 
3096 }
3097 END_TEST
3098 
START_TEST(test_LayoutCreation_Dimensions_annotation)3099 START_TEST (test_LayoutCreation_Dimensions_annotation)
3100 {
3101 	const char* a =
3102   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3103   "<annotation>\n"
3104   "      <this-is-a-test>\n"
3105   "        <another-level> level2 </another-level>\n"
3106   "      </this-is-a-test>\n"
3107   "    </annotation>";
3108 
3109 	const char* content=
3110   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3111   "<annotation>\n"
3112   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
3113   "  <layout id=\"layout_1\">\n"
3114   "    <dimensions width=\"200.5\" height=\"400.5\" depth=\"455.2\">\n"
3115   "      <annotation>\n"
3116   "        <this-is-a-test>\n"
3117   "          <another-level> level2 </another-level>\n"
3118   "        </this-is-a-test>\n"
3119   "      </annotation>\n"
3120   "    </dimensions>\n"
3121   "  </layout>\n"
3122   "</listOfLayouts>\n"
3123   "</annotation>\n"
3124   ;
3125 
3126 
3127 
3128 	XMLInputStream *stream=new XMLInputStream(content,false);
3129 	XMLNode node=XMLNode(*stream);
3130 	ListOfLayouts pListOfLayouts;
3131 	parseLayoutAnnotation(&node,pListOfLayouts);
3132 
3133 	fail_unless(pListOfLayouts.size()==1);
3134 
3135 	Layout* l=(Layout*)pListOfLayouts.get(0);
3136 
3137 	fail_unless(l!=NULL);
3138 
3139 	fail_unless(l->getId()=="layout_1");
3140 
3141 	Dimensions* dimensions=l->getDimensions();
3142 	fail_unless(dimensions->getWidth()==200.5);
3143 	fail_unless(dimensions->getHeight()==400.5);
3144 	fail_unless(dimensions->getDepth()==455.2);
3145 
3146 	fail_unless(dimensions->isSetAnnotation());
3147 	XMLInputStream *stream2 = new XMLInputStream(a,false);
3148 	XMLNode aNode=XMLNode(*stream2);
3149 	fail_unless(dimensions->getAnnotation()->equals(aNode, true)==true);
3150 
3151 	delete stream2;
3152 	delete stream;
3153 
3154 
3155 }
3156 END_TEST
3157 
START_TEST(test_LayoutCreation_Dimensions_skipOptional)3158 START_TEST (test_LayoutCreation_Dimensions_skipOptional)
3159 {
3160 	const char* content=
3161   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3162   "<annotation>\n"
3163   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
3164   "  <layout id=\"layout_1\">\n"
3165   "    <dimensions width=\"200.5\" height=\"400.5\"/>\n"
3166   "  </layout>\n"
3167   "</listOfLayouts>\n"
3168   "</annotation>"
3169   ;
3170 
3171 
3172 
3173 	XMLInputStream *stream=new XMLInputStream(content,false);
3174 	XMLNode node=XMLNode(*stream);
3175 	ListOfLayouts pListOfLayouts;
3176 	parseLayoutAnnotation(&node,pListOfLayouts);
3177 
3178 	fail_unless(pListOfLayouts.size()==1);
3179 
3180 	Layout* l=(Layout*)pListOfLayouts.get(0);
3181 
3182 	fail_unless(l!=NULL);
3183 
3184 	fail_unless(l->getId()=="layout_1");
3185 
3186 	Dimensions* dimensions=l->getDimensions();
3187 	fail_unless(dimensions->getWidth()==200.5);
3188 	fail_unless(dimensions->getHeight()==400.5);
3189 	fail_unless(dimensions->getDepth()==0.0);
3190 
3191 
3192 	delete stream;
3193 
3194 }
3195 END_TEST
3196 
3197 
START_TEST(test_LayoutCreation_BoundingBox)3198 START_TEST (test_LayoutCreation_BoundingBox)
3199 {
3200 	const char* content=
3201   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3202   "<annotation>\n"
3203   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
3204   "  <layout id=\"layout_1\">\n"
3205   "    <dimensions width=\"200.5\" height=\"400.5\"/>\n"
3206   "    <listOfReactionGlyphs>\n"
3207   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
3208   "        <boundingBox id=\"boundingBox_1\">\n"
3209   "          <position x=\"10.3\" y=\"20\" z=\"30.23\"/>\n"
3210   "          <dimensions width=\"200.5\" height=\"400.5\" depth=\"100.2\"/>\n"
3211   "        </boundingBox>\n"
3212   "      </reactionGlyph>\n"
3213   "    </listOfReactionGlyphs>\n"
3214   "  </layout>\n"
3215   "</listOfLayouts>\n"
3216   "</annotation>\n"
3217   ;
3218 
3219 
3220 	XMLInputStream *stream=new XMLInputStream(content,false);
3221 	XMLNode node=XMLNode(*stream);
3222 	ListOfLayouts pListOfLayouts;
3223 	parseLayoutAnnotation(&node,pListOfLayouts);
3224 
3225 	fail_unless(pListOfLayouts.size()==1);
3226 
3227 	Layout* l=(Layout*)pListOfLayouts.get(0);
3228 
3229 	fail_unless(l!=NULL);
3230 
3231 	fail_unless(l->getId()=="layout_1");
3232 
3233 	Dimensions* dimensions=l->getDimensions();
3234 	fail_unless(dimensions->getWidth()==200.5);
3235 	fail_unless(dimensions->getHeight()==400.5);
3236 	fail_unless(dimensions->getDepth()==0.0);
3237 
3238 	fail_unless(l->getNumReactionGlyphs()==1);
3239 	ReactionGlyph* rg=l->getReactionGlyph(0);
3240 	fail_unless(rg->getId()=="reactionGlyph_1");
3241 	fail_unless(!rg->isSetReactionId());
3242 
3243 	BoundingBox* bb=rg->getBoundingBox();
3244 	fail_unless(bb->getId()=="boundingBox_1");
3245 
3246 	Point* position=bb->getPosition();
3247 	fail_unless(position->getXOffset()==10.3);
3248 	fail_unless(position->getYOffset()==20.0);
3249 	fail_unless(position->getZOffset()==30.23);
3250 	Dimensions* dimensions2=bb->getDimensions();
3251 	fail_unless(dimensions2->getWidth()==200.5);
3252 	fail_unless(dimensions2->getHeight()==400.5);
3253 	fail_unless(dimensions2->getDepth()==100.2);
3254 
3255 	delete stream;
3256 
3257 }
3258 END_TEST
3259 
START_TEST(test_LayoutCreation_BoundingBox_notes)3260 START_TEST (test_LayoutCreation_BoundingBox_notes)
3261 {
3262 	const char* content=
3263   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3264   "<annotation>\n"
3265   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
3266   "  <layout id=\"layout_1\">\n"
3267   "    <dimensions width=\"200.5\" height=\"400.5\"/>\n"
3268   "    <listOfReactionGlyphs>\n"
3269   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
3270   "        <boundingBox>\n"
3271   "          <notes>"
3272   "  <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
3273   "   <p>Testnote</p>\n"
3274   "  </body>"
3275   "  </notes>\n"
3276   "          <position x=\"10.3\" y=\"20\"/>\n"
3277   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
3278   "        </boundingBox>\n"
3279   "      </reactionGlyph>\n"
3280   "    </listOfReactionGlyphs>\n"
3281   "  </layout>\n"
3282   "</listOfLayouts>\n"
3283   "</annotation>\n"
3284   ;
3285 
3286 
3287 	XMLInputStream *stream=new XMLInputStream(content,false);
3288 	XMLNode node=XMLNode(*stream);
3289 	ListOfLayouts pListOfLayouts;
3290 	parseLayoutAnnotation(&node,pListOfLayouts);
3291 
3292 	fail_unless(pListOfLayouts.size()==1);
3293 
3294 	Layout* l=(Layout*)pListOfLayouts.get(0);
3295 
3296 	fail_unless(l!=NULL);
3297 
3298 	fail_unless(l->getId()=="layout_1");
3299 
3300 	Dimensions* dimensions=l->getDimensions();
3301 	fail_unless(dimensions->getWidth()==200.5);
3302 	fail_unless(dimensions->getHeight()==400.5);
3303 	fail_unless(dimensions->getDepth()==0.0);
3304 
3305 	fail_unless(l->getNumReactionGlyphs()==1);
3306 	ReactionGlyph* rg=l->getReactionGlyph(0);
3307 	fail_unless(rg->getId()=="reactionGlyph_1");
3308 	fail_unless(!rg->isSetReactionId());
3309 
3310 	BoundingBox* bb=rg->getBoundingBox();
3311 	Point* position=bb->getPosition();
3312 	fail_unless(position->getXOffset()==10.3);
3313 	fail_unless(position->getYOffset()==20.0);
3314 	fail_unless(position->getZOffset()==0.0);
3315 	Dimensions* dimensions2=bb->getDimensions();
3316 	fail_unless(dimensions2->getWidth()==200.5);
3317 	fail_unless(dimensions2->getHeight()==400.5);
3318 	fail_unless(dimensions2->getDepth()==0.0);
3319 	fail_unless(bb->isSetNotes());
3320 	XMLInputStream *stream2 = new XMLInputStream(NOTES.c_str(),false);
3321 	XMLNode notes=XMLNode(*stream2);
3322 	fail_unless(bb->getNotes()->equals(notes, true)==true);
3323 
3324 	delete stream2;
3325 	delete stream;
3326 
3327 }
3328 END_TEST
3329 
START_TEST(test_LayoutCreation_BoundingBox_annotation)3330 START_TEST (test_LayoutCreation_BoundingBox_annotation)
3331 {
3332 	const char* a =
3333   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3334   "<annotation>\n"
3335   "          <this-is-a-test>\n"
3336   "            <another-level> level2 </another-level>\n"
3337   "          </this-is-a-test>\n"
3338   "        </annotation>";
3339 
3340 	const char* content=
3341   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3342   "<annotation>\n"
3343   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
3344   "  <layout id=\"layout_1\">\n"
3345   "    <dimensions width=\"200.5\" height=\"400.5\"/>\n"
3346   "    <listOfReactionGlyphs>\n"
3347   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
3348   "        <boundingBox>\n"
3349   "          <annotation>\n"
3350   "            <this-is-a-test>\n"
3351   "              <another-level> level2 </another-level>\n"
3352   "            </this-is-a-test>\n"
3353   "          </annotation>\n"
3354   "          <position x=\"10.3\" y=\"20\"/>\n"
3355   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
3356   "        </boundingBox>\n"
3357   "      </reactionGlyph>\n"
3358   "    </listOfReactionGlyphs>\n"
3359   "  </layout>\n"
3360   "</listOfLayouts>\n"
3361   "</annotation>\n"
3362   ;
3363 
3364 
3365 	XMLInputStream *stream=new XMLInputStream(content,false);
3366 	XMLNode node=XMLNode(*stream);
3367 	ListOfLayouts pListOfLayouts;
3368 	parseLayoutAnnotation(&node,pListOfLayouts);
3369 
3370 	fail_unless(pListOfLayouts.size()==1);
3371 
3372 	Layout* l=(Layout*)pListOfLayouts.get(0);
3373 
3374 	fail_unless(l!=NULL);
3375 
3376 	fail_unless(l->getId()=="layout_1");
3377 
3378 	Dimensions* dimensions=l->getDimensions();
3379 	fail_unless(dimensions->getWidth()==200.5);
3380 	fail_unless(dimensions->getHeight()==400.5);
3381 	fail_unless(dimensions->getDepth()==0.0);
3382 
3383 	fail_unless(l->getNumReactionGlyphs()==1);
3384 	ReactionGlyph* rg=l->getReactionGlyph(0);
3385 	fail_unless(rg->getId()=="reactionGlyph_1");
3386 	fail_unless(!rg->isSetReactionId());
3387 
3388 	BoundingBox* bb=rg->getBoundingBox();
3389 	Point* position=bb->getPosition();
3390 	fail_unless(position->getXOffset()==10.3);
3391 	fail_unless(position->getYOffset()==20.0);
3392 	fail_unless(position->getZOffset()==0.0);
3393 	Dimensions* dimensions2=bb->getDimensions();
3394 	fail_unless(dimensions2->getWidth()==200.5);
3395 	fail_unless(dimensions2->getHeight()==400.5);
3396 	fail_unless(dimensions2->getDepth()==0.0);
3397 
3398 	fail_unless(bb->isSetAnnotation());
3399 	XMLInputStream *stream2 = new XMLInputStream(a,false);
3400 	XMLNode aNode=XMLNode(*stream2);
3401 	fail_unless(bb->getAnnotation()->equals(aNode, true)==true);
3402 
3403 	delete stream2;
3404 	delete stream;
3405 
3406 }
3407 END_TEST
3408 
START_TEST(test_LayoutCreation_BoundingBox_skipOptional)3409 START_TEST (test_LayoutCreation_BoundingBox_skipOptional)
3410 {
3411 	const char* content=
3412   "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3413   "<annotation>\n"
3414   "<listOfLayouts xmlns=\"http://projects.eml.org/bcb/sbml/level2\">\n"
3415   "  <layout id=\"layout_1\"  >\n"
3416   "    <dimensions width=\"200.5\" height=\"400.5\"/>\n"
3417   "    <listOfReactionGlyphs>\n"
3418   "      <reactionGlyph id=\"reactionGlyph_1\">\n"
3419   "        <boundingBox>\n"
3420   "          <position x=\"10.3\" y=\"20\"/>\n"
3421   "          <dimensions width=\"200.5\" height=\"400.5\"/>\n"
3422   "        </boundingBox>\n"
3423   "      </reactionGlyph>\n"
3424   "    </listOfReactionGlyphs>\n"
3425   "  </layout>\n"
3426   "</listOfLayouts>\n"
3427   "</annotation>\n"
3428   ;
3429 
3430 
3431 	XMLInputStream *stream=new XMLInputStream(content,false);
3432 	XMLNode node=XMLNode(*stream);
3433 	ListOfLayouts pListOfLayouts;
3434 	parseLayoutAnnotation(&node,pListOfLayouts);
3435 
3436 	fail_unless(pListOfLayouts.size()==1);
3437 
3438 	Layout* l=(Layout*)pListOfLayouts.get(0);
3439 
3440 	fail_unless(l!=NULL);
3441 
3442 	fail_unless(l->getId()=="layout_1");
3443 
3444 	Dimensions* dimensions=l->getDimensions();
3445 	fail_unless(dimensions->getWidth()==200.5);
3446 	fail_unless(dimensions->getHeight()==400.5);
3447 	fail_unless(dimensions->getDepth()==0.0);
3448 
3449 	fail_unless(l->getNumReactionGlyphs()==1);
3450 	ReactionGlyph* rg=l->getReactionGlyph(0);
3451 	fail_unless(rg->getId()=="reactionGlyph_1");
3452 	fail_unless(!rg->isSetReactionId());
3453 
3454 	BoundingBox* bb=rg->getBoundingBox();
3455 	Point* position=bb->getPosition();
3456 	fail_unless(position->getXOffset()==10.3);
3457 	fail_unless(position->getYOffset()==20.0);
3458 	fail_unless(position->getZOffset()==0.0);
3459 	Dimensions* dimensions2=bb->getDimensions();
3460 	fail_unless(dimensions2->getWidth()==200.5);
3461 	fail_unless(dimensions2->getHeight()==400.5);
3462 	fail_unless(dimensions2->getDepth()==0.0);
3463 
3464 
3465 	delete stream;
3466 
3467 }
3468 END_TEST
3469 
3470 Suite *
create_suite_LayoutCreation(void)3471 create_suite_LayoutCreation (void)
3472 {
3473 	Suite *suite = suite_create("LayoutCreation");
3474 	TCase *tcase = tcase_create("LayoutCreation");
3475 
3476 	tcase_add_checked_fixture( tcase,
3477                             LayoutCreationTest_setup,
3478                             LayoutCreationTest_teardown );
3479 
3480 
3481 	tcase_add_test( tcase, test_LayoutCreation_Layout                            );
3482 	tcase_add_test( tcase, test_LayoutCreation_Layout_notes                      );
3483 	tcase_add_test( tcase, test_LayoutCreation_Layout_annotation                 );
3484 	tcase_add_test( tcase, test_LayoutCreation_Layout_skipOptional               );
3485 	tcase_add_test( tcase, test_LayoutCreation_CompartmentGlyph                  );
3486 	tcase_add_test( tcase, test_LayoutCreation_CompartmentGlyph_notes            );
3487 	tcase_add_test( tcase, test_LayoutCreation_CompartmentGlyph_annotation       );
3488 	tcase_add_test( tcase, test_LayoutCreation_CompartmentGlyph_skipOptional     );
3489 	tcase_add_test( tcase, test_LayoutCreation_SpeciesGlyph                      );
3490 	tcase_add_test( tcase, test_LayoutCreation_SpeciesGlyph_notes                );
3491 	tcase_add_test( tcase, test_LayoutCreation_SpeciesGlyph_annotation           );
3492 	tcase_add_test( tcase, test_LayoutCreation_SpeciesGlyph_skipOptional         );
3493 	tcase_add_test( tcase, test_LayoutCreation_ReactionGlyph_Curve               );
3494 	tcase_add_test( tcase, test_LayoutCreation_ReactionGlyph_BoundingBox         );
3495 	tcase_add_test( tcase, test_LayoutCreation_ReactionGlyph_notes               );
3496 	tcase_add_test( tcase, test_LayoutCreation_ReactionGlyph_annotation          );
3497 	tcase_add_test( tcase, test_LayoutCreation_ReactionGlyph_skipOptional        );
3498 	tcase_add_test( tcase, test_LayoutCreation_SpeciesReferenceGlyph_Curve       );
3499 	tcase_add_test( tcase, test_LayoutCreation_SpeciesReferenceGlyph_BoundingBox );
3500 	tcase_add_test( tcase, test_LayoutCreation_SpeciesReferenceGlyph_notes       );
3501 	tcase_add_test( tcase, test_LayoutCreation_SpeciesReferenceGlyph_annotation  );
3502 	tcase_add_test( tcase, test_LayoutCreation_SpeciesReferenceGlyph_skipOptional);
3503 	tcase_add_test( tcase, test_LayoutCreation_TextGlyph_text                    );
3504 	tcase_add_test( tcase, test_LayoutCreation_TextGlyph_notes                   );
3505 	tcase_add_test( tcase, test_LayoutCreation_TextGlyph_annotation              );
3506 	tcase_add_test( tcase, test_LayoutCreation_TextGlyph_originOfText            );
3507 	tcase_add_test( tcase, test_LayoutCreation_TextGlyph_skipOptional            );
3508 	tcase_add_test( tcase, test_LayoutCreation_GraphicalObject                   );
3509 	tcase_add_test( tcase, test_LayoutCreation_GraphicalObject_notes             );
3510 	tcase_add_test( tcase, test_LayoutCreation_GraphicalObject_annotation        );
3511 	tcase_add_test( tcase, test_LayoutCreation_Curve                             );
3512 	tcase_add_test( tcase, test_LayoutCreation_Curve_notes                       );
3513 	tcase_add_test( tcase, test_LayoutCreation_Curve_annotation                  );
3514 	tcase_add_test( tcase, test_LayoutCreation_Curve_skipOptional                );
3515 	tcase_add_test( tcase, test_LayoutCreation_LineSegment                       );
3516 	tcase_add_test( tcase, test_LayoutCreation_LineSegment_notes                 );
3517 	tcase_add_test( tcase, test_LayoutCreation_LineSegment_annotation            );
3518 	tcase_add_test( tcase, test_LayoutCreation_CubicBezier                       );
3519 	tcase_add_test( tcase, test_LayoutCreation_CubicBezier_notes                 );
3520 	tcase_add_test( tcase, test_LayoutCreation_CubicBezier_annotation            );
3521 	tcase_add_test( tcase, test_LayoutCreation_Dimensions                        );
3522 	tcase_add_test( tcase, test_LayoutCreation_Dimensions_notes                  );
3523 	tcase_add_test( tcase, test_LayoutCreation_Dimensions_annotation             );
3524 	tcase_add_test( tcase, test_LayoutCreation_Dimensions_skipOptional           );
3525 	tcase_add_test( tcase, test_LayoutCreation_BoundingBox                       );
3526 	tcase_add_test( tcase, test_LayoutCreation_BoundingBox_notes                 );
3527 	tcase_add_test( tcase, test_LayoutCreation_BoundingBox_annotation            );
3528 	tcase_add_test( tcase, test_LayoutCreation_BoundingBox_skipOptional          );
3529 	suite_add_tcase(suite, tcase);
3530 
3531 	return suite;
3532 }
3533 
3534 
3535 
3536 
3537 END_C_DECLS
3538