diff --git a/reporter/testproperties.py b/reporter/testproperties.py index 0ed5905..4bc5d3f 100644 --- a/reporter/testproperties.py +++ b/reporter/testproperties.py @@ -14,6 +14,15 @@ 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"] @@ -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,6 +113,13 @@ 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) @@ -85,6 +133,9 @@ class Stack(Gtk.Stack): def show_properties(self, results): 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) + self.add_page(NotRunView(results.skipped), "[not run]", Gtk.PolicyType.AUTOMATIC) + + def add_page(self, child, name, policy): + window = Gtk.ScrolledWindow(vscrollbar_policy=policy, child=child) + self.add_titled(window, name, name) diff --git a/reporter/testresults.py b/reporter/testresults.py index c23e5ec..78152b6 100644 --- a/reporter/testresults.py +++ b/reporter/testresults.py @@ -48,6 +48,7 @@ class TestResults: self.versions = [ ] self.tests = dict() self.properties = dict() + self.skipped = set() for file in sorted(testdir.iterdir()): self.versions.append(file.stem) @@ -66,6 +67,7 @@ class TestResults: result = PassingTest(elm) 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) diff --git a/reporter/testviewer.py b/reporter/testviewer.py index 11d9bd2..98e1ea2 100644 --- a/reporter/testviewer.py +++ b/reporter/testviewer.py @@ -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: