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)
|
||||
|
||||
def set_test_result(self, file):
|
||||
self.stack.clear()
|
||||
current = self.stack.clear()
|
||||
self.viewer.clear()
|
||||
if file and file.get_is_test_result():
|
||||
results = testresults.TestResults(file.path)
|
||||
self.stack.show_properties(results)
|
||||
self.stack.show_properties(results, current)
|
||||
self.viewer.show_results(results)
|
||||
|
|
|
@ -14,13 +14,22 @@ class Property(GObject.GObject):
|
|||
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):
|
||||
def __init__(self, properties):
|
||||
total = properties["TESTS"]
|
||||
time = properties["TIME"]
|
||||
passed = properties["PASSED"]
|
||||
failed = properties["FAILURES"]
|
||||
skipped = properties["SKIPPED"]
|
||||
passed = int(total) - (int(skipped) + int(failed))
|
||||
total = int(passed) + int(failed) + int(skipped)
|
||||
Property.__init__(self, "RESULTS",
|
||||
f"Ran {total} tests in {time} seconds: " \
|
||||
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]
|
||||
|
||||
|
||||
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):
|
||||
def __init__(self, column):
|
||||
Gtk.SignalListItemFactory.__init__(self)
|
||||
|
@ -63,6 +83,27 @@ class Factory(Gtk.SignalListItemFactory):
|
|||
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):
|
||||
def __init__(self, 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)))
|
||||
|
||||
|
||||
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):
|
||||
def __init__(self):
|
||||
Gtk.Stack.__init__(self, transition_type=Gtk.StackTransitionType.OVER_LEFT_RIGHT)
|
||||
Gtk.Stack.__init__(self)
|
||||
common.SizeGroup.add_widget(self)
|
||||
|
||||
def clear(self):
|
||||
current = self.get_visible_child_name()
|
||||
pages = self.get_pages()
|
||||
children = [ pages.get_item(i).get_child() for i in range(pages.get_n_items()) ]
|
||||
for child in children:
|
||||
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:
|
||||
window = Gtk.ScrolledWindow(vscrollbar_policy=Gtk.PolicyType.NEVER,
|
||||
child=View(results.properties[version]))
|
||||
self.add_titled(window, version, version)
|
||||
self.add_page(View(results.properties[version]), version, Gtk.PolicyType.NEVER, current)
|
||||
self.add_page(NotRunView(results.skipped), "[not run]", Gtk.PolicyType.AUTOMATIC, current)
|
||||
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.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():
|
||||
|
@ -64,11 +66,14 @@ class TestResults:
|
|||
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
|
||||
|
|
|
@ -120,11 +120,16 @@ class Filter(Gtk.Filter):
|
|||
def do_match(self, testcase):
|
||||
search = [ f"name={testcase.name}" ]
|
||||
for key in sorted(testcase.versions.keys()):
|
||||
keys = [ key ] + key.split("-")
|
||||
keys = [ "status", key ] + key.split("-")
|
||||
match type(testcase[key]):
|
||||
case testresults.PassingTest: res = [ "passing", "passed" ]
|
||||
case testresults.SkippedTest: res = [ "skipped" ]
|
||||
case testresults.FailedTest: res = [ "failed", "failing" ]
|
||||
case testresults.PassingTest:
|
||||
res = [ "passing", "passed" ]
|
||||
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" ]
|
||||
for k in keys:
|
||||
for r in res:
|
||||
|
|
Loading…
Reference in New Issue