diff options
author | Jean Felder <jfelder@src.gnome.org> | 2020-04-04 13:09:37 +0200 |
---|---|---|
committer | Jean Felder <jfelder@src.gnome.org> | 2020-12-06 14:33:09 +0100 |
commit | 9215e3a1327b63e9036c6a45def9654e1e5d58d6 (patch) | |
tree | 5d02dde087bca398ccc5751440320e1106fd5087 /tests | |
parent | 7df001655da6bd31c023c010a66e272f468a762a (diff) | |
download | pygobject-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.py | 95 |
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): |