more developments on the API testing more cleanups rebuilt Daniel
* gentest.py testapi.c: more developments on the API testing
* HTMLparser.c tree.c: more cleanups
* doc/*: rebuilt
Daniel
diff --git a/gentest.py b/gentest.py
index 7732d16..c74942c 100755
--- a/gentest.py
+++ b/gentest.py
@@ -21,6 +21,7 @@
# Some function really need to be skipped for the tests.
#
skipped_functions = [ "xmlFdRead", "xmlReadFd", "xmlCtxtReadFd",
+ "htmlFdRead", "htmlReadFd", "htmlCtxtReadFd",
"xmlCleanupParser" ]
#
@@ -31,7 +32,33 @@
"xmlSchemaInitTypes", "xmlNanoFTPProxy", "xmlNanoFTPScanProxy",
"xmlNanoHTTPScanProxy", "xmlResetLastError", "xmlCatalogConvert",
"xmlCatalogRemove", "xmlLoadCatalogs", "xmlCleanupCharEncodingHandlers",
- "xmlInitCharEncodingHandlers" ]
+ "xmlInitCharEncodingHandlers", "xmlCatalogCleanup",
+ "htmlParseFile" # loads the catalogs
+]
+
+#
+# Extra code needed for some test cases
+#
+extra_post_call = {
+ "xmlAddChild":
+ "if (ret_val == NULL) { xmlFreeNode(cur) ; cur = NULL ; }",
+ "xmlAddChildList":
+ "if (ret_val == NULL) { xmlFreeNodeList(cur) ; cur = NULL ; }",
+ "xmlAddSibling":
+ "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }",
+ "xmlAddNextSibling":
+ "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }",
+ "xmlAddPrevSibling":
+ "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }",
+ "xmlDocSetRootElement":
+ "if (doc == NULL) { xmlFreeNode(root) ; root = NULL ; }",
+ "xmlReplaceNode":
+ """if ((old == NULL) || (old->parent == NULL)) {
+ xmlFreeNode(cur) ; cur = NULL ; }""",
+ "xmlTextMerge":
+ """if ((first != NULL) && (first->type != XML_TEXT_NODE)) {
+ xmlFreeNode(second) ; second = NULL ; }""",
+}
modules = []
@@ -106,6 +133,8 @@
int ret;
int blocks, mem;
+ xmlInitParser();
+
LIBXML_TEST_VERSION
xmlSetStructuredErrorFunc(NULL, structured_errors);
@@ -161,9 +190,12 @@
# Provide the type generators and destructors for the parameters
#
-def type_convert(str, name, info, module, function):
+def type_convert(str, name, info, module, function, pos):
res = string.replace(str, " *", "_ptr")
res = string.replace(res, " ", "_")
+ res = string.replace(res, "htmlNode", "xmlNode")
+ res = string.replace(res, "htmlDoc", "xmlDoc")
+ res = string.replace(res, "htmlParser", "xmlParser")
if res == 'const_char_ptr':
if string.find(name, "file") != -1 or \
string.find(name, "uri") != -1 or \
@@ -179,11 +211,22 @@
return('xmlNanoFTPCtxtPtr')
if module == 'nanohttp' and name == 'ctx':
return('xmlNanoHTTPCtxtPtr')
+ if res == 'xmlNodePtr' and pos != 0:
+ if (function == 'xmlAddChild' and pos == 2) or \
+ (function == 'xmlAddChildList' and pos == 2) or \
+ (function == 'xmlAddNextSibling' and pos == 2) or \
+ (function == 'xmlAddSibling' and pos == 2) or \
+ (function == 'xmlDocSetRootElement' and pos == 2) or \
+ (function == 'xmlReplaceNode' and pos == 2) or \
+ (function == 'xmlTextMerge') or \
+ (function == 'xmlAddPrevSibling' and pos == 2):
+ return('xmlNodePtr_in');
return res
known_param_types = [ "int", "const_char_ptr", "const_xmlChar_ptr",
- "xmlParserCtxtPtr", "xmlDocPtr", "filepath", "fileoutput" ];
+ "xmlParserCtxtPtr", "xmlDocPtr", "filepath", "fileoutput" ,
+ "xmlNodePtr", "xmlNodePtr_in" ];
def is_known_param_type(name):
for type in known_param_types:
@@ -265,9 +308,10 @@
xmlFreeParserCtxt(val);
}
-#define gen_nb_xmlDocPtr 2
+#define gen_nb_xmlDocPtr 3
static xmlDocPtr gen_xmlDocPtr(int no) {
if (no == 0) return(xmlNewDoc(BAD_CAST "1.0"));
+ if (no == 1) return(xmlReadMemory("<foo/>", 6, "test", NULL, 0));
return(NULL);
}
static void des_xmlDocPtr(int no ATTRIBUTE_UNUSED, xmlDocPtr val) {
@@ -275,6 +319,27 @@
xmlFreeDoc(val);
}
+#define gen_nb_xmlNodePtr 2
+static xmlNodePtr gen_xmlNodePtr(int no) {
+ if (no == 0) return(xmlNewPI(BAD_CAST "test", NULL));
+ return(NULL);
+}
+static void des_xmlNodePtr(int no ATTRIBUTE_UNUSED, xmlNodePtr val) {
+ if (val != NULL) {
+ xmlUnlinkNode(val);
+ xmlFreeNode(val);
+ }
+}
+
+#define gen_nb_xmlNodePtr_in 3
+static xmlNodePtr gen_xmlNodePtr_in(int no) {
+ if (no == 0) return(xmlNewPI(BAD_CAST "test", NULL));
+ if (no == 0) return(xmlNewText(BAD_CAST "text"));
+ return(NULL);
+}
+static void des_xmlNodePtr_in(int no ATTRIBUTE_UNUSED, xmlNodePtr val ATTRIBUTE_UNUSED) {
+}
+
""");
#
@@ -364,13 +429,15 @@
except:
args = []
t_args = []
+ n = 0
for arg in args:
+ n = n + 1
rtype = arg.xpathEval("string(@type)")
if rtype == 'void':
break;
info = arg.xpathEval("string(@info)")
nam = arg.xpathEval("string(@name)")
- type = type_convert(rtype, nam, info, module, name)
+ type = type_convert(rtype, nam, info, module, name, n)
if is_known_param_type(type) == 0:
add_missing_type(type, name);
no_gen = 1
@@ -384,7 +451,7 @@
for ret in rets:
rtype = ret.xpathEval("string(@type)")
info = ret.xpathEval("string(@info)")
- type = type_convert(rtype, 'return', info, module, name)
+ type = type_convert(rtype, 'return', info, module, name, 0)
if rtype == 'void':
break
if is_known_return_type(type) == 0:
@@ -469,6 +536,9 @@
test.write(");\n")
test.write(" call_tests++;\n");
+ if extra_post_call.has_key(name):
+ test.write(" %s\n"% (extra_post_call[name]))
+
# Free the arguments
for arg in t_args:
(nam, type, rtype, info) = arg;
@@ -479,11 +549,15 @@
# Check the memory usage
if no_mem == 0:
test.write(""" if (mem_base != xmlMemBlocks()) {
- printf("Leak of %%d blocks found in %s\\n",
+ printf("Leak of %%d blocks found in %s",
xmlMemBlocks() - mem_base);
ret++;
- }
""" % (name));
+ for arg in t_args:
+ (nam, type, rtype, info) = arg;
+ test.write(""" printf(" %%d", n_%s);\n""" % (nam))
+ test.write(""" printf("\\n");\n""")
+ test.write(" }\n")
for arg in t_args:
test.write(" }\n")