1 /**
2  * @file    TestWriteQualExtension.cpp
3  * @brief   Unit tests of writing QualExtension
4  * @author  Akiya Jouraku
5  *
6  * $Id: $
7  * $HeadURL: $
8  *
9  * <!--------------------------------------------------------------------------
10  * This file is part of libSBML.  Please visit http://sbml.org for more
11  * information about SBML, and the latest version of libSBML.
12  *
13  * Copyright (C) 2020 jointly by the following organizations:
14  *     1. California Institute of Technology, Pasadena, CA, USA
15  *     2. University of Heidelberg, Heidelberg, Germany
16  *     3. University College London, London, UK
17  *
18  * Copyright (C) 2019 jointly by the following organizations:
19  *     1. California Institute of Technology, Pasadena, CA, USA
20  *     2. University of Heidelberg, Heidelberg, Germany
21  *
22  * Copyright (C) 2013-2018 jointly by the following organizations:
23  *     1. California Institute of Technology, Pasadena, CA, USA
24  *     2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
25  *     3. University of Heidelberg, Heidelberg, Germany
26  *
27  * Copyright (C) 2009-2011 jointly by the following organizations:
28  *     1. California Institute of Technology, Pasadena, CA, USA
29  *     2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
30  *
31  * Copyright (C) 2006-2008 by the California Institute of Technology,
32  *     Pasadena, CA, USA
33  *
34  * Copyright (C) 2002-2005 jointly by the following organizations:
35  *     1. California Institute of Technology, Pasadena, CA, USA
36  *     2. Japan Science and Technology Agency, Japan
37  *
38  * This library is free software; you can redistribute it and/or modify it
39  * under the terms of the GNU Lesser General Public License as published by
40  * the Free Software Foundation.  A copy of the license agreement is provided
41  * in the file named "LICENSE.txt" included with this software distribution
42  * and also available online as http://sbml.org/software/libsbml/license.html
43  * ---------------------------------------------------------------------- -->*/
44 
45 
46 #include <limits>
47 
48 #include <iostream>
49 #include <check.h>
50 #include <sbml/SBMLTypes.h>
51 #include <sbml/extension/SBMLExtensionRegistry.h>
52 #include <sbml/packages/qual/extension/QualModelPlugin.h>
53 #include <sbml/packages/qual/extension/QualExtension.h>
54 #include <sbml/packages/qual/common/QualExtensionTypes.h>
55 #include <string>
56 
57 /** @cond doxygenIgnored */
58 
59 using namespace std;
60 LIBSBML_CPP_NAMESPACE_USE
61 
62 /** @endcond doxygenIgnored */
63 
64 
65 CK_CPPSTART
66 
67 static string QUAL_XMLNS_L3V1V1;
68 static QualExtension* G;
69 static QualPkgNamespaces* GNS;
70 
71 void
WriteQualExtensionTest_setup(void)72 WriteQualExtensionTest_setup (void)
73 {
74 	try
75 	{
76 		G = new QualExtension();
77 		GNS = new QualPkgNamespaces();
78 		QUAL_XMLNS_L3V1V1 = GNS->getURI();
79 	}
80 	catch(...)
81 	{
82 		fail("Failed to create a QualExtension object");
83 	}
84 }
85 
86 
87 void
WriteQualExtensionTest_teardown(void)88 WriteQualExtensionTest_teardown (void)
89 {
90 	delete G;
91 	delete GNS;
92 }
93 
START_TEST(test_QualExtension_create_and_write_L3V1V1)94 START_TEST (test_QualExtension_create_and_write_L3V1V1)
95 {
96   const char* s1 =
97     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
98     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" xmlns:qual=\"http://www.sbml.org/sbml/level3/version1/qual/version1\" level=\"3\" version=\"1\" qual:required=\"true\">\n"
99     "  <model>\n"
100     "    <listOfCompartments>\n"
101     "      <compartment id=\"c\" constant=\"true\"/>\n"
102     "    </listOfCompartments>\n"
103     "    <qual:listOfQualitativeSpecies>\n"
104     "      <qual:qualitativeSpecies metaid=\"ddd\" qual:id=\"s1\" qual:compartment=\"c\" qual:constant=\"false\" qual:name=\"sss\" qual:initialLevel=\"1\" qual:maxLevel=\"4\"/>\n"
105     "    </qual:listOfQualitativeSpecies>\n"
106     "    <qual:listOfTransitions>\n"
107     "      <qual:transition sboTerm=\"SBO:0000001\" qual:id=\"d\">\n"
108     "        <qual:listOfInputs>\n"
109     "          <qual:input qual:id=\"RD\" qual:qualitativeSpecies=\"s1\" qual:transitionEffect=\"none\" qual:name=\"aa\" qual:sign=\"negative\" qual:thresholdLevel=\"2\"/>\n"
110     "        </qual:listOfInputs>\n"
111     "        <qual:listOfOutputs>\n"
112     "          <qual:output qual:id=\"wd\" qual:qualitativeSpecies=\"s1\" qual:transitionEffect=\"production\" qual:name=\"aa\" qual:outputLevel=\"2\"/>\n"
113     "        </qual:listOfOutputs>\n"
114     "        <qual:listOfFunctionTerms>\n"
115 		"          <qual:defaultTerm qual:resultLevel=\"1\"/>\n"
116 		"          <qual:functionTerm qual:resultLevel=\"2\">\n"
117     "            <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n"
118 		"              <apply>\n"
119 		"                <geq/>\n"
120 		"                <ci> s1 </ci>\n"
121 		"                <cn type=\"integer\"> 2 </cn>\n"
122 		"              </apply>\n"
123 		"            </math>\n"
124 		"          </qual:functionTerm>\n"
125 		"        </qual:listOfFunctionTerms>\n"
126     "      </qual:transition>\n"
127     "    </qual:listOfTransitions>\n"
128     "  </model>\n"
129     "</sbml>\n"
130     ;
131 
132   QualPkgNamespaces sbmlns(3,1,1);
133 
134   // create the document
135 
136   SBMLDocument document(&sbmlns);
137 
138   //// mark qual as required
139 
140   document.setPackageRequired("qual", true);
141 
142   // create the Model
143 
144   Model* model=document.createModel();
145 
146   // create the Compartment
147 
148   Compartment* compartment = model->createCompartment();
149   compartment->setId("c");
150   compartment->setConstant(true);
151 
152   //// create the QualitativeSpecies
153 
154   QualModelPlugin* mplugin = static_cast<QualModelPlugin*>(model->getPlugin("qual"));
155 
156   fail_unless(mplugin != NULL);
157 
158   QualitativeSpecies* qs = mplugin->createQualitativeSpecies();
159   fail_unless(qs->setId("s1")               == LIBSBML_OPERATION_SUCCESS);
160   fail_unless(qs->setCompartment("c")       == LIBSBML_OPERATION_SUCCESS);
161   fail_unless(qs->setConstant(false)        == LIBSBML_OPERATION_SUCCESS);
162   fail_unless(qs->setInitialLevel(1)        == LIBSBML_OPERATION_SUCCESS);
163   fail_unless(qs->setMaxLevel(4)            == LIBSBML_OPERATION_SUCCESS);
164   fail_unless(qs->setName("sss")            == LIBSBML_OPERATION_SUCCESS);
165   fail_unless(qs->setMetaId("ddd")          == LIBSBML_OPERATION_SUCCESS);
166 
167   Transition* t = mplugin->createTransition();
168   fail_unless(t->setId("d")               == LIBSBML_OPERATION_SUCCESS);
169   fail_unless(t->setSBOTerm(1)            == LIBSBML_OPERATION_SUCCESS);
170 
171   Input* i = t->createInput();
172   fail_unless(i->setId("RD")                 == LIBSBML_OPERATION_SUCCESS);
173   fail_unless(i->setQualitativeSpecies("s1") == LIBSBML_OPERATION_SUCCESS);
174   fail_unless(i->setTransitionEffect
175   (InputTransitionEffect_fromString("none")) == LIBSBML_OPERATION_SUCCESS);
176   fail_unless(i->setSign(InputSign_fromString("negative"))
177                                              == LIBSBML_OPERATION_SUCCESS);
178   fail_unless(i->setThresholdLevel(2)        == LIBSBML_OPERATION_SUCCESS);
179   fail_unless(i->setName("aa")               == LIBSBML_OPERATION_SUCCESS);
180 
181   Output* o = t->createOutput();
182   fail_unless(o->setId("wd")                       == LIBSBML_OPERATION_SUCCESS);
183   fail_unless(o->setQualitativeSpecies("s1")       == LIBSBML_OPERATION_SUCCESS);
184   fail_unless(o->setTransitionEffect
185   (OutputTransitionEffect_fromString("production")) == LIBSBML_OPERATION_SUCCESS);
186   fail_unless(o->setOutputLevel(2)                 == LIBSBML_OPERATION_SUCCESS);
187   fail_unless(o->setName("aa")                     == LIBSBML_OPERATION_SUCCESS);
188 
189   DefaultTerm* dt = t->createDefaultTerm();
190   fail_unless(dt->setResultLevel(1) == LIBSBML_OPERATION_SUCCESS);
191 
192   FunctionTerm* ft = t->createFunctionTerm();
193   ASTNode* math = SBML_parseL3Formula("geq(s1, 2)");
194   fail_unless(ft->setResultLevel(2) == LIBSBML_OPERATION_SUCCESS);
195   fail_unless(ft->setMath(math)     == LIBSBML_OPERATION_SUCCESS);
196   delete math;
197 
198 
199   string s2 = writeSBMLToStdString(&document);
200 
201   fail_unless(strcmp(s1,s2.c_str()) == 0);
202 
203   // check clone()
204 
205   SBMLDocument document2 = document;
206   s2 = writeSBMLToStdString(&document2);
207   fail_unless(strcmp(s1,s2.c_str()) == 0);
208 
209   // check operator=
210 
211   Model* m = document.getModel();
212   document2.setModel(m);
213   s2 = writeSBMLToStdString(&document2);
214 
215   fail_unless(strcmp(s1,s2.c_str()) == 0);
216 }
217 END_TEST
218 
219 
START_TEST(test_QualExtension_create_add_and_write_L3V1V1)220 START_TEST (test_QualExtension_create_add_and_write_L3V1V1)
221 {
222   const char* s1 =
223     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
224     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" xmlns:qual=\"http://www.sbml.org/sbml/level3/version1/qual/version1\" level=\"3\" version=\"1\" qual:required=\"true\">\n"
225     "  <model>\n"
226     "    <listOfCompartments>\n"
227     "      <compartment id=\"c\" constant=\"true\"/>\n"
228     "    </listOfCompartments>\n"
229     "    <qual:listOfQualitativeSpecies>\n"
230     "      <qual:qualitativeSpecies metaid=\"ddd\" qual:id=\"s1\" qual:compartment=\"c\" qual:constant=\"false\" qual:name=\"sss\" qual:initialLevel=\"1\" qual:maxLevel=\"4\"/>\n"
231     "    </qual:listOfQualitativeSpecies>\n"
232     "    <qual:listOfTransitions>\n"
233     "      <qual:transition sboTerm=\"SBO:0000001\" qual:id=\"d\">\n"
234     "        <qual:listOfInputs>\n"
235     "          <qual:input qual:id=\"RD\" qual:qualitativeSpecies=\"s1\" qual:transitionEffect=\"none\" qual:name=\"aa\" qual:sign=\"negative\" qual:thresholdLevel=\"2\"/>\n"
236     "        </qual:listOfInputs>\n"
237     "        <qual:listOfOutputs>\n"
238     "          <qual:output qual:id=\"wd\" qual:qualitativeSpecies=\"s1\" qual:transitionEffect=\"production\" qual:name=\"aa\" qual:outputLevel=\"2\"/>\n"
239     "        </qual:listOfOutputs>\n"
240     "        <qual:listOfFunctionTerms>\n"
241 		"          <qual:defaultTerm qual:resultLevel=\"1\"/>\n"
242 		"          <qual:functionTerm qual:resultLevel=\"2\">\n"
243     "            <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n"
244 		"              <apply>\n"
245 		"                <geq/>\n"
246 		"                <ci> s1 </ci>\n"
247 		"                <cn type=\"integer\"> 2 </cn>\n"
248 		"              </apply>\n"
249 		"            </math>\n"
250 		"          </qual:functionTerm>\n"
251 		"        </qual:listOfFunctionTerms>\n"
252     "      </qual:transition>\n"
253     "    </qual:listOfTransitions>\n"
254     "  </model>\n"
255     "</sbml>\n"
256     ;
257 
258   QualPkgNamespaces sbmlns(3,1,1);
259 
260   // create the document
261 
262   SBMLDocument document(&sbmlns);
263 
264   //// mark qual as required
265 
266   document.setPackageRequired("qual", true);
267 
268   // create the Model
269 
270   Model model(&sbmlns);
271 
272   // create the Compartment
273 
274   Compartment compartment(&sbmlns);
275   compartment.setId("c");
276   compartment.setConstant(true);
277 
278   fail_unless(model.addCompartment(&compartment) == LIBSBML_OPERATION_SUCCESS);
279 
280   //// create the QualitativeSpecies
281 
282   QualModelPlugin* mplugin = static_cast<QualModelPlugin*>(model.getPlugin("qual"));
283 
284   fail_unless(mplugin != NULL);
285 
286   QualitativeSpecies qs(&sbmlns);
287   fail_unless(qs.setId("s1")               == LIBSBML_OPERATION_SUCCESS);
288   fail_unless(qs.setCompartment("c")       == LIBSBML_OPERATION_SUCCESS);
289   fail_unless(qs.setConstant(false)        == LIBSBML_OPERATION_SUCCESS);
290   fail_unless(qs.setInitialLevel(1)        == LIBSBML_OPERATION_SUCCESS);
291   fail_unless(qs.setMaxLevel(4)            == LIBSBML_OPERATION_SUCCESS);
292   fail_unless(qs.setName("sss")            == LIBSBML_OPERATION_SUCCESS);
293   fail_unless(qs.setMetaId("ddd")          == LIBSBML_OPERATION_SUCCESS);
294 
295   fail_unless(mplugin->addQualitativeSpecies(&qs) == LIBSBML_OPERATION_SUCCESS);
296 
297   Transition t(&sbmlns);
298   fail_unless(t.setId("d")               == LIBSBML_OPERATION_SUCCESS);
299   fail_unless(t.setSBOTerm(1)            == LIBSBML_OPERATION_SUCCESS);
300 
301   Input i(&sbmlns);
302   fail_unless(i.setId("RD")                 == LIBSBML_OPERATION_SUCCESS);
303   fail_unless(i.setQualitativeSpecies("s1") == LIBSBML_OPERATION_SUCCESS);
304   fail_unless(i.setTransitionEffect
305   (InputTransitionEffect_fromString("none")) == LIBSBML_OPERATION_SUCCESS);
306   fail_unless(i.setSign(InputSign_fromString("negative"))
307                                              == LIBSBML_OPERATION_SUCCESS);
308   fail_unless(i.setThresholdLevel(2)        == LIBSBML_OPERATION_SUCCESS);
309   fail_unless(i.setName("aa")               == LIBSBML_OPERATION_SUCCESS);
310 
311   fail_unless(t.addInput(&i) == LIBSBML_OPERATION_SUCCESS);
312 
313   Output o(&sbmlns);
314   fail_unless(o.setId("wd")                       == LIBSBML_OPERATION_SUCCESS);
315   fail_unless(o.setQualitativeSpecies("s1")       == LIBSBML_OPERATION_SUCCESS);
316   fail_unless(o.setTransitionEffect
317   (OutputTransitionEffect_fromString("production")) == LIBSBML_OPERATION_SUCCESS);
318   fail_unless(o.setOutputLevel(2)                 == LIBSBML_OPERATION_SUCCESS);
319   fail_unless(o.setName("aa")                     == LIBSBML_OPERATION_SUCCESS);
320 
321   fail_unless(t.addOutput(&o) == LIBSBML_OPERATION_SUCCESS);
322 
323   FunctionTerm ft(&sbmlns);
324   ASTNode* math = SBML_parseL3Formula("geq(s1, 2)");
325   fail_unless(ft.setResultLevel(2) == LIBSBML_OPERATION_SUCCESS);
326   fail_unless(ft.setMath(math)     == LIBSBML_OPERATION_SUCCESS);
327   delete math;
328 
329   fail_unless(t.addFunctionTerm(&ft) == LIBSBML_OPERATION_SUCCESS);
330 
331   DefaultTerm dt(&sbmlns);
332   fail_unless(dt.setResultLevel(1) == LIBSBML_OPERATION_SUCCESS);
333 
334 
335   fail_unless(t.setDefaultTerm(&dt) == LIBSBML_OPERATION_SUCCESS);
336 
337   fail_unless(mplugin->addTransition(&t) == LIBSBML_OPERATION_SUCCESS);
338 
339   fail_unless(document.setModel(&model) == LIBSBML_OPERATION_SUCCESS);
340 
341   string s2 = writeSBMLToStdString(&document);
342 
343   fail_unless(strcmp(s1,s2.c_str()) == 0);
344 }
345 END_TEST
346 
347 
START_TEST(test_QualExtension_read_enable_via_model_and_write_L3V1V1)348 START_TEST (test_QualExtension_read_enable_via_model_and_write_L3V1V1)
349 {
350   const char* s1 =
351     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
352     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" level=\"3\" version=\"1\">\n"
353     "  <model>\n"
354     "    <listOfCompartments>\n"
355     "      <compartment id=\"c\" constant=\"true\"/>\n"
356     "    </listOfCompartments>\n"
357     "  </model>\n"
358     "</sbml>\n"
359     ;
360 
361   const char* s1a =
362     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
363     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" xmlns:qual=\"http://www.sbml.org/sbml/level3/version1/qual/version1\" level=\"3\" version=\"1\" qual:required=\"true\">\n"
364     "  <model>\n"
365     "    <listOfCompartments>\n"
366     "      <compartment id=\"c\" constant=\"true\"/>\n"
367     "    </listOfCompartments>\n"
368     "    <qual:listOfQualitativeSpecies>\n"
369     "      <qual:qualitativeSpecies qual:id=\"s1\" qual:compartment=\"c\" qual:constant=\"false\" qual:name=\"sss\" qual:initialLevel=\"1\" qual:maxLevel=\"4\"/>\n"
370     "    </qual:listOfQualitativeSpecies>\n"
371     "  </model>\n"
372     "</sbml>\n"
373     ;
374 
375   SBMLDocument *document = readSBMLFromString(s1);
376 
377   fail_unless(document->getNumPlugins()             == 0);
378 
379   Model *model = document->getModel();
380 
381   fail_unless(model != NULL);
382   fail_unless(model->getNumPlugins() == 0);
383 
384   //
385   // enable the qual package by invoking enablePackage function with Model object
386   //
387   fail_unless(model->enablePackage(QUAL_XMLNS_L3V1V1, "qual", true) == LIBSBML_OPERATION_SUCCESS);
388 
389   // mark qual as required
390 
391   document->setPackageRequired("qual", true);
392 
393   fail_unless(document->getNumPlugins() == 1);
394   fail_unless(model->getNumPlugins()    == 1);
395 
396   //// create the QualitativeSpecies
397 
398   QualModelPlugin* mplugin = static_cast<QualModelPlugin*>(model->getPlugin("qual"));
399 
400   fail_unless(mplugin != NULL);
401 
402   QualitativeSpecies* qs = mplugin->createQualitativeSpecies();
403   fail_unless(qs->setId("s1")               == LIBSBML_OPERATION_SUCCESS);
404   fail_unless(qs->setCompartment("c")       == LIBSBML_OPERATION_SUCCESS);
405   fail_unless(qs->setConstant(false)        == LIBSBML_OPERATION_SUCCESS);
406   fail_unless(qs->setInitialLevel(1)        == LIBSBML_OPERATION_SUCCESS);
407   fail_unless(qs->setMaxLevel(4)            == LIBSBML_OPERATION_SUCCESS);
408   fail_unless(qs->setName("sss")            == LIBSBML_OPERATION_SUCCESS);
409 
410   char *s2 = writeSBMLToString(document);
411 
412   fail_unless(strcmp(s1a,s2) == 0);
413 
414   free(s2);
415   delete document;
416 }
417 END_TEST
418 
419 
START_TEST(test_QualExtension_read_disable_via_model_and_write_L3V1V1)420 START_TEST (test_QualExtension_read_disable_via_model_and_write_L3V1V1)
421 {
422   const char* s1 =
423     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
424     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" xmlns:qual=\"http://www.sbml.org/sbml/level3/version1/qual/version1\" level=\"3\" version=\"1\" qual:required=\"true\">\n"
425     "  <model>\n"
426     "    <listOfCompartments>\n"
427     "      <compartment id=\"c\" constant=\"true\"/>\n"
428     "    </listOfCompartments>\n"
429     "    <qual:listOfQualitativeSpecies>\n"
430     "      <qual:qualitativeSpecies qual:id=\"s1\" qual:compartment=\"c\" qual:constant=\"false\" qual:name=\"sss\" qual:initialLevel=\"1\" qual:maxLevel=\"4\"/>\n"
431     "    </qual:listOfQualitativeSpecies>\n"
432     "  </model>\n"
433     "</sbml>\n"
434     ;
435 
436   const char* s1d =
437     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
438     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" level=\"3\" version=\"1\">\n"
439     "  <model>\n"
440     "    <listOfCompartments>\n"
441     "      <compartment id=\"c\" constant=\"true\"/>\n"
442     "    </listOfCompartments>\n"
443     "  </model>\n"
444     "</sbml>\n"
445     ;
446 
447   SBMLDocument *document = readSBMLFromString(s1);
448 
449   fail_unless(document->getNumPlugins() == 1);
450 
451   Model *model = document->getModel();
452 
453   fail_unless(model != NULL);
454   fail_unless(model->getNumPlugins() == 1);
455 
456   //
457   // disable the qual package by invoking enablePackage function with Model object
458   //
459   fail_unless(model->enablePackage(QUAL_XMLNS_L3V1V1, "qual", false) == LIBSBML_OPERATION_SUCCESS);
460 
461   fail_unless(document->getNumPlugins() == 0);
462   fail_unless(model->getNumPlugins()    == 0);
463 
464   char *s2 = writeSBMLToString(document);
465 
466   fail_unless(strcmp(s1d,s2) == 0);
467 
468   free(s2);
469   delete document;
470 }
471 END_TEST
472 
473 
START_TEST(test_QualExtension_read_enable_via_sbmldocument_and_write_L3V1V1)474 START_TEST (test_QualExtension_read_enable_via_sbmldocument_and_write_L3V1V1)
475 {
476   const char* s1 =
477     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
478     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" level=\"3\" version=\"1\">\n"
479     "  <model>\n"
480     "    <listOfCompartments>\n"
481     "      <compartment id=\"c\" constant=\"true\"/>\n"
482     "    </listOfCompartments>\n"
483     "  </model>\n"
484     "</sbml>\n"
485     ;
486 
487   const char* s1a =
488     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
489     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" xmlns:qual=\"http://www.sbml.org/sbml/level3/version1/qual/version1\" level=\"3\" version=\"1\" qual:required=\"true\">\n"
490     "  <model>\n"
491     "    <listOfCompartments>\n"
492     "      <compartment id=\"c\" constant=\"true\"/>\n"
493     "    </listOfCompartments>\n"
494     "    <qual:listOfQualitativeSpecies>\n"
495     "      <qual:qualitativeSpecies qual:id=\"s1\" qual:compartment=\"c\" qual:constant=\"false\" qual:name=\"sss\" qual:initialLevel=\"1\" qual:maxLevel=\"4\"/>\n"
496     "    </qual:listOfQualitativeSpecies>\n"
497     "  </model>\n"
498     "</sbml>\n"
499     ;
500 
501   SBMLDocument *document = readSBMLFromString(s1);
502 
503   fail_unless(document->getNumPlugins()             == 0);
504 
505   //
506   // enable the qual package by invoking enablePackage function with SBMLDocument object
507   //
508   fail_unless(document->enablePackage(QUAL_XMLNS_L3V1V1, "qual", true) == LIBSBML_OPERATION_SUCCESS);
509 
510   // mark qual as required
511 
512   document->setPackageRequired("qual", true);
513 
514   fail_unless(document->getNumPlugins()             == 1);
515 
516   Model *model = document->getModel();
517 
518   fail_unless(model != NULL);
519   fail_unless(model->getNumPlugins() == 1);
520 
521   //// create the QualitativeSpecies
522 
523   QualModelPlugin* mplugin = static_cast<QualModelPlugin*>(model->getPlugin("qual"));
524 
525   fail_unless(mplugin != NULL);
526 
527   QualitativeSpecies* qs = mplugin->createQualitativeSpecies();
528   fail_unless(qs->setId("s1")               == LIBSBML_OPERATION_SUCCESS);
529   fail_unless(qs->setCompartment("c")       == LIBSBML_OPERATION_SUCCESS);
530   fail_unless(qs->setConstant(false)        == LIBSBML_OPERATION_SUCCESS);
531   fail_unless(qs->setInitialLevel(1)        == LIBSBML_OPERATION_SUCCESS);
532   fail_unless(qs->setMaxLevel(4)            == LIBSBML_OPERATION_SUCCESS);
533   fail_unless(qs->setName("sss")            == LIBSBML_OPERATION_SUCCESS);
534 
535   char *s2 = writeSBMLToString(document);
536 
537   fail_unless(strcmp(s1a,s2) == 0);
538 
539   free(s2);
540   delete document;
541 }
542 END_TEST
543 
544 
START_TEST(test_QualExtension_read_disable_via_sbmldocument_and_write_L3V1V1)545 START_TEST (test_QualExtension_read_disable_via_sbmldocument_and_write_L3V1V1)
546 {
547   const char* s1 =
548     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
549     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" xmlns:qual=\"http://www.sbml.org/sbml/level3/version1/qual/version1\" level=\"3\" version=\"1\" qual:required=\"true\">\n"
550     "  <model>\n"
551     "    <listOfCompartments>\n"
552     "      <compartment id=\"c\" constant=\"true\"/>\n"
553     "    </listOfCompartments>\n"
554     "    <qual:listOfQualitativeSpecies>\n"
555     "      <qual:qualitativeSpecies qual:id=\"s1\" qual:compartment=\"c\" qual:constant=\"false\" qual:name=\"sss\" qual:initialLevel=\"1\" qual:maxLevel=\"4\"/>\n"
556     "    </qual:listOfQualitativeSpecies>\n"
557     "  </model>\n"
558     "</sbml>\n"
559     ;
560 
561   const char* s1d =
562     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
563     "<sbml xmlns=\"http://www.sbml.org/sbml/level3/version1/core\" level=\"3\" version=\"1\">\n"
564     "  <model>\n"
565     "    <listOfCompartments>\n"
566     "      <compartment id=\"c\" constant=\"true\"/>\n"
567     "    </listOfCompartments>\n"
568     "  </model>\n"
569     "</sbml>\n"
570     ;
571 
572   SBMLDocument *document = readSBMLFromString(s1);
573 
574   fail_unless(document->getNumPlugins() == 1);
575 
576   //
577   // disable the qual package by invoking enablePackage function with Model object
578   //
579   fail_unless(document->enablePackage(QUAL_XMLNS_L3V1V1, "qual", false) == LIBSBML_OPERATION_SUCCESS);
580 
581   fail_unless(document->getNumPlugins() == 0);
582 
583   Model *model = document->getModel();
584 
585   fail_unless(model != NULL);
586   fail_unless(model->getNumPlugins() == 0);
587 
588   char *s2 = writeSBMLToString(document);
589 
590   fail_unless(strcmp(s1d,s2) == 0);
591 
592   free(s2);
593   delete document;
594 }
595 END_TEST
596 
597 
598 
599 Suite *
create_suite_WriteQualExtension(void)600 create_suite_WriteQualExtension (void)
601 {
602   Suite *suite = suite_create("WriteQualExtension");
603   TCase *tcase = tcase_create("WriteQualExtension");
604 
605   tcase_add_checked_fixture(tcase, WriteQualExtensionTest_setup, WriteQualExtensionTest_teardown);
606 
607   tcase_add_test( tcase, test_QualExtension_create_and_write_L3V1V1);
608   tcase_add_test( tcase, test_QualExtension_create_add_and_write_L3V1V1);
609   tcase_add_test( tcase, test_QualExtension_read_enable_via_model_and_write_L3V1V1);
610   tcase_add_test( tcase, test_QualExtension_read_disable_via_model_and_write_L3V1V1);
611   tcase_add_test( tcase, test_QualExtension_read_enable_via_sbmldocument_and_write_L3V1V1);
612   tcase_add_test( tcase, test_QualExtension_read_disable_via_sbmldocument_and_write_L3V1V1);
613   suite_add_tcase(suite, tcase);
614 
615   return suite;
616 }
617 
618 
619 CK_CPPEND
620