#!/usr/bin/python from gi.repository import GObject from gi.repository import Gtk import html import xml.etree.ElementTree class PassingTest: def __init__(self, elm): self.time = elm.attrib["time"] def timestr(self): (m, s) = divmod(int(self.time), 60) res = [ f"{s} second{'' if s == 1 else 's'}" ] if m > 0: res.insert(0, f"{m} minute{'' if m == 1 else 's'}") return ' and '.join(res) class SkippedTest: def __init__(self, elm): self.time = elm.attrib["time"] self.message = elm[0].attrib["message"] class FailedTest: def __init__(self, elm): self.time = elm.attrib["time"] self.system_out = Gtk.TextBuffer() self.system_err = Gtk.TextBuffer() for e in elm: match e.tag: case "failure": self.message = e.attrib["message"] case "system-out": self.system_out.set_text(html.unescape(e.text)) case "system-err": self.system_err.set_text(html.unescape(e.text)) class TestCase(GObject.GObject): def __init__(self, name): GObject.GObject.__init__(self) self.name = name self.versions = dict() def __getitem__(self, key): return self.versions.get(key, None) def __setitem__(self, key, value): self.versions[key] = value class TestResults: def __init__(self, testdir): self.versions = [ ] self.tests = dict() self.properties = dict() self.skipped = set() for file in sorted(testdir.iterdir()): self.versions.append(file.stem) passed = 0 root = xml.etree.ElementTree.parse(file).getroot() for prop in root.attrib.keys(): self.set_property(prop, file.stem, root.attrib[prop]) for elm in root: if elm.tag == "properties": for prop in elm: self.set_property(prop.attrib["name"], file.stem, prop.attrib["value"]) elif elm.tag == "testcase": if len(elm) == 0: result = PassingTest(elm) passed += 1 elif elm[0].tag == "skipped": result = SkippedTest(elm) self.skipped.add(result.message) elif elm[0].tag == "failure": result = FailedTest(elm) self.add_testcase(elm.attrib["name"], file.stem, result) self.set_property("passed", file.stem, str(passed)) def set_property(self, name, vers, value): self.properties.setdefault(vers, dict())[name.upper()] = value def add_testcase(self, name, vers, result): self.tests.setdefault(name, TestCase(name))[vers] = result