1 import re 2 import sys 3 from xml.dom.minidom import Document 4 5 class TestCase: 6 def __init__(self, casePath, description, caseType): 7 self.casePath = casePath 8 self.description = description 9 self.caseType = caseType 10 self.children = [] 11 12 def findAllMatches(haystack, needle): 13 matches = [] 14 ndx = -1 15 while True: 16 ndx = haystack.find(needle, ndx+1) 17 if (ndx == -1): 18 break 19 matches.append(ndx) 20 return matches 21 22 def createAncestors(casePath): 23 parentCase = None 24 for dotNdx in findAllMatches(casePath, "."): 25 ancestorPath = casePath[:dotNdx] 26 if ancestorPath not in caseNameHash: 27 case = TestCase(ancestorPath, "Test Group", "TestGroup") 28 parentCase.children.append(case) 29 caseNameHash[ancestorPath] = case 30 parentCase = case 31 parentCase = caseNameHash[ancestorPath] 32 return parentCase 33 34 def exportCase (doc, parent, testCase): 35 #print testCase.name, testCase.caseType 36 element = doc.createElement("TestCase") 37 element.setAttribute("Name", testCase.casePath.rsplit(".", 2)[-1]) 38 element.setAttribute("Description", testCase.description) 39 element.setAttribute("CaseType", testCase.caseType) 40 parent.appendChild(element) 41 for child in testCase.children: 42 exportCase(doc, element, child) 43 44 # Main. 45 46 packageName = sys.argv[1] 47 48 rootCase = TestCase(packageName, packageName, "TestPackage" ) 49 caseNameHash = { packageName:rootCase } 50 caseRE = re.compile(r"^\s*([a-zA-Z0-9_\.\-]+) '([^']*)' (\w+)\s*$".replace(" ", r"\s+")) 51 52 lines = open(packageName + ".cases").readlines() 53 numMatches = 0 54 for line in lines: 55 line = line[:-1] 56 if line.startswith(packageName + "."): 57 m = caseRE.match(line) 58 if m: 59 casePath = m.group(1) 60 description = m.group(2) 61 caseType = m.group(3) 62 parent = createAncestors(casePath) 63 parent.children.append(TestCase(casePath, description, caseType)) 64 numMatches += 1 65 66 # Create XML document. 67 doc = Document() 68 element = doc.createElement("TestCaseList") 69 doc.appendChild(element) 70 for testCase in rootCase.children: 71 exportCase(doc, element, testCase) 72 73 # Dump XML document. 74 xml = doc.toprettyxml(indent=" ") 75 open(packageName + "-cases.xml", "wt").write(xml) 76 77 print "%d cases converted." % numMatches 78 79