Add powerbox hook
[gtk-with-powerbox.git] / tests / testrichtext.c
blobd59f608b7bf01db7c5aadccb7ca23a81913b0e37
1 /* testrichtext.c
2 * Copyright (C) 2006 Imendio AB
3 * Authors: Michael Natterer, Tim Janik
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
21 #include <string.h>
22 #include <gtk/gtk.h>
24 static guint32 quick_rand32_accu = 2147483563;
26 static inline guint32
27 quick_rand32 (void)
29 quick_rand32_accu = 1664525 * quick_rand32_accu + 1013904223;
30 return quick_rand32_accu;
33 static gboolean
34 delete_event (GtkWidget *widget,
35 GdkEventAny *event,
36 gpointer user_data)
38 gtk_main_quit ();
40 return TRUE;
43 static void
44 text_tag_enqueue (GtkTextTag *tag,
45 gpointer data)
47 GSList **slist_p = data;
48 *slist_p = g_slist_prepend (*slist_p, tag);
51 static const gchar *example_text =
52 "vkndsk vfds vkfds vkdsv fdlksnvkfdvnkfdvnkdsnvs\n"
53 "kmvofdmvfdsvkv fdskvnkfdv nnd.mckfdvnknsknvdnvs"
54 "fdlvmfdsvlkfdsmvnskdnvfdsnvf sbskjnvlknfd cvdvnd"
55 "mvlfdsv vfdkjv m, ds vkfdks v df,v j kfds v d\n"
56 "vnfdskv kjvnfv cfdkvndfnvcm fd,vk kdsf vj d\n"
57 "KLJHkjh kjh klhjKLJH Kjh kjl h34kj h34kj3h klj 23 "
58 "kjlkjlhsdjk 34kljh klj hklj 23k4jkjkjh234kjh 52kj "
59 "2h34 sdaf ukklj kjl32l jkkjl 23j jkl ljk23 jkl\n"
60 "hjhjhj2hj23jh jh jk jk2h3 hj kjj jk jh21 jhhj32.";
62 static GdkAtom
63 setup_buffer (GtkTextBuffer *buffer)
65 const guint tlen = strlen (example_text);
66 const guint tcount = 17;
67 GtkTextTag **tags;
68 GtkTextTagTable *ttable = gtk_text_buffer_get_tag_table (buffer);
69 GSList *node, *slist = NULL;
70 GdkAtom atom;
71 guint i;
73 tags = g_malloc (sizeof (GtkTextTag *) * tcount);
75 /* cleanup */
76 gtk_text_buffer_set_text (buffer, "", 0);
77 gtk_text_tag_table_foreach (ttable, text_tag_enqueue, &slist);
78 for (node = slist; node; node = node->next)
79 gtk_text_tag_table_remove (ttable, node->data);
80 g_slist_free (slist);
82 /* create new tags */
83 for (i = 0; i < tcount; i++)
85 char *s = g_strdup_printf ("tag%u", i);
86 tags[i] = gtk_text_buffer_create_tag (buffer, s,
87 "weight", quick_rand32() >> 31 ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
88 "style", quick_rand32() >> 31 ? PANGO_STYLE_OBLIQUE : PANGO_STYLE_NORMAL,
89 "underline", quick_rand32() >> 31,
90 NULL);
91 g_free (s);
94 /* assign text and tags */
95 gtk_text_buffer_set_text (buffer, example_text, -1);
96 for (i = 0; i < tcount * 5; i++)
98 gint a = quick_rand32() % tlen, b = quick_rand32() % tlen;
99 GtkTextIter start, end;
100 gtk_text_buffer_get_iter_at_offset (buffer, &start, MIN (a, b));
101 gtk_text_buffer_get_iter_at_offset (buffer, &end, MAX (a, b));
102 gtk_text_buffer_apply_tag (buffer, tags[i % tcount], &start, &end);
105 /* return serialization format */
106 atom = gtk_text_buffer_register_deserialize_tagset (buffer, NULL);
107 gtk_text_buffer_deserialize_set_can_create_tags (buffer, atom, TRUE);
109 g_free (tags);
111 return atom;
114 static gboolean
115 test_serialize_deserialize (GtkTextBuffer *buffer,
116 GdkAtom atom,
117 GError **error)
119 GtkTextIter start, end;
120 guint8 *spew;
121 gsize spew_length;
122 gboolean success;
124 gtk_text_buffer_get_bounds (buffer, &start, &end);
126 spew = gtk_text_buffer_serialize (buffer, buffer, atom,
127 &start, &end, &spew_length);
129 success = gtk_text_buffer_deserialize (buffer, buffer, atom, &end,
130 spew, spew_length, error);
132 g_free (spew);
134 return success;
137 gint
138 main (gint argc,
139 gchar *argv[])
141 GtkWidget *window;
142 GtkWidget *sw;
143 GtkWidget *view;
144 GtkTextBuffer *buffer;
145 GdkAtom atom;
146 guint i, broken = 0;
148 gtk_init (&argc, &argv);
150 /* initialize random numbers, disable this for deterministic testing */
151 if (1)
152 quick_rand32_accu = g_random_int();
154 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
155 gtk_widget_set_size_request (window, 400, 300);
157 sw = gtk_scrolled_window_new (NULL, NULL);
158 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
159 GTK_SHADOW_IN);
160 gtk_container_set_border_width (GTK_CONTAINER (sw), 12);
161 gtk_container_add (GTK_CONTAINER (window), sw);
163 g_signal_connect (window, "delete-event",
164 G_CALLBACK (delete_event),
165 NULL);
167 buffer = gtk_text_buffer_new (NULL);
168 view = gtk_text_view_new_with_buffer (buffer);
169 g_object_unref (buffer);
171 gtk_container_add (GTK_CONTAINER (sw), view);
173 gtk_widget_show_all (window);
174 if (0)
175 gtk_main ();
177 for (i = 0; i < 250; i++)
179 GError *error = NULL;
180 g_printerr ("creating randomly tagged text buffer with accu=0x%x...\n", quick_rand32_accu);
181 atom = setup_buffer (buffer);
182 if (test_serialize_deserialize (buffer, atom, &error))
183 g_printerr ("ok.\n");
184 else
186 g_printerr ("FAIL: serialization/deserialization failed:\n %s\n", error->message);
187 broken += 1;
189 g_clear_error (&error);
192 return broken > 0;