#!/usr/bin/python """Extract test cases information from Cppcheck test file""" import sys import re class Extract: """Read Cppcheck test file and create data representation""" # array that stores all the test cases nodes = [] def parseFile(self,filename): """parse test file and add info to the nodes variable""" name = '[0-9a-zA-Z_]+' string = '\\"(.+)\\"' testclass = None functionName = None fin = open(filename, 'r') for line in fin: # testclass starts res = re.match('class ('+name+')', line) if res != None: testclass = res.group(1) # end of testclass if re.match('};', line) != None: testclass = None # function start res = re.match('\\s+void ('+name+')\\(\\)', line) if res != None: functionName = res.group(1) elif re.match('\\s+}', line) != None: functionName = None if functionName == None: continue # check res = re.match('\s+check\('+string, line) if res != None: code = res.group(1) # code.. res = re.match('\\s+'+string, line) if res != None: code = code + res.group(1) # assert res = re.match('\\s+ASSERT_EQUALS\\(\\"(.*)\\"', line) if res != None and len(code) > 10: node = { 'testclass':testclass, 'functionName':functionName, 'code':code, 'expected':res.group(1) } self.nodes.append(node) code = '' # close test file fin.close() def strtoxml(s): """Convert string to xml/html format""" return s.replace('&','&').replace('"', '"').replace('<','<').replace('>','>') def trimname(name): """Trim test name. Trailing underscore and digits are removed""" while name[-1].isdigit(): name = name[:-1] if name[-1] == '_': name = name[:-1] return name def writeHtmlFile(nodes, functionName, filename, errorsOnly): """Write html file for a function name""" fout = open(filename, 'w') fout.write('\n') fout.write('
\n') fout.write(' \n') fout.write('\n') fout.write('\n') fout.write('Home -- ') if errorsOnly: fout.write('All test cases') else: fout.write('Error test cases') fout.write('Nr | Code | Expected |
---|---|---|
' + str(num) + ' | ') fout.write('' + strtoxml(node['code']).replace('\\n', '\n') + ' | ')
fout.write('' + strtoxml(node['expected']).replace('\\n', ' ') + ' | ')
fout.write('
Name | Errors | All | |
---|---|---|---|
'+functionname+' | ') numall = 0 numerr = 0 for node in e.nodes: if trimname(node['functionName']) == functionname: numall = numall + 1 if node['expected'] != '': numerr = numerr + 1 if numerr == 0: findex.write('0 | ')
else:
findex.write('' + str(numerr) + ' | ')
findex.write('' + str(numall) + ' | ')
findex.write('