Bug Summary

File:testsuite/ctk/textbuffer.c
Warning:line 1147, column 9
This statement is never executed

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name textbuffer.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/rootdir/testsuite/ctk -fcoverage-compilation-dir=/rootdir/testsuite/ctk -resource-dir /usr/lib/llvm-21/lib/clang/21 -D HAVE_CONFIG_H -I . -I ../.. -D CTK_LOCALEDIR="/usr/share/locale" -I ../.. -I ../../cdk -I ../../cdk -I ../../ctk -I ../../ctk -D G_ENABLE_DEBUG -D G_ENABLE_CONSISTENCY_CHECKS -D GLIB_MIN_REQUIRED_VERSION=GLIB_VERSION_2_66 -D GLIB_MAX_ALLOWED_VERSION=GLIB_VERSION_2_66 -I /usr/include/pango-1.0 -I /usr/include/cairo -I /usr/local/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/atk-1.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/fribidi -I /usr/include/pixman-1 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/gio-unix-2.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/pango-1.0 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -D HAVE_UNIX_PRINT_WIDGETS -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/15/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -analyzer-checker deadcode.DeadStores -analyzer-checker security.ArrayBound -analyzer-checker unix.cstring.NotNullTerminated -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2026-05-20-082140-45483-1 -x c textbuffer.c
1/* testtextbuffer.c -- Simplistic test suite
2 * Copyright (C) 2000 Red Hat, Inc
3 * Author: Havoc Pennington
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library 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 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include "config.h"
20#include <stdio.h>
21#include <string.h>
22
23#include <ctk/ctk.h>
24#include "ctk/ctktexttypes.h" /* Private header, for UNKNOWN_CHAR */
25
26static void
27ctk_text_iter_spew (const CtkTextIter *iter, const gchar *desc)
28{
29 g_print (" %20s: line %d / char %d / line char %d / line byte %d\n",
30 desc,
31 ctk_text_iter_get_line (iter),
32 ctk_text_iter_get_offset (iter),
33 ctk_text_iter_get_line_offset (iter),
34 ctk_text_iter_get_line_index (iter));
35}
36
37static void
38check_get_set_text (CtkTextBuffer *buffer,
39 const char *str)
40{
41 CtkTextIter start, end, iter;
42 char *text;
43 int n;
44
45 ctk_text_buffer_set_text (buffer, str, -1);
46 if (ctk_text_buffer_get_char_count (buffer) != g_utf8_strlen (str, -1))
47 g_error ("Wrong number of chars (%d not %d)",
48 ctk_text_buffer_get_char_count (buffer),
49 (int) g_utf8_strlen (str, -1));
50 ctk_text_buffer_get_bounds (buffer, &start, &end);
51 text = ctk_text_buffer_get_text (buffer, &start, &end, TRUE(!(0)));
52 if (strcmp (text, str) != 0)
53 g_error ("Got '%s' as buffer contents", text);
54 g_free (text);
55
56 /* line char counts */
57 iter = start;
58 n = 0;
59 do
60 {
61 n += ctk_text_iter_get_chars_in_line (&iter);
62 }
63 while (ctk_text_iter_forward_line (&iter));
64
65 if (n != ctk_text_buffer_get_char_count (buffer))
66 g_error ("Sum of chars in lines is %d but buffer char count is %d",
67 n, ctk_text_buffer_get_char_count (buffer));
68
69 /* line byte counts */
70 iter = start;
71 n = 0;
72 do
73 {
74 n += ctk_text_iter_get_bytes_in_line (&iter);
75 }
76 while (ctk_text_iter_forward_line (&iter));
77
78 if (n != strlen (str))
79 g_error ("Sum of chars in lines is %d but buffer byte count is %d",
80 n, (int) strlen (str));
81
82 ctk_text_buffer_set_text (buffer, "", -1);
83
84 n = ctk_text_buffer_get_line_count (buffer);
85 if (n != 1)
86 g_error ("%d lines, expected 1", n);
87
88 n = ctk_text_buffer_get_char_count (buffer);
89 if (n != 0)
90 g_error ("%d chars, expected 0", n);
91}
92
93static gint
94count_toggles_at_iter (CtkTextIter *iter,
95 CtkTextTag *of_tag)
96{
97 GSList *tags;
98 GSList *tmp;
99 gint count = 0;
100
101 /* get toggle-ons and toggle-offs */
102 tags = ctk_text_iter_get_toggled_tags (iter, TRUE(!(0)));
103 tags = g_slist_concat (tags,
104 ctk_text_iter_get_toggled_tags (iter, FALSE(0)));
105
106 tmp = tags;
107 while (tmp != NULL((void*)0))
108 {
109 if (of_tag == NULL((void*)0))
110 ++count;
111 else if (of_tag == tmp->data)
112 ++count;
113
114 tmp = tmp->next;
115 }
116
117 g_slist_free (tags);
118
119 return count;
120}
121
122static gint
123count_toggles_in_range_by_char (CtkTextBuffer *buffer G_GNUC_UNUSED__attribute__ ((__unused__)),
124 CtkTextTag *of_tag,
125 const CtkTextIter *start,
126 const CtkTextIter *end)
127{
128 CtkTextIter iter;
129 gint count = 0;
130
131 iter = *start;
132 do
133 {
134 count += count_toggles_at_iter (&iter, of_tag);
135 if (!ctk_text_iter_forward_char (&iter))
136 {
137 /* end iterator */
138 count += count_toggles_at_iter (&iter, of_tag);
139 break;
140 }
141 }
142 while (ctk_text_iter_compare (&iter, end) <= 0);
143
144 return count;
145}
146
147static gint
148count_toggles_in_buffer (CtkTextBuffer *buffer,
149 CtkTextTag *of_tag)
150{
151 CtkTextIter start, end;
152
153 ctk_text_buffer_get_bounds (buffer, &start, &end);
154
155 return count_toggles_in_range_by_char (buffer, of_tag, &start, &end);
156}
157
158static void
159check_specific_tag_in_range (CtkTextBuffer *buffer,
160 const gchar *tag_name,
161 const CtkTextIter *start,
162 const CtkTextIter *end)
163{
164 CtkTextIter iter;
165 CtkTextTag *tag;
166 gboolean state;
167 gint count;
168 gint buffer_count;
169 gint last_offset;
170
171 if (ctk_text_iter_compare (start, end) > 0)
172 {
173 g_print (" (inverted range for checking tags, skipping)\n");
174 return;
175 }
176
177 tag = ctk_text_tag_table_lookup (ctk_text_buffer_get_tag_table (buffer),
178 tag_name);
179
180 buffer_count = count_toggles_in_range_by_char (buffer, tag, start, end);
181
182 state = FALSE(0);
183 count = 0;
184
185 last_offset = -1;
186 iter = *start;
187 if (ctk_text_iter_toggles_tag (&iter, tag) ||
188 ctk_text_iter_forward_to_tag_toggle (&iter, tag))
189 {
190 do
191 {
192 gint this_offset;
193
194 ++count;
195
196 this_offset = ctk_text_iter_get_offset (&iter);
197
198 if (this_offset <= last_offset)
199 g_error ("forward_to_tag_toggle moved in wrong direction");
200
201 last_offset = this_offset;
202
203 if (ctk_text_iter_starts_tag (&iter, tag))
204 {
205 if (state)
206 g_error ("Tag %p is already on, and was toggled on?", tag);
207 state = TRUE(!(0));
208 }
209 else if (ctk_text_iter_ends_tag (&iter, tag))
210 {
211 if (!state)
212 g_error ("Tag %p toggled off, but wasn't toggled on?", tag);
213 state = FALSE(0);
214 }
215 else
216 g_error ("forward_to_tag_toggle went to a location without a toggle");
217 }
218 while (ctk_text_iter_forward_to_tag_toggle (&iter, tag) &&
219 ctk_text_iter_compare (&iter, end) <= 0);
220 }
221
222 if (count != buffer_count)
223 g_error ("Counted %d tags iterating by char, %d iterating forward by tag toggle",
224 buffer_count, count);
225
226 state = FALSE(0);
227 count = 0;
228
229 iter = *end;
230 last_offset = ctk_text_iter_get_offset (&iter);
231 if (ctk_text_iter_toggles_tag (&iter, tag) ||
232 ctk_text_iter_backward_to_tag_toggle (&iter, tag))
233 {
234 do
235 {
236 gint this_offset;
237
238 ++count;
239
240 this_offset = ctk_text_iter_get_offset (&iter);
241
242 if (this_offset >= last_offset)
243 g_error ("backward_to_tag_toggle moved in wrong direction");
244
245 last_offset = this_offset;
246
247 if (ctk_text_iter_starts_tag (&iter, tag))
248 {
249 if (!state)
250 g_error ("Tag %p wasn't on when we got to the on toggle going backward?", tag);
251 state = FALSE(0);
252 }
253 else if (ctk_text_iter_ends_tag (&iter, tag))
254 {
255 if (state)
256 g_error ("Tag %p off toggle, but we were already inside a tag?", tag);
257 state = TRUE(!(0));
258 }
259 else
260 g_error ("backward_to_tag_toggle went to a location without a toggle");
261 }
262 while (ctk_text_iter_backward_to_tag_toggle (&iter, tag) &&
263 ctk_text_iter_compare (&iter, start) >= 0);
264 }
265
266 if (count != buffer_count)
267 g_error ("Counted %d tags iterating by char, %d iterating backward by tag toggle\n",
268 buffer_count, count);
269}
270
271static void
272check_specific_tag (CtkTextBuffer *buffer,
273 const gchar *tag_name)
274{
275 CtkTextIter start, end;
276
277 ctk_text_buffer_get_bounds (buffer, &start, &end);
278 check_specific_tag_in_range (buffer, tag_name, &start, &end);
279 ctk_text_iter_forward_chars (&start, 2);
280 ctk_text_iter_backward_chars (&end, 2);
281 if (ctk_text_iter_compare (&start, &end) < 0)
282 check_specific_tag_in_range (buffer, tag_name, &start, &end);
283}
284
285static void
286run_tests (CtkTextBuffer *buffer)
287{
288 CtkTextIter iter;
289 CtkTextIter start;
290 CtkTextIter end;
291 CtkTextIter mark;
292 gint i, j;
293 gint num_chars;
294 CtkTextMark *bar_mark;
295 CtkTextTag *tag;
296 GHashTable *tag_states;
297 gint count;
298 gint buffer_count;
299
300 ctk_text_buffer_get_bounds (buffer, &start, &end);
301
302 /* Check that walking the tree via chars and via iterators produces
303 * the same number of indexable locations.
304 */
305 num_chars = ctk_text_buffer_get_char_count (buffer);
306 iter = start;
307 bar_mark = ctk_text_buffer_create_mark (buffer, "bar", &iter, FALSE(0));
308 i = 0;
309 while (i < num_chars)
310 {
311 CtkTextIter current;
312 CtkTextMark *foo_mark;
313
314 ctk_text_buffer_get_iter_at_offset (buffer, &current, i);
315
316 if (!ctk_text_iter_equal (&iter, &current))
317 {
318 g_error ("get_char_index didn't return current iter");
319 }
320
321 j = ctk_text_iter_get_offset (&iter);
322
323 if (i != j)
324 {
325 g_error ("iter converted to %d not %d", j, i);
326 }
327
328 /* get/set mark */
329 ctk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
330
331 if (!ctk_text_iter_equal (&iter, &mark))
332 {
333 ctk_text_iter_spew (&iter, "iter");
334 ctk_text_iter_spew (&mark, "mark");
335 g_error ("Mark not moved to the right place.");
336 }
337
338 foo_mark = ctk_text_buffer_create_mark (buffer, "foo", &iter, FALSE(0));
339 ctk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
340 ctk_text_buffer_delete_mark (buffer, foo_mark);
341
342 if (!ctk_text_iter_equal (&iter, &mark))
343 {
344 ctk_text_iter_spew (&iter, "iter");
345 ctk_text_iter_spew (&mark, "mark");
346 g_error ("Mark not created in the right place.");
347 }
348
349 if (ctk_text_iter_is_end (&iter))
350 g_error ("iterators ran out before chars (offset %d of %d)",
351 i, num_chars);
352
353 ctk_text_iter_forward_char (&iter);
354
355 ctk_text_buffer_move_mark (buffer, bar_mark, &iter);
356
357 ++i;
358 }
359
360 if (!ctk_text_iter_equal (&iter, &end))
361 g_error ("Iterating over all chars didn't end with the end iter");
362
363 /* Do the tree-walk backward
364 */
365 num_chars = ctk_text_buffer_get_char_count (buffer);
366 ctk_text_buffer_get_iter_at_offset (buffer, &iter, -1);
367
368 ctk_text_buffer_move_mark (buffer, bar_mark, &iter);
369
370 i = num_chars;
371
372 if (!ctk_text_iter_equal (&iter, &end))
373 g_error ("iter at char -1 is not equal to the end iterator");
374
375 while (i >= 0)
376 {
377 CtkTextIter current;
378 CtkTextMark *foo_mark;
379
380 ctk_text_buffer_get_iter_at_offset (buffer, &current, i);
381
382 if (!ctk_text_iter_equal (&iter, &current))
383 {
384 g_error ("get_char_index didn't return current iter while going backward");
385 }
386 j = ctk_text_iter_get_offset (&iter);
387
388 if (i != j)
389 {
390 g_error ("going backward, iter converted to %d not %d", j, i);
391 }
392
393 /* get/set mark */
394 ctk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
395
396 if (!ctk_text_iter_equal (&iter, &mark))
397 {
398 ctk_text_iter_spew (&iter, "iter");
399 ctk_text_iter_spew (&mark, "mark");
400 g_error ("Mark not moved to the right place.");
401 }
402
403 foo_mark = ctk_text_buffer_create_mark (buffer, "foo", &iter, FALSE(0));
404 ctk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
405 ctk_text_buffer_delete_mark (buffer, foo_mark);
406
407 if (!ctk_text_iter_equal (&iter, &mark))
408 {
409 ctk_text_iter_spew (&iter, "iter");
410 ctk_text_iter_spew (&mark, "mark");
411 g_error ("Mark not created in the right place.");
412 }
413
414 if (i > 0)
415 {
416 if (!ctk_text_iter_backward_char (&iter))
417 g_error ("iterators ran out before char indexes");
418
419 ctk_text_buffer_move_mark (buffer, bar_mark, &iter);
420 }
421 else
422 {
423 if (ctk_text_iter_backward_char (&iter))
424 g_error ("went backward from 0?");
425 }
426
427 --i;
428 }
429
430 if (!ctk_text_iter_equal (&iter, &start))
431 g_error ("Iterating backward over all chars didn't end with the start iter");
432
433 /*
434 * Check that get_line_count returns the same number of lines
435 * as walking the tree by line
436 */
437 i = 1; /* include current (first) line */
438 ctk_text_buffer_get_iter_at_line (buffer, &iter, 0);
439 while (ctk_text_iter_forward_line (&iter))
440 ++i;
441
442 if (i != ctk_text_buffer_get_line_count (buffer))
443 g_error ("Counted %d lines, buffer has %d", i,
444 ctk_text_buffer_get_line_count (buffer));
445
446 /*
447 * Check that moving over tag toggles thinks about working.
448 */
449
450 buffer_count = count_toggles_in_buffer (buffer, NULL((void*)0));
451
452 tag_states = g_hash_table_new (NULL((void*)0), NULL((void*)0));
453 count = 0;
454
455 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
456 if (ctk_text_iter_toggles_tag (&iter, NULL((void*)0)) ||
457 ctk_text_iter_forward_to_tag_toggle (&iter, NULL((void*)0)))
458 {
459 do
460 {
461 GSList *tags;
462 GSList *tmp;
463 gboolean found_some = FALSE(0);
464
465 /* get toggled-on tags */
466 tags = ctk_text_iter_get_toggled_tags (&iter, TRUE(!(0)));
467
468 if (tags)
469 found_some = TRUE(!(0));
470
471 tmp = tags;
472 while (tmp != NULL((void*)0))
473 {
474 ++count;
475
476 tag = tmp->data;
477
478 if (g_hash_table_lookup (tag_states, tag))
479 g_error ("Tag %p is already on, and was toggled on?", tag);
480
481 g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE)((gpointer) (glong) ((!(0)))));
482
483 tmp = tmp->next;
484 }
485
486 g_slist_free (tags);
487
488 /* get toggled-off tags */
489 tags = ctk_text_iter_get_toggled_tags (&iter, FALSE(0));
490
491 if (tags)
492 found_some = TRUE(!(0));
493
494 tmp = tags;
495 while (tmp != NULL((void*)0))
496 {
497 ++count;
498
499 tag = tmp->data;
500
501 if (!g_hash_table_lookup (tag_states, tag))
502 g_error ("Tag %p is already off, and was toggled off?", tag);
503
504 g_hash_table_remove (tag_states, tag);
505
506 tmp = tmp->next;
507 }
508
509 g_slist_free (tags);
510
511 if (!found_some)
512 g_error ("No tags found going forward to tag toggle.");
513
514 }
515 while (ctk_text_iter_forward_to_tag_toggle (&iter, NULL((void*)0)));
516 }
517
518 g_hash_table_destroy (tag_states);
519
520 if (count != buffer_count)
521 g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
522 buffer_count, count);
523
524 /* Go backward; here TRUE in the hash means we saw
525 * an off toggle last.
526 */
527
528 tag_states = g_hash_table_new (NULL((void*)0), NULL((void*)0));
529 count = 0;
530
531 ctk_text_buffer_get_end_iter (buffer, &iter);
532 if (ctk_text_iter_toggles_tag (&iter, NULL((void*)0)) ||
533 ctk_text_iter_backward_to_tag_toggle (&iter, NULL((void*)0)))
534 {
535 do
536 {
537 GSList *tags;
538 GSList *tmp;
539 gboolean found_some = FALSE(0);
540
541 /* get toggled-off tags */
542 tags = ctk_text_iter_get_toggled_tags (&iter, FALSE(0));
543
544 if (tags)
545 found_some = TRUE(!(0));
546
547 tmp = tags;
548 while (tmp != NULL((void*)0))
549 {
550 ++count;
551
552 tag = tmp->data;
553
554 if (g_hash_table_lookup (tag_states, tag))
555 g_error ("Tag %p has two off-toggles in a row?", tag);
556
557 g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE)((gpointer) (glong) ((!(0)))));
558
559 tmp = tmp->next;
560 }
561
562 g_slist_free (tags);
563
564 /* get toggled-on tags */
565 tags = ctk_text_iter_get_toggled_tags (&iter, TRUE(!(0)));
566
567 if (tags)
568 found_some = TRUE(!(0));
569
570 tmp = tags;
571 while (tmp != NULL((void*)0))
572 {
573 ++count;
574
575 tag = tmp->data;
576
577 if (!g_hash_table_lookup (tag_states, tag))
578 g_error ("Tag %p was toggled on, but saw no off-toggle?", tag);
579
580 g_hash_table_remove (tag_states, tag);
581
582 tmp = tmp->next;
583 }
584
585 g_slist_free (tags);
586
587 if (!found_some)
588 g_error ("No tags found going backward to tag toggle.");
589 }
590 while (ctk_text_iter_backward_to_tag_toggle (&iter, NULL((void*)0)));
591 }
592
593 g_hash_table_destroy (tag_states);
594
595 if (count != buffer_count)
596 g_error ("Counted %d tags iterating by char, %d iterating by tag toggle",
597 buffer_count, count);
598
599 check_specific_tag (buffer, "fg_red");
600 check_specific_tag (buffer, "bg_green");
601 check_specific_tag (buffer, "front_tag");
602 check_specific_tag (buffer, "center_tag");
603 check_specific_tag (buffer, "end_tag");
604}
605
606
607static const char *book_closed_xpm[] = {
608"16 16 6 1",
609" c None s None",
610". c black",
611"X c red",
612"o c yellow",
613"O c #808080",
614"# c white",
615" ",
616" .. ",
617" ..XX. ",
618" ..XXXXX. ",
619" ..XXXXXXXX. ",
620".ooXXXXXXXXX. ",
621"..ooXXXXXXXXX. ",
622".X.ooXXXXXXXXX. ",
623".XX.ooXXXXXX.. ",
624" .XX.ooXXX..#O ",
625" .XX.oo..##OO. ",
626" .XX..##OO.. ",
627" .X.#OO.. ",
628" ..O.. ",
629" .. ",
630" "};
631
632static void
633fill_buffer (CtkTextBuffer *buffer)
634{
635 CtkTextTag *tag;
636 CdkRGBA color;
637 CdkRGBA color2;
638 CtkTextIter iter;
639 CtkTextIter iter2;
640 GdkPixbuf *pixbuf;
641 int i;
642
643 color.red = 0.0;
644 color.green = 0.0;
645 color.blue = 1.0;
646 color.alpha = 1.0;
647
648 color2.red = 1.0;
649 color2.green = 0.0;
650 color2.blue = 0.0;
651 color2.alpha = 1.0;
652
653 ctk_text_buffer_create_tag (buffer, "fg_blue",
654 "foreground_rgba", &color,
655 "background_rgba", &color2,
656 "font", "-*-courier-bold-r-*-*-30-*-*-*-*-*-*-*",
657 NULL((void*)0));
658
659 color.red = 1.0;
660 color.green = 0.0;
661 color.blue = 0.0;
662
663 ctk_text_buffer_create_tag (buffer, "fg_red",
664 "rise", -4,
665 "foreground_rgba", &color,
666 NULL((void*)0));
667
668 color.red = 0.0;
669 color.green = 1.0;
670 color.blue = 0.0;
671
672 ctk_text_buffer_create_tag (buffer, "bg_green",
673 "background_rgba", &color,
674 "font", "-*-courier-bold-r-*-*-10-*-*-*-*-*-*-*",
675 NULL((void*)0));
676
677 pixbuf = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
678
679 g_assert (pixbuf != NULL)do { if (pixbuf != ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 679, ((const char*) (__func__
)), "pixbuf != NULL"); } while (0)
;
680
681 for (i = 0; i < 10; i++)
682 {
683 gchar *str;
684
685 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
686
687 ctk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
688
689 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 1);
690
691 ctk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
692
693 str = g_strdup_printf ("%d Hello World!\nwoo woo woo woo woo woo woo woo\n",
694 i);
695
696 ctk_text_buffer_insert (buffer, &iter, str, -1);
697
698 g_free (str);
699
700 ctk_text_buffer_insert (buffer, &iter,
701 "(Hello World!)\nfoo foo Hello this is some text we are using to text word wrap. It has punctuation! gee; blah - hmm, great.\nnew line\n\n"
702 /* This is UTF8 stuff, Emacs doesn't
703 really know how to display it */
704 "Spanish (Espa\303\261ol) \302\241Hola! / French (Fran\303\247ais) Bonjour, Salut / German (Deutsch S\303\274d) Gr\303\274\303\237 Gott (testing Latin-1 chars encoded in UTF8)\nThai (we can't display this, just making sure we don't crash) (\340\270\240\340\270\262\340\270\251\340\270\262\340\271\204\340\270\227\340\270\242) \340\270\252\340\270\247\340\270\261\340\270\252\340\270\224\340\270\265\340\270\204\340\270\243\340\270\261\340\270\232, \340\270\252\340\270\247\340\270\261\340\270\252\340\270\224\340\270\265\340\270\204\340\271\210\340\270\260\n",
705 -1);
706
707 ctk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
708 ctk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
709
710 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 4);
711
712 ctk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
713
714 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 7);
715
716 ctk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
717
718 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 8);
719
720 ctk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
721
722 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 8);
723 iter2 = iter;
724 ctk_text_iter_forward_chars (&iter2, 10);
725
726 ctk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
727
728 ctk_text_iter_forward_chars (&iter, 7);
729 ctk_text_iter_forward_chars (&iter2, 10);
730
731 ctk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
732
733 ctk_text_iter_forward_chars (&iter, 12);
734 ctk_text_iter_forward_chars (&iter2, 10);
735
736 ctk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
737
738 ctk_text_iter_forward_chars (&iter, 10);
739 ctk_text_iter_forward_chars (&iter2, 15);
740
741 ctk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
742 ctk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
743
744 ctk_text_iter_forward_chars (&iter, 20);
745 ctk_text_iter_forward_chars (&iter2, 20);
746
747 ctk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
748 ctk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
749
750 ctk_text_iter_backward_chars (&iter, 25);
751 ctk_text_iter_forward_chars (&iter2, 5);
752
753 ctk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
754 ctk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
755
756 ctk_text_iter_forward_chars (&iter, 15);
757 ctk_text_iter_backward_chars (&iter2, 10);
758
759 ctk_text_buffer_remove_tag_by_name (buffer, "fg_red", &iter, &iter2);
760 ctk_text_buffer_remove_tag_by_name (buffer, "fg_blue", &iter, &iter2);
761 }
762
763 /* Put in tags that are just at the beginning, and just near the end,
764 * and just near the middle.
765 */
766 tag = ctk_text_buffer_create_tag (buffer, "front_tag", NULL((void*)0));
767 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
768 ctk_text_buffer_get_iter_at_offset (buffer, &iter2, 300);
769
770 ctk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
771
772 tag = ctk_text_buffer_create_tag (buffer, "end_tag", NULL((void*)0));
773 ctk_text_buffer_get_end_iter (buffer, &iter2);
774 ctk_text_iter_backward_chars (&iter2, 12);
775 iter = iter2;
776 ctk_text_iter_backward_chars (&iter, 157);
777
778 ctk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
779
780 tag = ctk_text_buffer_create_tag (buffer, "center_tag", NULL((void*)0));
781 ctk_text_buffer_get_iter_at_offset (buffer, &iter,
782 ctk_text_buffer_get_char_count (buffer)/2);
783 ctk_text_iter_backward_chars (&iter, 37);
784 iter2 = iter;
785 ctk_text_iter_forward_chars (&iter2, 57);
786
787 ctk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
788
789 g_object_unref (pixbuf);
790}
791
792
793/*
794 * Line separator tests (initially to avoid regression on bugzilla #57428)
795 */
796
797static void
798test_line_separation (const char* str,
799 gboolean expect_next_line,
800 gboolean expect_end_iter,
801 int expected_line_count,
802 int expected_line_break,
803 int expected_next_line_start)
804{
805 CtkTextIter iter;
806 CtkTextBuffer* buffer;
807 gboolean on_next_line;
808 gboolean on_end_iter;
809 gint new_pos;
810
811 buffer = ctk_text_buffer_new (NULL((void*)0));
812
813 ctk_text_buffer_set_text (buffer, str, -1);
814 ctk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
815
816 g_assert (ctk_text_iter_ends_line (&iter) || ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_ends_line (&iter) || ctk_text_iter_is_end
(&iter)) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 816, ((const char*) (__func__)), "ctk_text_iter_ends_line (&iter) || ctk_text_iter_is_end (&iter)"
); } while (0)
;
817
818 g_assert (ctk_text_buffer_get_line_count (buffer) == expected_line_count)do { if (ctk_text_buffer_get_line_count (buffer) == expected_line_count
) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 818, ((const char*) (__func__)), "ctk_text_buffer_get_line_count (buffer) == expected_line_count"
); } while (0)
;
819
820 on_next_line = ctk_text_iter_forward_line (&iter);
821
822 g_assert (expect_next_line == on_next_line)do { if (expect_next_line == on_next_line) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 822, ((const char*) (__func__
)), "expect_next_line == on_next_line"); } while (0)
;
823
824 on_end_iter = ctk_text_iter_is_end (&iter);
825
826 g_assert (on_end_iter == expect_end_iter)do { if (on_end_iter == expect_end_iter) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 826, ((const char*) (__func__
)), "on_end_iter == expect_end_iter"); } while (0)
;
827
828 new_pos = ctk_text_iter_get_offset (&iter);
829
830 if (on_next_line)
831 g_assert (expected_next_line_start == new_pos)do { if (expected_next_line_start == new_pos) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 831, ((const char*) (__func__
)), "expected_next_line_start == new_pos"); } while (0)
;
832
833 ++expected_line_break;
834 while (expected_line_break < expected_next_line_start)
835 {
836 ctk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
837
838 g_assert (!ctk_text_iter_ends_line (&iter))do { if (!ctk_text_iter_ends_line (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 838, ((const char*) (__func__
)), "!ctk_text_iter_ends_line (&iter)"); } while (0)
;
839
840 on_next_line = ctk_text_iter_forward_line (&iter);
841
842 g_assert (expect_next_line == on_next_line)do { if (expect_next_line == on_next_line) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 842, ((const char*) (__func__
)), "expect_next_line == on_next_line"); } while (0)
;
843
844 new_pos = ctk_text_iter_get_offset (&iter);
845
846 if (on_next_line)
847 g_assert (expected_next_line_start == new_pos)do { if (expected_next_line_start == new_pos) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 847, ((const char*) (__func__
)), "expected_next_line_start == new_pos"); } while (0)
;
848
849 ++expected_line_break;
850 }
851
852 /* FIXME tests for backward line */
853
854 g_object_unref (buffer);
855}
856
857/* there are cases where \r and \n should not be treated like \r\n,
858 * originally bug #337022. */
859static void
860split_r_n_separators_test (void)
861{
862 CtkTextBuffer *buffer;
863 CtkTextIter iter;
864
865 buffer = ctk_text_buffer_new (NULL((void*)0));
866
867 ctk_text_buffer_set_text (buffer, "foo\ra\nbar\n", -1);
868
869 /* delete 'a' so that we have
870
871 1 foo\r
872 2 \n
873 3 bar\n
874
875 * and both \r and \n are line separators */
876
877 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 5);
878 ctk_text_buffer_backspace (buffer, &iter, TRUE(!(0)), TRUE(!(0)));
879
880 g_assert (ctk_text_iter_ends_line (&iter))do { if (ctk_text_iter_ends_line (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 880, ((const char*) (__func__
)), "ctk_text_iter_ends_line (&iter)"); } while (0)
;
881
882 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
883 g_assert (ctk_text_iter_ends_line (&iter))do { if (ctk_text_iter_ends_line (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 883, ((const char*) (__func__
)), "ctk_text_iter_ends_line (&iter)"); } while (0)
;
884
885 g_object_unref (buffer);
886}
887
888static void
889test_line_separator (void)
890{
891 char *str;
892 char buf[7] = { '\0', };
893
894 /* Only one character has type G_UNICODE_PARAGRAPH_SEPARATOR in
895 * Unicode 3.0; update this if that changes.
896 */
897#define PARAGRAPH_SEPARATOR0x2029 0x2029
898
899 test_line_separation ("line", FALSE(0), TRUE(!(0)), 1, 4, 4);
900 test_line_separation ("line\r\n", FALSE(0), TRUE(!(0)), 2, 4, 6);
901 test_line_separation ("line\r", FALSE(0), TRUE(!(0)), 2, 4, 5);
902 test_line_separation ("line\n", FALSE(0), TRUE(!(0)), 2, 4, 5);
903 test_line_separation ("line\rqw", TRUE(!(0)), FALSE(0), 2, 4, 5);
904 test_line_separation ("line\nqw", TRUE(!(0)), FALSE(0), 2, 4, 5);
905 test_line_separation ("line\r\nqw", TRUE(!(0)), FALSE(0), 2, 4, 6);
906
907 g_unichar_to_utf8 (PARAGRAPH_SEPARATOR0x2029, buf);
908
909 str = g_strdup_printf ("line%s", buf);
910 test_line_separation (str, FALSE(0), TRUE(!(0)), 2, 4, 5);
911 g_free (str);
912 str = g_strdup_printf ("line%sqw", buf);
913 test_line_separation (str, TRUE(!(0)), FALSE(0), 2, 4, 5);
914 g_free (str);
915
916 split_r_n_separators_test ();
917}
918
919static void
920test_backspace (void)
921{
922 CtkTextBuffer *buffer;
923 CtkTextIter iter;
924 gboolean ret;
925
926 buffer = ctk_text_buffer_new (NULL((void*)0));
927
928 ctk_text_buffer_set_text (buffer, "foo", -1);
929 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 2);
930 ret = ctk_text_buffer_backspace (buffer, &iter, TRUE(!(0)), TRUE(!(0)));
931 g_assert (ret)do { if (ret) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 931, ((const char*) (__func__)), "ret"); } while (0)
;
932 g_assert_cmpint (1, ==, ctk_text_iter_get_offset (&iter))do { gint64 __n1 = (1), __n2 = (ctk_text_iter_get_offset (&
iter)); if (__n1 == __n2) ; else g_assertion_message_cmpint (
((gchar*) 0), "textbuffer.c", 932, ((const char*) (__func__))
, "1" " " "==" " " "ctk_text_iter_get_offset (&iter)", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
933 g_assert_cmpint (2, ==, ctk_text_buffer_get_char_count (buffer))do { gint64 __n1 = (2), __n2 = (ctk_text_buffer_get_char_count
(buffer)); if (__n1 == __n2) ; else g_assertion_message_cmpint
(((gchar*) 0), "textbuffer.c", 933, ((const char*) (__func__
)), "2" " " "==" " " "ctk_text_buffer_get_char_count (buffer)"
, (guint64)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
934
935 ctk_text_buffer_set_text (buffer, "foo", -1);
936 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
937 ret = ctk_text_buffer_backspace (buffer, &iter, TRUE(!(0)), TRUE(!(0)));
938 g_assert (!ret)do { if (!ret) ; else g_assertion_message_expr (((gchar*) 0),
"textbuffer.c", 938, ((const char*) (__func__)), "!ret"); } while
(0)
;
939 g_assert_cmpint (0, ==, ctk_text_iter_get_offset (&iter))do { gint64 __n1 = (0), __n2 = (ctk_text_iter_get_offset (&
iter)); if (__n1 == __n2) ; else g_assertion_message_cmpint (
((gchar*) 0), "textbuffer.c", 939, ((const char*) (__func__))
, "0" " " "==" " " "ctk_text_iter_get_offset (&iter)", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
940 g_assert_cmpint (3, ==, ctk_text_buffer_get_char_count (buffer))do { gint64 __n1 = (3), __n2 = (ctk_text_buffer_get_char_count
(buffer)); if (__n1 == __n2) ; else g_assertion_message_cmpint
(((gchar*) 0), "textbuffer.c", 940, ((const char*) (__func__
)), "3" " " "==" " " "ctk_text_buffer_get_char_count (buffer)"
, (guint64)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
941
942 /* test bug #544724 */
943 ctk_text_buffer_set_text (buffer, "foo\r\n\r\nbar", -1);
944 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 5);
945 ret = ctk_text_buffer_backspace (buffer, &iter, TRUE(!(0)), TRUE(!(0)));
946 g_assert (ret)do { if (ret) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 946, ((const char*) (__func__)), "ret"); } while (0)
;
947 g_assert_cmpint (0, ==, ctk_text_iter_get_line (&iter))do { gint64 __n1 = (0), __n2 = (ctk_text_iter_get_line (&
iter)); if (__n1 == __n2) ; else g_assertion_message_cmpint (
((gchar*) 0), "textbuffer.c", 947, ((const char*) (__func__))
, "0" " " "==" " " "ctk_text_iter_get_line (&iter)", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
948 g_assert_cmpint (8, ==, ctk_text_buffer_get_char_count (buffer))do { gint64 __n1 = (8), __n2 = (ctk_text_buffer_get_char_count
(buffer)); if (__n1 == __n2) ; else g_assertion_message_cmpint
(((gchar*) 0), "textbuffer.c", 948, ((const char*) (__func__
)), "8" " " "==" " " "ctk_text_buffer_get_char_count (buffer)"
, (guint64)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
949
950 /* test empty last line */
951 ctk_text_buffer_set_text (buffer, "", -1);
952 ctk_text_buffer_get_end_iter (buffer, &iter);
953 ret = ctk_text_buffer_backspace (buffer, &iter, TRUE(!(0)), TRUE(!(0)));
954 g_assert (!ret)do { if (!ret) ; else g_assertion_message_expr (((gchar*) 0),
"textbuffer.c", 954, ((const char*) (__func__)), "!ret"); } while
(0)
;
955 g_assert_cmpint (0, ==, ctk_text_iter_get_offset (&iter))do { gint64 __n1 = (0), __n2 = (ctk_text_iter_get_offset (&
iter)); if (__n1 == __n2) ; else g_assertion_message_cmpint (
((gchar*) 0), "textbuffer.c", 955, ((const char*) (__func__))
, "0" " " "==" " " "ctk_text_iter_get_offset (&iter)", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
956 g_assert_cmpint (0, ==, ctk_text_buffer_get_char_count (buffer))do { gint64 __n1 = (0), __n2 = (ctk_text_buffer_get_char_count
(buffer)); if (__n1 == __n2) ; else g_assertion_message_cmpint
(((gchar*) 0), "textbuffer.c", 956, ((const char*) (__func__
)), "0" " " "==" " " "ctk_text_buffer_get_char_count (buffer)"
, (guint64)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
957
958 ctk_text_buffer_set_text (buffer, "foo\n", -1);
959 ctk_text_buffer_get_end_iter (buffer, &iter);
960 ret = ctk_text_buffer_backspace (buffer, &iter, TRUE(!(0)), TRUE(!(0)));
961 g_assert (ret)do { if (ret) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 961, ((const char*) (__func__)), "ret"); } while (0)
;
962 g_assert_cmpint (3, ==, ctk_text_iter_get_offset (&iter))do { gint64 __n1 = (3), __n2 = (ctk_text_iter_get_offset (&
iter)); if (__n1 == __n2) ; else g_assertion_message_cmpint (
((gchar*) 0), "textbuffer.c", 962, ((const char*) (__func__))
, "3" " " "==" " " "ctk_text_iter_get_offset (&iter)", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
963 g_assert_cmpint (3, ==, ctk_text_buffer_get_char_count (buffer))do { gint64 __n1 = (3), __n2 = (ctk_text_buffer_get_char_count
(buffer)); if (__n1 == __n2) ; else g_assertion_message_cmpint
(((gchar*) 0), "textbuffer.c", 963, ((const char*) (__func__
)), "3" " " "==" " " "ctk_text_buffer_get_char_count (buffer)"
, (guint64)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
964
965 ctk_text_buffer_set_text (buffer, "foo\r\n", -1);
966 ctk_text_buffer_get_end_iter (buffer, &iter);
967 ret = ctk_text_buffer_backspace (buffer, &iter, TRUE(!(0)), TRUE(!(0)));
968 g_assert (ret)do { if (ret) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 968, ((const char*) (__func__)), "ret"); } while (0)
;
969 g_assert_cmpint (3, ==, ctk_text_iter_get_offset (&iter))do { gint64 __n1 = (3), __n2 = (ctk_text_iter_get_offset (&
iter)); if (__n1 == __n2) ; else g_assertion_message_cmpint (
((gchar*) 0), "textbuffer.c", 969, ((const char*) (__func__))
, "3" " " "==" " " "ctk_text_iter_get_offset (&iter)", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
970 g_assert_cmpint (3, ==, ctk_text_buffer_get_char_count (buffer))do { gint64 __n1 = (3), __n2 = (ctk_text_buffer_get_char_count
(buffer)); if (__n1 == __n2) ; else g_assertion_message_cmpint
(((gchar*) 0), "textbuffer.c", 970, ((const char*) (__func__
)), "3" " " "==" " " "ctk_text_buffer_get_char_count (buffer)"
, (guint64)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
971
972 g_object_unref (buffer);
973}
974
975static void
976test_logical_motion (void)
977{
978 char *str;
979 char buf1[7] = { '\0', };
980 char buf2[7] = { '\0', };
981 char buf3[7] = { '\0', };
982 int expected[30];
983 int expected_steps;
984 int i;
985 CtkTextBuffer *buffer;
986 CtkTextIter iter;
987
988 buffer = ctk_text_buffer_new (NULL((void*)0));
989
990#define LEADING_JAMO0x1111 0x1111
991#define VOWEL_JAMO0x1167 0x1167
992#define TRAILING_JAMO0x11B9 0x11B9
993
994 g_unichar_to_utf8 (LEADING_JAMO0x1111, buf1);
995 g_unichar_to_utf8 (VOWEL_JAMO0x1167, buf2);
996 g_unichar_to_utf8 (TRAILING_JAMO0x11B9, buf3);
997
998 /* Build the string "abc<leading><vowel><trailing>def\r\nxyz" */
999 str = g_strconcat ("abc", buf1, buf2, buf3, "def\r\nxyz", NULL((void*)0));
1000 ctk_text_buffer_set_text (buffer, str, -1);
1001 g_free (str);
1002
1003 /* Check cursor positions */
1004 memset (expected, 0, sizeof (expected));
1005 expected[0] = 0; /* before 'a' */
1006 expected[1] = 1; /* before 'b' */
1007 expected[2] = 2; /* before 'c' */
1008 expected[3] = 3; /* before jamo */
1009 expected[4] = 6; /* before 'd' */
1010 expected[5] = 7; /* before 'e' */
1011 expected[6] = 8; /* before 'f' */
1012 expected[7] = 9; /* before '\r' */
1013 expected[8] = 11; /* before 'x' */
1014 expected[9] = 12; /* before 'y' */
1015 expected[10] = 13; /* before 'z' */
1016 expected[11] = 14; /* after 'z' (only matters going backward) */
1017 expected_steps = 11;
1018
1019 ctk_text_buffer_get_start_iter (buffer, &iter);
1020 i = 0;
1021 do
1022 {
1023 int pos;
1024
1025 pos = ctk_text_iter_get_offset (&iter);
1026
1027 if (pos != expected[i])
1028 {
1029 g_error ("Cursor position %d, expected %d",
1030 pos, expected[i]);
1031 }
1032
1033 ++i;
1034 }
1035 while (ctk_text_iter_forward_cursor_position (&iter));
1036
1037 if (!ctk_text_iter_is_end (&iter))
1038 g_error ("Expected to stop at the end iterator");
1039
1040 if (!ctk_text_iter_is_cursor_position (&iter))
1041 g_error ("Should be a cursor position before the end iterator");
1042
1043 if (i != expected_steps)
1044 g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
1045
1046 i = expected_steps;
1047 do
1048 {
1049 int pos;
1050
1051 pos = ctk_text_iter_get_offset (&iter);
1052
1053 if (pos != expected[i])
1054 {
1055 g_error ("Moving backward, cursor position %d, expected %d",
1056 pos, expected[i]);
1057 }
1058
1059 /* g_print ("%d = %d\n", pos, expected[i]); */
1060
1061 --i;
1062 }
1063 while (ctk_text_iter_backward_cursor_position (&iter));
1064
1065 if (i != -1)
1066 g_error ("Expected %d steps, there were actually %d", expected_steps - i, i);
1067
1068 if (!ctk_text_iter_is_start (&iter))
1069 g_error ("Expected to stop at the start iterator");
1070
1071
1072 /* Check sentence boundaries */
1073
1074 ctk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
1075
1076 memset (expected, 0, sizeof (expected));
1077
1078 expected[0] = 0; /* before first Hi */
1079 expected[1] = 3; /* After first . */
1080 expected[2] = 7; /* After second . */
1081 expected[3] = 12; /* After ! */
1082 expected[4] = 16; /* After third . */
1083 expected[5] = 20; /* After ? */
1084
1085 expected_steps = 6;
1086
1087 ctk_text_buffer_get_start_iter (buffer, &iter);
1088 i = 0;
1089 do
1090 {
1091 int pos;
1092
1093 pos = ctk_text_iter_get_offset (&iter);
1094
1095 if (pos != expected[i])
1096 {
1097 g_error ("Sentence position %d, expected %d",
1098 pos, expected[i]);
1099 }
1100
1101 if (i != 0 &&
1102 !ctk_text_iter_is_end (&iter) &&
1103 !ctk_text_iter_ends_sentence (&iter))
1104 g_error ("Iterator at %d should end a sentence", pos);
1105
1106 ++i;
1107 }
1108 while (ctk_text_iter_forward_sentence_end (&iter));
1109
1110 if (i != expected_steps)
1111 g_error ("Expected %d steps, there were actually %d", expected_steps, i);
1112
1113 if (!ctk_text_iter_is_end (&iter))
1114 g_error ("Expected to stop at the end iterator");
1115
1116 ctk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
1117
1118 memset (expected, 0, sizeof (expected));
1119
1120 expected[0] = 24;
1121 expected[1] = 21;
1122 expected[2] = 17;
1123 expected[3] = 13;
1124 expected[4] = 9;
1125 expected[5] = 4;
1126 expected[6] = 0;
1127
1128 expected_steps = 7;
1129
1130 ctk_text_buffer_get_end_iter (buffer, &iter);
1131 i = 0;
1132 do
1133 {
1134 int pos;
1135
1136 pos = ctk_text_iter_get_offset (&iter);
1137
1138 if (pos != expected[i])
1139 {
1140 g_error ("Sentence position %d, expected %d",
1141 pos, expected[i]);
1142 }
1143
1144 if (pos != 0 &&
1145 !ctk_text_iter_is_end (&iter) &&
1146 !ctk_text_iter_starts_sentence (&iter))
1147 g_error ("Iterator at %d should start a sentence", pos);
This statement is never executed
1148
1149 ++i;
1150 }
1151 while (ctk_text_iter_backward_sentence_start (&iter));
1152
1153 if (i != expected_steps)
1154 g_error ("Expected %d steps, there were actually %d", expected_steps, i);
1155
1156 if (ctk_text_iter_get_offset (&iter) != 0)
1157 g_error ("Expected to stop at the start iterator");
1158
1159 g_object_unref (buffer);
1160}
1161
1162static void
1163test_marks (void)
1164{
1165 CtkTextBuffer *buf1, *buf2;
1166 CtkTextMark *mark;
1167 CtkTextIter iter;
1168
1169 buf1 = ctk_text_buffer_new (NULL((void*)0));
1170 buf2 = ctk_text_buffer_new (NULL((void*)0));
1171
1172 ctk_text_buffer_get_start_iter (buf1, &iter);
1173 mark = ctk_text_buffer_create_mark (buf1, "foo", &iter, TRUE(!(0)));
1174 g_object_ref (mark)((__typeof__ (mark)) (g_object_ref) (mark));
1175 ctk_text_mark_set_visible (mark, TRUE(!(0)));
1176 ctk_text_buffer_delete_mark (buf1, mark);
1177
1178 g_assert (ctk_text_mark_get_visible (mark))do { if (ctk_text_mark_get_visible (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1178, ((const char*) (__func__
)), "ctk_text_mark_get_visible (mark)"); } while (0)
;
1179 g_assert (ctk_text_mark_get_left_gravity (mark))do { if (ctk_text_mark_get_left_gravity (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1179, ((const char*) (__func__
)), "ctk_text_mark_get_left_gravity (mark)"); } while (0)
;
1180 g_assert (!strcmp ("foo", ctk_text_mark_get_name (mark)))do { if (!strcmp ("foo", ctk_text_mark_get_name (mark))) ; else
g_assertion_message_expr (((gchar*) 0), "textbuffer.c", 1180
, ((const char*) (__func__)), "!strcmp (\"foo\", ctk_text_mark_get_name (mark))"
); } while (0)
;
1181 g_assert (ctk_text_mark_get_buffer (mark) == NULL)do { if (ctk_text_mark_get_buffer (mark) == ((void*)0)) ; else
g_assertion_message_expr (((gchar*) 0), "textbuffer.c", 1181
, ((const char*) (__func__)), "ctk_text_mark_get_buffer (mark) == NULL"
); } while (0)
;
1182 g_assert (ctk_text_mark_get_deleted (mark))do { if (ctk_text_mark_get_deleted (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1182, ((const char*) (__func__
)), "ctk_text_mark_get_deleted (mark)"); } while (0)
;
1183 g_assert (ctk_text_buffer_get_mark (buf1, "foo") == NULL)do { if (ctk_text_buffer_get_mark (buf1, "foo") == ((void*)0)
) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 1183, ((const char*) (__func__)), "ctk_text_buffer_get_mark (buf1, \"foo\") == NULL"
); } while (0)
;
1184
1185 ctk_text_buffer_get_start_iter (buf2, &iter);
1186 ctk_text_buffer_add_mark (buf2, mark, &iter);
1187 ctk_text_buffer_insert (buf2, &iter, "ewfwefwefwe", -1);
1188 ctk_text_buffer_get_iter_at_mark (buf2, &iter, mark);
1189
1190 g_assert (ctk_text_mark_get_visible (mark))do { if (ctk_text_mark_get_visible (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1190, ((const char*) (__func__
)), "ctk_text_mark_get_visible (mark)"); } while (0)
;
1191 g_assert (ctk_text_iter_is_start (&iter))do { if (ctk_text_iter_is_start (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1191, ((const char*) (__func__
)), "ctk_text_iter_is_start (&iter)"); } while (0)
;
1192 g_assert (ctk_text_mark_get_left_gravity (mark))do { if (ctk_text_mark_get_left_gravity (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1192, ((const char*) (__func__
)), "ctk_text_mark_get_left_gravity (mark)"); } while (0)
;
1193 g_assert (!strcmp ("foo", ctk_text_mark_get_name (mark)))do { if (!strcmp ("foo", ctk_text_mark_get_name (mark))) ; else
g_assertion_message_expr (((gchar*) 0), "textbuffer.c", 1193
, ((const char*) (__func__)), "!strcmp (\"foo\", ctk_text_mark_get_name (mark))"
); } while (0)
;
1194 g_assert (ctk_text_mark_get_buffer (mark) == buf2)do { if (ctk_text_mark_get_buffer (mark) == buf2) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1194, ((const char*) (__func__
)), "ctk_text_mark_get_buffer (mark) == buf2"); } while (0)
;
1195 g_assert (!ctk_text_mark_get_deleted (mark))do { if (!ctk_text_mark_get_deleted (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1195, ((const char*) (__func__
)), "!ctk_text_mark_get_deleted (mark)"); } while (0)
;
1196 g_assert (ctk_text_buffer_get_mark (buf2, "foo") == mark)do { if (ctk_text_buffer_get_mark (buf2, "foo") == mark) ; else
g_assertion_message_expr (((gchar*) 0), "textbuffer.c", 1196
, ((const char*) (__func__)), "ctk_text_buffer_get_mark (buf2, \"foo\") == mark"
); } while (0)
;
1197
1198 ctk_text_buffer_delete_mark (buf2, mark);
1199 ctk_text_mark_set_visible (mark, FALSE(0));
1200 g_object_unref (mark);
1201
1202 mark = ctk_text_mark_new ("blah", TRUE(!(0)));
1203 ctk_text_buffer_get_start_iter (buf1, &iter);
1204 ctk_text_mark_set_visible (mark, TRUE(!(0)));
1205 ctk_text_buffer_add_mark (buf1, mark, &iter);
1206
1207 g_assert (ctk_text_mark_get_visible (mark))do { if (ctk_text_mark_get_visible (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1207, ((const char*) (__func__
)), "ctk_text_mark_get_visible (mark)"); } while (0)
;
1208 g_assert (ctk_text_mark_get_buffer (mark) == buf1)do { if (ctk_text_mark_get_buffer (mark) == buf1) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1208, ((const char*) (__func__
)), "ctk_text_mark_get_buffer (mark) == buf1"); } while (0)
;
1209 g_assert (!ctk_text_mark_get_deleted (mark))do { if (!ctk_text_mark_get_deleted (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1209, ((const char*) (__func__
)), "!ctk_text_mark_get_deleted (mark)"); } while (0)
;
1210 g_assert (ctk_text_buffer_get_mark (buf1, "blah") == mark)do { if (ctk_text_buffer_get_mark (buf1, "blah") == mark) ; else
g_assertion_message_expr (((gchar*) 0), "textbuffer.c", 1210
, ((const char*) (__func__)), "ctk_text_buffer_get_mark (buf1, \"blah\") == mark"
); } while (0)
;
1211 g_assert (!strcmp ("blah", ctk_text_mark_get_name (mark)))do { if (!strcmp ("blah", ctk_text_mark_get_name (mark))) ; else
g_assertion_message_expr (((gchar*) 0), "textbuffer.c", 1211
, ((const char*) (__func__)), "!strcmp (\"blah\", ctk_text_mark_get_name (mark))"
); } while (0)
;
1212
1213 ctk_text_mark_set_visible (mark, FALSE(0));
1214 ctk_text_buffer_delete_mark (buf1, mark);
1215 g_assert (!ctk_text_mark_get_visible (mark))do { if (!ctk_text_mark_get_visible (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1215, ((const char*) (__func__
)), "!ctk_text_mark_get_visible (mark)"); } while (0)
;
1216 g_assert (ctk_text_buffer_get_mark (buf1, "blah") == NULL)do { if (ctk_text_buffer_get_mark (buf1, "blah") == ((void*)0
)) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 1216, ((const char*) (__func__)), "ctk_text_buffer_get_mark (buf1, \"blah\") == NULL"
); } while (0)
;
1217 g_assert (ctk_text_mark_get_buffer (mark) == NULL)do { if (ctk_text_mark_get_buffer (mark) == ((void*)0)) ; else
g_assertion_message_expr (((gchar*) 0), "textbuffer.c", 1217
, ((const char*) (__func__)), "ctk_text_mark_get_buffer (mark) == NULL"
); } while (0)
;
1218 g_assert (ctk_text_mark_get_deleted (mark))do { if (ctk_text_mark_get_deleted (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1218, ((const char*) (__func__
)), "ctk_text_mark_get_deleted (mark)"); } while (0)
;
1219
1220 ctk_text_buffer_get_start_iter (buf2, &iter);
1221 ctk_text_buffer_add_mark (buf2, mark, &iter);
1222 g_assert (ctk_text_mark_get_buffer (mark) == buf2)do { if (ctk_text_mark_get_buffer (mark) == buf2) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1222, ((const char*) (__func__
)), "ctk_text_mark_get_buffer (mark) == buf2"); } while (0)
;
1223 g_assert (!ctk_text_mark_get_deleted (mark))do { if (!ctk_text_mark_get_deleted (mark)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1223, ((const char*) (__func__
)), "!ctk_text_mark_get_deleted (mark)"); } while (0)
;
1224 g_assert (ctk_text_buffer_get_mark (buf2, "blah") == mark)do { if (ctk_text_buffer_get_mark (buf2, "blah") == mark) ; else
g_assertion_message_expr (((gchar*) 0), "textbuffer.c", 1224
, ((const char*) (__func__)), "ctk_text_buffer_get_mark (buf2, \"blah\") == mark"
); } while (0)
;
1225 g_assert (!strcmp ("blah", ctk_text_mark_get_name (mark)))do { if (!strcmp ("blah", ctk_text_mark_get_name (mark))) ; else
g_assertion_message_expr (((gchar*) 0), "textbuffer.c", 1225
, ((const char*) (__func__)), "!strcmp (\"blah\", ctk_text_mark_get_name (mark))"
); } while (0)
;
1226
1227 g_object_unref (mark);
1228 g_object_unref (buf1);
1229 g_object_unref (buf2);
1230}
1231
1232static void
1233test_utf8 (void)
1234{
1235 gunichar ch;
1236
1237 /* Check UTF8 unknown char thing */
1238 g_assert (CTK_TEXT_UNKNOWN_CHAR_UTF8_LEN == 3)do { if (3 == 3) ; else g_assertion_message_expr (((gchar*) 0
), "textbuffer.c", 1238, ((const char*) (__func__)), "CTK_TEXT_UNKNOWN_CHAR_UTF8_LEN == 3"
); } while (0)
;
1239 g_assert (g_utf8_strlen (ctk_text_unknown_char_utf8_ctk_tests_only (), 3) == 1)do { if (g_utf8_strlen (ctk_text_unknown_char_utf8_ctk_tests_only
(), 3) == 1) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 1239, ((const char*) (__func__)), "g_utf8_strlen (ctk_text_unknown_char_utf8_ctk_tests_only (), 3) == 1"
); } while (0)
;
1240 ch = g_utf8_get_char (ctk_text_unknown_char_utf8_ctk_tests_only ());
1241 g_assert (ch == CTK_TEXT_UNKNOWN_CHAR)do { if (ch == 0xFFFC) ; else g_assertion_message_expr (((gchar
*) 0), "textbuffer.c", 1241, ((const char*) (__func__)), "ch == CTK_TEXT_UNKNOWN_CHAR"
); } while (0)
;
1242}
1243
1244static void
1245test_empty_buffer (void)
1246{
1247 CtkTextBuffer *buffer;
1248 int n;
1249 CtkTextIter start;
1250
1251 buffer = ctk_text_buffer_new (NULL((void*)0));
1252
1253 /* Check that buffer starts with one empty line and zero chars */
1254 n = ctk_text_buffer_get_line_count (buffer);
1255 if (n != 1)
1256 g_error ("%d lines, expected 1", n);
1257
1258 n = ctk_text_buffer_get_char_count (buffer);
1259 if (n != 0)
1260 g_error ("%d chars, expected 0", n);
1261
1262 /* empty first line contains 0 chars */
1263 ctk_text_buffer_get_start_iter (buffer, &start);
1264 n = ctk_text_iter_get_chars_in_line (&start);
1265 if (n != 0)
1266 g_error ("%d chars in first line, expected 0", n);
1267 n = ctk_text_iter_get_bytes_in_line (&start);
1268 if (n != 0)
1269 g_error ("%d bytes in first line, expected 0", n);
1270
1271 /* Run gruesome alien test suite on buffer */
1272 run_tests (buffer);
1273
1274 g_object_unref (buffer);
1275}
1276
1277static void
1278test_get_set(void)
1279{
1280 CtkTextBuffer *buffer;
1281
1282 buffer = ctk_text_buffer_new (NULL((void*)0));
1283
1284 check_get_set_text (buffer, "Hello");
1285 check_get_set_text (buffer, "Hello\n");
1286 check_get_set_text (buffer, "Hello\r\n");
1287 check_get_set_text (buffer, "Hello\r");
1288 check_get_set_text (buffer, "Hello\nBar\nFoo");
1289 check_get_set_text (buffer, "Hello\nBar\nFoo\n");
1290
1291 g_object_unref (buffer);
1292}
1293
1294static void
1295test_fill_empty (void)
1296{
1297 CtkTextBuffer *buffer;
1298 int n;
1299 CtkTextIter start, end;
1300
1301 buffer = ctk_text_buffer_new (NULL((void*)0));
1302
1303 /* Put stuff in the buffer */
1304 fill_buffer (buffer);
1305
1306 /* Subject stuff-bloated buffer to further torment */
1307 run_tests (buffer);
1308
1309 /* Delete all stuff from the buffer */
1310 ctk_text_buffer_get_bounds (buffer, &start, &end);
1311 ctk_text_buffer_delete (buffer, &start, &end);
1312
1313 /* Check buffer for emptiness (note that a single
1314 empty line always remains in the buffer) */
1315 n = ctk_text_buffer_get_line_count (buffer);
1316 if (n != 1)
1317 g_error ("%d lines, expected 1", n);
1318
1319 n = ctk_text_buffer_get_char_count (buffer);
1320 if (n != 0)
1321 g_error ("%d chars, expected 0", n);
1322
1323 run_tests (buffer);
1324
1325 g_object_unref (buffer);
1326}
1327
1328static void
1329test_tag (void)
1330{
1331 CtkTextBuffer *buffer;
1332 CtkTextIter start, end;
1333
1334 buffer = ctk_text_buffer_new (NULL((void*)0));
1335
1336 fill_buffer (buffer);
1337
1338 ctk_text_buffer_set_text (buffer, "adcdef", -1);
1339 ctk_text_buffer_get_iter_at_offset (buffer, &start, 1);
1340 ctk_text_buffer_get_iter_at_offset (buffer, &end, 3);
1341 ctk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &start, &end);
1342
1343 run_tests (buffer);
1344
1345 g_object_unref (buffer);
1346}
1347
1348static void
1349check_buffer_contents (CtkTextBuffer *buffer,
1350 const gchar *contents)
1351{
1352 CtkTextIter start;
1353 CtkTextIter end;
1354 gchar *buffer_contents;
1355
1356 ctk_text_buffer_get_start_iter (buffer, &start);
1357 ctk_text_buffer_get_end_iter (buffer, &end);
1358 buffer_contents = ctk_text_buffer_get_text (buffer, &start, &end, FALSE(0));
1359 g_assert_cmpstr (buffer_contents, ==, contents)do { const char *__s1 = (buffer_contents), *__s2 = (contents)
; if (g_strcmp0 (__s1, __s2) == 0) ; else g_assertion_message_cmpstr
(((gchar*) 0), "textbuffer.c", 1359, ((const char*) (__func__
)), "buffer_contents" " " "==" " " "contents", __s1, "==", __s2
); } while (0)
;
1360}
1361
1362static void
1363test_clipboard (void)
1364{
1365 CtkClipboard *clipboard;
1366 CtkTextBuffer *buffer;
1367 CtkTextIter start;
1368 CtkTextIter end;
1369 CtkTextTag *tag;
1370
1371 clipboard = ctk_clipboard_get (CDK_SELECTION_CLIPBOARD((CdkAtom)((gpointer) (gulong) (69))));
1372
1373 buffer = ctk_text_buffer_new (NULL((void*)0));
1374 ctk_text_buffer_set_text (buffer, "abcdef", -1);
1375
1376 /* Simple cut & paste */
1377 ctk_text_buffer_get_start_iter (buffer, &start);
1378 ctk_text_buffer_get_iter_at_offset (buffer, &end, 3);
1379 ctk_text_buffer_select_range (buffer, &start, &end);
1380
1381 ctk_text_buffer_cut_clipboard (buffer, clipboard, TRUE(!(0)));
1382 check_buffer_contents (buffer, "def");
1383
1384 ctk_text_buffer_get_end_iter (buffer, &end);
1385 ctk_text_buffer_paste_clipboard (buffer, clipboard, &end, TRUE(!(0)));
1386 check_buffer_contents (buffer, "defabc");
1387
1388 /* Simple copy & paste */
1389 ctk_text_buffer_get_iter_at_offset (buffer, &start, 3);
1390 ctk_text_buffer_get_end_iter (buffer, &end);
1391 ctk_text_buffer_select_range (buffer, &start, &end);
1392 ctk_text_buffer_copy_clipboard (buffer, clipboard);
1393
1394 ctk_text_buffer_get_start_iter (buffer, &start);
1395 ctk_text_buffer_paste_clipboard (buffer, clipboard, &start, TRUE(!(0)));
1396 check_buffer_contents (buffer, "abcdefabc");
1397
1398 /* Replace the selection when pasting */
1399 ctk_text_buffer_set_text (buffer, "abcdef", -1);
1400
1401 ctk_text_buffer_get_start_iter (buffer, &start);
1402 ctk_text_buffer_get_iter_at_offset (buffer, &end, 3);
1403 ctk_text_buffer_select_range (buffer, &start, &end);
1404 ctk_text_buffer_copy_clipboard (buffer, clipboard);
1405
1406 ctk_text_buffer_get_iter_at_offset (buffer, &start, 3);
1407 ctk_text_buffer_get_end_iter (buffer, &end);
1408 ctk_text_buffer_select_range (buffer, &start, &end);
1409 ctk_text_buffer_paste_clipboard (buffer, clipboard, NULL((void*)0), TRUE(!(0)));
1410 check_buffer_contents (buffer, "abcabc");
1411
1412 /* Copy & paste text with tags.
1413 * See https://bugzilla.gnome.org/show_bug.cgi?id=339539
1414 */
1415 ctk_text_buffer_set_text (buffer, "abcdef", -1);
1416
1417 tag = ctk_text_buffer_create_tag (buffer, NULL((void*)0), NULL((void*)0));
1418
1419 ctk_text_buffer_get_start_iter (buffer, &start);
1420 ctk_text_buffer_get_iter_at_offset (buffer, &end, 4);
1421 ctk_text_buffer_apply_tag (buffer, tag, &start, &end);
1422
1423 ctk_text_buffer_get_iter_at_offset (buffer, &start, 3);
1424 ctk_text_buffer_get_end_iter (buffer, &end);
1425 ctk_text_buffer_select_range (buffer, &start, &end);
1426 ctk_text_buffer_copy_clipboard (buffer, clipboard);
1427 ctk_text_buffer_paste_clipboard (buffer, clipboard, NULL((void*)0), TRUE(!(0)));
1428 check_buffer_contents (buffer, "abcdef");
1429
1430 ctk_text_buffer_get_iter_at_offset (buffer, &start, 3);
1431 g_assert (ctk_text_iter_forward_to_tag_toggle (&start, tag))do { if (ctk_text_iter_forward_to_tag_toggle (&start, tag
)) ; else g_assertion_message_expr (((gchar*) 0), "textbuffer.c"
, 1431, ((const char*) (__func__)), "ctk_text_iter_forward_to_tag_toggle (&start, tag)"
); } while (0)
;
1432 g_assert_cmpint (4, ==, ctk_text_iter_get_offset (&start))do { gint64 __n1 = (4), __n2 = (ctk_text_iter_get_offset (&
start)); if (__n1 == __n2) ; else g_assertion_message_cmpint (
((gchar*) 0), "textbuffer.c", 1432, ((const char*) (__func__)
), "4" " " "==" " " "ctk_text_iter_get_offset (&start)", (
guint64)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1433
1434 g_object_unref (buffer);
1435}
1436
1437static void
1438test_get_iter (void)
1439{
1440 CtkTextBuffer *buffer;
1441 CtkTextIter iter;
1442 gint offset;
1443
1444 buffer = ctk_text_buffer_new (NULL((void*)0));
1445
1446 /* ß takes 2 bytes in UTF-8 */
1447 ctk_text_buffer_set_text (buffer, "ab\nßd\r\nef", -1);
1448
1449 /* Test get_iter_at_line() */
1450 ctk_text_buffer_get_iter_at_line (buffer, &iter, 0);
1451 g_assert (ctk_text_iter_is_start (&iter))do { if (ctk_text_iter_is_start (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1451, ((const char*) (__func__
)), "ctk_text_iter_is_start (&iter)"); } while (0)
;
1452
1453 ctk_text_buffer_get_iter_at_line (buffer, &iter, 1);
1454 offset = ctk_text_iter_get_offset (&iter);
1455 g_assert_cmpint (offset, ==, 3)do { gint64 __n1 = (offset), __n2 = (3); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1455
, ((const char*) (__func__)), "offset" " " "==" " " "3", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1456
1457 ctk_text_buffer_get_iter_at_line (buffer, &iter, 2);
1458 offset = ctk_text_iter_get_offset (&iter);
1459 g_assert_cmpint (offset, ==, 7)do { gint64 __n1 = (offset), __n2 = (7); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1459
, ((const char*) (__func__)), "offset" " " "==" " " "7", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1460
1461 ctk_text_buffer_get_iter_at_line (buffer, &iter, 3);
1462 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1462, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1463
1464 /* Test get_iter_at_line_offset() */
1465 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 0);
1466 g_assert (ctk_text_iter_is_start (&iter))do { if (ctk_text_iter_is_start (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1466, ((const char*) (__func__
)), "ctk_text_iter_is_start (&iter)"); } while (0)
;
1467
1468 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 1);
1469 offset = ctk_text_iter_get_offset (&iter);
1470 g_assert_cmpint (offset, ==, 1)do { gint64 __n1 = (offset), __n2 = (1); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1470
, ((const char*) (__func__)), "offset" " " "==" " " "1", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1471
1472 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 2);
1473 offset = ctk_text_iter_get_offset (&iter);
1474 g_assert_cmpint (offset, ==, 2)do { gint64 __n1 = (offset), __n2 = (2); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1474
, ((const char*) (__func__)), "offset" " " "==" " " "2", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1475
1476 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 3);
1477 offset = ctk_text_iter_get_offset (&iter);
1478 g_assert_cmpint (offset, ==, 2)do { gint64 __n1 = (offset), __n2 = (2); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1478
, ((const char*) (__func__)), "offset" " " "==" " " "2", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1479
1480 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 1, 1);
1481 offset = ctk_text_iter_get_offset (&iter);
1482 g_assert_cmpint (offset, ==, 4)do { gint64 __n1 = (offset), __n2 = (4); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1482
, ((const char*) (__func__)), "offset" " " "==" " " "4", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1483
1484 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 2, 1);
1485 offset = ctk_text_iter_get_offset (&iter);
1486 g_assert_cmpint (offset, ==, 8)do { gint64 __n1 = (offset), __n2 = (8); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1486
, ((const char*) (__func__)), "offset" " " "==" " " "8", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1487
1488 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 2, 2);
1489 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1489, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1490
1491 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 2, 3);
1492 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1492, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1493
1494 ctk_text_buffer_get_iter_at_line_offset (buffer, &iter, 3, 1);
1495 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1495, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1496
1497 /* Test get_iter_at_line_index() */
1498 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 0, 0);
1499 g_assert (ctk_text_iter_is_start (&iter))do { if (ctk_text_iter_is_start (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1499, ((const char*) (__func__
)), "ctk_text_iter_is_start (&iter)"); } while (0)
;
1500
1501 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 0, 1);
1502 offset = ctk_text_iter_get_offset (&iter);
1503 g_assert_cmpint (offset, ==, 1)do { gint64 __n1 = (offset), __n2 = (1); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1503
, ((const char*) (__func__)), "offset" " " "==" " " "1", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1504
1505 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 0, 2);
1506 offset = ctk_text_iter_get_offset (&iter);
1507 g_assert_cmpint (offset, ==, 2)do { gint64 __n1 = (offset), __n2 = (2); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1507
, ((const char*) (__func__)), "offset" " " "==" " " "2", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1508
1509 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 0, 3);
1510 offset = ctk_text_iter_get_offset (&iter);
1511 g_assert_cmpint (offset, ==, 2)do { gint64 __n1 = (offset), __n2 = (2); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1511
, ((const char*) (__func__)), "offset" " " "==" " " "2", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1512
1513 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 1, 0);
1514 offset = ctk_text_iter_get_offset (&iter);
1515 g_assert_cmpint (offset, ==, 3)do { gint64 __n1 = (offset), __n2 = (3); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1515
, ((const char*) (__func__)), "offset" " " "==" " " "3", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1516
1517 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 1, 2);
1518 offset = ctk_text_iter_get_offset (&iter);
1519 g_assert_cmpint (offset, ==, 4)do { gint64 __n1 = (offset), __n2 = (4); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1519
, ((const char*) (__func__)), "offset" " " "==" " " "4", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1520
1521 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 1, 3);
1522 offset = ctk_text_iter_get_offset (&iter);
1523 g_assert_cmpint (offset, ==, 5)do { gint64 __n1 = (offset), __n2 = (5); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1523
, ((const char*) (__func__)), "offset" " " "==" " " "5", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1524
1525 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 2, 2);
1526 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1526, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1527
1528 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 2, 3);
1529 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1529, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1530
1531 ctk_text_buffer_get_iter_at_line_index (buffer, &iter, 3, 1);
1532 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1532, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1533
1534 /* Test get_iter_at_offset() */
1535 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
1536 g_assert (ctk_text_iter_is_start (&iter))do { if (ctk_text_iter_is_start (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1536, ((const char*) (__func__
)), "ctk_text_iter_is_start (&iter)"); } while (0)
;
1537
1538 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 1);
1539 offset = ctk_text_iter_get_offset (&iter);
1540 g_assert_cmpint (offset, ==, 1)do { gint64 __n1 = (offset), __n2 = (1); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1540
, ((const char*) (__func__)), "offset" " " "==" " " "1", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1541
1542 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 8);
1543 offset = ctk_text_iter_get_offset (&iter);
1544 g_assert_cmpint (offset, ==, 8)do { gint64 __n1 = (offset), __n2 = (8); if (__n1 == __n2) ; else
g_assertion_message_cmpint (((gchar*) 0), "textbuffer.c", 1544
, ((const char*) (__func__)), "offset" " " "==" " " "8", (guint64
)__n1, "==", (guint64)__n2, 'i'); } while (0)
;
1545 g_assert (!ctk_text_iter_is_end (&iter))do { if (!ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1545, ((const char*) (__func__
)), "!ctk_text_iter_is_end (&iter)"); } while (0)
;
1546
1547 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 9);
1548 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1548, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1549
1550 ctk_text_buffer_get_iter_at_offset (buffer, &iter, 100);
1551 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1551, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1552
1553 ctk_text_buffer_get_iter_at_offset (buffer, &iter, -1);
1554 g_assert (ctk_text_iter_is_end (&iter))do { if (ctk_text_iter_is_end (&iter)) ; else g_assertion_message_expr
(((gchar*) 0), "textbuffer.c", 1554, ((const char*) (__func__
)), "ctk_text_iter_is_end (&iter)"); } while (0)
;
1555
1556 g_object_unref (buffer);
1557}
1558
1559int
1560main (int argc, char** argv)
1561{
1562 /* First, we turn on btree debugging. */
1563 ctk_set_debug_flags (ctk_get_debug_flags () | CTK_DEBUG_TEXT);
1564
1565 ctk_test_init (&argc, &argv);
1566
1567 g_test_add_func ("/TextBuffer/UTF8 unknown char", test_utf8);
1568 g_test_add_func ("/TextBuffer/Line separator", test_line_separator);
1569 g_test_add_func ("/TextBuffer/Backspace", test_backspace);
1570 g_test_add_func ("/TextBuffer/Logical motion", test_logical_motion);
1571 g_test_add_func ("/TextBuffer/Marks", test_marks);
1572 g_test_add_func ("/TextBuffer/Empty buffer", test_empty_buffer);
1573 g_test_add_func ("/TextBuffer/Get and Set", test_get_set);
1574 g_test_add_func ("/TextBuffer/Fill and Empty", test_fill_empty);
1575 g_test_add_func ("/TextBuffer/Tag", test_tag);
1576 g_test_add_func ("/TextBuffer/Clipboard", test_clipboard);
1577 g_test_add_func ("/TextBuffer/Get iter", test_get_iter);
1578
1579 return g_test_run();
1580}