Blame gtk/tests/filtermodel.c

Packit Service fb6fa5
/* Extensive GtkTreeModelFilter tests.
Packit Service fb6fa5
 * Copyright (C) 2009  Kristian Rietveld  <kris@gtk.org>
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include <gtk/gtk.h>
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/* Left to do:
Packit Service fb6fa5
 *   - Proper coverage checking to see if the unit tests cover
Packit Service fb6fa5
 *     all possible cases.
Packit Service fb6fa5
 *   - Verify if the ref counting is done properly for both the
Packit Service fb6fa5
 *     normal ref_count and the zero_ref_count.  One way to test
Packit Service fb6fa5
 *     this area is by collapsing/expanding branches on the view
Packit Service fb6fa5
 *     that is connected to the filter model.
Packit Service fb6fa5
 *   - Check if the iterator stamp is incremented at the correct times.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Model creation
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#define LEVEL_LENGTH 5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
create_tree_store_set_values (GtkTreeStore *store,
Packit Service fb6fa5
                              GtkTreeIter  *iter,
Packit Service fb6fa5
                              gboolean      visible)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
  gchar *path_string;
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter);
Packit Service fb6fa5
  path_string = gtk_tree_path_to_string (path);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_set (store, iter,
Packit Service fb6fa5
                      0, path_string,
Packit Service fb6fa5
                      1, visible,
Packit Service fb6fa5
                      -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_free (path);
Packit Service fb6fa5
  g_free (path_string);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
create_tree_store_recurse (int           depth,
Packit Service fb6fa5
                           GtkTreeStore *store,
Packit Service fb6fa5
                           GtkTreeIter  *parent,
Packit Service fb6fa5
                           gboolean      visible)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < LEVEL_LENGTH; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTreeIter iter;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_store_insert (store, &iter, parent, i);
Packit Service fb6fa5
      create_tree_store_set_values (store, &iter, visible);
Packit Service fb6fa5
Packit Service fb6fa5
      if (depth > 0)
Packit Service fb6fa5
        create_tree_store_recurse (depth - 1, store, &iter, visible);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GtkTreeStore *
Packit Service fb6fa5
create_tree_store (int      depth,
Packit Service fb6fa5
                   gboolean visible)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
Packit Service fb6fa5
Packit Service fb6fa5
  create_tree_store_recurse (depth, store, NULL, visible);
Packit Service fb6fa5
Packit Service fb6fa5
  return store;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Signal monitor
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
typedef enum
Packit Service fb6fa5
{
Packit Service fb6fa5
  ROW_INSERTED,
Packit Service fb6fa5
  ROW_DELETED,
Packit Service fb6fa5
  ROW_CHANGED,
Packit Service fb6fa5
  ROW_HAS_CHILD_TOGGLED,
Packit Service fb6fa5
  ROWS_REORDERED,
Packit Service fb6fa5
  LAST_SIGNAL
Packit Service fb6fa5
}
Packit Service fb6fa5
SignalName;
Packit Service fb6fa5
Packit Service fb6fa5
static const char *
Packit Service fb6fa5
signal_name_to_string (SignalName signal)
Packit Service fb6fa5
{
Packit Service fb6fa5
  switch (signal)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      case ROW_INSERTED:
Packit Service fb6fa5
          return "row-inserted";
Packit Service fb6fa5
Packit Service fb6fa5
      case ROW_DELETED:
Packit Service fb6fa5
          return "row-deleted";
Packit Service fb6fa5
Packit Service fb6fa5
      case ROW_CHANGED:
Packit Service fb6fa5
          return "row-changed";
Packit Service fb6fa5
Packit Service fb6fa5
      case ROW_HAS_CHILD_TOGGLED:
Packit Service fb6fa5
          return "row-has-child-toggled";
Packit Service fb6fa5
Packit Service fb6fa5
      case ROWS_REORDERED:
Packit Service fb6fa5
          return "rows-reordered";
Packit Service fb6fa5
Packit Service fb6fa5
      default:
Packit Service fb6fa5
          /* Fall through */
