gtk: Add a TestCaseFilter Gtk.Filter
This filter will be used to search the TestCaseList. Signed-off-by: Anna Schumaker <anna@nowheycreamery.com>
This commit is contained in:
parent
e0bb2d7be7
commit
e865728357
|
@ -5,6 +5,7 @@ import tests.xunit
|
|||
import xfstestsdb.gtk.model
|
||||
from gi.repository import GObject
|
||||
from gi.repository import Gio
|
||||
from gi.repository import Gtk
|
||||
|
||||
|
||||
class TestXunitResult(unittest.TestCase):
|
||||
|
@ -70,6 +71,18 @@ class TestTestCase(unittest.TestCase):
|
|||
self.assertEqual(xunit.stdout, "")
|
||||
self.assertEqual(xunit.stderr, "")
|
||||
|
||||
def test_get_results(self):
|
||||
"""Test getting a set of results for this test case."""
|
||||
self.testcase.add_xunit("xunit-1", "passed", 123, "", "", "")
|
||||
self.assertSetEqual(self.testcase.get_results(), {"passed"})
|
||||
self.testcase.add_xunit("xunit-2", "passed", 123, "", "", "")
|
||||
self.assertSetEqual(self.testcase.get_results(), {"passed"})
|
||||
self.testcase.add_xunit("xunit-3", "skipped", 123, "", "", "")
|
||||
self.assertSetEqual(self.testcase.get_results(), {"passed", "skipped"})
|
||||
self.testcase.add_xunit("xunit-4", "failure", 123, "", "", "")
|
||||
self.assertSetEqual(self.testcase.get_results(),
|
||||
{"passed", "skipped", "failure"})
|
||||
|
||||
|
||||
class TestCaseList(unittest.TestCase):
|
||||
"""Tests our TestCaseList Gio.ListModel."""
|
||||
|
@ -121,3 +134,72 @@ class TestCaseList(unittest.TestCase):
|
|||
def test_get_xunits(self):
|
||||
"""Test the get_xunits() function."""
|
||||
self.assertListEqual(self.tclist.get_xunits(), ["xunit-1", "xunit-2"])
|
||||
|
||||
|
||||
class TestCaseFilter(unittest.TestCase):
|
||||
"""Tests our Gtk.Filter customized for filtering TestCases."""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up common variables."""
|
||||
self.filter = xfstestsdb.gtk.model.TestCaseFilter()
|
||||
|
||||
def test_init(self):
|
||||
"""Test that the TestCaseFilter is set up properly."""
|
||||
self.assertIsInstance(self.filter, Gtk.Filter)
|
||||
|
||||
self.assertTrue(self.filter.failure)
|
||||
self.assertFalse(self.filter.passed)
|
||||
self.assertFalse(self.filter.skipped)
|
||||
|
||||
def test_strictness(self):
|
||||
"""Test the TestCaseFilter strictness."""
|
||||
self.assertEqual(self.filter.get_strictness(), Gtk.FilterMatch.SOME)
|
||||
self.filter.passed = True
|
||||
self.assertEqual(self.filter.get_strictness(), Gtk.FilterMatch.SOME)
|
||||
|
||||
self.filter.skipped = True
|
||||
self.assertEqual(self.filter.get_strictness(), Gtk.FilterMatch.ALL)
|
||||
|
||||
self.filter.passed = False
|
||||
self.filter.skipped = False
|
||||
self.filter.failure = False
|
||||
self.assertEqual(self.filter.get_strictness(), Gtk.FilterMatch.NONE)
|
||||
|
||||
def test_changed(self):
|
||||
"""Test the TestCaseFilter 'changed' signal."""
|
||||
changed = unittest.mock.Mock()
|
||||
self.filter.connect("changed", changed)
|
||||
|
||||
self.filter.skipped = True
|
||||
changed.assert_called_with(self.filter, Gtk.FilterChange.LESS_STRICT)
|
||||
self.filter.passed = False
|
||||
changed.assert_called_with(self.filter, Gtk.FilterChange.MORE_STRICT)
|
||||
|
||||
def test_match(self):
|
||||
"""Test matching TestCases with the TestCaseFilter."""
|
||||
testcase = xfstestsdb.gtk.model.TestCase(name="test-case")
|
||||
self.assertFalse(self.filter.match(testcase))
|
||||
|
||||
self.filter.passed = False
|
||||
self.filter.skipped = False
|
||||
self.filter.failure = False
|
||||
|
||||
testcase.add_xunit("xunit-1", "skipped", 123, "", "", "")
|
||||
self.assertFalse(self.filter.match(testcase))
|
||||
|
||||
self.filter.skipped = True
|
||||
self.assertTrue(self.filter.match(testcase))
|
||||
|
||||
testcase.add_xunit("xunit-2", "passed", 123, "", "", "")
|
||||
self.assertTrue(self.filter.match(testcase))
|
||||
self.filter.skipped = False
|
||||
self.assertFalse(self.filter.match(testcase))
|
||||
self.filter.passed = True
|
||||
self.assertTrue(self.filter.match(testcase))
|
||||
|
||||
testcase.add_xunit("xunit-3", "failure", 123, "", "", "")
|
||||
self.assertTrue(self.filter.match(testcase))
|
||||
self.filter.passed = False
|
||||
self.assertFalse(self.filter.match(testcase))
|
||||
self.filter.failure = True
|
||||
self.assertTrue(self.filter.match(testcase))
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
import typing
|
||||
from gi.repository import GObject
|
||||
from gi.repository import Gio
|
||||
from gi.repository import Gtk
|
||||
from .. import sqlite
|
||||
|
||||
|
||||
|
@ -46,6 +47,10 @@ class TestCase(GObject.GObject):
|
|||
message=message, stdout=stdout,
|
||||
stderr=stderr)
|
||||
|
||||
def get_results(self) -> set[str]:
|
||||
"""Get a set of results for each added xunit."""
|
||||
return {xunit.status for xunit in self.__xunits.values()}
|
||||
|
||||
|
||||
class TestCaseList(GObject.GObject, Gio.ListModel):
|
||||
"""A list of TestCases for a specific Xfstests Run."""
|
||||
|
@ -87,3 +92,43 @@ class TestCaseList(GObject.GObject, Gio.ListModel):
|
|||
def get_xunits(self) -> list[str]:
|
||||
"""Get a list of xunits attached to this xfstests run."""
|
||||
return sorted(self.__xunits)
|
||||
|
||||
|
||||
class TestCaseFilter(Gtk.Filter):
|
||||
"""A filter for TestCases."""
|
||||
|
||||
passed = GObject.Property(type=bool, default=False)
|
||||
skipped = GObject.Property(type=bool, default=False)
|
||||
failure = GObject.Property(type=bool, default=True)
|
||||
|
||||
def __init__(self) -> None:
|
||||
"""Initialize a TestCaseFilter."""
|
||||
super().__init__()
|
||||
self.connect("notify", self.__notify)
|
||||
|
||||
def __notify(self, filter: typing.Self, param: GObject.ParamSpec) -> None:
|
||||
match param.name:
|
||||
case "passed" | "skipped" | "failure":
|
||||
if self.get_property(param.name):
|
||||
change = Gtk.FilterChange.LESS_STRICT
|
||||
else:
|
||||
change = Gtk.FilterChange.MORE_STRICT
|
||||
self.changed(change)
|
||||
|
||||
def do_get_strictness(self) -> Gtk.FilterMatch:
|
||||
"""Get the current strictness of the filter."""
|
||||
match (self.passed, self.skipped, self.failure):
|
||||
case (True, True, True): return Gtk.FilterMatch.ALL
|
||||
case (False, False, False): return Gtk.FilterMatch.NONE
|
||||
case (_, _, _): return Gtk.FilterMatch.SOME
|
||||
|
||||
def do_match(self, testcase: TestCase) -> bool:
|
||||
"""Check if a testcase matches the current filter."""
|
||||
results = testcase.get_results()
|
||||
if self.passed and "passed" in results:
|
||||
return True
|
||||
if self.skipped and "skipped" in results:
|
||||
return True
|
||||
if self.failure and "failure" in results:
|
||||
return True
|
||||
return False
|
||||
|
|
Loading…
Reference in New Issue