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.
24 static guint32 quick_rand32_accu
= 2147483563;
29 quick_rand32_accu
= 1664525 * quick_rand32_accu
+ 1013904223;
30 return quick_rand32_accu
;
34 delete_event (GtkWidget
*widget
,
44 text_tag_enqueue (GtkTextTag
*tag
,
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.";
63 setup_buffer (GtkTextBuffer
*buffer
)
65 const guint tlen
= strlen (example_text
);
66 const guint tcount
= 17;
68 GtkTextTagTable
*ttable
= gtk_text_buffer_get_tag_table (buffer
);
69 GSList
*node
, *slist
= NULL
;
73 tags
= g_malloc (sizeof (GtkTextTag
*) * tcount
);
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
);
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,
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
);
115 test_serialize_deserialize (GtkTextBuffer
*buffer
,
119 GtkTextIter start
, end
;
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
);
144 GtkTextBuffer
*buffer
;
148 gtk_init (&argc
, &argv
);
150 /* initialize random numbers, disable this for deterministic testing */
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
),
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
),
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
);
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");
186 g_printerr ("FAIL: serialization/deserialization failed:\n %s\n", error
->message
);
189 g_clear_error (&error
);