Packit Service fb6fa5
          break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return "(unknown)";
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct
Packit Service fb6fa5
{
Packit Service fb6fa5
  SignalName signal;
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
}
Packit Service fb6fa5
Signal;
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static Signal *
Packit Service fb6fa5
signal_new (SignalName signal, GtkTreePath *path)
Packit Service fb6fa5
{
Packit Service fb6fa5
  Signal *s;
Packit Service fb6fa5
Packit Service fb6fa5
  s = g_new0 (Signal, 1);
Packit Service fb6fa5
  s->signal = signal;
Packit Service fb6fa5
  s->path = gtk_tree_path_copy (path);
Packit Service fb6fa5
Packit Service fb6fa5
  return s;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_free (Signal *s)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (s->path)
Packit Service fb6fa5
    gtk_tree_path_free (s->path);
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (s);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct
Packit Service fb6fa5
{
Packit Service fb6fa5
  GQueue *queue;
Packit Service fb6fa5
  GtkTreeModel *client;
Packit Service fb6fa5
  guint signal_ids[LAST_SIGNAL];
Packit Service fb6fa5
}
Packit Service fb6fa5
SignalMonitor;
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_generic_handler (SignalMonitor *m,
Packit Service fb6fa5
                                SignalName     signal,
Packit Service fb6fa5
                                GtkTreeModel  *model,
Packit Service fb6fa5
                                GtkTreePath   *path)
Packit Service fb6fa5
{
Packit Service fb6fa5
  Signal *s;
Packit Service fb6fa5
Packit Service fb6fa5
  if (g_queue_is_empty (m->queue))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_error ("Signal queue empty\n");
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (m->client != model)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_error ("Model mismatch; expected %p, got %p\n",
Packit Service fb6fa5
               m->client, model);
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  s = g_queue_peek_tail (m->queue);
Packit Service fb6fa5
Packit Service fb6fa5
#if 0
Packit Service fb6fa5
  /* For debugging: output signals that are coming in.  Leaks memory. */
Packit Service fb6fa5
  g_print ("signal=%d  path=%s\n", signal, gtk_tree_path_to_string (path));
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
  if (s->signal != signal
Packit Service fb6fa5
      || gtk_tree_path_compare (s->path, path) != 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gchar *path_str, *s_path_str;
Packit Service fb6fa5
Packit Service fb6fa5
      s_path_str = gtk_tree_path_to_string (s->path);
Packit Service fb6fa5
      path_str = gtk_tree_path_to_string (path);
Packit Service fb6fa5
Packit Service fb6fa5
      g_error ("Signals don't match; expected signal %s path %s, got signal %s path %s\n",
Packit Service fb6fa5
               signal_name_to_string (s->signal), s_path_str,
Packit Service fb6fa5
               signal_name_to_string (signal), path_str);
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (s_path_str);
Packit Service fb6fa5
      g_free (path_str);
Packit Service fb6fa5
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  s = g_queue_pop_tail (m->queue);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_free (s);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_row_inserted (GtkTreeModel *model,
Packit Service fb6fa5
                             GtkTreePath  *path,
Packit Service fb6fa5
                             GtkTreeIter  *iter,
Packit Service fb6fa5
                             gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_generic_handler (data, ROW_INSERTED,
Packit Service fb6fa5
                                  model, path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_row_deleted (GtkTreeModel *model,
Packit Service fb6fa5
                            GtkTreePath  *path,
Packit Service fb6fa5
                            gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_generic_handler (data, ROW_DELETED,
Packit Service fb6fa5
                                  model, path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_row_changed (GtkTreeModel *model,
Packit Service fb6fa5
                            GtkTreePath  *path,
Packit Service fb6fa5
                            GtkTreeIter  *iter,
Packit Service fb6fa5
                            gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_generic_handler (data, ROW_CHANGED,
Packit Service fb6fa5
                                  model, path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_row_has_child_toggled (GtkTreeModel *model,
Packit Service fb6fa5
                                      GtkTreePath  *path,
Packit Service fb6fa5
                                      GtkTreeIter  *iter,
Packit Service fb6fa5
                                      gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_generic_handler (data, ROW_HAS_CHILD_TOGGLED,
Packit Service fb6fa5
                                  model, path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_rows_reordered (GtkTreeModel *model,
Packit Service fb6fa5
                               GtkTreePath  *path,
Packit Service fb6fa5
                               GtkTreeIter  *iter,
Packit Service fb6fa5
                               gint         *new_order,
Packit Service fb6fa5
                               gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_generic_handler (data, ROWS_REORDERED,
Packit Service fb6fa5
                                  model, path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static SignalMonitor *
Packit Service fb6fa5
signal_monitor_new (GtkTreeModel *client)
Packit Service fb6fa5
{
Packit Service fb6fa5
  SignalMonitor *m;
Packit Service fb6fa5
Packit Service fb6fa5
  m = g_new0 (SignalMonitor, 1);
Packit Service fb6fa5
  m->client = g_object_ref (client);
Packit Service fb6fa5
  m->queue = g_queue_new ();
Packit Service fb6fa5
Packit Service fb6fa5
  m->signal_ids[ROW_INSERTED] = g_signal_connect (client,
Packit Service fb6fa5
                                                  "row-inserted",
Packit Service fb6fa5
                                                  G_CALLBACK (signal_monitor_row_inserted),
Packit Service fb6fa5
                                                  m);
Packit Service fb6fa5
  m->signal_ids[ROW_DELETED] = g_signal_connect (client,
Packit Service fb6fa5
                                                 "row-deleted",
Packit Service fb6fa5
                                                 G_CALLBACK (signal_monitor_row_deleted),
Packit Service fb6fa5
                                                 m);
Packit Service fb6fa5
  m->signal_ids[ROW_CHANGED] = g_signal_connect (client,
Packit Service fb6fa5
                                                 "row-changed",
Packit Service fb6fa5
                                                 G_CALLBACK (signal_monitor_row_changed),
Packit Service fb6fa5
                                                 m);
Packit Service fb6fa5
  m->signal_ids[ROW_HAS_CHILD_TOGGLED] = g_signal_connect (client,
Packit Service fb6fa5
                                                           "row-has-child-toggled",
Packit Service fb6fa5
                                                           G_CALLBACK (signal_monitor_row_has_child_toggled),
Packit Service fb6fa5
                                                           m);
Packit Service fb6fa5
  m->signal_ids[ROWS_REORDERED] = g_signal_connect (client,
Packit Service fb6fa5
                                                    "rows-reordered",
Packit Service fb6fa5
                                                    G_CALLBACK (signal_monitor_rows_reordered),
Packit Service fb6fa5
                                                    m);
Packit Service fb6fa5
Packit Service fb6fa5
  return m;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_free (SignalMonitor *m)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < LAST_SIGNAL; i++)
Packit Service fb6fa5
    g_signal_handler_disconnect (m->client, m->signal_ids[i]);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (m->client);
Packit Service fb6fa5
Packit Service fb6fa5
  if (m->queue)
Packit Service fb6fa5
    g_queue_free (m->queue);
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (m);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_assert_is_empty (SignalMonitor *m)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_assert (g_queue_is_empty (m->queue));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_append_signal_path (SignalMonitor *m,
Packit Service fb6fa5
                                   SignalName     signal,
Packit Service fb6fa5
                                   GtkTreePath   *path)
Packit Service fb6fa5
{
Packit Service fb6fa5
  Signal *s;
Packit Service fb6fa5
Packit Service fb6fa5
  s = signal_new (signal, path);
Packit Service fb6fa5
  g_queue_push_head (m->queue, s);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
signal_monitor_append_signal (SignalMonitor *m,
Packit Service fb6fa5
                              SignalName     signal,
Packit Service fb6fa5
                              const gchar   *path_string)
Packit Service fb6fa5
{
Packit Service fb6fa5
  Signal *s;
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_path_new_from_string (path_string);
Packit Service fb6fa5
Packit Service fb6fa5
  s = signal_new (signal, path);
Packit Service fb6fa5
  g_queue_push_head (m->queue, s);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_free (path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Fixture
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *tree_view;
Packit Service fb6fa5
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
  GtkTreeModelFilter *filter;
Packit Service fb6fa5
Packit Service fb6fa5
  SignalMonitor *monitor;
Packit Service fb6fa5
Packit Service fb6fa5
  guint block_signals : 1;
Packit Service fb6fa5
} FilterTest;
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_store_signal (FilterTest *fixture)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (fixture->block_signals)
Packit Service fb6fa5
    g_signal_stop_emission_by_name (fixture->store, "row-changed");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_setup_generic (FilterTest    *fixture,
Packit Service fb6fa5
                           gconstpointer  test_data,
Packit Service fb6fa5
                           int            depth,
Packit Service fb6fa5
                           gboolean       empty,
Packit Service fb6fa5
                           gboolean       unfiltered)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const GtkTreePath *vroot = test_data;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
Packit Service fb6fa5
  fixture->store = create_tree_store (depth, !empty);
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_connect_swapped (fixture->store, "row-changed",
Packit Service fb6fa5
                            G_CALLBACK (filter_test_store_signal), fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Please forgive me for casting const away. */
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                                      (GtkTreePath *)vroot);
Packit Service fb6fa5
  fixture->filter = GTK_TREE_MODEL_FILTER (filter);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!unfiltered)
Packit Service fb6fa5
    gtk_tree_model_filter_set_visible_column (fixture->filter, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  /* We need a tree view that's listening to get ref counting from that
Packit Service fb6fa5
   * side.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  fixture->tree_view = gtk_tree_view_new_with_model (filter);
Packit Service fb6fa5
Packit Service fb6fa5
  fixture->monitor = signal_monitor_new (filter);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_setup (FilterTest    *fixture,
Packit Service fb6fa5
                   gconstpointer  test_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  filter_test_setup_generic (fixture, test_data, 3, FALSE, FALSE);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_setup_empty (FilterTest    *fixture,
Packit Service fb6fa5
                         gconstpointer  test_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  filter_test_setup_generic (fixture, test_data, 3, TRUE, FALSE);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_setup_unfiltered (FilterTest    *fixture,
Packit Service fb6fa5
                              gconstpointer  test_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  filter_test_setup_generic (fixture, test_data, 3, FALSE, TRUE);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_setup_empty_unfiltered (FilterTest    *fixture,
Packit Service fb6fa5
                                    gconstpointer  test_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  filter_test_setup_generic (fixture, test_data, 3, TRUE, TRUE);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GtkTreePath *
Packit Service fb6fa5
strip_virtual_root (GtkTreePath *path,
Packit Service fb6fa5
                    GtkTreePath *root_path)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *real_path;
Packit Service fb6fa5
Packit Service fb6fa5
  if (root_path)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      int j;
Packit Service fb6fa5
      int depth = gtk_tree_path_get_depth (path);
Packit Service fb6fa5
      int root_depth = gtk_tree_path_get_depth (root_path);
Packit Service fb6fa5
Packit Service fb6fa5
      real_path = gtk_tree_path_new ();
Packit Service fb6fa5
Packit Service fb6fa5
      for (j = 0; j < depth - root_depth; j++)
Packit Service fb6fa5
        gtk_tree_path_append_index (real_path,
Packit Service fb6fa5
                                    gtk_tree_path_get_indices (path)[root_depth + j]);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    real_path = gtk_tree_path_copy (path);
Packit Service fb6fa5
Packit Service fb6fa5
  return real_path;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_append_refilter_signals_recurse (FilterTest  *fixture,
Packit Service fb6fa5
                                             GtkTreePath *store_path,
Packit Service fb6fa5
                                             GtkTreePath *filter_path,
Packit Service fb6fa5
                                             int          depth,
Packit Service fb6fa5
                                             GtkTreePath *root_path)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  int rows_deleted = 0;
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_down (store_path);
Packit Service fb6fa5
  gtk_tree_path_down (filter_path);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                           &iter, store_path);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < LEVEL_LENGTH; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gboolean visible;
Packit Service fb6fa5
      GtkTreePath *real_path;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_model_get (GTK_TREE_MODEL (fixture->store), &iter,
Packit Service fb6fa5
                          1, &visible,
Packit Service fb6fa5
                          -1);
Packit Service fb6fa5
Packit Service fb6fa5
      if (root_path &&
Packit Service fb6fa5
          (!gtk_tree_path_is_descendant (store_path, root_path)
Packit Service fb6fa5
           || !gtk_tree_path_compare (store_path, root_path)))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          if (!gtk_tree_path_compare (store_path, root_path))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              if (depth > 1
Packit Service fb6fa5
                  && gtk_tree_model_iter_has_child (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                                                    &iter))
Packit Service fb6fa5
                {
Packit Service fb6fa5
                  GtkTreePath *store_copy;
Packit Service fb6fa5
                  GtkTreePath *filter_copy;
Packit Service fb6fa5
Packit Service fb6fa5
                  store_copy = gtk_tree_path_copy (store_path);
Packit Service fb6fa5
                  filter_copy = gtk_tree_path_copy (filter_path);
Packit Service fb6fa5
                  filter_test_append_refilter_signals_recurse (fixture,
Packit Service fb6fa5
                                                               store_copy,
Packit Service fb6fa5
                                                               filter_copy,
Packit Service fb6fa5
                                                               depth - 1,
Packit Service fb6fa5
                                                               root_path);
Packit Service fb6fa5
                  gtk_tree_path_free (store_copy);
Packit Service fb6fa5
                  gtk_tree_path_free (filter_copy);
Packit Service fb6fa5
                }
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_tree_path_next (store_path);
Packit Service fb6fa5
          gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
Packit Service fb6fa5
          if (visible)
Packit Service fb6fa5
            gtk_tree_path_next (filter_path);
Packit Service fb6fa5
Packit Service fb6fa5
          continue;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      real_path = strip_virtual_root (filter_path, root_path);
Packit Service fb6fa5
Packit Service fb6fa5
      if (visible)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          /* This row will be inserted */
Packit Service fb6fa5
          signal_monitor_append_signal_path (fixture->monitor, ROW_CHANGED,
Packit Service fb6fa5
                                             real_path);
Packit Service fb6fa5
          signal_monitor_append_signal_path (fixture->monitor,
Packit Service fb6fa5
                                             ROW_HAS_CHILD_TOGGLED,
Packit Service fb6fa5
                                             real_path);
Packit Service fb6fa5
Packit Service fb6fa5
          if (depth > 1
Packit Service fb6fa5
              && gtk_tree_model_iter_has_child (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                                                &iter))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              GtkTreePath *store_copy;
Packit Service fb6fa5
              GtkTreePath *filter_copy;
Packit Service fb6fa5
Packit Service fb6fa5
              store_copy = gtk_tree_path_copy (store_path);
Packit Service fb6fa5
              filter_copy = gtk_tree_path_copy (filter_path);
Packit Service fb6fa5
              filter_test_append_refilter_signals_recurse (fixture,
Packit Service fb6fa5
                                                           store_copy,
Packit Service fb6fa5
                                                           filter_copy,
Packit Service fb6fa5
                                                           depth - 1,
Packit Service fb6fa5
                                                           root_path);
Packit Service fb6fa5
              gtk_tree_path_free (store_copy);
Packit Service fb6fa5
              gtk_tree_path_free (filter_copy);
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_tree_path_next (filter_path);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        {
Packit Service fb6fa5
          /* This row will be deleted */
Packit Service fb6fa5
          rows_deleted++;
Packit Service fb6fa5
          signal_monitor_append_signal_path (fixture->monitor, ROW_DELETED,
Packit Service fb6fa5
                                             real_path);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_path_free (real_path);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_path_next (store_path);
Packit Service fb6fa5
      gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (rows_deleted == LEVEL_LENGTH
Packit Service fb6fa5
      && gtk_tree_path_get_depth (filter_path) > 1)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTreePath *real_path;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_path_up (store_path);
Packit Service fb6fa5
      gtk_tree_path_up (filter_path);
Packit Service fb6fa5
Packit Service fb6fa5
      /* A row-has-child-toggled will be emitted on the parent */
Packit Service fb6fa5
      if (!root_path
Packit Service fb6fa5
          || (root_path
Packit Service fb6fa5
              && gtk_tree_path_is_descendant (store_path, root_path)
Packit Service fb6fa5
              && gtk_tree_path_compare (store_path, root_path)))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          real_path = strip_virtual_root (filter_path, root_path);
Packit Service fb6fa5
          signal_monitor_append_signal_path (fixture->monitor,
Packit Service fb6fa5
                                             ROW_HAS_CHILD_TOGGLED,
Packit Service fb6fa5
                                             real_path);
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_tree_path_free (real_path);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_append_refilter_signals (FilterTest *fixture,
Packit Service fb6fa5
                                     int         depth)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* A special function that walks the tree store like the
Packit Service fb6fa5
   * model validation functions below.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
  GtkTreePath *filter_path;
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_path_new ();
Packit Service fb6fa5
  filter_path = gtk_tree_path_new ();
Packit Service fb6fa5
  filter_test_append_refilter_signals_recurse (fixture,
Packit Service fb6fa5
                                               path,
Packit Service fb6fa5
                                               filter_path,
Packit Service fb6fa5
                                               depth,
Packit Service fb6fa5
                                               NULL);
Packit Service fb6fa5
  gtk_tree_path_free (path);
Packit Service fb6fa5
  gtk_tree_path_free (filter_path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_append_refilter_signals_with_vroot (FilterTest  *fixture,
Packit Service fb6fa5
                                                int          depth,
Packit Service fb6fa5
                                                GtkTreePath *root_path)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* A special function that walks the tree store like the
Packit Service fb6fa5
   * model validation functions below.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
  GtkTreePath *filter_path;
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_path_new ();
Packit Service fb6fa5
  filter_path = gtk_tree_path_new ();
Packit Service fb6fa5
  filter_test_append_refilter_signals_recurse (fixture,
Packit Service fb6fa5
                                               path,
Packit Service fb6fa5
                                               filter_path,
Packit Service fb6fa5
                                               depth,
Packit Service fb6fa5
                                               root_path);
Packit Service fb6fa5
  gtk_tree_path_free (path);
Packit Service fb6fa5
  gtk_tree_path_free (filter_path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_enable_filter (FilterTest *fixture)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_column (fixture->filter, 1);
Packit Service fb6fa5
  gtk_tree_model_filter_refilter (fixture->filter);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_block_signals (FilterTest *fixture)
Packit Service fb6fa5
{
Packit Service fb6fa5
  fixture->block_signals = TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_unblock_signals (FilterTest *fixture)
Packit Service fb6fa5
{
Packit Service fb6fa5
  fixture->block_signals = FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filter_test_teardown (FilterTest    *fixture,
Packit Service fb6fa5
                      gconstpointer  test_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_free (fixture->monitor);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (fixture->filter);
Packit Service fb6fa5
  g_object_unref (fixture->store);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Model structure validation
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
check_filter_model_recurse (FilterTest  *fixture,
Packit Service fb6fa5
                            GtkTreePath *store_parent_path,
Packit Service fb6fa5
                            GtkTreePath *filter_parent_path)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  GtkTreeIter store_iter;
Packit Service fb6fa5
  GtkTreeIter filter_iter;
Packit Service fb6fa5
  gboolean store_has_next, filter_has_next;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_down (store_parent_path);
Packit Service fb6fa5
  gtk_tree_path_down (filter_parent_path);
Packit Service fb6fa5
Packit Service fb6fa5
  store_has_next = gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                                            &store_iter, store_parent_path);
Packit Service fb6fa5
  filter_has_next = gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->filter),
Packit Service fb6fa5
                                             &filter_iter, filter_parent_path);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < LEVEL_LENGTH; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gboolean visible;
Packit Service fb6fa5
Packit Service fb6fa5
      g_return_if_fail (store_has_next == TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_model_get (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                          &store_iter,
Packit Service fb6fa5
                          1, &visible,
Packit Service fb6fa5
                          -1);
Packit Service fb6fa5
Packit Service fb6fa5
      if (visible)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          GtkTreePath *tmp;
Packit Service fb6fa5
          gchar *filter_str, *store_str;
Packit Service fb6fa5
Packit Service fb6fa5
          g_return_if_fail (filter_has_next == TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
          /* Verify path */
Packit Service fb6fa5
          tmp = gtk_tree_model_get_path (GTK_TREE_MODEL (fixture->filter),
Packit Service fb6fa5
                                         &filter_iter);
Packit Service fb6fa5
          g_return_if_fail (gtk_tree_path_compare (tmp, filter_parent_path) == 0);
Packit Service fb6fa5
Packit Service fb6fa5
          /* Verify model content */
Packit Service fb6fa5
          gtk_tree_model_get (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              &store_iter,
Packit Service fb6fa5
                              0, &store_str,
Packit Service fb6fa5
                              -1);
Packit Service fb6fa5
          gtk_tree_model_get (GTK_TREE_MODEL (fixture->filter),
Packit Service fb6fa5
                              &filter_iter,
Packit Service fb6fa5
                              0, &filter_str,
Packit Service fb6fa5
                              -1);
Packit Service fb6fa5
Packit Service fb6fa5
          g_return_if_fail (g_strcmp0 (store_str, filter_str) == 0);
Packit Service fb6fa5
Packit Service fb6fa5
          g_free (store_str);
Packit Service fb6fa5
          g_free (filter_str);
Packit Service fb6fa5
Packit Service fb6fa5
          if (gtk_tree_model_iter_has_child (GTK_TREE_MODEL (fixture->filter),
Packit Service fb6fa5
                                             &filter_iter))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              g_return_if_fail (gtk_tree_model_iter_has_child (GTK_TREE_MODEL (fixture->store), &store_iter));
Packit Service fb6fa5
Packit Service fb6fa5
              check_filter_model_recurse (fixture,
Packit Service fb6fa5
                                          gtk_tree_path_copy (store_parent_path),
Packit Service fb6fa5
                                          tmp);
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_tree_path_next (filter_parent_path);
Packit Service fb6fa5
          filter_has_next = gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->filter), &filter_iter);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_path_next (store_parent_path);
Packit Service fb6fa5
      store_has_next = gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &store_iter);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Both models should have no more content! */
Packit Service fb6fa5
  g_return_if_fail (store_has_next == FALSE);
Packit Service fb6fa5
  g_return_if_fail (filter_has_next == FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_free (store_parent_path);
Packit Service fb6fa5
  gtk_tree_path_free (filter_parent_path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
check_filter_model (FilterTest *fixture)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
Packit Service fb6fa5
  if (fixture->monitor)
Packit Service fb6fa5
    signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_path_new ();
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_recurse (fixture, path, gtk_tree_path_copy (path));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
check_filter_model_with_root (FilterTest  *fixture,
Packit Service fb6fa5
                              GtkTreePath *path)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (fixture->monitor)
Packit Service fb6fa5
    signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_recurse (fixture,
Packit Service fb6fa5
                              gtk_tree_path_copy (path),
Packit Service fb6fa5
                              gtk_tree_path_new ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Helpers */
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
check_level_length (GtkTreeModelFilter *filter,
Packit Service fb6fa5
                    const gchar        *level,
Packit Service fb6fa5
                    const int           length)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!level)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      int l = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (filter), NULL);
Packit Service fb6fa5
      g_return_if_fail (l == length);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      int l;
Packit Service fb6fa5
      gboolean retrieved_iter = FALSE;
Packit Service fb6fa5
      GtkTreeIter iter;
Packit Service fb6fa5
Packit Service fb6fa5
      retrieved_iter = gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (filter),
Packit Service fb6fa5
                                                            &iter, level);
Packit Service fb6fa5
      g_return_if_fail (retrieved_iter);
Packit Service fb6fa5
      l = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (filter), &iter);
Packit Service fb6fa5
      g_return_if_fail (l == length);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
set_path_visibility (FilterTest  *fixture,
Packit Service fb6fa5
                     const gchar *path,
Packit Service fb6fa5
                     gboolean     visible)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeIter store_iter;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                                       &store_iter, path);
Packit Service fb6fa5
  gtk_tree_store_set (fixture->store, &store_iter,
Packit Service fb6fa5
                      1, visible,
Packit Service fb6fa5
                      -1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#if 0
Packit Service fb6fa5
static void
Packit Service fb6fa5
insert_path_with_visibility (FilterTest  *fixture,
Packit Service fb6fa5
                             const gchar *path_string,
Packit Service fb6fa5
                             gboolean     visible)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int position;
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
  GtkTreeIter parent, iter;
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_path_new_from_string (path_string);
Packit Service fb6fa5
  position = gtk_tree_path_get_indices (path)[gtk_tree_path_get_depth (path)];
Packit Service fb6fa5
  gtk_tree_path_up (path);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store), &parent, path))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_tree_store_insert (fixture->store, &iter, &parent, position);
Packit Service fb6fa5
      create_tree_store_set_values (fixture->store, &iter, visible);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  gtk_tree_path_free (path);
Packit Service fb6fa5
}
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * The actual tests.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
verify_test_suite (FilterTest    *fixture,
Packit Service fb6fa5
                   gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
verify_test_suite_vroot (FilterTest    *fixture,
Packit Service fb6fa5
                         gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  check_filter_model_with_root (fixture, (GtkTreePath *)user_data);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filled_hide_root_level (FilterTest    *fixture,
Packit Service fb6fa5
                        gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2", FALSE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "0", FALSE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "2");
Packit Service fb6fa5
  set_path_visibility (fixture, "4", FALSE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 3);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  /* Hide remaining */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "1", FALSE);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "3", FALSE);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 5);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Show some */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "1");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "1");
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "1", TRUE);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "3", TRUE);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 3);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filled_hide_child_levels (FilterTest    *fixture,
Packit Service fb6fa5
                          gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "0:2", FALSE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH - 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0:3");
Packit Service fb6fa5
  set_path_visibility (fixture, "0:4", FALSE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "0:4:3", FALSE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "0:4:0", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "0:4:1", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "0:4:2", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "0:4:4", FALSE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Since "0:2" is hidden, "0:4" must be "0:3" in the filter model */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:3");
Packit Service fb6fa5
  /* FIXME: Actually, the filter model should not be emitted the
Packit Service fb6fa5
   * row-has-child-toggled signal here.  *However* an extraneous emission
Packit Service fb6fa5
   * of this signal does not hurt and is allowed.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:3");
Packit Service fb6fa5
  set_path_visibility (fixture, "0:4", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:3", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "0:2", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:2", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:3", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:4", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:4:0");
Packit Service fb6fa5
  /* Once 0:4:0 got inserted, 0:4 became a parent */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:4");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:4:0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:4:1");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:4:1");
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "0:4:2", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "0:4:4", TRUE);
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:4", 2);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filled_vroot_hide_root_level (FilterTest    *fixture,
Packit Service fb6fa5
                              gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  /* These changes do not affect the filter's root level */
Packit Service fb6fa5
  set_path_visibility (fixture, "0", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "4", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Even though we set the virtual root parent node to FALSE,
Packit Service fb6fa5
   * the virtual root contents remain.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  set_path_visibility (fixture, "2", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* No change */
Packit Service fb6fa5
  set_path_visibility (fixture, "1", FALSE);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "3", FALSE);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Show some */
Packit Service fb6fa5
  set_path_visibility (fixture, "2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "1", TRUE);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "3", TRUE);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Now test changes in the virtual root level */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "3");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:4", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "1:4", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "3");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "3");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:4", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "2", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:1", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:3", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:4", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "1:4", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:4", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 4);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:4", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "2", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "1");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "1");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:1", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 2);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
filled_vroot_hide_child_levels (FilterTest    *fixture,
Packit Service fb6fa5
                                gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:2", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH - 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0:3");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:4", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:4:3", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:4:0", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:4:1", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:4:2", FALSE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:4:4", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", LEVEL_LENGTH - 2);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Since "0:2" is hidden, "0:4" must be "0:3" in the filter model */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:3");
Packit Service fb6fa5
  /* FIXME: Actually, the filter model should not be emitted the
Packit Service fb6fa5
   * row-has-child-toggled signal here.  *However* an extraneous emission
Packit Service fb6fa5
   * of this signal does not hurt and is allowed.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:3");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:4", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:3", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:2", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:3", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:4", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* FIXME: Inconsistency!  For the non-vroot case we also receive two
Packit Service fb6fa5
   * row-has-child-toggled signals here.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:4:0");
Packit Service fb6fa5
  /* Once 0:4:0 got inserted, 0:4 became a parent */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:4");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:4:1");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:4:2", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:0:4:4", TRUE);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:4", 2);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
empty_show_nodes (FilterTest    *fixture,
Packit Service fb6fa5
                  gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "3", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "3:2:2", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:0");
Packit Service fb6fa5
  set_path_visibility (fixture, "3:2", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0:0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "3", FALSE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "3:2:1", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "3", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0", 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0:0", 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
empty_show_multiple_nodes (FilterTest    *fixture,
Packit Service fb6fa5
                           gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkTreePath *changed_path;
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "1");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "1");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "1");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "1");
Packit Service fb6fa5
Packit Service fb6fa5
  /* We simulate a change in visible func condition with this.  The
Packit Service fb6fa5
   * visibility state of multiple nodes changes at once, we emit row-changed
Packit Service fb6fa5
   * for these nodes (and others) after that.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_block_signals (fixture);
Packit Service fb6fa5
  set_path_visibility (fixture, "3", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "4", TRUE);
Packit Service fb6fa5
  filter_test_unblock_signals (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  changed_path = gtk_tree_path_new ();
Packit Service fb6fa5
  gtk_tree_path_append_index (changed_path, 2);
Packit Service fb6fa5
  gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                           &iter, changed_path);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_next (changed_path);
Packit Service fb6fa5
  gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_next (changed_path);
Packit Service fb6fa5
  gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_free (changed_path);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "3:2:2", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0:0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0:0");
Packit Service fb6fa5
  set_path_visibility (fixture, "3:2", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0:0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "3", FALSE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "3:2:1", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "3", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0", 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0:0", 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
empty_vroot_show_nodes (FilterTest    *fixture,
Packit Service fb6fa5
                        gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "3", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:1", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:1", 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
empty_vroot_show_multiple_nodes (FilterTest    *fixture,
Packit Service fb6fa5
                                 gconstpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkTreePath *changed_path;
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* We simulate a change in visible func condition with this.  The
Packit Service fb6fa5
   * visibility state of multiple nodes changes at once, we emit row-changed
Packit Service fb6fa5
   * for these nodes (and others) after that.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_block_signals (fixture);
Packit Service fb6fa5
  set_path_visibility (fixture, "2", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "3", TRUE);
Packit Service fb6fa5
  filter_test_unblock_signals (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  changed_path = gtk_tree_path_new ();
Packit Service fb6fa5
  gtk_tree_path_append_index (changed_path, 1);
Packit Service fb6fa5
  gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                           &iter, changed_path);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_next (changed_path);
Packit Service fb6fa5
  gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_next (changed_path);
Packit Service fb6fa5
  gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_next (changed_path);
Packit Service fb6fa5
  gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_free (changed_path);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "1");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "1");
Packit Service fb6fa5
Packit Service fb6fa5
  /* Again, we simulate a call to refilter */
Packit Service fb6fa5
  filter_test_block_signals (fixture);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:3", TRUE);
Packit Service fb6fa5
  filter_test_unblock_signals (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  changed_path = gtk_tree_path_new ();
Packit Service fb6fa5
  gtk_tree_path_append_index (changed_path, 2);
Packit Service fb6fa5
  gtk_tree_path_append_index (changed_path, 1);
Packit Service fb6fa5
  gtk_tree_model_get_iter (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                           &iter, changed_path);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_next (changed_path);
Packit Service fb6fa5
  gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_next (changed_path);
Packit Service fb6fa5
  gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_next (changed_path);
Packit Service fb6fa5
  gtk_tree_model_iter_next (GTK_TREE_MODEL (fixture->store), &iter);
Packit Service fb6fa5
  gtk_tree_model_row_changed (GTK_TREE_MODEL (fixture->store),
Packit Service fb6fa5
                              changed_path, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_free (changed_path);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (fixture, "3", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 2);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_DELETED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", FALSE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:1", TRUE);
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 2);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:1", 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_hide_single (FilterTest    *fixture,
Packit Service fb6fa5
                        gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2", FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals (fixture, 2);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_hide_single_child (FilterTest    *fixture,
Packit Service fb6fa5
                              gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals (fixture, 2);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_hide_single_multi_level (FilterTest    *fixture,
Packit Service fb6fa5
                                    gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* This row is not shown, so its signal is not propagated */
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2", FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals (fixture, 2);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2:2", LEVEL_LENGTH - 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_vroot_hide_single (FilterTest    *fixture,
Packit Service fb6fa5
                              gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.  (We add an additional level to
Packit Service fb6fa5
   * take the virtual root into account).
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals_with_vroot (fixture, 3, path);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH - 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_vroot_hide_single_child (FilterTest    *fixture,
Packit Service fb6fa5
                                    gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2", FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.  (We add an additional level to take
Packit Service fb6fa5
   * the virtual root into account).
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals_with_vroot (fixture, 3, path);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_vroot_hide_single_multi_level (FilterTest    *fixture,
Packit Service fb6fa5
                                          gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  /* This row is not shown, so its signal is not propagated */
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2:2", FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2", FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals_with_vroot (fixture, 3, path);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH - 1);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2:2", LEVEL_LENGTH - 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_show_single (FilterTest    *fixture,
Packit Service fb6fa5
                        gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals (fixture, 2);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_show_single_child (FilterTest    *fixture,
Packit Service fb6fa5
                              gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals (fixture, 3);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* From here we are filtered, "2" in the real model is "0" in the filter
Packit Service fb6fa5
   * model.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2", TRUE);
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_show_single_multi_level (FilterTest    *fixture,
Packit Service fb6fa5
                                    gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* The view is not showing this row (collapsed state), so it is not
Packit Service fb6fa5
   * referenced.  The signal should not go through.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals (fixture, 3);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* From here we are filtered, "2" in the real model is "0" in the filter
Packit Service fb6fa5
   * model.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2", TRUE);
Packit Service fb6fa5
  check_filter_model (fixture);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0", 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_vroot_show_single (FilterTest    *fixture,
Packit Service fb6fa5
                              gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals_with_vroot (fixture, 3, path);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_vroot_show_single_child (FilterTest    *fixture,
Packit Service fb6fa5
                                    gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals_with_vroot (fixture, 2, path);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* From here we are filtered, "2" in the real model is "0" in the filter
Packit Service fb6fa5
   * model.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
unfiltered_vroot_show_single_multi_level (FilterTest    *fixture,
Packit Service fb6fa5
                                          gconstpointer  user_data)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path = (GtkTreePath *)user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view is not showing this row (collapsed state), so it is not
Packit Service fb6fa5
   * referenced.  The signal should not go through.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2:2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_CHANGED, "2:2");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "2:2");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2:2", TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  signal_monitor_assert_is_empty (fixture->monitor);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2", LEVEL_LENGTH);
Packit Service fb6fa5
  check_level_length (fixture->filter, "2:2", LEVEL_LENGTH);
Packit Service fb6fa5
Packit Service fb6fa5
  /* The view only shows the root level, so the filter model only has
Packit Service fb6fa5
   * the first two levels cached.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  filter_test_append_refilter_signals_with_vroot (fixture, 4, path);
Packit Service fb6fa5
  filter_test_enable_filter (fixture);
Packit Service fb6fa5
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* From here we are filtered, "2" in the real model is "0" in the filter
Packit Service fb6fa5
   * model.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_INSERTED, "0");
Packit Service fb6fa5
  signal_monitor_append_signal (fixture->monitor, ROW_HAS_CHILD_TOGGLED, "0");
Packit Service fb6fa5
  set_path_visibility (fixture, "2:2", TRUE);
Packit Service fb6fa5
  check_filter_model_with_root (fixture, path);
Packit Service fb6fa5
  check_level_length (fixture->filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0", 1);
Packit Service fb6fa5
  check_level_length (fixture->filter, "0:0", 1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
specific_path_dependent_filter_func (GtkTreeModel *model,
Packit Service fb6fa5
                                     GtkTreeIter  *iter,
Packit Service fb6fa5
                                     gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_model_get_path (model, iter);
Packit Service fb6fa5
  if (gtk_tree_path_get_indices (path)[0] < 4)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_path_dependent_filter (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkListStore *list;
Packit Service fb6fa5
  GtkTreeModel *sort;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
Packit Service fb6fa5
  list = gtk_list_store_new (1, G_TYPE_INT);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 0, 0, 1, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 1, 0, 2, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 2, 0, 3, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 3, 0, 4, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 4, 0, 5, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 5, 0, 6, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 6, 0, 7, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 7, 0, 8, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (list));
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (sort), NULL);
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
Packit Service fb6fa5
                                          specific_path_dependent_filter_func,
Packit Service fb6fa5
                                          NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort), 0,
Packit Service fb6fa5
                                        GTK_SORT_DESCENDING);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < 4; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
Packit Service fb6fa5
                                         NULL, 1))
Packit Service fb6fa5
        gtk_list_store_remove (list, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
      if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (list), &iter,
Packit Service fb6fa5
                                         NULL, 2))
Packit Service fb6fa5
        gtk_list_store_remove (list, &iter);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
specific_append_after_collapse_visible_func (GtkTreeModel *model,
Packit Service fb6fa5
                                             GtkTreeIter  *iter,
Packit Service fb6fa5
                                             gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint number;
Packit Service fb6fa5
  gboolean hide_negative_numbers;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_get (model, iter, 1, &number, -1);
Packit Service fb6fa5
  hide_negative_numbers = GPOINTER_TO_INT (g_object_get_data (data, "private-hide-negative-numbers"));
Packit Service fb6fa5
Packit Service fb6fa5
  return (number >= 0 || !hide_negative_numbers);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_append_after_collapse (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* This test is based on one of the test cases I found in my
Packit Service fb6fa5
   * old test cases directory.  I unfortunately do not have a record
Packit Service fb6fa5
   * from who this test case originated.  -Kris.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * General idea:
Packit Service fb6fa5
   * - Construct tree.
Packit Service fb6fa5
   * - Show tree, expand, collapse.
Packit Service fb6fa5
   * - Add a row.
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkTreeIter child_iter;
Packit Service fb6fa5
  GtkTreeIter child_iter2;
Packit Service fb6fa5
  GtkTreePath *append_path;
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
  GtkTreeModel *sort;
Packit Service fb6fa5
Packit Service fb6fa5
  GtkWidget *window;
Packit Service fb6fa5
  GtkWidget *tree_view;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_INT);
Packit Service fb6fa5
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
Packit Service fb6fa5
  g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
Packit Service fb6fa5
                     GINT_TO_POINTER (FALSE));
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
Packit Service fb6fa5
                                          specific_append_after_collapse_visible_func,
Packit Service fb6fa5
                                          filter, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  sort = gtk_tree_model_sort_new_with_model (filter);
Packit Service fb6fa5
Packit Service fb6fa5
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit Service fb6fa5
  tree_view = gtk_tree_view_new_with_model (sort);
Packit Service fb6fa5
  gtk_container_add (GTK_CONTAINER (window), tree_view);
Packit Service fb6fa5
  gtk_widget_realize (tree_view);
Packit Service fb6fa5
Packit Service fb6fa5
  while (gtk_events_pending ())
Packit Service fb6fa5
    gtk_main_iteration ();
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_prepend (store, &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter,
Packit Service fb6fa5
                      0, "hallo", 1, 1, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &child_iter, &iter);
Packit Service fb6fa5
  gtk_tree_store_set (store, &child_iter,
Packit Service fb6fa5
                      0, "toemaar", 1, 1, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &child_iter2, &child_iter);
Packit Service fb6fa5
  gtk_tree_store_set (store, &child_iter2,
Packit Service fb6fa5
                      0, "very deep", 1, 1, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  append_path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &child_iter2);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &child_iter, &iter);
Packit Service fb6fa5
  gtk_tree_store_set (store, &child_iter,
Packit Service fb6fa5
                      0, "sja", 1, 1, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &child_iter, &iter);
Packit Service fb6fa5
  gtk_tree_store_set (store, &child_iter,
Packit Service fb6fa5
                      0, "some word", 1, -1, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Expand and collapse the tree */
Packit Service fb6fa5
  gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
Packit Service fb6fa5
  while (gtk_events_pending ())
Packit Service fb6fa5
    gtk_main_iteration ();
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view));
Packit Service fb6fa5
  while (gtk_events_pending ())
Packit Service fb6fa5
    gtk_main_iteration ();
Packit Service fb6fa5
Packit Service fb6fa5
  /* Add another it */
Packit Service fb6fa5
  g_object_set_data (G_OBJECT (filter), "private-hide-negative-numbers",
Packit Service fb6fa5
                     GINT_TO_POINTER (TRUE));
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, append_path))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_tree_store_append (store, &child_iter, &iter);
Packit Service fb6fa5
      gtk_tree_store_set (store, &child_iter,
Packit Service fb6fa5
                          0, "new new new !!", 1, 1, -1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  gtk_tree_path_free (append_path);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Expand */
Packit Service fb6fa5
  gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
Packit Service fb6fa5
  while (gtk_events_pending ())
Packit Service fb6fa5
    gtk_main_iteration ();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
specific_sort_filter_remove_node_compare_func (GtkTreeModel  *model,
Packit Service fb6fa5
                                               GtkTreeIter   *iter1,
Packit Service fb6fa5
                                               GtkTreeIter   *iter2,
Packit Service fb6fa5
                                               gpointer       data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return -1;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
specific_sort_filter_remove_node_visible_func (GtkTreeModel  *model,
Packit Service fb6fa5
                                               GtkTreeIter   *iter,
Packit Service fb6fa5
                                               gpointer       data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  char *item = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Do reference the model */
Packit Service fb6fa5
  gtk_tree_model_get (model, iter, 0, &item, -1);
Packit Service fb6fa5
  g_free (item);
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_sort_filter_remove_node (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* This test is based on one of the test cases I found in my
Packit Service fb6fa5
   * old test cases directory.  I unfortunately do not have a record
Packit Service fb6fa5
   * from who this test case originated.  -Kris.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * General idea:
Packit Service fb6fa5
   *  - Create tree store, sort, filter models.  The sort model has
Packit Service fb6fa5
   *    a default sort func that is enabled, filter model a visible func
Packit Service fb6fa5
   *    that defaults to returning FALSE.
Packit Service fb6fa5
   *  - Remove a node from the tree store.
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
  GtkTreeModel *sort;
Packit Service fb6fa5
Packit Service fb6fa5
  GtkWidget *window;
Packit Service fb6fa5
  GtkWidget *tree_view;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_tree_store_new (1, G_TYPE_STRING);
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, "Hello1", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, "Hello2", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
Packit Service fb6fa5
  gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
Packit Service fb6fa5
                                           specific_sort_filter_remove_node_compare_func, NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (sort, NULL);
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
Packit Service fb6fa5
                                          specific_sort_filter_remove_node_visible_func,
Packit Service fb6fa5
                                          filter, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit Service fb6fa5
  tree_view = gtk_tree_view_new_with_model (filter);
Packit Service fb6fa5
  gtk_container_add (GTK_CONTAINER (window), tree_view);
Packit Service fb6fa5
  gtk_widget_realize (tree_view);
Packit Service fb6fa5
Packit Service fb6fa5
  while (gtk_events_pending ())
Packit Service fb6fa5
    gtk_main_iteration ();
Packit Service fb6fa5
Packit Service fb6fa5
  /* Remove a node */
Packit Service fb6fa5
  gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
Packit Service fb6fa5
  gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter);
Packit Service fb6fa5
  gtk_tree_store_remove (store, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  while (gtk_events_pending ())
Packit Service fb6fa5
    gtk_main_iteration ();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_sort_filter_remove_root (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* This test is based on one of the test cases I found in my
Packit Service fb6fa5
   * old test cases directory.  I unfortunately do not have a record
Packit Service fb6fa5
   * from who this test case originated.  -Kris.
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  GtkTreeModel *model, *sort, *filter;
Packit Service fb6fa5
  GtkTreeIter root, mid, leaf;
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
Packit Service fb6fa5
  model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_INT));
Packit Service fb6fa5
  gtk_tree_store_append (GTK_TREE_STORE (model), &root, NULL);
Packit Service fb6fa5
  gtk_tree_store_append (GTK_TREE_STORE (model), &mid, &root);
Packit Service fb6fa5
  gtk_tree_store_append (GTK_TREE_STORE (model), &leaf, &mid);
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_model_get_path (model, &mid);
Packit Service fb6fa5
Packit Service fb6fa5
  sort = gtk_tree_model_sort_new_with_model (model);
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (sort, path);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_remove (GTK_TREE_STORE (model), &root);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (filter);
Packit Service fb6fa5
  g_object_unref (sort);
Packit Service fb6fa5
  g_object_unref (model);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_root_mixed_visibility (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
  /* A bit nasty, apologies */
Packit Service fb6fa5
  FilterTest fixture;
Packit Service fb6fa5
Packit Service fb6fa5
  fixture.store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < LEVEL_LENGTH; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTreeIter iter;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_store_insert (fixture.store, &iter, NULL, i);
Packit Service fb6fa5
      if (i % 2 == 0)
Packit Service fb6fa5
        create_tree_store_set_values (fixture.store, &iter, TRUE);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        create_tree_store_set_values (fixture.store, &iter, FALSE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture.store), NULL);
Packit Service fb6fa5
  fixture.filter = GTK_TREE_MODEL_FILTER (filter);
Packit Service fb6fa5
  fixture.monitor = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_column (fixture.filter, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  /* In order to trigger the potential bug, we should not access
Packit Service fb6fa5
   * the filter model here (so don't call the check functions).
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  /* Change visibility of an odd row to TRUE */
Packit Service fb6fa5
  set_path_visibility (&fixture, "3", TRUE);
Packit Service fb6fa5
  check_filter_model (&fixture);
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 4);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
specific_has_child_filter_filter_func (GtkTreeModel *model,
Packit Service fb6fa5
                                       GtkTreeIter  *iter,
Packit Service fb6fa5
                                       gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gtk_tree_model_iter_has_child (model, iter);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_has_child_filter (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
  GtkTreeIter iter, root;
Packit Service fb6fa5
  /* A bit nasty, apologies */
Packit Service fb6fa5
  FilterTest fixture;
Packit Service fb6fa5
Packit Service fb6fa5
  fixture.store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture.store), NULL);
Packit Service fb6fa5
  fixture.filter = GTK_TREE_MODEL_FILTER (filter);
Packit Service fb6fa5
  fixture.monitor = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  /* We will filter on parent state using a filter function.  We will
Packit Service fb6fa5
   * manually keep the boolean column in sync, so that we can use
Packit Service fb6fa5
   * check_filter_model() to check the consistency of the model.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  /* FIXME: We need a check_filter_model() that is not tied to LEVEL_LENGTH
Packit Service fb6fa5
   * to be able to check the structure here.  We keep the calls to
Packit Service fb6fa5
   * check_filter_model() commented out until then.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_func (fixture.filter,
Packit Service fb6fa5
                                          specific_has_child_filter_filter_func,
Packit Service fb6fa5
                                          NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &root, NULL);
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &root, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* check_filter_model (&fixture); */
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &iter, &root);
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &iter, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Parent must now be visible.  Do the level length check first,
Packit Service fb6fa5
   * to avoid modifying the child model triggering a row-changed to
Packit Service fb6fa5
   * the filter model.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture.filter, "0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (&fixture, "0", TRUE);
Packit Service fb6fa5
  /* check_filter_model (&fixture); */
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &root, NULL);
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &iter, &root);
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture.filter, "1", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &root, TRUE);
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &iter, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* check_filter_model (&fixture); */
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &iter, &root);
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &iter, TRUE);
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture.filter, "0", 0);
Packit Service fb6fa5
  check_level_length (fixture.filter, "1", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Now remove one of the remaining child rows */
Packit Service fb6fa5
  gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture.store),
