1use Test;
2BEGIN { plan tests => 294 };
3
4use LibSBML;
5use strict;
6use vars qw/$formula $f $tu $su $math $m/;
7
8#########################
9
10my $level   = LibSBML::SBMLDocument::getDefaultLevel();
11my $version = 1;
12
13my $id = 'Branch';
14my $Rk = 0; # counter for Reactions
15my $Rl = 0; # counter for Rules
16
17# create w/ Id
18my $m = new LibSBML::Model($level,$version);
19$m->setId('repressilator');
20ok($m->getTypeCode() == $LibSBML::SBML_MODEL);
21ok($m->getMetaId(), '');
22ok($m->getNotes(), undef);
23ok($m->getAnnotation(), undef);
24ok($m->isSetId(), 1);
25ok($m->getId(), 'repressilator');
26ok($m->isSetName(), 0);
27ok($m->getName(), '');
28ok($m->getNumUnitDefinitions(), 0);
29ok($m->getNumCompartments(), 0);
30ok($m->getNumSpecies(), 0);
31ok($m->getNumParameters(), 0);
32ok($m->getNumReactions(), 0);
33
34# create w/ Name
35$m = new LibSBML::Model($level,$version);
36$m->setName('The Repressilator Model');
37ok($m->getTypeCode() == $LibSBML::SBML_MODEL);
38ok($m->getMetaId(), '');
39ok($m->getNotes(), undef);
40ok($m->getAnnotation(), undef);
41ok($m->isSetId(), 0);
42ok($m->getId(), '');
43ok($m->isSetName(), 1);
44ok($m->getName(), 'The Repressilator Model');
45ok($m->getNumUnitDefinitions(), 0);
46ok($m->getNumCompartments(), 0);
47ok($m->getNumSpecies(), 0);
48ok($m->getNumParameters(), 0);
49ok($m->getNumReactions(), 0);
50
51# create w/o arguments
52$m = new LibSBML::Model($level,$version);
53ok($m->getTypeCode() == $LibSBML::SBML_MODEL);
54ok($m->getMetaId(), '');
55ok($m->getNotes(), undef);
56ok($m->getAnnotation(), undef);
57ok($m->isSetId(), 0);
58ok($m->getId(), '');
59ok($m->isSetName(), 0);
60ok($m->getName(), '');
61ok($m->getNumUnitDefinitions(), 0);
62ok($m->getNumCompartments(), 0);
63ok($m->getNumSpecies(), 0);
64ok($m->getNumParameters(), 0);
65ok($m->getNumReactions(), 0);
66
67# set/get Id
68ok($m->isSetId(), 0);
69$m->setId($id);
70ok($m->isSetId(), 1);
71ok($m->getId(), $id);
72# reflexive case
73$m->setId($m->getId());
74ok($m->isSetId(), 1);
75ok($m->getId(), $id);
76$m->setId('');
77ok($m->isSetId(), 0);
78ok($m->getId(), '');
79
80# set/get Name
81ok($m->isSetName(), 0);
82$m->setName($id);
83ok($m->isSetName(), 1);
84ok($m->getName(), $id);
85# reflexive case
86$m->setName($m->getName());
87ok($m->isSetName(), 1);
88ok($m->getName(), $id);
89$m->setName('');
90ok($m->isSetName(), 0);
91ok($m->getName(), '');
92
93
94# set/get TimeUnits
95ok($m->isSetTimeUnits(), 0);
96$m->setTimeUnits($id);
97ok($m->isSetTimeUnits(), 1);
98ok($m->getTimeUnits(), $id);
99# reflexive case
100$m->setTimeUnits($m->getTimeUnits());
101ok($m->isSetTimeUnits(), 1);
102ok($m->getTimeUnits(), $id);
103$m->setTimeUnits('');
104ok($m->isSetTimeUnits(), 0);
105ok($m->getTimeUnits(), '');
106
107# set/get VolumeUnits
108ok($m->isSetVolumeUnits(), 0);
109$m->setVolumeUnits($id);
110ok($m->isSetVolumeUnits(), 1);
111ok($m->getVolumeUnits(), $id);
112# reflexive case
113$m->setVolumeUnits($m->getVolumeUnits());
114ok($m->isSetVolumeUnits(), 1);
115ok($m->getVolumeUnits(), $id);
116$m->setVolumeUnits('');
117ok($m->isSetVolumeUnits(), 0);
118ok($m->getVolumeUnits(), '');
119
120# set/get AreaUnits
121ok($m->isSetAreaUnits(), 0);
122$m->setAreaUnits($id);
123ok($m->isSetAreaUnits(), 1);
124ok($m->getAreaUnits(), $id);
125# reflexive case
126$m->setAreaUnits($m->getAreaUnits());
127ok($m->isSetAreaUnits(), 1);
128ok($m->getAreaUnits(), $id);
129$m->setAreaUnits('');
130ok($m->isSetAreaUnits(), 0);
131ok($m->getAreaUnits(), '');
132
133# set/get LengthUnits
134ok($m->isSetLengthUnits(), 0);
135$m->setLengthUnits($id);
136ok($m->isSetLengthUnits(), 1);
137ok($m->getLengthUnits(), $id);
138# reflexive case
139$m->setLengthUnits($m->getLengthUnits());
140ok($m->isSetLengthUnits(), 1);
141ok($m->getLengthUnits(), $id);
142$m->setLengthUnits('');
143ok($m->isSetLengthUnits(), 0);
144ok($m->getLengthUnits(), '');
145
146# set/get SubstanceUnits
147ok($m->isSetSubstanceUnits(), 0);
148$m->setSubstanceUnits($id);
149ok($m->isSetSubstanceUnits(), 1);
150ok($m->getSubstanceUnits(), $id);
151# reflexive case
152$m->setSubstanceUnits($m->getSubstanceUnits());
153ok($m->isSetSubstanceUnits(), 1);
154ok($m->getSubstanceUnits(), $id);
155$m->setSubstanceUnits('');
156ok($m->isSetSubstanceUnits(), 0);
157ok($m->getSubstanceUnits(), '');
158
159# set/get ExtentUnits
160ok($m->isSetExtentUnits(), 0);
161$m->setExtentUnits($id);
162ok($m->isSetExtentUnits(), 1);
163ok($m->getExtentUnits(), $id);
164# reflexive case
165$m->setExtentUnits($m->getExtentUnits());
166ok($m->isSetExtentUnits(), 1);
167ok($m->getExtentUnits(), $id);
168$m->setExtentUnits('');
169ok($m->isSetExtentUnits(), 0);
170ok($m->getExtentUnits(), '');
171
172# set/get ConversionFactor
173ok($m->isSetConversionFactor(), 0);
174$m->setConversionFactor($id);
175ok($m->isSetConversionFactor(), 1);
176ok($m->getConversionFactor(), $id);
177# reflexive case
178$m->setConversionFactor($m->getConversionFactor());
179ok($m->isSetConversionFactor(), 1);
180ok($m->getConversionFactor(), $id);
181$m->setConversionFactor('');
182ok($m->isSetConversionFactor(), 0);
183ok($m->getConversionFactor(), '');
184
185
186# create FunctionDefinition
187my $fd = $m->createFunctionDefinition();
188ok($fd->getTypeCode() == $LibSBML::SBML_FUNCTION_DEFINITION);
189ok($m->getNumFunctionDefinitions(), 1);
190
191# add/get FunctionDefinition
192$fd = new LibSBML::FunctionDefinition($level,$version);
193ok($m->addFunctionDefinition($fd),$LibSBML::LIBSBML_INVALID_OBJECT);
194$fd->setId('fd');
195$fd->setMath(LibSBML::parseFormula('1+1'));
196ok($m->addFunctionDefinition($fd),0);
197ok($m->getNumFunctionDefinitions(), 2);
198ok($m->getFunctionDefinition(0)->getTypeCode()
199   == $LibSBML::SBML_FUNCTION_DEFINITION);
200ok($m->getFunctionDefinition(1)->getTypeCode()
201   == $LibSBML::SBML_FUNCTION_DEFINITION);
202ok($m->getFunctionDefinition(2),  undef);
203
204# add/get FunctionDefinitionById
205$fd = new LibSBML::FunctionDefinition($level,$version);
206$fd->setId('sin');
207$fd->setMath(LibSBML::parseFormula('sin(x)'));
208$m->addFunctionDefinition($fd);
209$fd = new LibSBML::FunctionDefinition($level,$version);
210$fd->setId('cos');
211$fd->setMath(LibSBML::parseFormula('cos(x)'));
212$m->addFunctionDefinition($fd);
213
214ok($m->getNumFunctionDefinitions(), 4);
215ok($m->getFunctionDefinition('sin')->getId(),
216   $m->getFunctionDefinition(2)->getId());
217ok($m->getFunctionDefinition('cos')->getId(),
218   $m->getFunctionDefinition(3)->getId());
219ok($m->getFunctionDefinition('tan'), undef);
220
221# create UnitDefinition
222my $ud = $m->createUnitDefinition();
223ok($ud->getTypeCode() == $LibSBML::SBML_UNIT_DEFINITION);
224ok($m->getNumUnitDefinitions(), 1);
225
226# add/get UnitDefinition                          Id       Name
227$ud = new LibSBML::UnitDefinition($level,$version);
228$ud->setId('volume');
229$ud->setName('mmls');
230my $u = new LibSBML::Unit($level,$version);
231$u->setKind($LibSBML::UNIT_KIND_LITRE);
232$u->setExponent(1.0);
233$u->setMultiplier(1.0);
234$u->setScale(0);
235$ud->addUnit($u);
236$m->addUnitDefinition($ud);
237$ud = new LibSBML::UnitDefinition($level,$version);
238$ud->setId('mmls');
239$ud->setName('volume');
240$ud->addUnit($u);
241$m->addUnitDefinition($ud);
242ok($m->getNumUnitDefinitions(), 3);
243ok($m->getUnitDefinition(0)->getTypeCode() == $LibSBML::SBML_UNIT_DEFINITION);
244ok($m->getUnitDefinition(0)->getName(), '');
245ok($m->getUnitDefinition(1)->getTypeCode() == $LibSBML::SBML_UNIT_DEFINITION);
246ok($m->getUnitDefinition(1)->getName(), 'mmls');
247ok($m->getUnitDefinition(2)->getTypeCode() == $LibSBML::SBML_UNIT_DEFINITION);
248ok($m->getUnitDefinition(2)->getName(), 'volume');
249ok($m->getUnitDefinition(3),  undef);
250
251# get UnitDefinitionById
252ok($m->getUnitDefinition('volume')->getName(),
253   $m->getUnitDefinition(2)->getId());
254ok($m->getUnitDefinition('mmls')->getName(),
255   $m->getUnitDefinition(1)->getId());
256ok($m->getUnitDefinition('liter'), undef);
257
258# create Unit
259$ud = $m->createUnitDefinition();
260$ud = $m->createUnitDefinition();
261ok($m->getNumUnitDefinitions(), 5);
262$u = $m->createUnit();
263ok($u->getTypeCode() == $LibSBML::SBML_UNIT);
264$ud = $m->getUnitDefinition(4);
265ok($ud->getTypeCode() == $LibSBML::SBML_UNIT_DEFINITION);
266ok($ud->getNumUnits(), 1);
267
268# create Unit noUnitDefinition
269my $mNO = new LibSBML::Model($level,$version);
270ok($mNO->getTypeCode() == $LibSBML::SBML_MODEL);
271ok($mNO->getNumUnitDefinitions(), 0);
272ok($mNO->createUnit(), undef);
273
274# create Compartment
275my $c = $m->createCompartment();
276$c->setId('a');
277ok($c->getTypeCode() == $LibSBML::SBML_COMPARTMENT);
278ok($m->getNumCompartments(), 1);
279
280# add/get Compartment
281$c = new LibSBML::Compartment($level,$version);
282$c->setId('A');
283$c->setConstant(1);
284$m->addCompartment($c);
285$m->getCompartment(1)->setId('A');
286$m->getCompartment(1)->setName('B');
287$c->setId('B');
288$m->addCompartment($c);
289$m->getCompartment(2)->setId('B');
290$m->getCompartment(2)->setName('A');
291ok($m->getNumCompartments(), 3);
292ok($m->getCompartment(0)->getTypeCode() == $LibSBML::SBML_COMPARTMENT);
293ok($m->getName(), '');
294ok($m->getId(),   '');
295ok($m->getCompartment(1)->getTypeCode() == $LibSBML::SBML_COMPARTMENT);
296ok($m->getCompartment(1)->getId(),   'A');
297ok($m->getCompartment(1)->getName(), 'B');
298ok($m->getCompartment(2)->getTypeCode() == $LibSBML::SBML_COMPARTMENT);
299ok($m->getCompartment(2)->getId(),   'B');
300ok($m->getCompartment(2)->getName(), 'A');
301ok($m->getCompartment(3), undef);
302
303# get CompartmentById
304ok($m->getCompartment('A')->getName(), $m->getCompartment(2)->getId());
305ok($m->getCompartment('B')->getName(), $m->getCompartment(1)->getId());
306ok($m->getCompartment('C'), undef);
307
308# create Species
309my $s = $m->createSpecies();
310$s->setId('S1');
311$s->setCompartment('A');
312ok($s->getTypeCode() == $LibSBML::SBML_SPECIES);
313ok($m->getNumSpecies(), 1);
314
315# add/get Species
316$s = new LibSBML::Species($level,$version);
317$s->setId('Glucose');
318$s->setCompartment('A');
319$s->setConstant(0);
320$s->setHasOnlySubstanceUnits(0);
321$s->setBoundaryCondition(0);
322$m->addSpecies($s);
323$m->getSpecies(1)->setId('Glucose');
324$m->getSpecies(1)->setName('Glucose_6_P');
325$s->setId('Glucose_6_P');
326$m->addSpecies($s);
327$m->getSpecies(2)->setId('Glucose_6_P');
328$m->getSpecies(2)->setName('Glucose');
329ok($m->getNumSpecies(), 3);
330ok($m->getSpecies(0)->getTypeCode() == $LibSBML::SBML_SPECIES);
331ok($m->getSpecies(0)->getId(),   'S1');
332ok($m->getSpecies(0)->getName(), '');
333ok($m->getSpecies(1)->getTypeCode() == $LibSBML::SBML_SPECIES);
334ok($m->getSpecies(1)->getId(), 'Glucose');
335ok($m->getSpecies(1)->getName(), 'Glucose_6_P');
336ok($m->getSpecies(2)->getTypeCode() == $LibSBML::SBML_SPECIES);
337ok($m->getSpecies(2)->getId(), 'Glucose_6_P');
338ok($m->getSpecies(2)->getName(), 'Glucose');
339ok($m->getSpecies(3),  undef);
340
341# get SpeciesById
342ok($m->getSpecies('Glucose')->getName(), $m->getSpecies(2)->getId());
343ok($m->getSpecies('Glucose_6_P')->getName(), $m->getSpecies(1)->getId());
344ok($m->getSpecies('Glucose_5_P'), undef);
345
346# create Parameter
347my $p = $m->createParameter();
348$p->setId('P1');
349ok($p->getTypeCode() == $LibSBML::SBML_PARAMETER);
350ok($m->getNumParameters(), 1);
351
352# add/get Parameter
353$p = new LibSBML::Parameter($level,$version);
354$p->setId('Km1');
355$p->setConstant(1);
356$m->addParameter($p);
357$m->getParameter(1)->setId('Km1');
358$m->getParameter(1)->setName('Km2');
359$p->setId('Km2');
360$m->addParameter($p);
361$m->getParameter(2)->setId('Km2');
362$m->getParameter(2)->setName('Km1');
363ok($m->getNumParameters(), 3);
364ok($m->getParameter(0)->getTypeCode() == $LibSBML::SBML_PARAMETER);
365ok($m->getParameter(0)->getId(), 'P1');
366ok($m->getParameter(0)->getName(), '');
367ok($m->getParameter(1)->getTypeCode() == $LibSBML::SBML_PARAMETER);
368ok($m->getParameter(1)->getId(), 'Km1');
369ok($m->getParameter(1)->getName(), 'Km2');
370ok($m->getParameter(2)->getTypeCode() == $LibSBML::SBML_PARAMETER);
371ok($m->getParameter(2)->getId(), 'Km2');
372ok($m->getParameter(2)->getName(), 'Km1');
373ok($m->getParameter(3),  undef);
374
375# get ParameterById
376ok($m->getParameter('Km1')->getName(), $m->getParameter(2)->getId());
377ok($m->getParameter('Km2')->getName(), $m->getParameter(1)->getId());
378ok($m->getParameter('Km3'), undef);
379
380# create AssignmentRule
381my $ar = $m->createAssignmentRule(); $Rl++;
382$ar->setVariable('a1');
383$ar->setFormula('x + 1');
384ok($ar->getTypeCode() == $LibSBML::SBML_ASSIGNMENT_RULE);
385ok($m->getNumRules(), $Rl);
386ok($m->getRule($Rl-1)->getTypeCode() == $LibSBML::SBML_ASSIGNMENT_RULE);
387ok($m->getRule($Rl-1)->getFormula(), 'x + 1');
388
389# add/get AssignmentRule
390$ar = new LibSBML::AssignmentRule($level,$version);
391$ar->setVariable('a2');
392$ar->setFormula('y + 1');
393ok($m->addRule($ar), $LibSBML::LIBSBML_OPERATION_SUCCESS);
394$Rl++;
395ok($m->getNumRules(), $Rl);
396ok($m->getRule($Rl-1)->getTypeCode()
397   == $LibSBML::SBML_ASSIGNMENT_RULE);
398ok($m->getRule($Rl-2)->getTypeCode()
399   == $LibSBML::SBML_ASSIGNMENT_RULE);
400ok($m->getRule($Rl),  undef);
401
402# create RateRule
403my $rr = $m->createRateRule(); $Rl++;
404$rr->setVariable('r1');
405ok($rr->getTypeCode() == $LibSBML::SBML_RATE_RULE);
406ok($m->getNumRules(), $Rl);
407ok($m->getRule($Rl-1)->getTypeCode() == $LibSBML::SBML_RATE_RULE);
408
409# add/get RateRule
410$rr = new LibSBML::RateRule($level,$version);
411$rr->setVariable('r2');
412$rr->setFormula('w + 1');
413ok($m->addRule($rr), $LibSBML::LIBSBML_OPERATION_SUCCESS); $Rl++;
414ok($m->getNumRules(), $Rl);
415ok($m->getRule($Rl-1)->getTypeCode()
416   == $LibSBML::SBML_RATE_RULE);
417ok($m->getRule($Rl-2)->getTypeCode()
418   == $LibSBML::SBML_RATE_RULE);
419ok($m->getRule($Rl),  undef);
420
421# create AlgebraicRule
422#$ar = new LibSBML::AlgebraicRule($level,$version);
423#$ar->setFormula('x + 1');
424#$ar = $m->createAlgebraicRule(); $Rl++;
425#ok($ar->getTypeCode() == $LibSBML::SBML_ALGEBRAIC_RULE);
426#ok($m->getNumRules(), $Rl);
427#ok($m->getRule($Rl-1)->getTypeCode() == $LibSBML::SBML_ALGEBRAIC_RULE);
428
429# add/get AlgebraicRule
430#$ar = new LibSBML::AlgebraicRule($level,$version);
431#$ar->setFormula('y + 1');
432#ok($m->addRule($ar),$LibSBML::LIBSBML_OPERATION_SUCCESS); $Rl++;
433#ok($m->getNumRules(), $Rl);
434#ok($m->getRule($Rl-1)->getTypeCode()
435#   == $LibSBML::SBML_ALGEBRAIC_RULE);
436#ok($m->getRule($Rl-2)->getTypeCode()
437#   == $LibSBML::SBML_ALGEBRAIC_RULE);
438#ok($m->getRule($Rl),  undef);
439
440# create Reaction
441my $r = $m->createReaction(); $Rk++;
442$r->setId("reaction_0");
443ok($r->getTypeCode() == $LibSBML::SBML_REACTION);
444ok($m->getNumReactions(),$Rk);
445ok($m->getReaction(0)->getTypeCode() == $LibSBML::SBML_REACTION);
446
447# add/get Reaction
448$r = new LibSBML::Reaction($level,$version);
449$r->setId("reaction_1");
450$r->setReversible(1);
451$r->setFast(0);
452$m->addReaction($r); $Rk++;
453$m->getReaction($Rk-1)->setId('reaction_1');
454$m->getReaction($Rk-1)->setName('reaction_2');
455$r->setId("reaction_2");
456$m->addReaction($r); $Rk++;
457$m->getReaction($Rk-1)->setId('reaction_2');
458$m->getReaction($Rk-1)->setName('reaction_1');
459ok($m->getNumReactions(), $Rk);
460ok($m->getReaction($Rk-1)->getTypeCode()
461   == $LibSBML::SBML_REACTION);
462ok($m->getReaction($Rk-1)->getId(), 'reaction_2');
463ok($m->getReaction($Rk-1)->getName(), 'reaction_1');
464ok($m->getReaction($Rk-2)->getTypeCode()
465   == $LibSBML::SBML_REACTION);
466ok($m->getReaction($Rk-2)->getId(), 'reaction_1');
467ok($m->getReaction($Rk-2)->getName(), 'reaction_2');
468ok($m->getReaction($Rk),  undef);
469
470# get ReactionById
471ok($m->getReaction('reaction_1')->getName(), $m->getReaction(2)->getId());
472ok($m->getReaction('reaction_2')->getName(), $m->getReaction(1)->getId());
473ok($m->getReaction('reaction_3'), undef);
474
475
476# create Reactant
477$r = $m->createReaction();
478$r = $m->createReaction(); $Rk += 2;
479my $sr = $m->createReactant();
480ok(defined $sr); # note Reactant has no SBMLTypeCode
481ok($r->getReactant(0)->getTypeCode()
482   == $LibSBML::SBML_SPECIES_REFERENCE);
483ok($m->getNumReactions(), $Rk);
484$r = $m->getReaction($Rk-1);
485ok($r->getTypeCode() == $LibSBML::SBML_REACTION);
486ok($r->getNumReactants(), 1);
487ok(defined $r->getReactant(0)); # note Reactant has no SBMLTypeCode
488
489# create Reactant noReaction
490$mNO = new LibSBML::Model($level,$version);
491ok($mNO->getTypeCode() == $LibSBML::SBML_MODEL);
492ok($mNO->getNumReactions(), 0);
493ok($mNO->createReactant(), undef);
494
495# add/get Reactant
496$sr = new LibSBML::SpeciesReference($level,$version);
497$sr->setId("reaction_1");
498$sr->setSpecies("ggh");
499$sr->setConstant(0);
500$r->addReactant($sr);
501ok($r->getNumReactants(), 2);
502$sr = $r->getReactant(1);
503ok($sr->getSpecies(), "ggh");
504
505# create Product
506$r = $m->createReaction();
507$r = $m->createReaction(); $Rk += 2;
508$sr = $m->createProduct();
509ok($r->getProduct(0)->getTypeCode()
510   == $LibSBML::SBML_SPECIES_REFERENCE);
511ok(defined $sr); # note Product has no SBMLTypeCode
512ok($m->getNumReactions(), $Rk);
513$r = $m->getReaction($Rk-1);
514ok($r->getNumProducts(), 1);
515ok(defined $r->getProduct(0)); # note Product has no SBMLTypeCode
516
517# create Product noReaction
518$mNO = new LibSBML::Model($level,$version);
519ok($mNO->getTypeCode() == $LibSBML::SBML_MODEL);
520ok($mNO->getNumReactions(), 0);
521ok($mNO->createProduct(), undef);
522
523# add/get Reactant
524$sr = new LibSBML::SpeciesReference($level,$version);
525$sr->setId("reaction_1");
526$sr->setSpecies("ggh");
527$sr->setConstant(0);
528$r->addProduct($sr);
529ok($r->getNumProducts(), 2);
530$sr = $r->getProduct(1);
531ok($sr->getSpecies(), "ggh");
532
533# create Modifier
534$r = $m->createReaction();
535$r = $m->createReaction(); $Rk += 2;
536my $msr = $m->createModifier();
537ok(defined $msr); # note Modifier has no SBMLTypeCode
538ok($r->getModifier(0)->getTypeCode()
539   == $LibSBML::SBML_MODIFIER_SPECIES_REFERENCE);
540ok($m->getNumReactions(), $Rk);
541$r = $m->getReaction($Rk-1);
542ok($r->getNumModifiers(), 1);
543ok(defined $r->getModifier(0)); # note Modifier has no SBMLTypeCode
544
545# create Modifier noReaction
546$mNO = new LibSBML::Model($level,$version);
547ok($mNO->getTypeCode() == $LibSBML::SBML_MODEL);
548ok($mNO->getNumReactions(), 0);
549ok($mNO->createModifier(), undef);
550
551# add/get Reactant
552$sr = new LibSBML::ModifierSpeciesReference($level,$version);
553$sr->setSpecies("ggh");
554$r->addModifier($sr);
555ok($r->getNumModifiers(), 2);
556$sr = $r->getModifier(1);
557ok($sr->getSpecies(), "ggh");
558
559# create KineticLaw
560$r = $m->createReaction();
561$r = $m->createReaction(); $Rk += 2;
562my $kl = $m->createKineticLaw();
563ok($kl->getTypeCode() == $LibSBML::SBML_KINETIC_LAW);
564ok($m->getNumReactions(), $Rk);
565$r = $m->getReaction($Rk-2);
566ok($r->getKineticLaw(), undef);
567$r = $m->getReaction($Rk-1);
568ok($r->getKineticLaw()->getTypeCode() == $LibSBML::SBML_KINETIC_LAW);
569
570# create KineticLaw noReaction
571$mNO = new LibSBML::Model($level,$version);
572ok($mNO->getTypeCode() == $LibSBML::SBML_MODEL);
573ok($mNO->getNumReactions(), 0);
574ok($mNO->createKineticLaw(), undef);
575
576# create KineticLawParameter
577$r = $m->createReaction();
578$r = $m->createReaction(); $Rk += 2;
579$kl = $m->createKineticLaw();
580$p = $m->createKineticLawLocalParameter();
581ok($m->getNumReactions(), $Rk);
582ok($m->getReaction($Rk-2)->getKineticLaw(), undef);
583ok($m->getReaction($Rk-1)->getKineticLaw()->getTypeCode()
584   == $LibSBML::SBML_KINETIC_LAW);
585ok($m->getReaction($Rk-1)->getKineticLaw()->getNumParameters(), 1);
586ok($m->getReaction($Rk-1)->getKineticLaw()->getNumLocalParameters(), 1);
587ok($m->getReaction($Rk-1)->getKineticLaw()
588   ->getParameter(0)->getTypeCode() == $LibSBML::SBML_LOCAL_PARAMETER);
589
590# create KineticLawParameter noReaction
591$mNO = new LibSBML::Model($level,$version);
592ok($mNO->getTypeCode() == $LibSBML::SBML_MODEL);
593ok($mNO->getNumReactions(), 0);
594ok($mNO->createKineticLawParameter(), undef);
595ok($mNO->createKineticLawLocalParameter(), undef);
596
597# create KineticLawParameter noKineticLaw
598ok($m->createReaction()->getKineticLaw(), undef); $Rk++;
599ok($m->createKineticLawParameter(), undef);
600ok($m->createKineticLawLocalParameter(), undef);
601
602# create Event
603my $e = $m->createEvent();
604$e->setId('event_0');
605my $t = new LibSBML::Trigger($level,$version);
606$t->setMath(LibSBML::parseFormula("lambda(x,x^3)"));
607$t->setInitialValue(0);
608$t->setPersistent(0);
609$e->setTrigger($t);
610$e->createEventAssignment();
611ok($e->getTypeCode() == $LibSBML::SBML_EVENT);
612ok($m->getNumEvents(), 1);
613ok($m->getEvent(0)->getTypeCode() == $LibSBML::SBML_EVENT);
614
615# add/get Event
616$e = new LibSBML::Event($level,$version);
617$e->setId('event_1');
618$e->setTrigger($t);
619$e->createEventAssignment();
620$e->setUseValuesFromTriggerTime(1);
621ok($e->hasRequiredElements());
622ok($e->hasRequiredAttributes());
623ok($m->addEvent($e), $LibSBML::LIBSBML_OPERATION_SUCCESS);
624
625$m->getEvent(1)->setId('event_1');
626$m->getEvent(1)->setName('event_2');
627$e = new LibSBML::Event($level,$version);
628$e->setId('event_2');
629$e->setTrigger($t);
630$e->setUseValuesFromTriggerTime(1);
631$e->createEventAssignment();
632$m->addEvent($e);
633$m->getEvent(2)->setId('event_2');
634$m->getEvent(2)->setName('event_1');
635ok($m->getNumEvents(), 3);
636ok($m->getEvent(0)->getTypeCode() == $LibSBML::SBML_EVENT);
637ok($m->getEvent(0)->getId(), 'event_0');
638ok($m->getEvent(0)->getName(), '');
639ok($m->getEvent(1)->getTypeCode() == $LibSBML::SBML_EVENT);
640ok($m->getEvent(1)->getId(), 'event_1');
641ok($m->getEvent(1)->getName(), 'event_2');
642ok($m->getEvent(2)->getTypeCode() == $LibSBML::SBML_EVENT);
643ok($m->getEvent(2)->getId(), 'event_2');
644ok($m->getEvent(2)->getName(), 'event_1');
645ok($m->getEvent(3),  undef);
646
647# add/get Event with delay
648$e = new LibSBML::Event($level,$version);
649$e->setId('event_new');
650$e->setTrigger($t);
651my $del = new LibSBML::Delay($level,$version);
652$del->setMath(LibSBML::parseFormula("1"));
653$e->setDelay($del);
654$e->setUseValuesFromTriggerTime(1);
655$m->addEvent($e);
656$m->getEvent(3)->setId('event_1');
657ok($m->getNumEvents(), 4);
658ok($m->getEvent(3)->getTypeCode() == $LibSBML::SBML_EVENT);
659ok($m->getEvent(3)->getId(), 'event_1');
660
661# get EventById
662ok($m->getEvent('event_1')->getName(), $m->getEvent(2)->getId());
663ok($m->getEvent('event_2')->getName(), $m->getEvent(1)->getId());
664ok($m->getEvent('event_3'), undef);
665
666# create EventAssignment
667$m->createEvent();
668$m->getEvent(3)->setId('event_3');
669$m->getEvent(3)->setTrigger($t);
670my $ea = $m->createEventAssignment();
671ok($ea->getTypeCode() == $LibSBML::SBML_EVENT_ASSIGNMENT);
672ok($m->getNumEvents(), 5);
673ok($m->getEvent(4)->getNumEventAssignments(), 1);
674ok($m->getEvent(4)->getEventAssignment(0)->getTypeCode()
675   == $LibSBML::SBML_EVENT_ASSIGNMENT);
676
677# create EventAssignment noEvent
678$mNO = new LibSBML::Model($level,$version);
679ok($mNO->getTypeCode() == $LibSBML::SBML_MODEL);
680ok($mNO->getNumEvents(), 0);
681ok($mNO->createEventAssignment(), undef);
682__END__
683