Blame tests/testrichtext.c

Packit 98cdb6
/* testrichtext.c
Packit 98cdb6
 * Copyright (C) 2006 Imendio AB
Packit 98cdb6
 * Authors: Michael Natterer, Tim Janik
Packit 98cdb6
 *
Packit 98cdb6
 * This library is free software; you can redistribute it and/or
Packit 98cdb6
 * modify it under the terms of the GNU Lesser General Public
Packit 98cdb6
 * License as published by the Free Software Foundation; either
Packit 98cdb6
 * version 2 of the License, or (at your option) any later version.
Packit 98cdb6
 *
Packit 98cdb6
 * This library is distributed in the hope that it will be useful,
Packit 98cdb6
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 98cdb6
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 98cdb6
 * Lesser General Public License for more details.
Packit 98cdb6
 *
Packit 98cdb6
 * You should have received a copy of the GNU Lesser General Public
Packit 98cdb6
 * License along with this library; if not, write to the
Packit 98cdb6
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 98cdb6
 * Boston, MA 02111-1307, USA.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
#include <string.h>
Packit 98cdb6
#include <gtk/gtk.h>
Packit 98cdb6
Packit 98cdb6
static guint32 quick_rand32_accu = 2147483563;
Packit 98cdb6
Packit 98cdb6
static inline guint32
Packit 98cdb6
quick_rand32 (void)
Packit 98cdb6
{
Packit 98cdb6
  quick_rand32_accu = 1664525 * quick_rand32_accu + 1013904223;
Packit 98cdb6
  return quick_rand32_accu;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
delete_event (GtkWidget   *widget,
Packit 98cdb6
              GdkEventAny *event,
Packit 98cdb6
              gpointer     user_data)
Packit 98cdb6
{
Packit 98cdb6
  gtk_main_quit ();
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
text_tag_enqueue (GtkTextTag *tag,
Packit 98cdb6
                  gpointer    data)
Packit 98cdb6
{
Packit 98cdb6
  GSList **slist_p = data;
Packit 98cdb6
  *slist_p = g_slist_prepend (*slist_p, tag);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static const gchar *example_text =
Packit 98cdb6
"vkndsk vfds vkfds vkdsv fdlksnvkfdvnkfdvnkdsnvs\n"
Packit 98cdb6
"kmvofdmvfdsvkv fdskvnkfdv nnd.mckfdvnknsknvdnvs"
Packit 98cdb6
"fdlvmfdsvlkfdsmvnskdnvfdsnvf sbskjnvlknfd cvdvnd"
Packit 98cdb6
"mvlfdsv vfdkjv m, ds vkfdks v df,v j kfds v d\n"
Packit 98cdb6
"vnfdskv kjvnfv  cfdkvndfnvcm fd,vk kdsf vj d\n"
Packit 98cdb6
"KLJHkjh kjh klhjKLJH Kjh kjl h34kj h34kj3h klj 23 "
Packit 98cdb6
"kjlkjlhsdjk 34kljh klj hklj 23k4jkjkjh234kjh 52kj "
Packit 98cdb6
"2h34 sdaf ukklj kjl32l jkkjl 23j jkl ljk23 jkl\n"
Packit 98cdb6
"hjhjhj2hj23jh jh jk jk2h3 hj kjj jk jh21 jhhj32.";
Packit 98cdb6
Packit 98cdb6
static GdkAtom
Packit 98cdb6
setup_buffer (GtkTextBuffer *buffer)
Packit 98cdb6
{
Packit 98cdb6
  const guint tlen = strlen (example_text);
Packit 98cdb6
  const guint tcount = 17;
Packit 98cdb6
  GtkTextTag **tags;
Packit 98cdb6
  GtkTextTagTable *ttable = gtk_text_buffer_get_tag_table (buffer);
Packit 98cdb6
  GSList *node, *slist = NULL;
Packit 98cdb6
  GdkAtom atom;
Packit 98cdb6
  guint i;
Packit 98cdb6
Packit 98cdb6
  tags = g_malloc (sizeof (GtkTextTag *) * tcount);
Packit 98cdb6
Packit 98cdb6
  /* cleanup */
Packit 98cdb6
  gtk_text_buffer_set_text (buffer, "", 0);
Packit 98cdb6
  gtk_text_tag_table_foreach (ttable, text_tag_enqueue, &slist);
Packit 98cdb6
  for (node = slist; node; node = node->next)
Packit 98cdb6
    gtk_text_tag_table_remove (ttable, node->data);
Packit 98cdb6
  g_slist_free (slist);
Packit 98cdb6
Packit 98cdb6
  /* create new tags */
Packit 98cdb6
  for (i = 0; i < tcount; i++)