Packit Service fb6fa5
                                       &iter, "0:0");
Packit Service fb6fa5
  gtk_tree_store_remove (fixture.store, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture.filter, "0", 0);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (&fixture, "0", FALSE);
Packit Service fb6fa5
  /* check_filter_model (&fixture); */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
specific_root_has_child_filter_filter_func (GtkTreeModel *model,
Packit Service fb6fa5
                                            GtkTreeIter  *iter,
Packit Service fb6fa5
                                            gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int depth;
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_model_get_path (model, iter);
Packit Service fb6fa5
  depth = gtk_tree_path_get_depth (path);
Packit Service fb6fa5
  gtk_tree_path_free (path);
Packit Service fb6fa5
Packit Service fb6fa5
  if (depth > 1)
Packit Service fb6fa5
    return TRUE;
Packit Service fb6fa5
  /* else */
Packit Service fb6fa5
  return gtk_tree_model_iter_has_child (model, iter);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_root_has_child_filter (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
  GtkTreeIter iter, root;
Packit Service fb6fa5
  /* A bit nasty, apologies */
Packit Service fb6fa5
  FilterTest fixture;
Packit Service fb6fa5
Packit Service fb6fa5
  /* This is a variation on the above test case wherein the has-child
Packit Service fb6fa5
   * check for visibility only applies to root level nodes.
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  fixture.store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fixture.store), NULL);
Packit Service fb6fa5
  fixture.filter = GTK_TREE_MODEL_FILTER (filter);
Packit Service fb6fa5
  fixture.monitor = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  /* We will filter on parent state using a filter function.  We will
Packit Service fb6fa5
   * manually keep the boolean column in sync, so that we can use
Packit Service fb6fa5
   * check_filter_model() to check the consistency of the model.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  /* FIXME: We need a check_filter_model() that is not tied to LEVEL_LENGTH
Packit Service fb6fa5
   * to be able to check the structure here.  We keep the calls to
Packit Service fb6fa5
   * check_filter_model() commented out until then.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_func (fixture.filter,
Packit Service fb6fa5
                                          specific_root_has_child_filter_filter_func,
Packit Service fb6fa5
                                          NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &root, NULL);
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &root, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* check_filter_model (&fixture); */
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &iter, &root);
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &iter, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Parent must now be visible.  Do the level length check first,
Packit Service fb6fa5
   * to avoid modifying the child model triggering a row-changed to
Packit Service fb6fa5
   * the filter model.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture.filter, "0", 1);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (&fixture, "0", TRUE);
