summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Negreanu <groleo@gmail.com>2014-01-28 22:58:43 (GMT)
committerAdrian Negreanu <adrian.m.negreanu@intel.com>2014-02-01 20:14:45 (GMT)
commit733aaaa073a92a316ba888b6992f1172550dd469 (patch)
treec52715bb65870694b3efceab0d8f4986d893e8e1
parent6f38dd245d56aaa9b6c8e966a4ccebe2f66ceb7d (diff)
downloadDoxygen-733aaaa073a92a316ba888b6992f1172550dd469.zip
Doxygen-733aaaa073a92a316ba888b6992f1172550dd469.tar.gz
Doxygen-733aaaa073a92a316ba888b6992f1172550dd469.tar.bz2
testsqlite3: a test for sqlite3gen
This verifies the 'memberdef' table against the generated XMLs. It accomplishes this by executing a sql query, constructed by iterating through the children and attributes of the memberdef XML element. The information translated from xml to sql, is then removed from the DOM, and the unprocessed bits are printed as warning messages. usage: testing/testsqlite3.py -d /.../doxygen_sqlite3.db -x /.../xml/test__x11_8cpp.xml output: WARNING: 'location' has unprocessed attr 'bodyend' WARNING: 'memberdef' has unprocessed child elem 'briefdescription' WARNING: 'memberdef' has unprocessed child elem 'detaileddescription' WARNING: 'memberdef' has unprocessed child elem 'inbodydescription' WARNING: 'memberdef' has unprocessed child elem 'location' WARNING: 'memberdef' has unprocessed attr 'kind' WARNING: 'memberdef' has unprocessed attr 'prot' WARNING: 'memberdef' has unprocessed attr 'static' WARNING: 'memberdef' has unprocessed attr 'id'
-rwxr-xr-xtesting/testsqlite3.py146
1 files changed, 146 insertions, 0 deletions
diff --git a/testing/testsqlite3.py b/testing/testsqlite3.py
new file mode 100755
index 0000000..e8ab16c
--- /dev/null
+++ b/testing/testsqlite3.py
@@ -0,0 +1,146 @@
+#! /usr/bin/python
+from xml.etree import cElementTree as ET
+import os
+import sqlite3
+import sys
+import getopt
+
+# map XML attributes/elements to SQL rows
+# --POC: iterate through the children and attributes of the memberdef elelement
+# and search it in doxygen_sqlite3.db
+
+g_conn=None
+val=[]
+def print_unprocessed_attributes(node):
+ for key in node.attrib:
+ print "WARNING: '%s' has unprocessed attr '%s'" % (node.tag,key)
+
+def extract_attribute(node,attribute,pnl):
+ if not attribute in node.attrib:
+ return
+ pnl.append("%s = ?" % attribute)
+ val.append(node.attrib[attribute])
+ node.attrib.pop(attribute)
+
+def extract_element(node,chld,pnl):
+ # deal with <tag />
+ if chld.text == None:
+ if len(chld.attrib)==0:
+ node.remove(chld)
+ return
+
+ a=chld.text.strip()
+ if not a == "":
+ pnl.append("%s =?" % chld.tag)
+ val.append(chld.text.strip())
+ else:
+ pnl.append("%s IS NULL OR %s = ''" % (chld.tag,chld.tag))
+ node.remove(chld)
+
+def process_memberdef(node):
+ q=[]
+ for chld in node.getchildren():
+ if chld.tag == "referencedby":
+ continue
+ if chld.tag == "references":
+ continue
+ if chld.tag == "param":
+ continue
+ if chld.tag == "type":
+ continue
+ if chld.tag == "location":
+ extract_attribute(chld,"line",q)
+ extract_attribute(chld,"column",q)
+ extract_attribute(chld,"bodystart",q)
+ extract_attribute(chld,"bodyend",q)
+
+ q.append("id_bodyfile=(select id from files where name=?)")
+ val.append(chld.attrib["bodyfile"])
+ chld.attrib.pop("bodyfile")
+
+ q.append("id_file=(select id from files where name=?)")
+ val.append(chld.attrib["file"])
+ chld.attrib.pop("file")
+
+ print_unprocessed_attributes(chld)
+ if len(chld.attrib) == 0:
+ node.remove(chld)
+ else:
+ extract_element(node,chld,q)
+
+ for chld in node.getchildren():
+ print "WARNING: '%s' has unprocessed child elem '%s'" % (node.tag,chld.tag)
+
+ extract_attribute(node,"kind",q)
+ extract_attribute(node,"prot",q)
+ extract_attribute(node,"static",q)
+ extract_attribute(node,"mutable",q)
+ extract_attribute(node,"const",q)
+ extract_attribute(node,"virt",q)
+ extract_attribute(node,"explicit",q)
+ extract_attribute(node,"inline",q)
+
+ q.append("refid=?")
+ val.append(node.attrib['id'])
+ node.attrib.pop('id')
+
+ print_unprocessed_attributes(node)
+
+ query="SELECT * FROM memberdef WHERE %s" % " AND ".join(q)
+ r=[]
+ try:
+ r = g_conn.execute(query,val).fetchall()
+ except sqlite3.OperationalError,e:
+ print "SQL_ERROR:%s"%e
+
+ del val[:]
+ if not len(r) > 0:
+ print "TEST_ERROR: Member not found in SQL DB"
+
+
+def load_xml(name):
+ context = ET.iterparse(name, events=("start", "end"))
+ event, root = context.next()
+ for event, elem in context:
+ if event == "end" and elem.tag == "memberdef":
+ process_memberdef(elem)
+ print "\n== Unprocessed XML =="
+# ET.dump(root)
+
+
+def open_db(dbname):
+ global g_conn
+
+ if dbname == None:
+ dbname = "doxygen_sqlite3.db"
+
+ if not os.path.isfile(dbname):
+ raise BaseException("No such file %s" % dbname )
+
+ g_conn = sqlite3.connect(dbname)
+ g_conn.execute('PRAGMA temp_store = MEMORY;')
+ g_conn.row_factory = sqlite3.Row
+
+def main(argv):
+ try:
+ opts, args = getopt.getopt(argv, "hd:x:",["help"])
+ except getopt.GetoptError:
+ sys.exit(1)
+
+ dbname=None
+ xmlfile=None
+
+ for a, o in opts:
+ if a in ('-h', '--help'):
+ sys.exit(0)
+ elif a in ('-d'):
+ dbname=o
+ continue
+ elif a in ('-x'):
+ xmlfile=o
+ continue
+ open_db(dbname)
+ load_xml(xmlfile)
+
+if __name__ == '__main__':
+ main(sys.argv[1:])