END_TEST START_TEST (test_conversion_inlineFD_bug) { std::string filename = "/inline_bug_minimal.xml"; filename = TestDataDirectory + filename; SBMLDocument* doc = readSBMLFromFile(filename.c_str()); ConversionProperties props; props.addOption("expandFunctionDefinitions", "true"); fail_unless(doc->getModel() != NULL); fail_unless(doc->convert(props) == LIBSBML_OPERATION_SUCCESS); fail_unless(doc->getModel()->getNumReactions() == 1); fail_unless(doc->getModel()->getReaction(0)->isSetKineticLaw()); fail_unless(doc->getModel()->getReaction(0)->getKineticLaw()->getMath() != NULL); // all seems good ... write it const ASTNode * node = doc->getModel()->getReaction(0)->getKineticLaw()->getMath(); #ifndef LIBSBML_USE_LEGACY_MATH fail_unless(node->ASTBase::isChild() == false); #endif std::string math = writeMathMLToString(node); ASTNode* test = readMathMLFromString(math.c_str()); fail_unless(test != NULL); // additional test where the node being converted is the top-level fail_unless(doc->getModel()->getNumRules() == 1); fail_unless(doc->getModel()->getRule(0)->isSetMath()); fail_unless(doc->getModel()->getRule(0)->getMath() != NULL); node = doc->getModel()->getRule(0)->getMath(); #ifndef LIBSBML_USE_LEGACY_MATH fail_unless(node->ASTBase::isChild() == false); #endif math = writeMathMLToString(node); test = readMathMLFromString(math.c_str()); fail_unless(test != NULL); delete test; delete doc; }
END_TEST START_TEST (test_conversion_inlineIA_bug) { std::string filename = "/ia-ternary-lt.xml"; filename = TestDataDirectory + filename; SBMLDocument* doc = readSBMLFromFile(filename.c_str()); ConversionProperties props; props.addOption("expandInitialAssignments", "true"); fail_unless(doc->getModel() != NULL); fail_unless(doc->convert(props) == LIBSBML_OPERATION_SUCCESS); fail_unless(doc->getModel()->getNumInitialAssignments() == 0); fail_unless(doc->getModel()->getParameter("x")->isSetValue()); fail_unless(doc->getModel()->getParameter("x")->getValue() == 3); delete doc; }
END_TEST START_TEST (test_SBMLTransforms_expandFD) { std::string filename(TestDataDirectory); filename += "multiple-functions.xml"; // test 1: skip expansion of 'f' SBMLDocument *doc = readSBMLFromFile(filename.c_str()); ConversionProperties props; props.addOption("expandFunctionDefinitions", true); props.addOption("skipIds", "f"); fail_unless(doc->convert(props) == LIBSBML_OPERATION_SUCCESS); fail_unless(doc->getModel() != NULL); fail_unless(doc->getModel()->getNumFunctionDefinitions() == 1); fail_unless(doc->getModel()->getFunctionDefinition("f") != NULL); delete doc; // test 2: expand all doc = readSBMLFromFile(filename.c_str()); props = ConversionProperties(); props.addOption("expandFunctionDefinitions", true); fail_unless(doc->convert(props) == LIBSBML_OPERATION_SUCCESS); fail_unless(doc->getModel() != NULL); fail_unless(doc->getModel()->getNumFunctionDefinitions() == 0); delete doc; // test 3: don't expand f and g doc = readSBMLFromFile(filename.c_str()); props = ConversionProperties(); props.addOption("expandFunctionDefinitions", true); props.addOption("skipIds", "f,g"); fail_unless(doc->convert(props) == LIBSBML_OPERATION_SUCCESS); fail_unless(doc->getModel() != NULL); fail_unless(doc->getModel()->getNumFunctionDefinitions() == 2); delete doc; // test 4: even though comma separated is advertized, make sure that ';' works doc = readSBMLFromFile(filename.c_str()); props = ConversionProperties(); props.addOption("expandFunctionDefinitions", true); props.addOption("skipIds", "f;g"); fail_unless(doc->convert(props) == LIBSBML_OPERATION_SUCCESS); fail_unless(doc->getModel() != NULL); fail_unless(doc->getModel()->getNumFunctionDefinitions() == 2); delete doc; // test 5: or space doc = readSBMLFromFile(filename.c_str()); props = ConversionProperties(); props.addOption("expandFunctionDefinitions", true); props.addOption("skipIds", "f g"); fail_unless(doc->convert(props) == LIBSBML_OPERATION_SUCCESS); fail_unless(doc->getModel() != NULL); fail_unless(doc->getModel()->getNumFunctionDefinitions() == 2); delete doc; // test 6: or tab doc = readSBMLFromFile(filename.c_str()); props = ConversionProperties(); props.addOption("expandFunctionDefinitions", true); props.addOption("skipIds", "f\tg"); fail_unless(doc->convert(props) == LIBSBML_OPERATION_SUCCESS); fail_unless(doc->getModel() != NULL); fail_unless(doc->getModel()->getNumFunctionDefinitions() == 2); delete doc; // test 7: or a combination doc = readSBMLFromFile(filename.c_str()); props = ConversionProperties(); props.addOption("expandFunctionDefinitions", true); props.addOption("skipIds", "f; g"); fail_unless(doc->convert(props) == LIBSBML_OPERATION_SUCCESS); fail_unless(doc->getModel() != NULL); fail_unless(doc->getModel()->getNumFunctionDefinitions() == 2); delete doc; }
int main (int argc, char* argv[]) { char *line; char *result; char *buffer = (char*)calloc( 1, sizeof(char) ); unsigned long len; L3ParserSettings_t* settings; int reading = 1; SBMLDocument_t* doc = NULL; printf( "\n" ); printf( "This program translates infix formulas into MathML and\n" ); printf( "vice-versa. An 'enter' or a 'return' on an empty line\n" ); printf( "triggers translation.\n" ); printf( "\n" ); settings = L3ParserSettings_create(); while (reading) { printf( "Enter infix formula, MathML expression, \n"); printf( "or change parsing rules with the keywords:\n"); printf( "LOG_AS_LOG10, LOG_AS_LN, LOG_AS_ERROR, EXPAND_UMINUS, "); printf( "COLLAPSE_UMINUS, TARGETL2, TARGETL3, NO_UNITS, UNITS, "); printf( "or FILE:<filename>\n\n\n" ); printf( "> " ); do { line = trim_whitespace(get_line(stdin)); len = (unsigned int)strlen(line); if (len > 0) { buffer = (char *) realloc( buffer, 1 + strlen(buffer) + len ); if (strcmp(line, "LOG_AS_LOG10")==0) { L3ParserSettings_setParseLog(settings, L3P_PARSE_LOG_AS_LOG10); printf( "Now parsing 'log(x)' as 'log10(x)'\n\n> "); } else if (strcmp(line, "LOG_AS_LN")==0) { L3ParserSettings_setParseLog(settings, L3P_PARSE_LOG_AS_LN); printf( "Now parsing 'log(x)' as 'ln(x)'\n\n> "); } else if (strcmp(line, "LOG_AS_ERROR")==0) { L3ParserSettings_setParseLog(settings, L3P_PARSE_LOG_AS_ERROR); printf( "Now parsing 'log(x)' as an error\n\n> "); } else if (strcmp(line, "EXPAND_UMINUS")==0) { L3ParserSettings_setParseCollapseMinus(settings, 0); printf( "Will now leave multiple unary minuses expanded, "); printf("and all negative numbers will be translated using the "); printf("<minus> construct.\n\n> "); } else if (strcmp(line, "COLLAPSE_UMINUS")==0) { L3ParserSettings_setParseCollapseMinus(settings, 1); printf( "Will now collapse multiple unary minuses, and incorporate "); printf("a negative sign into digits.\n\n> "); } else if (strcmp(line, "NO_UNITS")==0) { L3ParserSettings_setParseUnits(settings, 0); printf( "Will now target MathML but with no units on numbers.\n\n> "); } else if (strcmp(line, "UNITS")==0) { L3ParserSettings_setParseUnits(settings, 1); printf( "Will now target MathML but with units on numbers.\n\n> "); } else if (line[0] == 'F' && line[1] == 'I' && line[2]=='L' && line[3]=='E' && line[4]==':') { int len = strlen(line); char *filename = (char*) malloc(len-5+1); strncpy(filename, line+5, len-5); SBMLDocument_free(doc); doc = readSBMLFromFile(filename); if (SBMLDocument_getModel(doc)==NULL) { printf( "File '%s' not found or no model present.", filename); printf( "Clearing the Model parsing object.\n\n> "); } else { printf( "Using model from file %s to parse infix:", filename); printf( "all symbols present in that model will not be translated "); printf( "as native MathML or SBML-defined elements.\n\n> ");; } L3ParserSettings_setModel(settings, SBMLDocument_getModel(doc)); } else { strncat(buffer, line, len); strncat(buffer, "\n", 1); } } else { result = (buffer[0] == '<') ? translateMathML(buffer) : translateInfix(buffer, settings); printf("Result:\n\n%s\n\n\n", result); free(result); reading = 0; } } while (len > 0); } free(line); return 0; }