Packit Service fb6fa5
  /* check_filter_model (&fixture); */
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &root, NULL);
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &iter, &root);
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture.filter, "1", 1);
Packit Service fb6fa5
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &root, TRUE);
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &iter, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* check_filter_model (&fixture); */
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (fixture.store, &iter, &root);
Packit Service fb6fa5
  create_tree_store_set_values (fixture.store, &iter, TRUE);
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 2);
Packit Service fb6fa5
  check_level_length (fixture.filter, "0", 1);
Packit Service fb6fa5
  check_level_length (fixture.filter, "1", 2);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Now remove one of the remaining child rows */
Packit Service fb6fa5
  gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (fixture.store),
Packit Service fb6fa5
                                       &iter, "0:0");
Packit Service fb6fa5
  gtk_tree_store_remove (fixture.store, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  check_level_length (fixture.filter, NULL, 1);
Packit Service fb6fa5
  check_level_length (fixture.filter, "0", 2);
Packit Service fb6fa5
Packit Service fb6fa5
  set_path_visibility (&fixture, "0", FALSE);
Packit Service fb6fa5
  /* check_filter_model (&fixture); */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_filter_add_child (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* This test is based on one of the test cases I found in my
Packit Service fb6fa5
   * old test cases directory.  I unfortunately do not have a record
Packit Service fb6fa5
   * from who this test case originated.  -Kris.
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkTreeIter iter_first;
Packit Service fb6fa5
  GtkTreeIter child;
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_tree_store_new (1, G_TYPE_STRING);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter_first, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter_first, 0, "Hello", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, "Hello", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, "Hello", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, "Hello", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, "Hello", -1);
Packit Service fb6fa5
  gtk_tree_store_append (store, &child, &iter_first);
Packit Service fb6fa5
  gtk_tree_store_set (store, &child, 0, "Hello", -1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_list_store_clear (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkListStore *list;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
  GtkWidget *view;
Packit Service fb6fa5
Packit Service fb6fa5
  list = gtk_list_store_new (1, G_TYPE_INT);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 0, 0, 1, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 1, 0, 2, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 2, 0, 3, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 3, 0, 4, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 4, 0, 5, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 5, 0, 6, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 6, 0, 7, -1);
Packit Service fb6fa5
  gtk_list_store_insert_with_values (list, &iter, 7, 0, 8, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (list), NULL);
Packit Service fb6fa5
  view = gtk_tree_view_new_with_model (filter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_list_store_clear (list);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_bug_300089 (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* Test case for GNOME Bugzilla bug 300089.  Written by
Packit Service fb6fa5
   * Matthias Clasen.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  GtkTreeModel *sort_model, *child_model;
Packit Service fb6fa5
  GtkTreePath *path;
Packit Service fb6fa5
  GtkTreeIter iter, iter2, sort_iter;
Packit Service fb6fa5
Packit Service fb6fa5
  child_model = GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_STRING));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
Packit Service fb6fa5
  gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "B", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
Packit Service fb6fa5
  gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "D", -1);
Packit Service fb6fa5
  gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter2, &iter);
