END_TEST START_TEST (test_getUnitDefinition_power_one_child) { ASTNode * node = new ASTNode(AST_POWER); ASTNode * c = new ASTNode(AST_NAME); c->setName("k"); node->addChild(c); UnitDefinition * ud = NULL; ud = uff->getUnitDefinition(node); fail_unless(uff->getContainsUndeclaredUnits() == true); fail_unless(uff->canIgnoreUndeclaredUnits() == false); fail_unless(ud != NULL); fail_unless(ud->getNumUnits() == 1); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE); fail_unless(util_isEqual(ud->getUnit(0)->getExponent(), 1)); delete node; delete ud; }
END_TEST START_TEST (test_CalcUnitDefinition_assignmentRule1) { UnitDefinition *fud = m->getParameter("e")->getDerivedUnitDefinition(); fail_unless(fud->getNumUnits() == 0); m->getParameter("e")->setCalculatingUnits(true); fud = m->getParameter("e")->getDerivedUnitDefinition(); m->getParameter("e")->setCalculatingUnits(false); fail_unless(fud->getNumUnits() == 2); fail_unless(!strcmp(fud->getId().c_str(), ""), NULL); fail_unless(fud->getUnit(0)->getMultiplier() == 1); fail_unless(fud->getUnit(0)->getScale() == 0); fail_unless(fud->getUnit(0)->getExponent() == 1); fail_unless(fud->getUnit(0)->getOffset() == 0.0); fail_unless(fud->getUnit(0)->getKind() == UNIT_KIND_METRE); fail_unless(fud->getUnit(1)->getMultiplier() == 1); fail_unless(fud->getUnit(1)->getScale() == 0); fail_unless(fud->getUnit(1)->getExponent() == -1); fail_unless(fud->getUnit(1)->getOffset() == 0.0); fail_unless(fud->getUnit(1)->getKind() == UNIT_KIND_SECOND); delete fud; }
END_TEST START_TEST (test_DerivedUnitDefinition_event) { UnitDefinition *fud = m->getEvent(0)->getEventAssignment(0)->getDerivedUnitDefinition(); bool undecl = m->getEvent(0)->getEventAssignment(0)->containsUndeclaredUnits(); fail_unless(undecl == 1); fail_unless(fud->getNumUnits() == 2); fail_unless(!strcmp(fud->getId().c_str(), ""), NULL); fail_unless(fud->getUnit(0)->getMultiplier() == 1); fail_unless(fud->getUnit(0)->getScale() == 0); fail_unless(fud->getUnit(0)->getExponent() == 1); fail_unless(fud->getUnit(0)->getOffset() == 0.0); fail_unless(fud->getUnit(0)->getKind() == UNIT_KIND_METRE); fail_unless(fud->getUnit(1)->getMultiplier() == 1); fail_unless(fud->getUnit(1)->getScale() == 0); fail_unless(fud->getUnit(1)->getExponent() == -1); fail_unless(fud->getUnit(1)->getOffset() == 0.0); fail_unless(fud->getUnit(1)->getKind() == UNIT_KIND_SECOND); }
END_TEST START_TEST (test_DerivedUnitDefinition_parameter) { UnitDefinition *fud = m->getParameter(0)->getDerivedUnitDefinition(); fail_unless(fud->getNumUnits() == 2); fail_unless(!strcmp(fud->getId().c_str(), ""), NULL); fail_unless(fud->getUnit(0)->getMultiplier() == 1); fail_unless(fud->getUnit(0)->getScale() == 0); fail_unless(fud->getUnit(0)->getExponent() == 1); fail_unless(fud->getUnit(0)->getOffset() == 0.0); fail_unless(fud->getUnit(0)->getKind() == UNIT_KIND_METRE); fail_unless(fud->getUnit(1)->getMultiplier() == 1); fail_unless(fud->getUnit(1)->getScale() == 0); fail_unless(fud->getUnit(1)->getExponent() == -1); fail_unless(fud->getUnit(1)->getOffset() == 0.0); fail_unless(fud->getUnit(1)->getKind() == UNIT_KIND_SECOND); fud = m->getParameter(1)->getDerivedUnitDefinition(); fail_unless(fud->getNumUnits() == 0); fail_unless(!strcmp(fud->getId().c_str(), ""), NULL); }
END_TEST #if (0) START_TEST (test_getUnitDefinition_power_minus_double_exponent) { ASTNode * node = new ASTNode(AST_POWER); ASTNode * c = new ASTNode(AST_NAME); c->setName("k"); ASTNode * c1 = new ASTNode(AST_REAL); c1->setValue(0.3); ASTNode * c2 = new ASTNode(AST_MINUS); c2->addChild(c1); node->addChild(c); node->addChild(c2); UnitDefinition * ud = NULL; ud = uff->getUnitDefinition(node); fail_unless(uff->getContainsUndeclaredUnits() == false); fail_unless(uff->canIgnoreUndeclaredUnits() == false); fail_unless(ud != NULL); fail_unless(ud->getNumUnits() == 1); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE); fail_unless(util_isEqual(ud->getUnit(0)->getExponentAsDouble(), -0.3)); delete node; delete ud; }
END_TEST #endif START_TEST (test_getUnitDefinition_power_dim_param_exponent) { ASTNode * node = new ASTNode(AST_POWER); ASTNode * c = new ASTNode(AST_NAME); c->setName("k"); ASTNode * c1 = new ASTNode(AST_NAME); c1->setName("a"); node->addChild(c); node->addChild(c1); UnitDefinition * ud = NULL; ud = uff->getUnitDefinition(node); fail_unless(uff->getContainsUndeclaredUnits() == false); fail_unless(uff->canIgnoreUndeclaredUnits() == false); fail_unless(ud != NULL); fail_unless(ud->getNumUnits() == 1); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE); fail_unless(util_isEqual(ud->getUnit(0)->getExponentAsDouble(), 3.5)); delete node; delete ud; }
END_TEST START_TEST(test_unitdefinition_divide2) { UnitDefinition* ud = new UnitDefinition(2, 2); UnitDefinition* ud1 = new UnitDefinition(2, 2); UnitDefinition* udTemp; Unit* u = ud->createUnit(); u->setKind(UNIT_KIND_METRE); Unit* u1 = ud1->createUnit(); u1->setKind(UNIT_KIND_MOLE); udTemp = UnitDefinition::divide(ud, ud1); fail_unless(udTemp->getNumUnits() == 2); fail_unless(udTemp->getUnit(0)->getKind() == UNIT_KIND_METRE); fail_unless(udTemp->getUnit(1)->getKind() == UNIT_KIND_MOLE); fail_unless(udTemp->getUnit(1)->getExponent() == -1); fail_unless(udTemp->getLevel() == 2); fail_unless(udTemp->getVersion() == 2); delete ud1; delete ud; delete udTemp; }
END_TEST START_TEST (test_CalcUnitDefinition_local1) { UnitDefinition *fud = m->getReaction("R5")->getKineticLaw() ->getLocalParameter(0)->getDerivedUnitDefinition(); fail_unless(fud->getNumUnits() == 0); m->getReaction("R5")->getKineticLaw() ->getLocalParameter(0)->setCalculatingUnits(true); fud = m->getReaction("R5")->getKineticLaw() ->getLocalParameter(0)->getDerivedUnitDefinition(); m->getReaction("R5")->getKineticLaw() ->getLocalParameter(0)->setCalculatingUnits(false); fail_unless(fud->getNumUnits() == 1); fail_unless(!strcmp(fud->getId().c_str(), ""), NULL); fail_unless(fud->getUnit(0)->getMultiplier() == 1); fail_unless(fud->getUnit(0)->getScale() == 0); fail_unless(fud->getUnit(0)->getExponent() == 1); fail_unless(fud->getUnit(0)->getOffset() == 0.0); fail_unless(fud->getUnit(0)->getKind() == UNIT_KIND_SECOND); }
END_TEST START_TEST (test_UnitFormulaFormatter2_getUnitDefinition_model_extent) { UnitDefinition * ud = NULL; /* model extent units */ ud = uff->getExtentUnitDefinition(); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); /* check deals with invalid nodes */ delete ud; UnitDefinition * ud1 = NULL; m->unsetExtentUnits(); ud1 = uff->getExtentUnitDefinition(); fail_unless (ud1->getNumUnits() == 0); delete ud1; }
END_TEST START_TEST (test_UnitFormulaFormatter_getUnitDefinition_plus) { UnitDefinition * ud = new UnitDefinition(2, 4); ud = uff->getUnitDefinition(m->getRule(3)->getMath()); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE); /* check an invalid node */ delete ud; UnitDefinition * ud1 = new UnitDefinition(m->getLevel(), m->getVersion()); ASTNode *node = new ASTNode(AST_PLUS); ud1 = uff->getUnitDefinition(node); fail_unless (ud1->getNumUnits() == 0); delete ud1; delete node; }
std::string Expression2PresentationMMLUnits::getMathML(const UnitDefinition & ud) const { std::string tmp; /*tmp += "<mrow>"; unsigned int i, imax = ud.getNumUnits(); for (i=0; i<imax; ++i) { if (i) tmp += "<mo>·</mo>"; tmp += getMathML(ud.getUnit(i), false); } tmp += "</mrow>";*/ tmp += "<mrow>"; bool isFirst = true; unsigned int i, imax = ud.getNumUnits(); for (i = 0; i < imax; ++i) { if (ud.getUnit(i)->getExponent() >= 0) { if (!isFirst) tmp += "<mo>·</mo>"; tmp += getMathML(ud.getUnit(i), true); isFirst = false; } } if (isFirst) tmp += "<mn>1</mn>"; //there are no units with pos. exponent std::string tmp2; isFirst = true; for (i = 0; i < imax; ++i) { if (ud.getUnit(i)->getExponent() < 0) { if (!isFirst) tmp2 += "<mo>·</mo>"; tmp2 += getMathML(ud.getUnit(i), true); isFirst = false; } } if (!isFirst) tmp += "<mo>/</mo>" + tmp2; //only create fraction when there is a denominator tmp += "</mrow>"; return tmp; }
END_TEST START_TEST (test_infer_localParam_fromReaction) { string filename(TestDataDirectory); filename += "inferUnits-3.xml"; SBMLDocument* d = readSBMLFromFile(filename.c_str()); fail_unless(d != NULL); LocalParameter * p = d->getModel()->getReaction(1)-> getKineticLaw()->getLocalParameter("k2"); fail_unless(p->isSetUnits() == false); p->setCalculatingUnits(true); UnitDefinition *ud = p->getDerivedUnitDefinition(); fail_unless(ud->getNumUnits() == 1); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == -1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_SECOND); delete ud; // TO DO make the units converter do local parameters; //fail_unless(d->getModel()->getNumUnitDefinitions() == 3); // //SBMLInferUnitsConverter * units = new SBMLInferUnitsConverter(); //units->setDocument(d); //fail_unless (units->convert() == LIBSBML_OPERATION_SUCCESS); //kl = d->getModel()->getReaction(1)->getKineticLaw(); //fail_unless(kl->getLocalParameter("k2")->isSetUnits() == true); //fail_unless(kl->getLocalParameter("k2")->getUnits() == "per_time"); //delete units; delete d; }
END_TEST START_TEST (test_infer_newUD) { string filename(TestDataDirectory); filename += "inferUnits.xml"; SBMLDocument* d = readSBMLFromFile(filename.c_str()); fail_unless(d != NULL); fail_unless(d->getModel()->getParameter("b")->isSetUnits() == false); fail_unless(d->getModel()->getNumUnitDefinitions() == 1); SBMLInferUnitsConverter * units = new SBMLInferUnitsConverter(); units->setDocument(d); fail_unless (units->convert() == LIBSBML_OPERATION_SUCCESS); fail_unless(d->getModel()->getParameter("b")->isSetUnits() == true); fail_unless(d->getModel()->getParameter("b")->getUnits() == "unitSid_0"); fail_unless(d->getModel()->getNumUnitDefinitions() == 2); UnitDefinition *ud = d->getModel()->getUnitDefinition(1); fail_unless(ud->getId() == "unitSid_0"); fail_unless(ud->getNumUnits() == 2); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_LITRE); fail_unless(ud->getUnit(1)->getMultiplier() == 1); fail_unless(ud->getUnit(1)->getScale() == 0); fail_unless(ud->getUnit(1)->getExponent() == 1); fail_unless(ud->getUnit(1)->getOffset() == 0.0); fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_METRE); delete units; delete d; }
END_TEST START_TEST (test_UnitFormulaFormatter_getUnitDefinition_root) { UnitDefinition * ud = new UnitDefinition(2, 4); ud = uff->getUnitDefinition(m->getRule(8)->getMath()); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_VOLT); delete ud; }
/* * Eliminate all dimensionless units from the given UnitDefinition. * A new UnitDefinition without the dimensionless units is returned. * The scale and multiplier are preserved. If the UnitDefinition has only * one unit the is a dimensionless, it is not deleted. * @param UnitDefinition* pUdef * @return UnitDefinition* result */ LIBSBML_EXTERN UnitDefinition* UnitConversionFactory::eliminateDimensionless(UnitDefinition* pUdef) { unsigned int maxUnits = pUdef->getNumUnits(); UnitDefinition* pTmpUdef = NULL; Unit* pU = NULL; if (maxUnits > 1) { int scale = 0; double multiplier = 1.0; unsigned int i = 0; pTmpUdef = new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION); while (i < maxUnits) { pU = new Unit(*(pUdef->getUnit(i))); if (pU->getKind() != UNIT_KIND_DIMENSIONLESS) { pTmpUdef->addUnit(pU); } else { // conserve scale and multiplier scale = scale + pU->getScale(); multiplier = multiplier * pU->getMultiplier(); } delete pU; ++i; } i = pTmpUdef->getNumUnits(); if (i > 0 && i < maxUnits) { pTmpUdef->setName(pUdef->getName()); pTmpUdef->setId(pUdef->getId()); pU = pTmpUdef->getUnit(0); pU->setScale(pU->getScale() + scale); pU->setMultiplier(pU->getMultiplier()*multiplier); } else { delete pTmpUdef; pTmpUdef = NULL; } } return pTmpUdef; }
END_TEST START_TEST (test_CalcUnitDefinition_global_with_local_known) { UnitDefinition *fud = m->getParameter("q")->getDerivedUnitDefinition(); fail_unless(fud->getNumUnits() == 0); m->getParameter("q")->setCalculatingUnits(true); fud = m->getParameter("q")->getDerivedUnitDefinition(); m->getParameter("q")->setCalculatingUnits(false); fail_unless(fud->getNumUnits() == 1); fail_unless(!strcmp(fud->getId().c_str(), ""), NULL); fail_unless(fud->getUnit(0)->getMultiplier() == 1); fail_unless(fud->getUnit(0)->getScale() == 0); fail_unless(fud->getUnit(0)->getExponent() == 1); fail_unless(fud->getUnit(0)->getOffset() == 0.0); fail_unless(fud->getUnit(0)->getKind() == UNIT_KIND_LITRE); }
/* * Returns a string representation of the given Unit. THis function is * only for debugging purposes. * @param const UnitDefinition& uDef * @return std::string unitDefinitionRepresentation */ LIBSBML_EXTERN std::string UnitConversionFactory::toString(const UnitDefinition& uDef) { unsigned int maxUnits = uDef.getNumUnits(); unsigned int i; std::stringstream ss; for (i = 0; i < maxUnits; ++i) { ss << "(" << UnitConversionFactory::toString(*(uDef.getUnit(i))) << ") "; } return ss.str(); }
END_TEST START_TEST (test_UnitFormulaFormatter2_getUnitDefinition_event) { UnitDefinition * ud = NULL; /* event with no time units */ ud = uff->getUnitDefinitionFromEventTime(m->getEvent(0)); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 60); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_SECOND); /* check deals with invalid nodes */ delete ud; UnitDefinition * ud1 = NULL; Event *e = new Event(m->getLevel(), m->getVersion()); e->setId("p"); m->unsetTimeUnits(); ud1 = uff->getUnitDefinitionFromEventTime(e); fail_unless (ud1->getNumUnits() == 0); delete e; delete ud1; }
END_TEST START_TEST(test_unitdefinition_order) { UnitDefinition* ud = new UnitDefinition(2, 4); Unit* u = new Unit(2, 4); u->setKind(UNIT_KIND_METRE); Unit* u1 = new Unit(2, 4); u1->setKind(UNIT_KIND_AMPERE); Unit* u2 = new Unit(2, 4); u2->setKind(UNIT_KIND_HERTZ); ud->addUnit(u); ud->addUnit(u1); ud->addUnit(u2); UnitDefinition::reorder(ud); fail_unless(ud->getNumUnits() == 3); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE); fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_HERTZ); fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_METRE); /* NULL case*/ ud = NULL; UnitDefinition::reorder(ud); fail_unless(ud == NULL); delete u; delete u1; delete u2; delete ud; }
END_TEST START_TEST (test_UnitFormulaFormatter_getUnitDefinition_piecewise) { UnitDefinition * ud = new UnitDefinition(2, 4); ud = uff->getUnitDefinition(m->getRule(7)->getMath()); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE); /* check deals with invalid nodes */ delete ud; UnitDefinition * ud1 = new UnitDefinition(m->getLevel(), m->getVersion()); ASTNode *node = new ASTNode(AST_FUNCTION_PIECEWISE); ud1 == uff->getUnitDefinition(node); fail_unless (ud1->getNumUnits() == 0); ASTNode *c = new ASTNode(AST_UNKNOWN); node->addChild(c); ud1 == uff->getUnitDefinition(node); fail_unless (ud1->getNumUnits() == 0); delete ud1; delete node; }
END_TEST START_TEST (test_DerivedUnitDefinition_reaction) { UnitDefinition *fud = m->getReaction(0)->getKineticLaw()->getDerivedUnitDefinition(); bool undecl = m->getReaction(0)->getKineticLaw()->containsUndeclaredUnits(); fail_unless(undecl == 0); fail_unless(fud->getNumUnits() == 2); fail_unless(!strcmp(fud->getId().c_str(), ""), NULL); fail_unless(fud->getUnit(0)->getMultiplier() == 1); fail_unless(fud->getUnit(0)->getScale() == 0); fail_unless(fud->getUnit(0)->getExponent() == 1); fail_unless(fud->getUnit(0)->getOffset() == 0.0); fail_unless(fud->getUnit(0)->getKind() == UNIT_KIND_MOLE); fail_unless(fud->getUnit(1)->getMultiplier() == 1); fail_unless(fud->getUnit(1)->getScale() == 0); fail_unless(fud->getUnit(1)->getExponent() == -1); fail_unless(fud->getUnit(1)->getOffset() == 0.0); fail_unless(fud->getUnit(1)->getKind() == UNIT_KIND_SECOND); fud = m->getReaction(0)->getReactant(0)->getStoichiometryMath()->getDerivedUnitDefinition(); undecl = m->getReaction(0)->getReactant(0)->getStoichiometryMath()->containsUndeclaredUnits(); fail_unless(undecl == 1); fail_unless(fud->getNumUnits() == 0); fail_unless(!strcmp(fud->getId().c_str(), ""), NULL); }
END_TEST START_TEST (test_CalcUnitDefinition_priority) { UnitDefinition *fud = m->getParameter("m")->getDerivedUnitDefinition(); fail_unless(fud->getNumUnits() == 0); m->getParameter("m")->setCalculatingUnits(true); fud = m->getParameter("m")->getDerivedUnitDefinition(); m->getParameter("m")->setCalculatingUnits(false); fail_unless(fud->getNumUnits() == 1); fail_unless(!strcmp(fud->getId().c_str(), ""), NULL); fail_unless(fud->getUnit(0)->getMultiplier() == 1); fail_unless(fud->getUnit(0)->getScale() == 0); fail_unless(fud->getUnit(0)->getExponent() == 1); fail_unless(fud->getUnit(0)->getOffset() == 0.0); fail_unless(fud->getUnit(0)->getKind() == UNIT_KIND_DIMENSIONLESS); delete fud; }
/* * The functions determins wether the given UnitDefinition contains only * units from the list given as the second argument. * @param const UnitDefinition& uDef * @param const ListOf& unitList * @return bool containsOnlyGivenUnits */ LIBSBML_EXTERN bool UnitConversionFactory::containsOnlyGivenUnits(const UnitDefinition& uDef, const ListOf& unitList) { bool result = true; UnitDefinition* pTmpUdef = UnitConversionFactory::convertToSI(uDef); if (pTmpUdef) { unsigned int i; unsigned int maxUnits = pTmpUdef->getNumUnits(); for (i = 0; i < maxUnits; ++i) { Unit* pU = pTmpUdef->getUnit(i); UnitKind_t kind = pU->getKind(); unsigned int j; unsigned int maxUnits2 = unitList.size(); bool found = false; for (j = 0; j < maxUnits2; ++j) { const Unit* pU2 = dynamic_cast<const Unit*>(unitList.get(j)); if (!pU2) break; if (pU2->getKind() == kind) { found = true; break; } } if (!found) { result = false; break; } } delete pTmpUdef; } else { result = false; } return result; }
END_TEST START_TEST ( test_Unit_parent_create ) { UnitDefinition* ud = new UnitDefinition(2, 4); Unit * u = ud->createUnit(); fail_unless(ud->getNumUnits() == 1); ListOf *lo = ud->getListOfUnits(); fail_unless(lo == ud->getUnit(0)->getParentSBMLObject()); fail_unless(lo == u->getParentSBMLObject()); fail_unless(ud == lo->getParentSBMLObject()); delete ud; }
double SbmlReader::unitsforRates() { double lvalue =1; for (unsigned int n=0; n < model_->getNumUnitDefinitions(); n++) { UnitDefinition * ud = model_->getUnitDefinition(n); for (unsigned int ut=0; ut <ud->getNumUnits(); ut++) { Unit * unit = ud->getUnit(ut); if (ud->getId() == "substance") { if ( unit->isMole() ) { double exponent = unit->getExponent(); double multiplier = unit->getMultiplier(); int scale = unit->getScale(); double offset = unit->getOffset(); lvalue *= pow( multiplier * pow(10.0,scale), exponent ) + offset; return lvalue; } } } } return lvalue; }//unitforRates
END_TEST START_TEST (test_unitdefinition_simplify1) { UnitDefinition *ud = new UnitDefinition(2, 1); Unit * u = ud->createUnit(); u->setKind(UNIT_KIND_MOLE); Unit * u1 = ud->createUnit(); u1->setKind(UNIT_KIND_MOLE); u1->setExponent(-1); UnitDefinition::simplify(ud); fail_unless( ud->getNumUnits() == 1); fail_unless( ud->getUnit(0)->getKind() == UNIT_KIND_DIMENSIONLESS ); delete ud; }
END_TEST START_TEST (test_UnitFormulaFormatter2_getUnitDefinition_species_extent) { UnitDefinition * ud = NULL; /* model extent units + conversion on species*/ ud = uff->getSpeciesExtentUnitDefinition(m->getSpecies(0)); fail_unless(ud->getNumUnits() == 2); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); fail_unless(ud->getUnit(1)->getMultiplier() == 1); fail_unless(ud->getUnit(1)->getScale() == 0); fail_unless(ud->getUnit(1)->getExponent() == 1); fail_unless(ud->getUnit(1)->getOffset() == 0.0); fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_SECOND); delete ud; /* model extent units + conversion on model*/ ud = uff->getSpeciesExtentUnitDefinition(m->getSpecies(1)); fail_unless(ud->getNumUnits() == 2); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); fail_unless(ud->getUnit(1)->getMultiplier() == 1); fail_unless(ud->getUnit(1)->getScale() == 0); fail_unless(ud->getUnit(1)->getExponent() == 1); fail_unless(ud->getUnit(1)->getOffset() == 0.0); fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_SECOND); /* check deals with invalid nodes */ delete ud; UnitDefinition * ud1 = NULL; m->unsetConversionFactor(); ud1 = uff->getSpeciesExtentUnitDefinition(m->getSpecies(1)); fail_unless (ud1->getNumUnits() == 0); m->getSpecies(0)->unsetConversionFactor(); delete ud1; ud1 = uff->getSpeciesExtentUnitDefinition(m->getSpecies(0)); fail_unless (ud1->getNumUnits() == 0); m->getSpecies(0)->setConversionFactor("cf"); m->unsetExtentUnits(); delete ud1; ud1 = uff->getSpeciesExtentUnitDefinition(m->getSpecies(0)); fail_unless (ud1->getNumUnits() == 0); delete ud1; }
END_TEST START_TEST (test_UnitFormulaFormatter2_getUnitDefinition_function) { UnitDefinition * ud; /* function applied to numbers only */ ud = uff->getUnitDefinition(m->getRule(0)->getMath()); fail_unless(ud->getNumUnits() == 0); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); delete ud; /* function applied to components */ uff->resetFlags(); ud = uff->getUnitDefinition(m->getRule(1)->getMath()); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE); delete ud; /* function with two arguments but only one bvar */ uff->resetFlags(); ud = uff->getUnitDefinition(m->getRule(2)->getMath()); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 3); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE); delete ud; ///* function with two arguments but only one bvar */ uff->resetFlags(); ud = uff->getUnitDefinition(m->getRule(3)->getMath()); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == -1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_SECOND); delete ud; }
END_TEST START_TEST (test_UnitFormulaFormatter2_getUnitDefinition_parameter) { UnitDefinition * ud = NULL; /* parameter with declared standard units */ ud = uff->getUnitDefinitionFromParameter(m->getParameter(0)); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE); delete ud; /* parameter with declared units from unit definition */ ud = uff->getUnitDefinitionFromParameter(m->getParameter(1)); fail_unless(ud->getNumUnits() == 2); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE); fail_unless(ud->getUnit(1)->getMultiplier() == 1); fail_unless(ud->getUnit(1)->getScale() == 0); fail_unless(ud->getUnit(1)->getExponent() == -1); fail_unless(ud->getUnit(1)->getOffset() == 0.0); fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_SECOND); delete ud; /* parameter with no declared units */ ud = uff->getUnitDefinitionFromParameter(m->getParameter(2)); fail_unless(ud->getNumUnits() == 0); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); /* check deals with invalid nodes */ delete ud; UnitDefinition * ud1 = NULL; Parameter *p = new Parameter(m->getLevel(), m->getVersion()); p->setId("p"); p->setUnits("undefined"); ud1 = uff->getUnitDefinitionFromParameter(p); fail_unless (ud1->getNumUnits() == 0); delete p; delete ud1; }
END_TEST START_TEST (test_UnitFormulaFormatter2_getUnitDefinition_species) { UnitDefinition * ud = NULL; /* species with declared standard units for substance and comp with units*/ ud = uff->getUnitDefinitionFromSpecies(m->getSpecies(0)); fail_unless(ud->getNumUnits() == 2); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); fail_unless(ud->getUnit(1)->getMultiplier() == 1); fail_unless(ud->getUnit(1)->getScale() == 0); fail_unless(ud->getUnit(1)->getExponent() == -1); fail_unless(ud->getUnit(1)->getOffset() == 0.0); fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_LITRE); delete ud; ud = uff->getSpeciesSubstanceUnitDefinition(m->getSpecies(0)); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); delete ud; /* species with declared standard units for substance and hasOnlySubstanceUnits = 1*/ ud = uff->getUnitDefinitionFromSpecies(m->getSpecies(1)); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == -2); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); delete ud; ud = uff->getSpeciesSubstanceUnitDefinition(m->getSpecies(1)); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == -2); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); delete ud; /* species with units from model substance*/ ud = uff->getUnitDefinitionFromSpecies(m->getSpecies(2)); fail_unless(ud->getNumUnits() == 2); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); fail_unless(ud->getUnit(1)->getMultiplier() == 1); fail_unless(ud->getUnit(1)->getScale() == 0); fail_unless(ud->getUnit(1)->getExponent() == -1); fail_unless(ud->getUnit(1)->getOffset() == 0.0); fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_LITRE); delete ud; ud = uff->getSpeciesSubstanceUnitDefinition(m->getSpecies(2)); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); delete ud; /* species with declared standard units for substance and no spatialSizeUnits*/ ud = uff->getUnitDefinitionFromSpecies(m->getSpecies(3)); fail_unless(ud->getNumUnits() == 0); delete ud; ud = uff->getSpeciesSubstanceUnitDefinition(m->getSpecies(3)); fail_unless(ud->getNumUnits() == 1); fail_unless(!strcmp(ud->getId().c_str(), ""), NULL); fail_unless(ud->getUnit(0)->getMultiplier() == 1); fail_unless(ud->getUnit(0)->getScale() == 0); fail_unless(ud->getUnit(0)->getExponent() == 1); fail_unless(ud->getUnit(0)->getOffset() == 0.0); fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE); ///* check deals with invalid nodes */ delete ud; UnitDefinition * ud1 = NULL; Species *s = new Species(m->getLevel(), m->getVersion()); s->setId("s"); s->setUnits("undefined"); ud1 = uff->getUnitDefinitionFromSpecies(s); fail_unless (ud1->getNumUnits() == 0); delete ud1; ud1 = uff->getSpeciesSubstanceUnitDefinition(s); fail_unless (ud1->getNumUnits() == 0); s->setUnits("mole"); // here the compartment size will be NULL delete ud1; ud1 = uff->getUnitDefinitionFromSpecies(s); fail_unless (ud1->getNumUnits() == 1); delete ud1; ud1 = uff->getSpeciesSubstanceUnitDefinition(s); fail_unless (ud1->getNumUnits() == 1); delete s; delete ud1; }