Compare commits
3 Commits
4d36a33840
...
2ef3eea690
Author | SHA1 | Date |
---|---|---|
Anna Schumaker | 2ef3eea690 | |
Anna Schumaker | e5a8e46cd9 | |
Anna Schumaker | 31166081bf |
|
@ -39,9 +39,9 @@ class TestViewer(Gtk.Box):
|
||||||
SizeGroup.add_widget(self.switcher)
|
SizeGroup.add_widget(self.switcher)
|
||||||
|
|
||||||
def set_test_result(self, file):
|
def set_test_result(self, file):
|
||||||
self.stack.clear()
|
current = self.stack.clear()
|
||||||
self.viewer.clear()
|
self.viewer.clear()
|
||||||
if file and file.get_is_test_result():
|
if file and file.get_is_test_result():
|
||||||
results = testresults.TestResults(file.path)
|
results = testresults.TestResults(file.path)
|
||||||
self.stack.show_properties(results)
|
self.stack.show_properties(results, current)
|
||||||
self.viewer.show_results(results)
|
self.viewer.show_results(results)
|
||||||
|
|
|
@ -14,13 +14,22 @@ class Property(GObject.GObject):
|
||||||
self.value = value
|
self.value = value
|
||||||
|
|
||||||
|
|
||||||
|
class NotRun(GObject.GObject):
|
||||||
|
def __init__(self, message):
|
||||||
|
GObject.GObject.__init__(self)
|
||||||
|
self.message = message
|
||||||
|
|
||||||
|
def __lt__(self, rhs):
|
||||||
|
return self.message < rhs.message
|
||||||
|
|
||||||
|
|
||||||
class Results(Property):
|
class Results(Property):
|
||||||
def __init__(self, properties):
|
def __init__(self, properties):
|
||||||
total = properties["TESTS"]
|
|
||||||
time = properties["TIME"]
|
time = properties["TIME"]
|
||||||
|
passed = properties["PASSED"]
|
||||||
failed = properties["FAILURES"]
|
failed = properties["FAILURES"]
|
||||||
skipped = properties["SKIPPED"]
|
skipped = properties["SKIPPED"]
|
||||||
passed = int(total) - (int(skipped) + int(failed))
|
total = int(passed) + int(failed) + int(skipped)
|
||||||
Property.__init__(self, "RESULTS",
|
Property.__init__(self, "RESULTS",
|
||||||
f"Ran {total} tests in {time} seconds: " \
|
f"Ran {total} tests in {time} seconds: " \
|
||||||
f"{passed} passed, {failed} failed, {skipped} skipped")
|
f"{passed} passed, {failed} failed, {skipped} skipped")
|
||||||
|
@ -37,6 +46,17 @@ class Model(GObject.GObject, Gio.ListModel):
|
||||||
def do_get_item(self, i): return self.properties[i]
|
def do_get_item(self, i): return self.properties[i]
|
||||||
|
|
||||||
|
|
||||||
|
class NotRunModel(GObject.GObject, Gio.ListModel):
|
||||||
|
def __init__(self, notrun):
|
||||||
|
GObject.GObject.__init__(self)
|
||||||
|
self.notrun = [ NotRun(m) for m in notrun ]
|
||||||
|
self.notrun.sort()
|
||||||
|
|
||||||
|
def do_get_item_type(self): return GObject.TYPE_PYOBJECT
|
||||||
|
def do_get_n_items(self): return len(self.notrun)
|
||||||
|
def do_get_item(self, i): return self.notrun[i]
|
||||||
|
|
||||||
|
|
||||||
class Factory(Gtk.SignalListItemFactory):
|
class Factory(Gtk.SignalListItemFactory):
|
||||||
def __init__(self, column):
|
def __init__(self, column):
|
||||||
Gtk.SignalListItemFactory.__init__(self)
|
Gtk.SignalListItemFactory.__init__(self)
|
||||||
|
@ -63,6 +83,27 @@ class Factory(Gtk.SignalListItemFactory):
|
||||||
listitem.set_child(None)
|
listitem.set_child(None)
|
||||||
|
|
||||||
|
|
||||||
|
class NotRunFactory(Gtk.SignalListItemFactory):
|
||||||
|
def __init__(self):
|
||||||
|
Gtk.SignalListItemFactory.__init__(self)
|
||||||
|
self.connect("setup", self.on_setup)
|
||||||
|
self.connect("bind", self.on_bind)
|
||||||
|
self.connect("unbind", self.on_unbind)
|
||||||
|
self.connect("teardown", self.on_teardown)
|
||||||
|
|
||||||
|
def on_setup(self, factory, listitem):
|
||||||
|
listitem.set_child(Gtk.Label(xalign=0))
|
||||||
|
|
||||||
|
def on_bind(self, factory, listitem):
|
||||||
|
listitem.get_child().set_text(listitem.get_item().message)
|
||||||
|
|
||||||
|
def on_unbind(self, factory, listitem):
|
||||||
|
listitem.get_child().set_text("")
|
||||||
|
|
||||||
|
def on_teardown(self, factory, listitem):
|
||||||
|
listitem.set_child(None)
|
||||||
|
|
||||||
|
|
||||||
class View(Gtk.ColumnView):
|
class View(Gtk.ColumnView):
|
||||||
def __init__(self, properties):
|
def __init__(self, properties):
|
||||||
self.selection = Gtk.NoSelection.new(Model(properties))
|
self.selection = Gtk.NoSelection.new(Model(properties))
|
||||||
|
@ -72,19 +113,35 @@ class View(Gtk.ColumnView):
|
||||||
self.append_column(Gtk.ColumnViewColumn.new(title, Factory(title)))
|
self.append_column(Gtk.ColumnViewColumn.new(title, Factory(title)))
|
||||||
|
|
||||||
|
|
||||||
|
class NotRunView(Gtk.ListView):
|
||||||
|
def __init__(self, notrun):
|
||||||
|
self.selection = Gtk.NoSelection.new(NotRunModel(notrun))
|
||||||
|
Gtk.ListView.__init__(self, model=self.selection, factory=NotRunFactory())
|
||||||
|
self.add_css_class("data-table")
|
||||||
|
|
||||||
|
|
||||||
class Stack(Gtk.Stack):
|
class Stack(Gtk.Stack):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
Gtk.Stack.__init__(self, transition_type=Gtk.StackTransitionType.OVER_LEFT_RIGHT)
|
Gtk.Stack.__init__(self)
|
||||||
common.SizeGroup.add_widget(self)
|
common.SizeGroup.add_widget(self)
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
|
current = self.get_visible_child_name()
|
||||||
pages = self.get_pages()
|
pages = self.get_pages()
|
||||||
children = [ pages.get_item(i).get_child() for i in range(pages.get_n_items()) ]
|
children = [ pages.get_item(i).get_child() for i in range(pages.get_n_items()) ]
|
||||||
for child in children:
|
for child in children:
|
||||||
self.remove(child)
|
self.remove(child)
|
||||||
|
return current
|
||||||
|
|
||||||
def show_properties(self, results):
|
def show_properties(self, results, current):
|
||||||
|
self.set_transition_type(Gtk.StackTransitionType.NONE)
|
||||||
for version in results.versions:
|
for version in results.versions:
|
||||||
window = Gtk.ScrolledWindow(vscrollbar_policy=Gtk.PolicyType.NEVER,
|
self.add_page(View(results.properties[version]), version, Gtk.PolicyType.NEVER, current)
|
||||||
child=View(results.properties[version]))
|
self.add_page(NotRunView(results.skipped), "[not run]", Gtk.PolicyType.AUTOMATIC, current)
|
||||||
self.add_titled(window, version, version)
|
self.set_transition_type(Gtk.StackTransitionType.OVER_LEFT_RIGHT)
|
||||||
|
|
||||||
|
def add_page(self, child, name, policy, current):
|
||||||
|
window = Gtk.ScrolledWindow(vscrollbar_policy=policy, child=child)
|
||||||
|
self.add_titled(window, name, name)
|
||||||
|
if current == name:
|
||||||
|
self.set_visible_child(window)
|
||||||
|
|
|
@ -48,9 +48,11 @@ class TestResults:
|
||||||
self.versions = [ ]
|
self.versions = [ ]
|
||||||
self.tests = dict()
|
self.tests = dict()
|
||||||
self.properties = dict()
|
self.properties = dict()
|
||||||
|
self.skipped = set()
|
||||||
|
|
||||||
for file in sorted(testdir.iterdir()):
|
for file in sorted(testdir.iterdir()):
|
||||||
self.versions.append(file.stem)
|
self.versions.append(file.stem)
|
||||||
|
passed = 0
|
||||||
|
|
||||||
root = xml.etree.ElementTree.parse(file).getroot()
|
root = xml.etree.ElementTree.parse(file).getroot()
|
||||||
for prop in root.attrib.keys():
|
for prop in root.attrib.keys():
|
||||||
|
@ -64,11 +66,14 @@ class TestResults:
|
||||||
elif elm.tag == "testcase":
|
elif elm.tag == "testcase":
|
||||||
if len(elm) == 0:
|
if len(elm) == 0:
|
||||||
result = PassingTest(elm)
|
result = PassingTest(elm)
|
||||||
|
passed += 1
|
||||||
elif elm[0].tag == "skipped":
|
elif elm[0].tag == "skipped":
|
||||||
result = SkippedTest(elm)
|
result = SkippedTest(elm)
|
||||||
|
self.skipped.add(result.message)
|
||||||
elif elm[0].tag == "failure":
|
elif elm[0].tag == "failure":
|
||||||
result = FailedTest(elm)
|
result = FailedTest(elm)
|
||||||
self.add_testcase(elm.attrib["name"], file.stem, result)
|
self.add_testcase(elm.attrib["name"], file.stem, result)
|
||||||
|
self.set_property("passed", file.stem, str(passed))
|
||||||
|
|
||||||
def set_property(self, name, vers, value):
|
def set_property(self, name, vers, value):
|
||||||
self.properties.setdefault(vers, dict())[name.upper()] = value
|
self.properties.setdefault(vers, dict())[name.upper()] = value
|
||||||
|
|
|
@ -120,11 +120,16 @@ class Filter(Gtk.Filter):
|
||||||
def do_match(self, testcase):
|
def do_match(self, testcase):
|
||||||
search = [ f"name={testcase.name}" ]
|
search = [ f"name={testcase.name}" ]
|
||||||
for key in sorted(testcase.versions.keys()):
|
for key in sorted(testcase.versions.keys()):
|
||||||
keys = [ key ] + key.split("-")
|
keys = [ "status", key ] + key.split("-")
|
||||||
match type(testcase[key]):
|
match type(testcase[key]):
|
||||||
case testresults.PassingTest: res = [ "passing", "passed" ]
|
case testresults.PassingTest:
|
||||||
case testresults.SkippedTest: res = [ "skipped" ]
|
res = [ "passing", "passed" ]
|
||||||
case testresults.FailedTest: res = [ "failed", "failing" ]
|
case testresults.SkippedTest:
|
||||||
|
res = [ "skipped" ]
|
||||||
|
search.append(f"message={testcase[key].message}")
|
||||||
|
case testresults.FailedTest:
|
||||||
|
res = [ "failed", "failing" ]
|
||||||
|
search.append(f"message={testcase[key].message}")
|
||||||
case _: res = [ "missing" ]
|
case _: res = [ "missing" ]
|
||||||
for k in keys:
|
for k in keys:
|
||||||
for r in res:
|
for r in res:
|
||||||
|
|
Loading…
Reference in New Issue