END_TEST START_TEST (test_element_selector) { const char* s = wrapMathML ( " <apply>" " <selector/>" " <ci> A </ci>" " <ci> i </ci>" " </apply>" ); N = readMathMLFromStringWithNamespaces(s, NS); fail_unless( N != NULL ); fail_unless( N->getType() == AST_ORIGINATES_IN_PACKAGE); fail_unless( N->getExtendedType() == AST_LINEAR_ALGEBRA_SELECTOR); fail_unless( N->getNumChildren() == 2); fail_unless( N->getPackageName() == "arrays"); ASTNode * child = N->getChild(0); fail_unless( child != NULL ); fail_unless( child->getType() == AST_NAME); fail_unless( child->getExtendedType() == AST_NAME); fail_unless( strcmp(child->getName(), "A") == 0); fail_unless( child->getNumChildren() == 0); fail_unless( child->getPackageName() == "core"); child = N->getChild(1); fail_unless( child != NULL ); fail_unless( child->getType() == AST_NAME); fail_unless( child->getExtendedType() == AST_NAME); fail_unless( strcmp(child->getName(), "i") == 0); fail_unless( child->getNumChildren() == 0); ArraysASTPlugin* plugin = static_cast<ArraysASTPlugin*>(N->getPlugin("arrays")); fail_unless(plugin != NULL); fail_unless(plugin->getASTType() == AST_LINEAR_ALGEBRA_SELECTOR); }
bool ArraysASTPlugin::hasCorrectNumberArguments(int type) const { bool correctNumArgs = true; ASTBase* function = const_cast<ASTBase*>(getMath()); // so getMath will only return teh node if it is a vector or matrix if (function == NULL) { function = const_cast<ASTBase*>(getParentASTObject()); if (function == NULL) { return false; } } // cast the function to an ASTNode ASTNode * newAST = dynamic_cast<ASTNode*>(function); // double check we are working with the right thing if (newAST == NULL) { return false; } else if (newAST->getExtendedType() != type) { return false; } unsigned int numChildren = newAST->getNumChildren(); switch (type) { case AST_LINEAR_ALGEBRA_SELECTOR: if (numChildren < 1 || numChildren > 3) { correctNumArgs = false; } break; default: break; } return correctNumArgs; }
bool ArraysASTPlugin::isWellFormedNode(int type) const { bool valid = hasCorrectNumberArguments(type); ASTBase* function = const_cast<ASTBase*>(getMath()); // so getMath will only return teh node if it is a vector or matrix if (function == NULL) { function = const_cast<ASTBase*>(getParentASTObject()); if (function == NULL) { return false; } } // cast the function to an ASTNode ASTNode * newAST = dynamic_cast<ASTNode*>(function); // double check we are working with the right thing if (newAST == NULL) { return false; } else if (newAST->getExtendedType() != type) { return false; } unsigned int numChildren = newAST->getNumChildren(); unsigned int i = 0; // check number of arguments while (valid && i < numChildren) { valid = newAST->getChild(i)->isWellFormedNode(); i++; } return valid; }
CK_CPPSTART START_TEST (test_element_vector) { const char* s = wrapMathML ( "<vector>" " <apply>" " <cos/>" " <cn type=\"integer\"> 5 </cn>" " </apply>" " <ci> y </ci>" "</vector>\n" ); N = readMathMLFromStringWithNamespaces(s, NS); fail_unless( N != NULL ); fail_unless( N->getType() == AST_ORIGINATES_IN_PACKAGE); fail_unless( N->getExtendedType() == AST_LINEAR_ALGEBRA_VECTOR_CONSTRUCTOR); fail_unless( N->getNumChildren() == 2); fail_unless( N->getPackageName() == "arrays"); ASTNode * child = N->getChild(0); fail_unless( child != NULL ); fail_unless( child->getType() == AST_FUNCTION_COS); fail_unless( child->getExtendedType() == AST_FUNCTION_COS); fail_unless( child->getNumChildren() == 1); fail_unless( child->getPackageName() == "core"); ASTNode *c1 = child->getChild(0); fail_unless( c1 != NULL ); fail_unless( c1->getType() == AST_INTEGER); fail_unless( c1->getExtendedType() == AST_INTEGER); fail_unless( c1->getNumChildren() == 0); fail_unless( c1->getInteger() == 5); child = N->getChild(1); fail_unless( child != NULL ); fail_unless( child->getType() == AST_NAME); fail_unless( child->getExtendedType() == AST_NAME); fail_unless( strcmp(child->getName(), "y") == 0); fail_unless( child->getNumChildren() == 0); ArraysASTPlugin* plugin = static_cast<ArraysASTPlugin*>(N->getPlugin("arrays")); fail_unless(plugin != NULL); fail_unless(plugin->getASTType() == AST_LINEAR_ALGEBRA_VECTOR_CONSTRUCTOR); plugin = static_cast<ArraysASTPlugin*>(child->getPlugin("arrays")); fail_unless(plugin != NULL); fail_unless(plugin->getASTType() == AST_ARRAYS_UNKNOWN); }
END_TEST START_TEST (test_element_matrix) { const char* s = wrapMathML ( "<matrix>" "<matrixrow>" "<apply>" "<cos/>" "<cn type=\"integer\"> 5 </cn>" "</apply>" "<ci> y </ci>" "</matrixrow>" "<matrixrow>" "<cn type=\"integer\"> 2 </cn>" "<apply>" "<cos/>" "<cn type=\"integer\"> 5 </cn>" "</apply>" "</matrixrow>" "</matrix>\n" ); N = readMathMLFromStringWithNamespaces(s, NS); fail_unless( N != NULL ); fail_unless( N->getType() == AST_ORIGINATES_IN_PACKAGE); fail_unless( N->getExtendedType() == AST_LINEAR_ALGEBRA_MATRIX_CONSTRUCTOR); fail_unless( N->getNumChildren() == 2); fail_unless( N->getPackageName() == "arrays"); ASTNode * child = N->getChild(0); fail_unless( child != NULL ); fail_unless( child->getType() == AST_ORIGINATES_IN_PACKAGE); fail_unless( child->getExtendedType() == AST_LINEAR_ALGEBRA_MATRIXROW_CONSTRUCTOR); fail_unless( child->getNumChildren() == 2); fail_unless( child->getPackageName() == "arrays"); ASTNode *c1 = child->getChild(0); fail_unless( c1 != NULL ); fail_unless( c1->getType() == AST_FUNCTION_COS); fail_unless( c1->getExtendedType() == AST_FUNCTION_COS); fail_unless( c1->getNumChildren() == 1); fail_unless( c1->getPackageName() == "core"); child = N->getChild(1); fail_unless( child != NULL ); fail_unless( child->getType() == AST_ORIGINATES_IN_PACKAGE); fail_unless( child->getExtendedType() == AST_LINEAR_ALGEBRA_MATRIXROW_CONSTRUCTOR); fail_unless( child->getNumChildren() == 2); fail_unless( child->getPackageName() == "arrays"); c1 = child->getChild(0); fail_unless( c1 != NULL ); fail_unless( c1->getType() == AST_INTEGER); fail_unless( c1->getExtendedType() == AST_INTEGER); fail_unless( c1->getNumChildren() == 0); fail_unless( c1->getInteger() == 2); ArraysASTPlugin* plugin = static_cast<ArraysASTPlugin*>(N->getPlugin("arrays")); fail_unless(plugin != NULL); fail_unless(plugin->getASTType() == AST_LINEAR_ALGEBRA_MATRIX_CONSTRUCTOR); }