summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJean Felder <jfelder@src.gnome.org>2020-04-04 13:09:37 +0200
committerJean Felder <jfelder@src.gnome.org>2020-12-06 14:33:09 +0100
commit9215e3a1327b63e9036c6a45def9654e1e5d58d6 (patch)
tree5d02dde087bca398ccc5751440320e1106fd5087 /tests
parent7df001655da6bd31c023c010a66e272f468a762a (diff)
downloadpygobject-9215e3a1327b63e9036c6a45def9654e1e5d58d6.tar.gz
gtk: Add override for Gtk.CustomSorter.set_sort_func
This function use CompareDataFunc which works with pointers and doesn't know anything about GObjects. The same logic as in Gio.List.sort and Gio.List.insert_sorted is used. An associated unit_test is also added.
Diffstat (limited to 'tests')
-rw-r--r--tests/test_overrides_gtk.py95
1 files changed, 94 insertions, 1 deletions
diff --git a/tests/test_overrides_gtk.py b/tests/test_overrides_gtk.py
index 6337d7c4..bde0b5fa 100644
--- a/tests/test_overrides_gtk.py
+++ b/tests/test_overrides_gtk.py
@@ -14,7 +14,7 @@ from .helper import ignore_gi_deprecation_warnings, capture_glib_warnings
import gi.overrides
import gi.types
-from gi.repository import GLib, GObject
+from gi.repository import Gio, GLib, GObject
try:
from gi.repository import Gtk, GdkPixbuf, Gdk
@@ -1267,6 +1267,99 @@ class TestTreeModelRow(unittest.TestCase):
assert row.previous.previous is None
+@unittest.skipUnless(Gtk, "Gtk not available")
+class TestCustomSorter():
+ class Person(GObject.GObject):
+
+ name = GObject.Property(type=str, default="")
+
+ def __init__(self, name):
+ super().__init__()
+ self.props.name = name
+
+ user_data = "user_data"
+
+ def names_sort(self, name_a, name_b, user_data):
+ assert user_data is None
+ if name_a.props.name < name_b.props.name:
+ return Gtk.Ordering.SMALLER
+ elif name_a.props.name > name_b.props.name:
+ return Gtk.Ordering.LARGER
+ else:
+ return Gtk.Ordering.EQUAL
+
+ def names_invert_sort(self, name_a, name_b, user_data):
+ assert user_data == self.user_data
+ if name_a.props.name < name_b.props.name:
+ return Gtk.Ordering.LARGER
+ elif name_a.props.name > name_b.props.name:
+ return Gtk.Ordering.SMALLER
+ else:
+ return Gtk.Ordering.EQUAL
+
+ @unittest.skipIf(Gtk_version != "4.0", "gtk4 only")
+ def test_custom_sorter_init(self):
+ custom_sorter_empty = Gtk.CustomSorter()
+ assert isinstance(custom_sorter_empty, Gtk.CustomSorter)
+
+ custom_sorter_empty.set_sort_func(self.names_sort)
+ assert isinstance(custom_sorter_empty, Gtk.CustomSorter)
+
+ custom_sorter_empty.set_sort_func(
+ self.names_invert_sort, self.user_data)
+ assert isinstance(custom_sorter_empty, Gtk.CustomSorter)
+
+ custom_sorter_empty_sort = Gtk.CustomSorter.new(None)
+ assert isinstance(custom_sorter_empty_sort, Gtk.CustomSorter)
+
+ custom_sorter_with_sort = Gtk.CustomSorter.new(self.names_sort, None)
+ assert isinstance(custom_sorter_with_sort, Gtk.CustomSorter)
+
+ custom_sorter_with_sort_ud = Gtk.CustomSorter.new(
+ self.names_invert_sort, self.user_data)
+ assert isinstance(custom_sorter_with_sort_ud, Gtk.CustomSorter)
+
+ @unittest.skipIf(Gtk_version != "4.0", "gtk4 only")
+ def test_custom_sorter_with_model(self):
+ model = Gio.ListStore.new(self.Person)
+ sort_model = Gtk.SortListModel.new(model)
+ assert sort_model.props.sorter is None
+
+ empty_sorter = Gtk.CustomSorter()
+ empty_sorter.set_sort_func(self.names_sort, None)
+ sort_model.set_sorter(empty_sorter)
+ assert sort_model.props.sorter is empty_sorter
+
+ john = self.Person("john")
+ bob = self.Person("bob")
+ model.append(john)
+ model.append(bob)
+ assert sort_model[0] == bob
+ assert sort_model[1] == john
+
+ alice = self.Person("alice")
+ model.append(alice)
+ assert sort_model[0] == alice
+ assert sort_model[2] == john
+
+ new_model = Gio.ListStore.new(self.Person)
+ new_sort_model = Gtk.SortListModel.new(new_model)
+ assert new_sort_model.props.sorter is None
+
+ invert_sorter = Gtk.CustomSorter.new(
+ self.names_invert_sort, self.user_data)
+ new_sort_model.set_sorter(invert_sorter)
+ assert new_sort_model.props.sorter is invert_sorter
+
+ beatles = ["john", "paul", "george", "ringo"]
+ for member in beatles:
+ new_model.append(self.Person(member))
+
+ expected_result = ["ringo", "paul", "john", "george"]
+ for result, member in zip(new_sort_model, expected_result):
+ assert result.props.name == member
+
+
@ignore_gi_deprecation_warnings
@unittest.skipUnless(Gtk, 'Gtk not available')
class TestTreeModel(unittest.TestCase):