[gtk/treelistmodel-collapse-test] Add a test for treelistmodel row collapse
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/treelistmodel-collapse-test] Add a test for treelistmodel row collapse
- Date: Wed, 24 Aug 2022 03:05:21 +0000 (UTC)
commit e6f4e7d246ae84e29e9fae21bdf619479655a8c8
Author: Matthias Clasen <mclasen redhat com>
Date: Tue Aug 23 23:03:49 2022 -0400
Add a test for treelistmodel row collapse
Test that we can expand and collapse a row, and then
add another child below it, without crashing.
This test is adapted from the testcase in #4595.
testsuite/gtk/treelistmodel.c | 121 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
---
diff --git a/testsuite/gtk/treelistmodel.c b/testsuite/gtk/treelistmodel.c
index bf3f12caf3..f1cbe637a3 100644
--- a/testsuite/gtk/treelistmodel.c
+++ b/testsuite/gtk/treelistmodel.c
@@ -261,6 +261,126 @@ test_remove_some (void)
g_object_unref (tree);
}
+/* Test for https://gitlab.gnome.org/GNOME/gtk/-/issues/4595 */
+typedef struct _DemoNode DemoNode;
+
+struct _DemoNode {
+ GObject parent_instance;
+ char *value;
+ GListStore *children;
+};
+
+G_DECLARE_FINAL_TYPE (DemoNode, demo_node, DEMO, NODE, GObject);
+
+G_DEFINE_TYPE (DemoNode, demo_node, G_TYPE_OBJECT);
+
+static void
+demo_node_init (DemoNode *node)
+{
+}
+
+static void
+demo_node_finalize (GObject *object)
+{
+ g_free (DEMO_NODE (object)->value);
+
+ G_OBJECT_CLASS (demo_node_parent_class)->finalize (object);
+}
+
+static void
+demo_node_class_init (DemoNodeClass *klass)
+{
+ G_OBJECT_CLASS (klass)->finalize = demo_node_finalize;
+}
+
+static DemoNode *
+demo_node_new (const char *value,
+ GListStore *children)
+{
+ DemoNode *result;
+
+ result = g_object_new (demo_node_get_type(), NULL);
+ result->value = g_strdup (value);
+ if (children)
+ result->children = g_object_ref (children);
+
+ return result;
+}
+
+static GListStore *
+create_model (void)
+{
+ DemoNode *aa, *a, *b, *c;
+ GListStore *a_children, *root;
+
+ aa = demo_node_new ("aa", NULL);
+
+ a_children = g_list_store_new (demo_node_get_type ());
+ g_list_store_append (a_children, aa);
+
+ a = demo_node_new ("a", a_children);
+ b = demo_node_new ("b", NULL);
+ c = demo_node_new ("c", NULL);
+
+ root = g_list_store_new (demo_node_get_type ());
+ g_list_store_append (root, a);
+ g_list_store_append (root, b);
+ g_list_store_append (root, c);
+
+ g_object_unref (aa);
+ g_object_unref (a_children);
+ g_object_unref (a);
+ g_object_unref (b);
+ g_object_unref (c);
+
+ return root;
+}
+
+static GListModel *
+model_children (gpointer item,
+ gpointer unused)
+{
+ GListStore *children;
+
+ children = DEMO_NODE (item)->children;
+ if (children)
+ return G_LIST_MODEL (g_object_ref (children));
+
+ return NULL;
+}
+
+static void
+test_collapse_change (void)
+{
+ GListStore *model;
+ GtkTreeListModel *treemodel;
+ DemoNode *a, *ab;
+ GtkTreeListRow *row;
+
+ model = create_model ();
+ a = g_list_model_get_item (G_LIST_MODEL (model), 0);
+
+ treemodel = gtk_tree_list_model_new (G_LIST_MODEL (model),
+ FALSE,
+ FALSE,
+ model_children,
+ NULL,
+ NULL);
+
+ row = gtk_tree_list_model_get_row (treemodel, 0);
+ gtk_tree_list_row_set_expanded (row, TRUE);
+ gtk_tree_list_row_set_expanded (row, FALSE);
+ g_object_unref (row);
+
+ ab = demo_node_new ("ab", NULL);
+ g_list_store_append (a->children, ab);
+ g_object_unref (ab);
+
+ g_object_unref (treemodel);
+ g_object_unref (a);
+ g_object_unref (model);
+}
+
int
main (int argc, char *argv[])
{
@@ -272,6 +392,7 @@ main (int argc, char *argv[])
g_test_add_func ("/treelistmodel/expand", test_expand);
g_test_add_func ("/treelistmodel/remove_some", test_remove_some);
+ g_test_add_func ("/treelistmodel/collapse-change", test_collapse_change);
return g_test_run ();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]