Packit Service fb6fa5
  gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter2, 0, "E", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (GTK_TREE_STORE (child_model), &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "C", -1);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  sort_model = GTK_TREE_MODEL (gtk_tree_model_sort_new_with_model (child_model));
Packit Service fb6fa5
  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model),
Packit Service fb6fa5
                                        0, GTK_SORT_ASCENDING);
Packit Service fb6fa5
Packit Service fb6fa5
  path = gtk_tree_path_new_from_indices (1, 1, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  /* make sure a level is constructed */ 
Packit Service fb6fa5
  gtk_tree_model_get_iter (sort_model, &sort_iter, path);
Packit Service fb6fa5
Packit Service fb6fa5
  /* change the "E" row in a way that causes it to change position */ 
Packit Service fb6fa5
  gtk_tree_model_get_iter (child_model, &iter, path);
Packit Service fb6fa5
  gtk_tree_store_set (GTK_TREE_STORE (child_model), &iter, 0, "A", -1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static int
Packit Service fb6fa5
specific_bug_301558_sort_func (GtkTreeModel *model,
Packit Service fb6fa5
                               GtkTreeIter  *a,
Packit Service fb6fa5
                               GtkTreeIter  *b,
Packit Service fb6fa5
                               gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int i, j;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_get (model, a, 0, &i, -1);
Packit Service fb6fa5
  gtk_tree_model_get (model, b, 0, &j, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  return j - i;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_bug_301558 (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* Test case for GNOME Bugzilla bug 301558 provided by
Packit Service fb6fa5
   * Markku Vire.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  GtkTreeStore *tree;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
  GtkTreeModel *sort;
Packit Service fb6fa5
  GtkTreeIter root, iter, iter2;
Packit Service fb6fa5
  GtkWidget *view;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  gboolean add;
Packit Service fb6fa5
Packit Service fb6fa5
  tree = gtk_tree_store_new (2, G_TYPE_INT, G_TYPE_BOOLEAN);
Packit Service fb6fa5
  gtk_tree_store_append (tree, &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (tree, &iter, 0, 123, 1, TRUE, -1);
Packit Service fb6fa5
  gtk_tree_store_append (tree, &iter2, &iter);
Packit Service fb6fa5
  gtk_tree_store_set (tree, &iter2, 0, 73, 1, TRUE, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (tree));
Packit Service fb6fa5
  gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sort),
Packit Service fb6fa5
                                           specific_bug_301558_sort_func,
Packit Service fb6fa5
                                           NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (sort, NULL);
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER (filter), 1);
Packit Service fb6fa5
Packit Service fb6fa5
  view = gtk_tree_view_new_with_model (filter);
Packit Service fb6fa5
Packit Service fb6fa5
  while (gtk_events_pending ())
Packit Service fb6fa5
    gtk_main_iteration ();
Packit Service fb6fa5
Packit Service fb6fa5
  add = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < 10; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (tree), &root))
Packit Service fb6fa5
        g_assert_not_reached ();
Packit Service fb6fa5
Packit Service fb6fa5
      if (add)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gtk_tree_store_append (tree, &iter, &root);
Packit Service fb6fa5
          gtk_tree_store_set (tree, &iter, 0, 456, 1, TRUE, -1);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        {
Packit Service fb6fa5
          int n;
Packit Service fb6fa5
          n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (tree), &root);
Packit Service fb6fa5
          gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (tree), &iter,
Packit Service fb6fa5
                                         &root, n - 1);
Packit Service fb6fa5
          gtk_tree_store_remove (tree, &iter);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      add = !add;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
specific_bug_311955_filter_func (GtkTreeModel *model,
Packit Service fb6fa5
                                 GtkTreeIter  *iter,
Packit Service fb6fa5
                                 gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int value;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_get (model, iter, 0, &value, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  return (value != 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_bug_311955 (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* This is a test case for GNOME Bugzilla bug 311955.  It was written
Packit Service fb6fa5
   * by Markku Vire.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  GtkTreeIter iter, child, root;
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
  GtkTreeModel *sort;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
Packit Service fb6fa5
  GtkWidget *window;
Packit Service fb6fa5
  GtkWidget *tree_view;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  int n;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_tree_store_new (1, G_TYPE_INT);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &root, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &root, 0, 33, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, &root);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, 50, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, 22, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (sort, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
Packit Service fb6fa5
                                          specific_bug_311955_filter_func,
Packit Service fb6fa5
                                          NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit Service fb6fa5
  tree_view = gtk_tree_view_new_with_model (filter);
Packit Service fb6fa5
  g_object_unref (store);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
Packit Service fb6fa5
Packit Service fb6fa5
  while (gtk_events_pending ())
Packit Service fb6fa5
    gtk_main_iteration ();
Packit Service fb6fa5
Packit Service fb6fa5
  /* Fill model */
Packit Service fb6fa5
  for (i = 0; i < 4; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_tree_store_append (store, &iter, &root);
Packit Service fb6fa5
Packit Service fb6fa5
      if (i < 3)
Packit Service fb6fa5
        gtk_tree_store_set (store, &iter, 0, i, -1);
Packit Service fb6fa5
Packit Service fb6fa5
      if (i % 2 == 0)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gtk_tree_store_append (store, &child, &iter);
Packit Service fb6fa5
          gtk_tree_store_set (store, &child, 0, 10, -1);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  while (gtk_events_pending ())
Packit Service fb6fa5
    gtk_main_iteration ();
Packit Service fb6fa5
Packit Service fb6fa5
  /* Remove bottommost child from the tree. */
Packit Service fb6fa5
  gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &root);
Packit Service fb6fa5
  n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), &root);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter, &root, n - 2))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (gtk_tree_model_iter_children (GTK_TREE_MODEL (store), &child, &iter))
Packit Service fb6fa5
        gtk_tree_store_remove (store, &child);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    g_assert_not_reached ();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_bug_346800 (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* This is a test case for GNOME Bugzilla bug 346800.  It was written
Packit Service fb6fa5
   * by Jonathan Matthew.
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  GtkTreeIter node_iters[50];
Packit Service fb6fa5
  GtkTreeIter child_iters[50];
Packit Service fb6fa5
  GtkTreeModel *model;
Packit Service fb6fa5
  GtkTreeModelFilter *filter;
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
  GType *columns;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  int items = 50;
Packit Service fb6fa5
  columns = g_new (GType, 2);
Packit Service fb6fa5
  columns[0] = G_TYPE_STRING;
Packit Service fb6fa5
  columns[1] = G_TYPE_BOOLEAN;
Packit Service fb6fa5
  store = gtk_tree_store_newv (2, columns);
Packit Service fb6fa5
  model = GTK_TREE_MODEL (store);
Packit Service fb6fa5
Packit Service fb6fa5
  filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (model, NULL));
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_column (filter, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i=0; i
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* allocate random amounts of junk, otherwise the filter model's arrays can expand without moving */
Packit Service fb6fa5
Packit Service fb6fa5
      g_malloc (138);
Packit Service fb6fa5
      gtk_tree_store_append (store, &node_iters[i], NULL);
Packit Service fb6fa5
      gtk_tree_store_set (store, &node_iters[i],
Packit Service fb6fa5
                          0, "something",
Packit Service fb6fa5
                          1, ((i%6) == 0) ? FALSE : TRUE,
Packit Service fb6fa5
                          -1);
Packit Service fb6fa5
Packit Service fb6fa5
      g_malloc (47);
Packit Service fb6fa5
      gtk_tree_store_append (store, &child_iters[i], &node_iters[i]);
Packit Service fb6fa5
      gtk_tree_store_set (store, &child_iters[i],
Packit Service fb6fa5
                          0, "something else",
Packit Service fb6fa5
                          1, FALSE,
Packit Service fb6fa5
                          -1);
Packit Service fb6fa5
      gtk_tree_model_filter_refilter (filter);
Packit Service fb6fa5
Packit Service fb6fa5
      if (i > 6)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-1], 1,
Packit Service fb6fa5
                              (i & 1) ? TRUE : FALSE, -1);
