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:
Anna Schumaker 2023-08-02 11:54:30 -04:00
parent e0bb2d7be7
commit e865728357
2 changed files with 127 additions and 0 deletions

View File

@ -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))

View File

@ -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