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