Packit Service fb6fa5
          gtk_tree_model_filter_refilter (filter);
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_tree_store_set (GTK_TREE_STORE (model), &child_iters[i-2], 1,
Packit Service fb6fa5
                              (i & 1) ? FALSE: TRUE, -1);
Packit Service fb6fa5
          gtk_tree_model_filter_refilter (filter);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_bug_364946 (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* This is a test case for GNOME Bugzilla bug 364946.  It was written
Packit Service fb6fa5
   * by Andreas Koehler.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
  GtkTreeIter a, aa, aaa, aab, iter;
Packit Service fb6fa5
  GtkTreeModel *s_model;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_tree_store_new (1, G_TYPE_STRING);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &a, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &a, 0, "0", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &aa, &a);
Packit Service fb6fa5
  gtk_tree_store_set (store, &aa, 0, "0:0", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &aaa, &aa);
Packit Service fb6fa5
  gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &aab, &aa);
Packit Service fb6fa5
  gtk_tree_store_set (store, &aab, 0, "0:0:1", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  s_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
Packit Service fb6fa5
  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (s_model), 0,
Packit Service fb6fa5
                                        GTK_SORT_ASCENDING);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_get_iter_from_string (s_model, &iter, "0:0:0");
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_set (store, &aaa, 0, "0:0:0", -1);
Packit Service fb6fa5
  gtk_tree_store_remove (store, &aaa;;
Packit Service fb6fa5
  gtk_tree_store_remove (store, &aab;;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_sort_clear_cache (GTK_TREE_MODEL_SORT (s_model));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
specific_bug_464173_visible_func (GtkTreeModel *model,
Packit Service fb6fa5
                                  GtkTreeIter  *iter,
Packit Service fb6fa5
                                  gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean *visible = (gboolean *)data;
Packit Service fb6fa5
Packit Service fb6fa5
  return *visible;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_bug_464173 (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* Test case for GNOME Bugzilla bug 464173, test case written
Packit Service fb6fa5
   * by Andreas Koehler.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  GtkTreeStore *model;
Packit Service fb6fa5
  GtkTreeModelFilter *f_model;
Packit Service fb6fa5
  GtkTreeIter iter1, iter2;
Packit Service fb6fa5
  GtkWidget *view;
Packit Service fb6fa5
  gboolean visible = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  model = gtk_tree_store_new (1, G_TYPE_STRING);
Packit Service fb6fa5
  gtk_tree_store_append (model, &iter1, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (model, &iter1, 0, "Foo", -1);
Packit Service fb6fa5
  gtk_tree_store_append (model, &iter2, &iter1);
Packit Service fb6fa5
  gtk_tree_store_set (model, &iter2, 0, "Bar", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  f_model = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL(model), NULL));
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_func (f_model,
Packit Service fb6fa5
                                          specific_bug_464173_visible_func,
Packit Service fb6fa5
                                          &visible, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (f_model));
Packit Service fb6fa5
Packit Service fb6fa5
  visible = FALSE;
Packit Service fb6fa5
  gtk_tree_model_filter_refilter (f_model);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
specific_bug_540201_filter_func (GtkTreeModel *model,
Packit Service fb6fa5
                                 GtkTreeIter  *iter,
Packit Service fb6fa5
                                 gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean has_children;
Packit Service fb6fa5
Packit Service fb6fa5
  has_children = gtk_tree_model_iter_has_child (model, iter);
Packit Service fb6fa5
Packit Service fb6fa5
  return has_children;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_bug_540201 (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* Test case for GNOME Bugzilla bug 540201, steps provided by
Packit Service fb6fa5
   * Charles Day.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  GtkTreeIter iter, root;
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
  GtkTreeModel *filter;
Packit Service fb6fa5
Packit Service fb6fa5
  GtkWidget *tree_view;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_tree_store_new (1, G_TYPE_INT);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &root, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &root, 0, 33, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
Packit Service fb6fa5
  tree_view = gtk_tree_view_new_with_model (filter);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
Packit Service fb6fa5
                                          specific_bug_540201_filter_func,
Packit Service fb6fa5
                                          NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, &root);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, 50, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, &root);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, 22, -1);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &root, NULL);
Packit Service fb6fa5
  gtk_tree_store_set (store, &root, 0, 33, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_store_append (store, &iter, &root);
Packit Service fb6fa5
  gtk_tree_store_set (store, &iter, 0, 22, -1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
specific_bug_549287_visible_func (GtkTreeModel *model,
Packit Service fb6fa5
                                  GtkTreeIter  *iter,
Packit Service fb6fa5
                                  gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean result = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  result = gtk_tree_model_iter_has_child (model, iter);
Packit Service fb6fa5
Packit Service fb6fa5
  return result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
specific_bug_549287 (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* Test case for GNOME Bugzilla bug 529287, provided by Julient Puydt */
Packit Service fb6fa5
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  GtkTreeStore *store;
Packit Service fb6fa5
  GtkTreeModel *filtered;
Packit Service fb6fa5
  GtkWidget *view;
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkTreeIter *swap, *parent, *child;
Packit Service fb6fa5
Packit Service fb6fa5
  store = gtk_tree_store_new (1, G_TYPE_STRING);
Packit Service fb6fa5
  filtered = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
Packit Service fb6fa5
  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filtered),
Packit Service fb6fa5
                                          specific_bug_549287_visible_func,
Packit Service fb6fa5
                                          NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  view = gtk_tree_view_new_with_model (filtered);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < 4; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          parent = gtk_tree_iter_copy (&iter);
Packit Service fb6fa5
          child = gtk_tree_iter_copy (&iter);
Packit Service fb6fa5
Packit Service fb6fa5
          while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store),
Packit Service fb6fa5
                                                child, parent, 0))
Packit Service fb6fa5
            {
Packit Service fb6fa5
Packit Service fb6fa5
              swap = parent;
Packit Service fb6fa5
              parent = child;
Packit Service fb6fa5
              child = swap;
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_tree_store_append (store, child, parent);
Packit Service fb6fa5
          gtk_tree_store_set (store, child,
Packit Service fb6fa5
                              0, "Something",
Packit Service fb6fa5
                              -1);
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_tree_iter_free (parent);
Packit Service fb6fa5
          gtk_tree_iter_free (child);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gtk_tree_store_append (store, &iter, NULL);
Packit Service fb6fa5
          gtk_tree_store_set (store, &iter,
Packit Service fb6fa5
                              0, "Something",
Packit Service fb6fa5
                              -1);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      /* since we inserted something, we changed the visibility conditions: */
Packit Service fb6fa5
      gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filtered));
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* main */
Packit Service fb6fa5
Packit Service fb6fa5
int
Packit Service fb6fa5
main (int    argc,
Packit Service fb6fa5
      char **argv)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_test_init (&argc, &argv, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/self/verify-test-suite",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup,
Packit Service fb6fa5
              verify_test_suite,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/self/verify-test-suite/vroot/depth-1",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup,
Packit Service fb6fa5
              verify_test_suite_vroot,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/self/verify-test-suite/vroot/depth-2",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, 3, -1),
Packit Service fb6fa5
              filter_test_setup,
Packit Service fb6fa5
              verify_test_suite_vroot,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/filled/hide-root-level",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup,
Packit Service fb6fa5
              filled_hide_root_level,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/filled/hide-child-levels",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup,
Packit Service fb6fa5
              filled_hide_child_levels,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/filled/hide-root-level/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup,
Packit Service fb6fa5
              filled_vroot_hide_root_level,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/filled/hide-child-levels/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup,
Packit Service fb6fa5
              filled_vroot_hide_child_levels,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/empty/show-nodes",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup_empty,
Packit Service fb6fa5
              empty_show_nodes,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/empty/show-multiple-nodes",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup_empty,
Packit Service fb6fa5
              empty_show_multiple_nodes,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/empty/show-nodes/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup_empty,
Packit Service fb6fa5
              empty_vroot_show_nodes,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/empty/show-multiple-nodes/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup_empty,
Packit Service fb6fa5
              empty_vroot_show_multiple_nodes,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/hide-single",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup_unfiltered,
Packit Service fb6fa5
              unfiltered_hide_single,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/hide-single-child",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup_unfiltered,
Packit Service fb6fa5
              unfiltered_hide_single_child,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/hide-single-multi-level",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup_unfiltered,
Packit Service fb6fa5
              unfiltered_hide_single_multi_level,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/hide-single/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup_unfiltered,
Packit Service fb6fa5
              unfiltered_vroot_hide_single,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/hide-single-child/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup_unfiltered,
Packit Service fb6fa5
              unfiltered_vroot_hide_single_child,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/hide-single-multi-level/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup_unfiltered,
Packit Service fb6fa5
              unfiltered_vroot_hide_single_multi_level,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/show-single",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup_empty_unfiltered,
Packit Service fb6fa5
              unfiltered_show_single,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/show-single-child",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup_empty_unfiltered,
Packit Service fb6fa5
              unfiltered_show_single_child,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/show-single-multi-level",
Packit Service fb6fa5
              FilterTest, NULL,
Packit Service fb6fa5
              filter_test_setup_empty_unfiltered,
Packit Service fb6fa5
              unfiltered_show_single_multi_level,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/show-single/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup_empty_unfiltered,
Packit Service fb6fa5
              unfiltered_vroot_show_single,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/show-single-child/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup_empty_unfiltered,
Packit Service fb6fa5
              unfiltered_vroot_show_single_child,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
  g_test_add ("/FilterModel/unfiltered/show-single-multi-level/vroot",
Packit Service fb6fa5
              FilterTest, gtk_tree_path_new_from_indices (2, -1),
Packit Service fb6fa5
              filter_test_setup_empty_unfiltered,
Packit Service fb6fa5
              unfiltered_vroot_show_single_multi_level,
Packit Service fb6fa5
              filter_test_teardown);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/path-dependent-filter",
Packit Service fb6fa5
                   specific_path_dependent_filter);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/append-after-collapse",
Packit Service fb6fa5
                   specific_append_after_collapse);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/sort-filter-remove-node",