Packit 98cdb6
    {
Packit 98cdb6
      char *s = g_strdup_printf ("tag%u", i);
Packit 98cdb6
      tags[i] = gtk_text_buffer_create_tag (buffer, s,
Packit 98cdb6
                                            "weight", quick_rand32() >> 31 ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
Packit 98cdb6
                                            "style", quick_rand32() >> 31 ? PANGO_STYLE_OBLIQUE : PANGO_STYLE_NORMAL,
Packit 98cdb6
                                            "underline", quick_rand32() >> 31,
Packit 98cdb6
                                            NULL);
Packit 98cdb6
      g_free (s);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* assign text and tags */
Packit 98cdb6
  gtk_text_buffer_set_text (buffer, example_text, -1);
Packit 98cdb6
  for (i = 0; i < tcount * 5; i++)
Packit 98cdb6
    {
Packit 98cdb6
      gint a = quick_rand32() % tlen, b = quick_rand32() % tlen;
Packit 98cdb6
      GtkTextIter start, end;
Packit 98cdb6
      gtk_text_buffer_get_iter_at_offset (buffer, &start, MIN (a, b));
Packit 98cdb6
      gtk_text_buffer_get_iter_at_offset (buffer, &end,   MAX (a, b));
Packit 98cdb6
      gtk_text_buffer_apply_tag (buffer, tags[i % tcount], &start, &end;;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* return serialization format */
Packit 98cdb6
  atom = gtk_text_buffer_register_deserialize_tagset (buffer, NULL);
Packit 98cdb6
  gtk_text_buffer_deserialize_set_can_create_tags (buffer, atom, TRUE);
Packit 98cdb6
Packit 98cdb6
  g_free (tags);
Packit 98cdb6
Packit 98cdb6
  return atom;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
test_serialize_deserialize (GtkTextBuffer *buffer,
Packit 98cdb6
                            GdkAtom        atom,
Packit 98cdb6
                            GError       **error)
Packit 98cdb6
{
Packit 98cdb6
  GtkTextIter  start, end;
Packit 98cdb6
  guint8      *spew;
Packit 98cdb6
  gsize        spew_length;
Packit 98cdb6
  gboolean     success;
Packit 98cdb6
Packit 98cdb6
  gtk_text_buffer_get_bounds (buffer, &start, &end;;
Packit 98cdb6
Packit 98cdb6
  spew = gtk_text_buffer_serialize (buffer, buffer, atom,
Packit 98cdb6
                                    &start, &end, &spew_length);
Packit 98cdb6
Packit 98cdb6
  success = gtk_text_buffer_deserialize (buffer, buffer, atom, &end,
Packit 98cdb6
                                         spew, spew_length, error);
Packit 98cdb6
Packit 98cdb6
  g_free (spew);
Packit 98cdb6
Packit 98cdb6
  return success;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
gint
Packit 98cdb6
main (gint   argc,
Packit 98cdb6
      gchar *argv[])
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget     *window;
Packit 98cdb6
  GtkWidget     *sw;
Packit 98cdb6
  GtkWidget     *view;
Packit 98cdb6
  GtkTextBuffer *buffer;
Packit 98cdb6
  GdkAtom        atom;
Packit 98cdb6
  guint          i, broken = 0;
Packit 98cdb6
Packit 98cdb6
  gtk_init (&argc, &argv);
Packit 98cdb6
Packit 98cdb6
  /* initialize random numbers, disable this for deterministic testing */
Packit 98cdb6
  if (1)        
Packit 98cdb6
    quick_rand32_accu = g_random_int();
Packit 98cdb6
Packit 98cdb6
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit 98cdb6
  gtk_widget_set_size_request (window, 400, 300);
Packit 98cdb6
Packit 98cdb6
  sw = gtk_scrolled_window_new (NULL, NULL);
Packit 98cdb6
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
Packit 98cdb6
                                       GTK_SHADOW_IN);
Packit 98cdb6
  gtk_container_set_border_width (GTK_CONTAINER (sw), 12);
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (window), sw);
Packit 98cdb6
Packit 98cdb6
  g_signal_connect (window, "delete-event",
Packit 98cdb6
                    G_CALLBACK (delete_event),
Packit 98cdb6
                    NULL);
Packit 98cdb6
Packit 98cdb6
  buffer = gtk_text_buffer_new (NULL);
Packit 98cdb6
  view = gtk_text_view_new_with_buffer (buffer);
Packit 98cdb6
  g_object_unref (buffer);
Packit 98cdb6
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (sw), view);
Packit 98cdb6
Packit 98cdb6
  gtk_widget_show_all (window);
Packit 98cdb6
  if (0)
Packit 98cdb6
    gtk_main ();
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < 250; i++)
Packit 98cdb6
    {
Packit 98cdb6
      GError *error = NULL;
Packit 98cdb6
      g_printerr ("creating randomly tagged text buffer with accu=0x%x...\n", quick_rand32_accu);
Packit 98cdb6
      atom = setup_buffer (buffer);
Packit 98cdb6
      if (test_serialize_deserialize (buffer, atom, &error))
Packit 98cdb6
        g_printerr ("ok.\n");
Packit 98cdb6
      else
Packit 98cdb6
        {
Packit 98cdb6
          g_printerr ("FAIL: serialization/deserialization failed:\n  %s\n", error->message);
Packit 98cdb6
          broken += 1;
Packit 98cdb6
        }
Packit 98cdb6
      g_clear_error (&error);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return broken > 0;
Packit 98cdb6
}