]> Pileus Git - ~andy/gtk/blob - tests/testrichtext.c
Fix C89 compilation issue. (#467711, The Written Word)
[~andy/gtk] / tests / testrichtext.c
1 /* testrichtext.c
2  * Copyright (C) 2006 Imendio AB
3  * Authors: Michael Natterer, Tim Janik
4  *
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.
9  *
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.
14  *
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.
19  */
20
21 #include <string.h>
22 #include <gtk/gtk.h>
23
24 static guint32 quick_rand32_accu = 2147483563;
25
26 static inline guint32
27 quick_rand32 (void)
28 {
29   quick_rand32_accu = 1664525 * quick_rand32_accu + 1013904223;
30   return quick_rand32_accu;
31 }
32
33 static gboolean
34 delete_event (GtkWidget   *widget,
35               GdkEventAny *event,
36               gpointer     user_data)
37 {
38   gtk_main_quit ();
39
40   return TRUE;
41 }
42
43 static void
44 text_tag_enqueue (GtkTextTag *tag,
45                   gpointer    data)
46 {
47   GSList **slist_p = data;
48   *slist_p = g_slist_prepend (*slist_p, tag);
49 }
50
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.";
61
62 static GdkAtom
63 setup_buffer (GtkTextBuffer *buffer)
64 {
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;
72
73   tags = g_malloc (sizeof (GtkTextTag *) * tcount);
74
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);
81
82   /* create new tags */
83   for (i = 0; i < tcount; i++)
84     {
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);
92     }
93
94   /* assign text and tags */
95   gtk_text_buffer_set_text (buffer, example_text, -1);
96   for (i = 0; i < tcount * 5; i++)
97     {
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);
103     }
104
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);
108
109   g_free (tags);
110
111   return atom;
112 }
113
114 static gboolean
115 test_serialize_deserialize (GtkTextBuffer *buffer,
116                             GdkAtom        atom,
117                             GError       **error)
118 {
119   GtkTextIter  start, end;
120   guint8      *spew;
121   gsize        spew_length;
122   gboolean     success;
123
124   gtk_text_buffer_get_bounds (buffer, &start, &end);
125
126   spew = gtk_text_buffer_serialize (buffer, buffer, atom,
127                                     &start, &end, &spew_length);
128
129   success = gtk_text_buffer_deserialize (buffer, buffer, atom, &end,
130                                          spew, spew_length, error);
131
132   g_free (spew);
133
134   return success;
135 }
136
137 gint
138 main (gint   argc,
139       gchar *argv[])
140 {
141   GtkWidget     *window;
142   GtkWidget     *sw;
143   GtkWidget     *view;
144   GtkTextBuffer *buffer;
145   GdkAtom        atom;
146   guint          i, broken = 0;
147
148   gtk_init (&argc, &argv);
149
150   /* initialize random numbers, disable this for deterministic testing */
151   if (1)        
152     quick_rand32_accu = g_random_int();
153
154   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
155   gtk_widget_set_size_request (window, 400, 300);
156
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);
162
163   g_signal_connect (window, "delete-event",
164                     G_CALLBACK (delete_event),
165                     NULL);
166
167   buffer = gtk_text_buffer_new (NULL);
168   view = gtk_text_view_new_with_buffer (buffer);
169   g_object_unref (buffer);
170
171   gtk_container_add (GTK_CONTAINER (sw), view);
172
173   gtk_widget_show_all (window);
174   if (0)
175     gtk_main ();
176
177   for (i = 0; i < 250; i++)
178     {
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
185         {
186           g_printerr ("FAIL: serialization/deserialization failed:\n  %s\n", error->message);
187           broken += 1;
188         }
189       g_clear_error (&error);
190     }
191
192   return broken > 0;
193 }