Packit Service fb6fa5
                   specific_sort_filter_remove_node);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/sort-filter-remove-root",
Packit Service fb6fa5
                   specific_sort_filter_remove_root);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/root-mixed-visibility",
Packit Service fb6fa5
                   specific_root_mixed_visibility);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/has-child-filter",
Packit Service fb6fa5
                   specific_has_child_filter);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/root-has-child-filter",
Packit Service fb6fa5
                   specific_root_has_child_filter);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/filter-add-child",
Packit Service fb6fa5
                   specific_filter_add_child);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/list-store-clear",
Packit Service fb6fa5
                   specific_list_store_clear);
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/bug-300089",
Packit Service fb6fa5
                   specific_bug_300089);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/bug-301558",
Packit Service fb6fa5
                   specific_bug_301558);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/bug-311955",
Packit Service fb6fa5
                   specific_bug_311955);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/bug-346800",
Packit Service fb6fa5
                   specific_bug_346800);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/bug-364946",
Packit Service fb6fa5
                   specific_bug_364946);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/bug-464173",
Packit Service fb6fa5
                   specific_bug_464173);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/bug-540201",
Packit Service fb6fa5
                   specific_bug_540201);
Packit Service fb6fa5
  g_test_add_func ("/FilterModel/specific/bug-549287",
Packit Service fb6fa5
                   specific_bug_549287);
Packit Service fb6fa5
Packit Service fb6fa5
  return g_test_run ();
Packit Service fb6fa5
}