1 /**
2 * \file TestSBMLConvertFromL3V2.c
3 * \brief SBMLConvert unit tests for strict conversion from L3V2
4 * \author Sarah Keating
5 *
6 * <!--------------------------------------------------------------------------
7 * This file is part of libSBML. Please visit http://sbml.org for more
8 * information about SBML, and the latest version of libSBML.
9 *
10 * Copyright (C) 2020 jointly by the following organizations:
11 * 1. California Institute of Technology, Pasadena, CA, USA
12 * 2. University of Heidelberg, Heidelberg, Germany
13 * 3. University College London, London, UK
14 *
15 * Copyright (C) 2019 jointly by the following organizations:
16 * 1. California Institute of Technology, Pasadena, CA, USA
17 * 2. University of Heidelberg, Heidelberg, Germany
18 *
19 * Copyright (C) 2013-2018 jointly by the following organizations:
20 * 1. California Institute of Technology, Pasadena, CA, USA
21 * 2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
22 * 3. University of Heidelberg, Heidelberg, Germany
23 *
24 * Copyright (C) 2009-2013 jointly by the following organizations:
25 * 1. California Institute of Technology, Pasadena, CA, USA
26 * 2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
27 *
28 * Copyright (C) 2006-2008 by the California Institute of Technology,
29 * Pasadena, CA, USA
30 *
31 * Copyright (C) 2002-2005 jointly by the following organizations:
32 * 1. California Institute of Technology, Pasadena, CA, USA
33 * 2. Japan Science and Technology Agency, Japan
34 *
35 * This library is free software; you can redistribute it and/or modify it
36 * under the terms of the GNU Lesser General Public License as published by
37 * the Free Software Foundation. A copy of the license agreement is provided
38 * in the file named "LICENSE.txt" included with this software distribution
39 * and also available online as http://sbml.org/software/libsbml/license.html
40 * ---------------------------------------------------------------------- -->*/
41
42 #include <sbml/common/common.h>
43 #include <sbml/SBMLDocument.h>
44 #include <sbml/SBMLTypes.h>
45
46 #include <check.h>
47
48
49
50 #include <sbml/common/extern.h>
51
52 LIBSBML_CPP_NAMESPACE_USE
53
54
55 BEGIN_C_DECLS
56
57 extern char *TestDataDirectory;
58
59 static bool
equals(const char * expected,const char * actual)60 equals (const char* expected, const char* actual)
61 {
62 if ( !strcmp(expected, actual) ) return true;
63
64 printf( "\nStrings are not equal:\n" );
65 printf( "Expected:\n[%s]\n", expected );
66 printf( "Actual:\n[%s]\n" , actual );
67
68 return false;
69 }
70
START_TEST(test_SBMLConvertFromL3V2_convertMissingTrigger_strict)71 START_TEST (test_SBMLConvertFromL3V2_convertMissingTrigger_strict)
72 {
73 // add a dummy trigger that never fires
74 SBMLDocument * doc = new SBMLDocument(3, 2);
75 Model * m = doc->createModel();
76 Parameter * p = m->createParameter();
77 p->setId("p");
78 p->setConstant(false);
79 Event *e = m->createEvent();
80 e->setUseValuesFromTriggerTime(true);
81 EventAssignment *ea = e->createEventAssignment();
82 ea->setVariable("p");
83 std::string math = "2";
84 ASTNode* node = SBML_parseL3Formula(math.c_str());
85 ea->setMath(node);
86 delete node;
87
88 fail_unless(doc->getLevel() == 3);
89 fail_unless(doc->getVersion() == 2);
90 fail_unless(e->getLevel() == 3);
91 fail_unless(e->getVersion() == 2);
92 fail_unless(e->isSetTrigger() == false);
93
94 bool done = doc->setLevelAndVersion(3, 1, true);
95
96 fail_unless(done == true);
97
98 fail_unless(doc->getErrorLog()->contains(MissingTriggerElementNotSupported) == true);
99
100 fail_unless(doc->getLevel() == 3);
101 fail_unless(doc->getVersion() == 1);
102 fail_unless(doc->getModel()->getEvent(0)->getLevel() == 3);
103 fail_unless(doc->getModel()->getEvent(0)->getVersion() == 1);
104 fail_unless(doc->getModel()->getEvent(0)->isSetTrigger() == true);
105 fail_unless(doc->getModel()->getEvent(0)->getTrigger()->isSetMath() == true);
106
107 const ASTNode * node1 = doc->getModel()->getEvent(0)->getTrigger()->getMath();
108 char * str = SBML_formulaToL3String(node1);
109
110 fail_unless(!strcmp(str, "false"));
111 safe_free(str);
112 delete doc;
113 }
114 END_TEST
115
116
START_TEST(test_SBMLConvertFromL3V2_convertMissingTriggerMath_strict)117 START_TEST (test_SBMLConvertFromL3V2_convertMissingTriggerMath_strict)
118 {
119 // add math to the trigger that never fires
120 SBMLDocument * doc = new SBMLDocument(3, 2);
121 Model * m = doc->createModel();
122 Parameter * p = m->createParameter();
123 p->setId("p");
124 p->setConstant(false);
125 Event *e = m->createEvent();
126 e->setUseValuesFromTriggerTime(true);
127 Trigger *t = e->createTrigger();
128 t->setPersistent(false);
129 t->setInitialValue(false);
130 EventAssignment *ea = e->createEventAssignment();
131 ea->setVariable("p");
132 std::string math = "2";
133 ASTNode* node = SBML_parseL3Formula(math.c_str());
134 ea->setMath(node);
135 delete node;
136
137 fail_unless(doc->getLevel() == 3);
138 fail_unless(doc->getVersion() == 2);
139 fail_unless(e->getLevel() == 3);
140 fail_unless(e->getVersion() == 2);
141 fail_unless(e->isSetTrigger() == true);
142 fail_unless(e->getTrigger()->isSetMath() == false);
143
144 bool done = doc->setLevelAndVersion(3, 1, true);
145
146 fail_unless(done == true);
147
148 fail_unless(doc->getErrorLog()->contains(MissingMathElementNotSupported) == true);
149
150 fail_unless(doc->getLevel() == 3);
151 fail_unless(doc->getVersion() == 1);
152 fail_unless(doc->getModel()->getEvent(0)->getLevel() == 3);
153 fail_unless(doc->getModel()->getEvent(0)->getVersion() == 1);
154
155 fail_unless(doc->getModel()->getEvent(0)->isSetTrigger() == true);
156 fail_unless(doc->getModel()->getEvent(0)->getTrigger()->isSetMath() == true);
157
158 const ASTNode * node1 = doc->getModel()->getEvent(0)->getTrigger()->getMath();
159 char * str = SBML_formulaToL3String(node1);
160
161 fail_unless(!strcmp(str, "false"));
162 safe_free(str);
163 delete doc;
164 }
165 END_TEST
166
167
START_TEST(test_SBMLConvertFromL3V2_convertMissingTrigger_nonstrict)168 START_TEST (test_SBMLConvertFromL3V2_convertMissingTrigger_nonstrict)
169 {
170 // add a dummy trigger that never fires
171 SBMLDocument * doc = new SBMLDocument(3, 2);
172 Model * m = doc->createModel();
173 Parameter * p = m->createParameter();
174 p->setId("p");
175 p->setConstant(false);
176 Event *e = m->createEvent();
177 e->setUseValuesFromTriggerTime(true);
178 EventAssignment *ea = e->createEventAssignment();
179 ea->setVariable("p");
180 std::string math = "2";
181 ASTNode* node = SBML_parseL3Formula(math.c_str());
182 ea->setMath(node);
183 delete node;
184
185 fail_unless(doc->getLevel() == 3);
186 fail_unless(doc->getVersion() == 2);
187 fail_unless(e->getLevel() == 3);
188 fail_unless(e->getVersion() == 2);
189 fail_unless(e->isSetTrigger() == false);
190
191 bool done = doc->setLevelAndVersion(3, 1, false);
192
193 fail_unless(done == true);
194
195 fail_unless(doc->getErrorLog()->contains(MissingTriggerElementNotSupported) == true);
196
197 fail_unless(doc->getLevel() == 3);
198 fail_unless(doc->getVersion() == 1);
199 fail_unless(doc->getModel()->getEvent(0)->getLevel() == 3);
200 fail_unless(doc->getModel()->getEvent(0)->getVersion() == 1);
201
202 fail_unless(doc->getModel()->getEvent(0)->isSetTrigger() == true);
203 fail_unless(doc->getModel()->getEvent(0)->getTrigger()->isSetMath() == true);
204
205 const ASTNode * node1 = doc->getModel()->getEvent(0)->getTrigger()->getMath();
206 char * str = SBML_formulaToL3String(node1);
207
208 fail_unless(!strcmp(str, "false"));
209 safe_free(str);
210 delete doc;
211 }
212 END_TEST
213
214
START_TEST(test_SBMLConvertFromL3V2_convertMissingTriggerMath_nonstrict)215 START_TEST (test_SBMLConvertFromL3V2_convertMissingTriggerMath_nonstrict)
216 {
217 // add math to the trigger that never fires
218 SBMLDocument * doc = new SBMLDocument(3, 2);
219 Model * m = doc->createModel();
220 Parameter * p = m->createParameter();
221 p->setId("p");
222 p->setConstant(false);
223 Event *e = m->createEvent();
224 e->setUseValuesFromTriggerTime(true);
225 Trigger *t = e->createTrigger();
226 t->setPersistent(false);
227 t->setInitialValue(false);
228 EventAssignment *ea = e->createEventAssignment();
229 ea->setVariable("p");
230 std::string math = "2";
231 ASTNode* node = SBML_parseL3Formula(math.c_str());
232 ea->setMath(node);
233 delete node;
234
235 fail_unless(doc->getLevel() == 3);
236 fail_unless(doc->getVersion() == 2);
237 fail_unless(e->getLevel() == 3);
238 fail_unless(e->getVersion() == 2);
239 fail_unless(e->isSetTrigger() == true);
240 fail_unless(e->getTrigger()->isSetMath() == false);
241
242 bool done = doc->setLevelAndVersion(3, 1, false);
243
244 fail_unless(done == true);
245
246 fail_unless(doc->getErrorLog()->contains(MissingMathElementNotSupported) == true);
247
248 fail_unless(doc->getLevel() == 3);
249 fail_unless(doc->getVersion() == 1);
250 fail_unless(doc->getModel()->getEvent(0)->getLevel() == 3);
251 fail_unless(doc->getModel()->getEvent(0)->getVersion() == 1);
252
253 fail_unless(doc->getModel()->getEvent(0)->isSetTrigger() == true);
254 fail_unless(doc->getModel()->getEvent(0)->getTrigger()->isSetMath() == true);
255
256 const ASTNode * node1 = doc->getModel()->getEvent(0)->getTrigger()->getMath();
257 char * str = SBML_formulaToL3String(node1);
258
259 fail_unless(!strcmp(str, "false"));
260 safe_free(str);
261 delete doc;
262 }
263 END_TEST
264
265
START_TEST(test_SBMLConvertFromL3V2_convertnewMath_strict)266 START_TEST (test_SBMLConvertFromL3V2_convertnewMath_strict)
267 {
268 // do not convert model with new math
269 SBMLDocument * doc = new SBMLDocument(3, 2);
270 Model * m = doc->createModel();
271 Parameter * p = m->createParameter();
272 p->setId("p");
273 p->setConstant(false);
274 AssignmentRule *ar = m->createAssignmentRule();
275 ar->setVariable("p");
276 std::string math = "min(2, 3)";
277 ASTNode* node = SBML_parseL3Formula(math.c_str());
278 ar->setMath(node);
279 delete node;
280
281 fail_unless(doc->getLevel() == 3);
282 fail_unless(doc->getVersion() == 2);
283 fail_unless(ar->getLevel() == 3);
284 fail_unless(ar->getVersion() == 2);
285
286 fail_unless(ar->isSetMath() == true);
287 fail_unless(ar->getMath()->usesL3V2MathConstructs() == true);
288
289 bool done = doc->setLevelAndVersion(2, 4, true);
290
291 fail_unless(done == false);
292
293 fail_unless(doc->getErrorLog()->contains(MathMLElementNotSupported) == true);
294
295 fail_unless(doc->getLevel() == 3);
296 fail_unless(doc->getVersion() == 2);
297 fail_unless(doc->getModel()->getRule(0)->getLevel() == 3);
298 fail_unless(doc->getModel()->getRule(0)->getVersion() == 2);
299
300 fail_unless(doc->getModel()->getRule(0)->isSetMath() == true);
301 fail_unless(doc->getModel()->getRule(0)->getMath()->usesL3V2MathConstructs() == true);
302
303 const ASTNode * node1 = doc->getModel()->getRule(0)->getMath();
304 char * str = SBML_formulaToL3String(node1);
305 fail_unless(!strcmp(str, "min(2, 3)"));
306 safe_free(str);
307 delete doc;
308 }
309 END_TEST
310
311
START_TEST(test_SBMLConvertFromL3V2_convertnewMath_nonstrict)312 START_TEST (test_SBMLConvertFromL3V2_convertnewMath_nonstrict)
313 {
314 // convert the model but leave invalid new math
315 SBMLDocument * doc = new SBMLDocument(3, 2);
316 Model * m = doc->createModel();
317 Parameter * p = m->createParameter();
318 p->setId("p");
319 p->setConstant(false);
320 AssignmentRule *ar = m->createAssignmentRule();
321 ar->setVariable("p");
322 std::string math = "min(2, 3)";
323 ASTNode* node = SBML_parseL3Formula(math.c_str());
324 ar->setMath(node);
325 delete node;
326
327 fail_unless(doc->getLevel() == 3);
328 fail_unless(doc->getVersion() == 2);
329 fail_unless(ar->getLevel() == 3);
330 fail_unless(ar->getVersion() == 2);
331
332 fail_unless(ar->isSetMath() == true);
333 fail_unless(ar->getMath()->usesL3V2MathConstructs() == true);
334
335 bool done = doc->setLevelAndVersion(2, 4, false);
336
337 fail_unless(done == true);
338
339 fail_unless(doc->getErrorLog()->contains(MathMLElementNotSupported) == true);
340
341 fail_unless(doc->getLevel() == 2);
342 fail_unless(doc->getVersion() == 4);
343 fail_unless(doc->getModel()->getRule(0)->getLevel() == 2);
344 fail_unless(doc->getModel()->getRule(0)->getVersion() == 4);
345
346 fail_unless(doc->getModel()->getRule(0)->isSetMath() == true);
347 fail_unless(doc->getModel()->getRule(0)->getMath()->usesL3V2MathConstructs() == true);
348
349 const ASTNode * node1 = doc->getModel()->getRule(0)->getMath();
350 char * str = SBML_formulaToL3String(node1);
351 fail_unless(!strcmp(str, "min(2, 3)"));
352 safe_free(str);
353 delete doc;
354 }
355 END_TEST
356
357
START_TEST(test_SBMLConvertFromL3V2_convertEmptyLO_strict)358 START_TEST (test_SBMLConvertFromL3V2_convertEmptyLO_strict)
359 {
360 // remove list of with no children
361 const char * expected =
362 "<model>\n"
363 " <listOfParameters>\n"
364 " <annotation>some annotation</annotation>\n"
365 " </listOfParameters>\n"
366 "</model>";
367
368 const char * expected1 =
369 "<model/>";
370
371 SBMLDocument * doc = new SBMLDocument(3, 2);
372 Model * m = doc->createModel();
373 ListOfParameters* lo = m->getListOfParameters();
374 lo->setAnnotation("some annotation");
375
376 fail_unless(doc->getLevel() == 3);
377 fail_unless(doc->getVersion() == 2);
378 fail_unless(lo->getLevel() == 3);
379 fail_unless(lo->getVersion() == 2);
380
381 fail_unless(lo->isSetAnnotation() == true);
382
383 char * sbml = m->toSBML();
384
385 fail_unless(equals(expected, sbml));
386
387 free(sbml);
388
389 bool done = doc->setLevelAndVersion(2, 4, true);
390
391 fail_unless(done == true);
392
393 fail_unless(doc->getErrorLog()->contains(EmptyListOfElementNotSupported) == true);
394
395 fail_unless(doc->getLevel() == 2);
396 fail_unless(doc->getVersion() == 4);
397 fail_unless(doc->getModel()->getListOfParameters()->getLevel() == 2);
398 fail_unless(doc->getModel()->getListOfParameters()->getVersion() == 4);
399
400 Model* m1 = doc->getModel();
401
402 sbml = m1->toSBML();
403
404 fail_unless(equals(expected1, sbml));
405
406 free(sbml);
407
408 delete doc;
409 }
410 END_TEST
411
412
START_TEST(test_SBMLConvertFromL3V2_convertEmptyLO_nonstrict)413 START_TEST (test_SBMLConvertFromL3V2_convertEmptyLO_nonstrict)
414 {
415 // remove list of with no children
416 const char * expected =
417 "<model>\n"
418 " <listOfParameters>\n"
419 " <annotation>some annotation</annotation>\n"
420 " </listOfParameters>\n"
421 "</model>";
422
423 const char * expected1 =
424 "<model/>";
425
426 SBMLDocument * doc = new SBMLDocument(3, 2);
427 Model * m = doc->createModel();
428 ListOfParameters* lo = m->getListOfParameters();
429 lo->setAnnotation("some annotation");
430
431 fail_unless(doc->getLevel() == 3);
432 fail_unless(doc->getVersion() == 2);
433 fail_unless(lo->getLevel() == 3);
434 fail_unless(lo->getVersion() == 2);
435
436 fail_unless(lo->isSetAnnotation() == true);
437
438 char * sbml = m->toSBML();
439
440 fail_unless(equals(expected, sbml));
441
442 free(sbml);
443
444 bool done = doc->setLevelAndVersion(2, 4, false);
445
446 fail_unless(done == true);
447
448 fail_unless(doc->getErrorLog()->contains(EmptyListOfElementNotSupported) == true);
449
450 fail_unless(doc->getLevel() == 2);
451 fail_unless(doc->getVersion() == 4);
452 fail_unless(doc->getModel()->getListOfParameters()->getLevel() == 2);
453 fail_unless(doc->getModel()->getListOfParameters()->getVersion() == 4);
454
455 Model* m1 = doc->getModel();
456
457 sbml = m1->toSBML();
458
459 fail_unless(equals(expected1, sbml));
460
461 free(sbml);
462
463 delete doc;
464 }
465 END_TEST
466
467
START_TEST(test_SBMLConvertFromL3V2_convertIAnewMath_strict)468 START_TEST (test_SBMLConvertFromL3V2_convertIAnewMath_strict)
469 {
470 // replace IA with new math by value
471 SBMLDocument * doc = new SBMLDocument(3, 2);
472 Model * m = doc->createModel();
473 Parameter * p = m->createParameter();
474 p->setId("p");
475 p->setConstant(false);
476 InitialAssignment *ar = m->createInitialAssignment();
477 ar->setSymbol("p");
478 std::string math = "min(2, 3)";
479 ASTNode* node = SBML_parseL3Formula(math.c_str());
480 ar->setMath(node);
481 delete node;
482
483 fail_unless(doc->getLevel() == 3);
484 fail_unless(doc->getVersion() == 2);
485 fail_unless(ar->getLevel() == 3);
486 fail_unless(ar->getVersion() == 2);
487
488 fail_unless(ar->isSetMath() == true);
489 fail_unless(ar->getMath()->usesL3V2MathConstructs() == true);
490 fail_unless(ar->getMath()->usesRateOf() == false);
491
492 fail_unless(m->getNumInitialAssignments() == 1);
493 fail_unless(p->isSetValue() == false);
494
495 bool done = doc->setLevelAndVersion(2, 4, true);
496
497 fail_unless(done == true);
498
499 fail_unless(doc->getErrorLog()->contains(ConvertibleMathInitialAssignment) == true);
500
501 fail_unless(doc->getLevel() == 2);
502 fail_unless(doc->getVersion() == 4);
503
504 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 2);
505 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 4);
506
507 fail_unless(m->getNumInitialAssignments() == 0);
508
509 fail_unless(doc->getModel()->getParameter(0)->isSetValue() == true);
510 fail_unless(util_isEqual(doc->getModel()->getParameter(0)->getValue(), 2.0));
511
512 delete doc;
513 }
514 END_TEST
515
516
START_TEST(test_SBMLConvertFromL3V2_convertIAnewMath_nonstrict)517 START_TEST (test_SBMLConvertFromL3V2_convertIAnewMath_nonstrict)
518 {
519 // replace IA with new math by value
520 SBMLDocument * doc = new SBMLDocument(3, 2);
521 Model * m = doc->createModel();
522 Parameter * p = m->createParameter();
523 p->setId("p");
524 p->setConstant(false);
525 InitialAssignment *ar = m->createInitialAssignment();
526 ar->setSymbol("p");
527 std::string math = "min(2, 3)";
528 ASTNode* node = SBML_parseL3Formula(math.c_str());
529 ar->setMath(node);
530 delete node;
531
532 fail_unless(doc->getLevel() == 3);
533 fail_unless(doc->getVersion() == 2);
534 fail_unless(ar->getLevel() == 3);
535 fail_unless(ar->getVersion() == 2);
536
537 fail_unless(ar->isSetMath() == true);
538 fail_unless(ar->getMath()->usesL3V2MathConstructs() == true);
539 fail_unless(ar->getMath()->usesRateOf() == false);
540
541 fail_unless(m->getNumInitialAssignments() == 1);
542 fail_unless(p->isSetValue() == false);
543
544 bool done = doc->setLevelAndVersion(2, 4, true);
545
546 fail_unless(done == true);
547
548 fail_unless(doc->getErrorLog()->contains(ConvertibleMathInitialAssignment) == true);
549
550 fail_unless(doc->getLevel() == 2);
551 fail_unless(doc->getVersion() == 4);
552
553 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 2);
554 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 4);
555
556 fail_unless(m->getNumInitialAssignments() == 0);
557
558 fail_unless(doc->getModel()->getParameter(0)->isSetValue() == true);
559 fail_unless(util_isEqual(doc->getModel()->getParameter(0)->getValue(), 2.0));
560
561 delete doc;
562 }
563 END_TEST
564
565
START_TEST(test_SBMLConvertFromL3V2_convertIAnewMath1_strict)566 START_TEST (test_SBMLConvertFromL3V2_convertIAnewMath1_strict)
567 {
568 // dont convert if IA has rateOf
569 SBMLDocument * doc = new SBMLDocument(3, 2);
570 Model * m = doc->createModel();
571 Parameter * p = m->createParameter();
572 p->setId("p");
573 p->setConstant(false);
574 Parameter * p1 = m->createParameter();
575 p1->setId("x");
576 p1->setConstant(true);
577 p1->setValue(1);
578 InitialAssignment *ar = m->createInitialAssignment();
579 ar->setSymbol("p");
580 std::string math = "rateOf(x)";
581 ASTNode* node = SBML_parseL3Formula(math.c_str());
582 ar->setMath(node);
583 delete node;
584
585 fail_unless(doc->getLevel() == 3);
586 fail_unless(doc->getVersion() == 2);
587 fail_unless(ar->getLevel() == 3);
588 fail_unless(ar->getVersion() == 2);
589
590 fail_unless(ar->isSetMath() == true);
591 fail_unless(ar->getMath()->usesL3V2MathConstructs() == true);
592 fail_unless(ar->getMath()->usesRateOf() == true);
593
594 fail_unless(m->getNumInitialAssignments() == 1);
595 fail_unless(p->isSetValue() == false);
596
597 bool done = doc->setLevelAndVersion(2, 4, true);
598
599 fail_unless(done == false);
600
601 fail_unless(doc->getErrorLog()->contains(MathMLElementNotSupported) == true);
602
603 fail_unless(doc->getLevel() == 3);
604 fail_unless(doc->getVersion() == 2);
605
606 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 3);
607 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 2);
608
609 fail_unless(m->getNumInitialAssignments() == 1);
610
611 fail_unless(doc->getModel()->getParameter(0)->isSetValue() == false);
612
613 delete doc;
614 }
615 END_TEST
616
617
START_TEST(test_SBMLConvertFromL3V2_convertIAnewMath1_nonstrict)618 START_TEST (test_SBMLConvertFromL3V2_convertIAnewMath1_nonstrict)
619 {
620 // convert the IA withh rateOf but leave invalid
621 SBMLDocument * doc = new SBMLDocument(3, 2);
622 Model * m = doc->createModel();
623 Parameter * p = m->createParameter();
624 p->setId("p");
625 p->setConstant(false);
626 Parameter * p1 = m->createParameter();
627 p1->setId("x");
628 p1->setConstant(true);
629 p1->setValue(1);
630 InitialAssignment *ar = m->createInitialAssignment();
631 ar->setSymbol("p");
632 std::string math = "rateOf(x)";
633 ASTNode* node = SBML_parseL3Formula(math.c_str());
634 ar->setMath(node);
635 delete node;
636
637 fail_unless(doc->getLevel() == 3);
638 fail_unless(doc->getVersion() == 2);
639 fail_unless(ar->getLevel() == 3);
640 fail_unless(ar->getVersion() == 2);
641
642 fail_unless(ar->isSetMath() == true);
643 fail_unless(ar->getMath()->usesL3V2MathConstructs() == true);
644 fail_unless(ar->getMath()->usesRateOf() == true);
645
646 fail_unless(m->getNumInitialAssignments() == 1);
647 fail_unless(p->isSetValue() == false);
648
649 bool done = doc->setLevelAndVersion(2, 4, false);
650
651 fail_unless(done == true);
652
653 fail_unless(doc->getErrorLog()->contains(MathMLElementNotSupported) == true);
654
655 fail_unless(doc->getLevel() == 2);
656 fail_unless(doc->getVersion() == 4);
657
658 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 2);
659 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 4);
660
661 fail_unless(m->getNumInitialAssignments() == 1);
662
663 fail_unless(doc->getModel()->getParameter(0)->isSetValue() == false);
664
665 const ASTNode * node1 = doc->getModel()->getInitialAssignment(0)->getMath();
666 char * str = SBML_formulaToL3String(node1);
667 fail_unless(!strcmp(str, "rateOf(x)"));
668 safe_free(str);
669 delete doc;
670 }
671 END_TEST
672
673
START_TEST(test_SBMLConvertFromL3V2_convertIA_strict)674 START_TEST (test_SBMLConvertFromL3V2_convertIA_strict)
675 {
676 // convert IA to IA
677 SBMLDocument * doc = new SBMLDocument(3, 2);
678 Model * m = doc->createModel();
679 Parameter * p = m->createParameter();
680 p->setId("p");
681 p->setConstant(false);
682 InitialAssignment *ar = m->createInitialAssignment();
683 ar->setSymbol("p");
684 std::string math = "2*3";
685 ASTNode* node = SBML_parseL3Formula(math.c_str());
686 ar->setMath(node);
687 delete node;
688
689 fail_unless(doc->getLevel() == 3);
690 fail_unless(doc->getVersion() == 2);
691 fail_unless(ar->getLevel() == 3);
692 fail_unless(ar->getVersion() == 2);
693
694 fail_unless(ar->isSetMath() == true);
695 fail_unless(ar->getMath()->usesL3V2MathConstructs() == false);
696
697 fail_unless(m->getNumInitialAssignments() == 1);
698 fail_unless(p->isSetValue() == false);
699
700 bool done = doc->setLevelAndVersion(2, 4, true);
701
702 fail_unless(done == true);
703
704 fail_unless(doc->getErrorLog()->contains(ConvertibleMathInitialAssignment) == false);
705
706 fail_unless(doc->getLevel() == 2);
707 fail_unless(doc->getVersion() == 4);
708
709 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 2);
710 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 4);
711
712 fail_unless(m->getNumInitialAssignments() == 1);
713 const ASTNode * node1 = doc->getModel()->getInitialAssignment(0)->getMath();
714 char * str = SBML_formulaToL3String(node1);
715 fail_unless(!strcmp(str, "2 * 3"));
716 safe_free(str);
717
718 fail_unless(doc->getModel()->getParameter(0)->isSetValue() == false);
719
720 delete doc;
721 }
722 END_TEST
723
724
START_TEST(test_SBMLConvertFromL3V2_convertIA_nonstrict)725 START_TEST (test_SBMLConvertFromL3V2_convertIA_nonstrict)
726 {
727 // convert IA to IA
728 SBMLDocument * doc = new SBMLDocument(3, 2);
729 Model * m = doc->createModel();
730 Parameter * p = m->createParameter();
731 p->setId("p");
732 p->setConstant(false);
733 InitialAssignment *ar = m->createInitialAssignment();
734 ar->setSymbol("p");
735 std::string math = "2*3";
736 ASTNode* node = SBML_parseL3Formula(math.c_str());
737 ar->setMath(node);
738 delete node;
739
740 fail_unless(doc->getLevel() == 3);
741 fail_unless(doc->getVersion() == 2);
742 fail_unless(ar->getLevel() == 3);
743 fail_unless(ar->getVersion() == 2);
744
745 fail_unless(ar->isSetMath() == true);
746 fail_unless(ar->getMath()->usesL3V2MathConstructs() == false);
747
748 fail_unless(m->getNumInitialAssignments() == 1);
749 fail_unless(p->isSetValue() == false);
750
751 bool done = doc->setLevelAndVersion(2, 4, false);
752
753 fail_unless(done == true);
754
755 fail_unless(doc->getErrorLog()->contains(ConvertibleMathInitialAssignment) == false);
756
757 fail_unless(doc->getLevel() == 2);
758 fail_unless(doc->getVersion() == 4);
759
760 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 2);
761 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 4);
762
763 fail_unless(m->getNumInitialAssignments() == 1);
764 const ASTNode * node1 = doc->getModel()->getInitialAssignment(0)->getMath();
765 char * str = SBML_formulaToL3String(node1);
766 fail_unless(!strcmp(str, "2 * 3"));
767 safe_free(str);
768
769 fail_unless(doc->getModel()->getParameter(0)->isSetValue() == false);
770
771 delete doc;
772 }
773 END_TEST
774
775
START_TEST(test_SBMLConvertFromL3V2_convertIAvalue_strict)776 START_TEST (test_SBMLConvertFromL3V2_convertIAvalue_strict)
777 {
778 // convert IA to value
779 SBMLDocument * doc = new SBMLDocument(3, 2);
780 Model * m = doc->createModel();
781 Parameter * p = m->createParameter();
782 p->setId("p");
783 p->setConstant(false);
784 InitialAssignment *ar = m->createInitialAssignment();
785 ar->setSymbol("p");
786 std::string math = "2 * 3";
787 ASTNode* node = SBML_parseL3Formula(math.c_str());
788 ar->setMath(node);
789 delete node;
790
791 fail_unless(doc->getLevel() == 3);
792 fail_unless(doc->getVersion() == 2);
793 fail_unless(ar->getLevel() == 3);
794 fail_unless(ar->getVersion() == 2);
795
796 fail_unless(ar->isSetMath() == true);
797 fail_unless(ar->getMath()->usesL3V2MathConstructs() == false);
798
799 fail_unless(m->getNumInitialAssignments() == 1);
800 fail_unless(p->isSetValue() == false);
801
802 bool done = doc->setLevelAndVersion(2, 1, true);
803
804 fail_unless(done == true);
805
806 fail_unless(doc->getErrorLog()->contains(ConvertibleMathInitialAssignment) == false);
807 fail_unless(doc->getErrorLog()->contains(MathMLElementNotSupported) == false);
808
809 fail_unless(doc->getLevel() == 2);
810 fail_unless(doc->getVersion() == 1);
811
812 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 2);
813 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 1);
814
815 fail_unless(m->getNumInitialAssignments() == 0);
816
817 fail_unless(doc->getModel()->getParameter(0)->isSetValue() == true);
818 fail_unless(util_isEqual(doc->getModel()->getParameter(0)->getValue(), 6.0));
819
820 delete doc;
821 }
822 END_TEST
823
824
START_TEST(test_SBMLConvertFromL3V2_convertIAvalue_nonstrict)825 START_TEST (test_SBMLConvertFromL3V2_convertIAvalue_nonstrict)
826 {
827 // convert IA to value
828 SBMLDocument * doc = new SBMLDocument(3, 2);
829 Model * m = doc->createModel();
830 Parameter * p = m->createParameter();
831 p->setId("p");
832 p->setConstant(false);
833 InitialAssignment *ar = m->createInitialAssignment();
834 ar->setSymbol("p");
835 std::string math = "2 * 3";
836 ASTNode* node = SBML_parseL3Formula(math.c_str());
837 ar->setMath(node);
838 delete node;
839
840 fail_unless(doc->getLevel() == 3);
841 fail_unless(doc->getVersion() == 2);
842 fail_unless(ar->getLevel() == 3);
843 fail_unless(ar->getVersion() == 2);
844
845 fail_unless(ar->isSetMath() == true);
846 fail_unless(ar->getMath()->usesL3V2MathConstructs() == false);
847
848 fail_unless(m->getNumInitialAssignments() == 1);
849 fail_unless(p->isSetValue() == false);
850
851 bool done = doc->setLevelAndVersion(2, 1, false);
852
853 fail_unless(done == true);
854
855 fail_unless(doc->getErrorLog()->contains(ConvertibleMathInitialAssignment) == false);
856 fail_unless(doc->getErrorLog()->contains(MathMLElementNotSupported) == false);
857
858 fail_unless(doc->getLevel() == 2);
859 fail_unless(doc->getVersion() == 1);
860
861 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 2);
862 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 1);
863
864 fail_unless(m->getNumInitialAssignments() == 0);
865
866 fail_unless(doc->getModel()->getParameter(0)->isSetValue() == true);
867 fail_unless(util_isEqual(doc->getModel()->getParameter(0)->getValue(), 6.0));
868
869 delete doc;
870 }
871 END_TEST
872
873
START_TEST(test_SBMLConvertFromL3V2_convertMissingEAMath_bug)874 START_TEST (test_SBMLConvertFromL3V2_convertMissingEAMath_bug)
875 {
876 /* // bug reported https://www.pivotaltracker.com/story/show/128923467 */
877 SBMLDocument * doc = new SBMLDocument(3, 2);
878 Model * m = doc->createModel();
879 Parameter * p = m->createParameter();
880 p->setId("p");
881 p->setConstant(false);
882 Event *e = m->createEvent();
883 e->setUseValuesFromTriggerTime(true);
884 Trigger *t = e->createTrigger();
885 t->setPersistent(false);
886 t->setInitialValue(false);
887 std::string math = "true";
888 ASTNode* node = SBML_parseL3Formula(math.c_str());
889 t->setMath(node);
890 delete node;
891 EventAssignment *ea = e->createEventAssignment();
892 ea->setVariable("p");
893
894 fail_unless(doc->getLevel() == 3);
895 fail_unless(doc->getVersion() == 2);
896 fail_unless(e->getLevel() == 3);
897 fail_unless(e->getVersion() == 2);
898 fail_unless(e->isSetTrigger() == true);
899 fail_unless(e->getTrigger()->isSetMath() == true);
900 fail_unless(e->getNumEventAssignments() == 1);
901 fail_unless(e->getEventAssignment(0)->isSetMath() == false);
902
903 bool done = doc->setLevelAndVersion(3, 1, true);
904
905 fail_unless(done == true);
906
907 fail_unless(doc->getErrorLog()->contains(MissingMathElementNotSupported) == true);
908
909 fail_unless(doc->getLevel() == 3);
910 fail_unless(doc->getVersion() == 1);
911 fail_unless(doc->getModel()->getEvent(0)->getLevel() == 3);
912 fail_unless(doc->getModel()->getEvent(0)->getVersion() == 1);
913
914 fail_unless(doc->getModel()->getEvent(0)->isSetTrigger() == true);
915 fail_unless(doc->getModel()->getEvent(0)->getTrigger()->isSetMath() == true);
916 fail_unless(e->getNumEventAssignments() == 0);
917
918 const ASTNode * node1 = doc->getModel()->getEvent(0)->getTrigger()->getMath();
919 char * str = SBML_formulaToL3String(node1);
920
921 fail_unless(!strcmp(str, "true"));
922 safe_free(str);
923 delete doc;
924 }
925 END_TEST
926
927
START_TEST(test_SBMLConvertFromL3V2_convertMissingMath_strict)928 START_TEST (test_SBMLConvertFromL3V2_convertMissingMath_strict)
929 {
930 // remove element with missing math
931 SBMLDocument * doc = new SBMLDocument(3, 2);
932 Model * m = doc->createModel();
933 Parameter * p = m->createParameter();
934 p->setId("p");
935 p->setConstant(false);
936 AssignmentRule *ar = m->createAssignmentRule();
937 ar->setVariable("p");
938
939 fail_unless(doc->getLevel() == 3);
940 fail_unless(doc->getVersion() == 2);
941 fail_unless(ar->getLevel() == 3);
942 fail_unless(ar->getVersion() == 2);
943
944 fail_unless(ar->isSetMath() == false);
945
946 fail_unless(m->getNumRules() == 1);
947
948 bool done = doc->setLevelAndVersion(3, 1, true);
949
950 fail_unless(done == true);
951
952 fail_unless(doc->getErrorLog()->contains(MissingMathElementNotSupported) == true);
953
954 fail_unless(doc->getLevel() == 3);
955 fail_unless(doc->getVersion() == 1);
956
957 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 3);
958 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 1);
959
960 fail_unless(m->getNumRules() == 0);
961
962 delete doc;
963 }
964 END_TEST
965
966
START_TEST(test_SBMLConvertFromL3V2_convertMissingMath_nonstrict)967 START_TEST (test_SBMLConvertFromL3V2_convertMissingMath_nonstrict)
968 {
969 // remove element with missing math
970 SBMLDocument * doc = new SBMLDocument(3, 2);
971 Model * m = doc->createModel();
972 Parameter * p = m->createParameter();
973 p->setId("p");
974 p->setConstant(false);
975 AssignmentRule *ar = m->createAssignmentRule();
976 ar->setVariable("p");
977
978 fail_unless(doc->getLevel() == 3);
979 fail_unless(doc->getVersion() == 2);
980 fail_unless(ar->getLevel() == 3);
981 fail_unless(ar->getVersion() == 2);
982
983 fail_unless(ar->isSetMath() == false);
984
985 fail_unless(m->getNumRules() == 1);
986
987 bool done = doc->setLevelAndVersion(3, 1, false);
988
989 fail_unless(done == true);
990
991 fail_unless(doc->getErrorLog()->contains(MissingMathElementNotSupported) == true);
992
993 fail_unless(doc->getLevel() == 3);
994 fail_unless(doc->getVersion() == 1);
995
996 fail_unless(doc->getModel()->getParameter(0)->getLevel() == 3);
997 fail_unless(doc->getModel()->getParameter(0)->getVersion() == 1);
998
999 fail_unless(m->getNumRules() == 1);
1000
1001 ar = doc->getModel()->getAssignmentRule("p");
1002 fail_unless(ar->isSetMath() == false);
1003 delete doc;
1004 }
1005 END_TEST
1006
1007
START_TEST(test_SBMLConvertFromL3V2_convertMissingReactantProducts_strict)1008 START_TEST (test_SBMLConvertFromL3V2_convertMissingReactantProducts_strict)
1009 {
1010 std::string filename(TestDataDirectory);
1011 filename += "l3v2-reaction-no-sr.xml";
1012 SBMLDocument * doc = readSBML(filename.c_str());
1013
1014 fail_unless(doc->getLevel() == 3);
1015 fail_unless(doc->getVersion() == 2);
1016 fail_unless(doc->getModel()->getNumReactions() == 1);
1017
1018 Reaction *r = doc->getModel()->getReaction(0);
1019 fail_unless(r != NULL);
1020
1021 fail_unless(r->getNumProducts() == 0);
1022 fail_unless(r->getNumReactants() == 0);
1023 fail_unless(r->getNumModifiers() == 0);
1024
1025 fail_unless(r->isSetKineticLaw() == true);
1026
1027 bool done = doc->setLevelAndVersion(3, 1, true);
1028
1029 fail_unless(done == false);
1030
1031 fail_unless(doc->getErrorLog()->contains(MissingParticipantsNotSupported) == true);
1032
1033 fail_unless(doc->getLevel() == 3);
1034 fail_unless(doc->getVersion() == 2);
1035 fail_unless(doc->getModel()->getNumReactions() == 1);
1036
1037 delete doc;
1038 }
1039 END_TEST
1040
1041
1042
START_TEST(test_SBMLConvertFromL3V2_convertMissingReactantProducts_nonstrict)1043 START_TEST (test_SBMLConvertFromL3V2_convertMissingReactantProducts_nonstrict)
1044 {
1045 std::string filename(TestDataDirectory);
1046 filename += "l3v2-reaction-no-sr.xml";
1047 SBMLDocument * doc = readSBML(filename.c_str());
1048
1049 fail_unless(doc->getLevel() == 3);
1050 fail_unless(doc->getVersion() == 2);
1051 fail_unless(doc->getModel()->getNumReactions() == 1);
1052
1053 Reaction *r = doc->getModel()->getReaction(0);
1054 fail_unless(r != NULL);
1055
1056 fail_unless(r->getNumProducts() == 0);
1057 fail_unless(r->getNumReactants() == 0);
1058 fail_unless(r->getNumModifiers() == 0);
1059
1060 fail_unless(r->isSetKineticLaw() == true);
1061
1062 bool done = doc->setLevelAndVersion(3, 1, false);
1063
1064 fail_unless(done == true);
1065
1066 fail_unless(doc->getErrorLog()->contains(MissingParticipantsNotSupported) == true);
1067
1068 fail_unless(doc->getLevel() == 3);
1069 fail_unless(doc->getVersion() == 1);
1070 fail_unless(doc->getModel()->getNumReactions() == 1);
1071
1072 r = doc->getModel()->getReaction(0);
1073 fail_unless(r != NULL);
1074
1075 fail_unless(r->getNumProducts() == 0);
1076 fail_unless(r->getNumReactants() == 0);
1077 fail_unless(r->getNumModifiers() == 0);
1078
1079 fail_unless(r->isSetKineticLaw() == true);
1080 delete doc;
1081 }
1082 END_TEST
1083
1084
START_TEST(test_SBMLConvertFromL3V2_convertMissingFast)1085 START_TEST (test_SBMLConvertFromL3V2_convertMissingFast)
1086 {
1087 std::string filename(TestDataDirectory);
1088 filename += "l3v2-reaction.xml";
1089 SBMLDocument * doc = readSBML(filename.c_str());
1090
1091 fail_unless(doc->getLevel() == 3);
1092 fail_unless(doc->getVersion() == 2);
1093 fail_unless(doc->getModel()->getNumReactions() == 1);
1094
1095 Reaction *r = doc->getModel()->getReaction(0);
1096 fail_unless(r != NULL);
1097
1098 fail_unless(r->isSetFast() == false);
1099
1100 bool done = doc->setLevelAndVersion(3, 1, true);
1101
1102 fail_unless(done == true);
1103
1104 fail_unless(doc->getLevel() == 3);
1105 fail_unless(doc->getVersion() == 1);
1106
1107 r = doc->getModel()->getReaction(0);
1108 fail_unless(r != NULL);
1109
1110 fail_unless(r->isSetFast() == true);
1111 fail_unless(r->getFast() == false);
1112
1113 delete doc;
1114 }
1115 END_TEST
1116
1117
START_TEST(test_SBMLConvertFromL3V2_convertMissingMathForStoich_strict)1118 START_TEST(test_SBMLConvertFromL3V2_convertMissingMathForStoich_strict)
1119 {
1120 std::string filename(TestDataDirectory);
1121 filename += "l3v2-stoich-math-missing.xml";
1122 SBMLDocument * doc = readSBML(filename.c_str());
1123 Model* m = doc->getModel();
1124 AssignmentRule* ar = (AssignmentRule*)(m->getRule(0));
1125 SpeciesReference *sr = m->getReaction(0)->getProduct(0);
1126
1127 fail_unless(doc->getLevel() == 3);
1128 fail_unless(doc->getVersion() == 2);
1129 fail_unless(ar->getLevel() == 3);
1130 fail_unless(ar->getVersion() == 2);
1131
1132 fail_unless(ar->isSetMath() == false);
1133
1134 fail_unless(m->getNumRules() == 1);
1135
1136 fail_unless(ar->getVariable() == sr->getId());
1137
1138 bool done = doc->setLevelAndVersion(2, 4, true);
1139
1140 fail_unless(done == true);
1141
1142 fail_unless(doc->getLevel() == 2);
1143 fail_unless(doc->getVersion() == 4);
1144
1145 m = doc->getModel();
1146
1147 // expect the rule to have gone and no stoichiometryMath
1148 fail_unless(m->getNumRules() == 0);
1149 sr = m->getReaction(0)->getProduct(0);
1150
1151 fail_unless(sr->isSetStoichiometryMath() == false);
1152 fail_unless(sr->isSetStoichiometry() == true);
1153
1154
1155 delete doc;
1156 }
1157 END_TEST
1158
1159
1160
1161 Suite *
create_suite_SBMLConvertFromL3V2(void)1162 create_suite_SBMLConvertFromL3V2 (void)
1163 {
1164 Suite *suite = suite_create("SBMLConvertFromL3V2");
1165 TCase *tcase = tcase_create("SBMLConvertFromL3V2");
1166
1167
1168 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingTrigger_strict );
1169 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingTriggerMath_strict );
1170 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingTrigger_nonstrict );
1171 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingTriggerMath_nonstrict );
1172 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertnewMath_strict );
1173 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertnewMath_nonstrict );
1174 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertEmptyLO_strict );
1175 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertEmptyLO_nonstrict );
1176 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertIAnewMath_strict );
1177 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertIAnewMath_nonstrict );
1178 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertIAnewMath1_strict );
1179 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertIAnewMath1_nonstrict );
1180 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertIA_strict );
1181 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertIA_nonstrict );
1182 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertIAvalue_strict );
1183 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertIAvalue_nonstrict );
1184 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingEAMath_bug );
1185 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingMath_strict );
1186 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingMath_nonstrict );
1187 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingReactantProducts_strict );
1188 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingReactantProducts_nonstrict );
1189 tcase_add_test( tcase, test_SBMLConvertFromL3V2_convertMissingFast );
1190 tcase_add_test(tcase, test_SBMLConvertFromL3V2_convertMissingMathForStoich_strict);
1191 suite_add_tcase(suite, tcase);
1192
1193 return suite;
1194 }
1195
1196 END_C_DECLS
1197
1198