1 /* Simplistic test suite */
8 #include "../gtk/gtktexttypes.h" /* Private header, for UNKNOWN_CHAR */
11 gtk_text_iter_spew (const GtkTextIter *iter, const gchar *desc)
13 g_print (" %20s: line %d / char %d / line char %d / line byte %d\n",
15 gtk_text_iter_get_line (iter),
16 gtk_text_iter_get_offset (iter),
17 gtk_text_iter_get_line_offset (iter),
18 gtk_text_iter_get_line_index (iter));
21 static void fill_buffer (GtkTextBuffer *buffer);
23 static void run_tests (GtkTextBuffer *buffer);
25 static void check_get_set_text (GtkTextBuffer *buffer,
29 static void line_separator_tests (void);
31 static void logical_motion_tests (void);
34 main (int argc, char** argv)
36 GtkTextBuffer *buffer;
39 GtkTextIter start, end;
41 gtk_init (&argc, &argv);
43 /* Check UTF8 unknown char thing */
44 g_assert (g_utf8_strlen (gtk_text_unknown_char_utf8, 3) == 1);
45 ch = g_utf8_get_char (gtk_text_unknown_char_utf8);
46 g_assert (ch == GTK_TEXT_UNKNOWN_CHAR);
48 /* First, we turn on btree debugging. */
49 gtk_debug_flags |= GTK_DEBUG_TEXT;
51 /* Check some line separator stuff */
52 line_separator_tests ();
54 /* Check log attr motion */
55 logical_motion_tests ();
58 buffer = gtk_text_buffer_new (NULL);
60 /* Check that buffer starts with one empty line and zero chars */
62 n = gtk_text_buffer_get_line_count (buffer);
64 g_error ("%d lines, expected 1", n);
66 n = gtk_text_buffer_get_char_count (buffer);
68 g_error ("%d chars, expected 0", n);
70 /* Run gruesome alien test suite on buffer */
73 /* Check set/get text */
74 check_get_set_text (buffer, "Hello");
75 check_get_set_text (buffer, "Hello\n");
76 check_get_set_text (buffer, "Hello\r\n");
77 check_get_set_text (buffer, "Hello\r");
78 check_get_set_text (buffer, "Hello\nBar\nFoo");
79 check_get_set_text (buffer, "Hello\nBar\nFoo\n");
81 /* Put stuff in the buffer */
85 /* Subject stuff-bloated buffer to further torment */
88 /* Delete all stuff from the buffer */
89 gtk_text_buffer_get_bounds (buffer, &start, &end);
90 gtk_text_buffer_delete (buffer, &start, &end);
92 /* Check buffer for emptiness (note that a single
93 empty line always remains in the buffer) */
94 n = gtk_text_buffer_get_line_count (buffer);
96 g_error ("%d lines, expected 1", n);
98 n = gtk_text_buffer_get_char_count (buffer);
100 g_error ("%d chars, expected 0", n);
104 g_object_unref (G_OBJECT (buffer));
106 g_print ("All tests passed.\n");
112 check_get_set_text (GtkTextBuffer *buffer,
115 GtkTextIter start, end;
119 gtk_text_buffer_set_text (buffer, str, -1);
120 if (gtk_text_buffer_get_char_count (buffer) != g_utf8_strlen (str, -1))
121 g_error ("Wrong number of chars (%d not %d)",
122 gtk_text_buffer_get_char_count (buffer),
123 (int) g_utf8_strlen (str, -1));
124 gtk_text_buffer_get_bounds (buffer, &start, &end);
125 text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
126 if (strcmp (text, str) != 0)
127 g_error ("Got '%s' as buffer contents", text);
130 gtk_text_buffer_set_text (buffer, "", -1);
132 n = gtk_text_buffer_get_line_count (buffer);
134 g_error ("%d lines, expected 1", n);
136 n = gtk_text_buffer_get_char_count (buffer);
138 g_error ("%d chars, expected 0", n);
142 count_toggles_at_iter (GtkTextIter *iter,
149 /* get toggle-ons and toggle-offs */
150 tags = gtk_text_iter_get_toggled_tags (iter, TRUE);
151 tags = g_slist_concat (tags,
152 gtk_text_iter_get_toggled_tags (iter, FALSE));
159 else if (of_tag == tmp->data)
162 tmp = g_slist_next (tmp);
171 count_toggles_in_buffer (GtkTextBuffer *buffer,
177 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
180 count += count_toggles_at_iter (&iter, of_tag);
182 while (gtk_text_iter_forward_char (&iter));
184 /* Do the end iterator, because forward_char won't return TRUE
187 count += count_toggles_at_iter (&iter, of_tag);
193 check_specific_tag (GtkTextBuffer *buffer,
194 const gchar *tag_name)
203 tag = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table (buffer),
206 buffer_count = count_toggles_in_buffer (buffer, tag);
212 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
213 if (gtk_text_iter_toggles_tag (&iter, tag) ||
214 gtk_text_iter_forward_to_tag_toggle (&iter, tag))
222 this_offset = gtk_text_iter_get_offset (&iter);
224 if (this_offset <= last_offset)
225 g_error ("forward_to_tag_toggle moved in wrong direction");
227 last_offset = this_offset;
229 if (gtk_text_iter_begins_tag (&iter, tag))
232 g_error ("Tag %p is already on, and was toggled on?", tag);
235 else if (gtk_text_iter_ends_tag (&iter, tag))
238 g_error ("Tag %p toggled off, but wasn't toggled on?", tag);
242 g_error ("forward_to_tag_toggle went to a location without a toggle");
244 while (gtk_text_iter_forward_to_tag_toggle (&iter, tag));
247 if (count != buffer_count)
248 g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
249 buffer_count, count);
254 gtk_text_buffer_get_end_iter (buffer, &iter);
255 last_offset = gtk_text_iter_get_offset (&iter);
256 if (gtk_text_iter_toggles_tag (&iter, tag) ||
257 gtk_text_iter_backward_to_tag_toggle (&iter, tag))
265 this_offset = gtk_text_iter_get_offset (&iter);
267 if (this_offset >= last_offset)
268 g_error ("backward_to_tag_toggle moved in wrong direction");
270 last_offset = this_offset;
272 if (gtk_text_iter_begins_tag (&iter, tag))
275 g_error ("Tag %p wasn't on when we got to the on toggle going backward?", tag);
278 else if (gtk_text_iter_ends_tag (&iter, tag))
281 g_error ("Tag %p off toggle, but we were already inside a tag?", tag);
285 g_error ("backward_to_tag_toggle went to a location without a toggle");
287 while (gtk_text_iter_backward_to_tag_toggle (&iter, tag));
290 if (count != buffer_count)
291 g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
292 buffer_count, count);
297 run_tests (GtkTextBuffer *buffer)
305 GtkTextMark *bar_mark;
307 GHashTable *tag_states;
311 gtk_text_buffer_get_bounds (buffer, &start, &end);
313 /* Check that walking the tree via chars and via iterators produces
314 * the same number of indexable locations.
316 num_chars = gtk_text_buffer_get_char_count (buffer);
318 bar_mark = gtk_text_buffer_create_mark (buffer, "bar", &iter, FALSE);
320 while (i < num_chars)
323 GtkTextMark *foo_mark;
325 gtk_text_buffer_get_iter_at_offset (buffer, ¤t, i);
327 if (!gtk_text_iter_equal (&iter, ¤t))
329 g_error ("get_char_index didn't return current iter");
332 j = gtk_text_iter_get_offset (&iter);
336 g_error ("iter converted to %d not %d", j, i);
340 gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
342 if (!gtk_text_iter_equal (&iter, &mark))
344 gtk_text_iter_spew (&iter, "iter");
345 gtk_text_iter_spew (&mark, "mark");
346 g_error ("Mark not moved to the right place.");
349 foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
350 gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
351 gtk_text_buffer_delete_mark (buffer, foo_mark);
353 if (!gtk_text_iter_equal (&iter, &mark))
355 gtk_text_iter_spew (&iter, "iter");
356 gtk_text_iter_spew (&mark, "mark");
357 g_error ("Mark not created in the right place.");
360 if (gtk_text_iter_is_end (&iter))
361 g_error ("iterators ran out before chars (offset %d of %d)",
364 gtk_text_iter_forward_char (&iter);
366 gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
371 if (!gtk_text_iter_equal (&iter, &end))
372 g_error ("Iterating over all chars didn't end with the end iter");
374 /* Do the tree-walk backward
376 num_chars = gtk_text_buffer_get_char_count (buffer);
377 gtk_text_buffer_get_iter_at_offset (buffer, &iter, -1);
379 gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
383 if (!gtk_text_iter_equal (&iter, &end))
384 g_error ("iter at char -1 is not equal to the end iterator");
389 GtkTextMark *foo_mark;
391 gtk_text_buffer_get_iter_at_offset (buffer, ¤t, i);
393 if (!gtk_text_iter_equal (&iter, ¤t))
395 g_error ("get_char_index didn't return current iter while going backward");
397 j = gtk_text_iter_get_offset (&iter);
401 g_error ("going backward, iter converted to %d not %d", j, i);
405 gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
407 if (!gtk_text_iter_equal (&iter, &mark))
409 gtk_text_iter_spew (&iter, "iter");
410 gtk_text_iter_spew (&mark, "mark");
411 g_error ("Mark not moved to the right place.");
414 foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
415 gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
416 gtk_text_buffer_delete_mark (buffer, foo_mark);
418 if (!gtk_text_iter_equal (&iter, &mark))
420 gtk_text_iter_spew (&iter, "iter");
421 gtk_text_iter_spew (&mark, "mark");
422 g_error ("Mark not created in the right place.");
427 if (!gtk_text_iter_backward_char (&iter))
428 g_error ("iterators ran out before char indexes");
430 gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
434 if (gtk_text_iter_backward_char (&iter))
435 g_error ("went backward from 0?");
441 if (!gtk_text_iter_equal (&iter, &start))
442 g_error ("Iterating backward over all chars didn't end with the start iter");
445 * Check that get_line_count returns the same number of lines
446 * as walking the tree by line
448 i = 1; /* include current (first) line */
449 gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
450 while (gtk_text_iter_forward_line (&iter))
453 if (i != gtk_text_buffer_get_line_count (buffer))
454 g_error ("Counted %d lines, buffer has %d", i,
455 gtk_text_buffer_get_line_count (buffer));
458 * Check that moving over tag toggles thinks about working.
461 buffer_count = count_toggles_in_buffer (buffer, NULL);
463 tag_states = g_hash_table_new (NULL, NULL);
466 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
467 if (gtk_text_iter_toggles_tag (&iter, NULL) ||
468 gtk_text_iter_forward_to_tag_toggle (&iter, NULL))
474 gboolean found_some = FALSE;
476 /* get toggled-on tags */
477 tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
489 if (g_hash_table_lookup (tag_states, tag))
490 g_error ("Tag %p is already on, and was toggled on?", tag);
492 g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
494 tmp = g_slist_next (tmp);
499 /* get toggled-off tags */
500 tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
512 if (!g_hash_table_lookup (tag_states, tag))
513 g_error ("Tag %p is already off, and was toggled off?", tag);
515 g_hash_table_remove (tag_states, tag);
517 tmp = g_slist_next (tmp);
523 g_error ("No tags found going forward to tag toggle.");
526 while (gtk_text_iter_forward_to_tag_toggle (&iter, NULL));
529 g_hash_table_destroy (tag_states);
531 if (count != buffer_count)
532 g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
533 buffer_count, count);
535 /* Go backward; here TRUE in the hash means we saw
536 * an off toggle last.
539 tag_states = g_hash_table_new (NULL, NULL);
542 gtk_text_buffer_get_end_iter (buffer, &iter);
543 if (gtk_text_iter_toggles_tag (&iter, NULL) ||
544 gtk_text_iter_backward_to_tag_toggle (&iter, NULL))
550 gboolean found_some = FALSE;
552 /* get toggled-off tags */
553 tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
565 if (g_hash_table_lookup (tag_states, tag))
566 g_error ("Tag %p has two off-toggles in a row?", tag);
568 g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
570 tmp = g_slist_next (tmp);
575 /* get toggled-on tags */
576 tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
588 if (!g_hash_table_lookup (tag_states, tag))
589 g_error ("Tag %p was toggled on, but saw no off-toggle?", tag);
591 g_hash_table_remove (tag_states, tag);
593 tmp = g_slist_next (tmp);
599 g_error ("No tags found going backward to tag toggle.");
601 while (gtk_text_iter_backward_to_tag_toggle (&iter, NULL));
604 g_hash_table_destroy (tag_states);
606 if (count != buffer_count)
607 g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
608 buffer_count, count);
610 check_specific_tag (buffer, "fg_red");
611 check_specific_tag (buffer, "bg_green");
612 check_specific_tag (buffer, "front_tag");
613 check_specific_tag (buffer, "center_tag");
614 check_specific_tag (buffer, "end_tag");
618 static const char *book_closed_xpm[] = {
644 fill_buffer (GtkTextBuffer *buffer)
647 GdkColor color, color2;
653 color.red = color.green = 0;
659 gtk_text_buffer_create_tag (buffer, "fg_blue",
660 "foreground_gdk", &color,
661 "background_gdk", &color2,
662 "font", "-*-courier-bold-r-*-*-30-*-*-*-*-*-*-*",
665 color.blue = color.green = 0;
668 gtk_text_buffer_create_tag (buffer, "fg_red",
670 "foreground_gdk", &color,
673 color.blue = color.red = 0;
674 color.green = 0xffff;
676 gtk_text_buffer_create_tag (buffer, "bg_green",
677 "background_gdk", &color,
678 "font", "-*-courier-bold-r-*-*-10-*-*-*-*-*-*-*",
681 pixbuf = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
683 g_assert (pixbuf != NULL);
690 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
692 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
694 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 1);
696 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
698 str = g_strdup_printf ("%d Hello World!\nwoo woo woo woo woo woo woo woo\n",
701 gtk_text_buffer_insert (buffer, &iter, str, -1);
705 gtk_text_buffer_insert (buffer, &iter,
706 "(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"
707 /* This is UTF8 stuff, Emacs doesn't
708 really know how to display it */
709 "Spanish (Español) ¡Hola! / French (Français) Bonjour, Salut / German (Deutsch Süd) Grüß Gott (testing Latin-1 chars encoded in UTF8)\nThai (we can't display this, just making sure we don't crash) (ภาษาไทย) สวัสดีครับ, สวัสดีค่ะ\n",
712 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
713 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
715 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 4);
717 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
719 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 7);
721 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
723 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 8);
725 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
727 gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 8);
729 gtk_text_iter_forward_chars (&iter2, 10);
731 gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
733 gtk_text_iter_forward_chars (&iter, 7);
734 gtk_text_iter_forward_chars (&iter2, 10);
736 gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
738 gtk_text_iter_forward_chars (&iter, 12);
739 gtk_text_iter_forward_chars (&iter2, 10);
741 gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
743 gtk_text_iter_forward_chars (&iter, 10);
744 gtk_text_iter_forward_chars (&iter2, 15);
746 gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
747 gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
749 gtk_text_iter_forward_chars (&iter, 20);
750 gtk_text_iter_forward_chars (&iter2, 20);
752 gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
753 gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
755 gtk_text_iter_backward_chars (&iter, 25);
756 gtk_text_iter_forward_chars (&iter2, 5);
758 gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
759 gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
761 gtk_text_iter_forward_chars (&iter, 15);
762 gtk_text_iter_backward_chars (&iter2, 10);
764 gtk_text_buffer_remove_tag_by_name (buffer, "fg_red", &iter, &iter2);
765 gtk_text_buffer_remove_tag_by_name (buffer, "fg_blue", &iter, &iter2);
770 /* Put in tags that are just at the beginning, and just near the end,
771 * and just near the middle.
773 tag = gtk_text_buffer_create_tag (buffer, "front_tag", NULL);
774 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
775 gtk_text_buffer_get_iter_at_offset (buffer, &iter2, 300);
777 gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
779 tag = gtk_text_buffer_create_tag (buffer, "end_tag", NULL);
780 gtk_text_buffer_get_end_iter (buffer, &iter2);
781 gtk_text_iter_backward_chars (&iter2, 12);
783 gtk_text_iter_backward_chars (&iter, 157);
785 gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
787 tag = gtk_text_buffer_create_tag (buffer, "center_tag", NULL);
788 gtk_text_buffer_get_iter_at_offset (buffer, &iter,
789 gtk_text_buffer_get_char_count (buffer)/2);
790 gtk_text_iter_backward_chars (&iter, 37);
792 gtk_text_iter_forward_chars (&iter2, 57);
794 gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
796 gdk_pixbuf_unref (pixbuf);
801 * Line separator tests (initially to avoid regression on bugzilla #57428)
805 test_line_separation (const char* str,
806 gboolean expect_next_line,
807 gboolean expect_end_iter,
808 int expected_line_count,
809 int expected_line_break,
810 int expected_next_line_start)
813 GtkTextBuffer* buffer;
814 gboolean on_next_line;
815 gboolean on_end_iter;
818 buffer = gtk_text_buffer_new (NULL);
820 gtk_text_buffer_set_text (buffer, str, -1);
821 gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
823 g_assert (gtk_text_iter_ends_line (&iter) || gtk_text_iter_is_end (&iter));
825 g_assert (gtk_text_buffer_get_line_count (buffer) == expected_line_count);
827 on_next_line = gtk_text_iter_forward_line (&iter);
829 g_assert (expect_next_line == on_next_line);
831 on_end_iter = gtk_text_iter_is_end (&iter);
833 g_assert (on_end_iter == expect_end_iter);
835 new_pos = gtk_text_iter_get_offset (&iter);
838 g_assert (expected_next_line_start == new_pos);
840 ++expected_line_break;
841 while (expected_line_break < expected_next_line_start)
843 gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
845 g_assert (!gtk_text_iter_ends_line (&iter));
847 on_next_line = gtk_text_iter_forward_line (&iter);
849 g_assert (expect_next_line == on_next_line);
851 new_pos = gtk_text_iter_get_offset (&iter);
854 g_assert (expected_next_line_start == new_pos);
856 ++expected_line_break;
859 /* FIXME tests for backward line */
861 g_object_unref (G_OBJECT (buffer));
866 line_separator_tests (void)
869 char buf[7] = { '\0', };
871 /* Only one character has type G_UNICODE_PARAGRAPH_SEPARATOR in
872 * Unicode 3.0; update this if that changes.
874 #define PARAGRAPH_SEPARATOR 0x2029
876 test_line_separation ("line", FALSE, TRUE, 1, 4, 4);
877 test_line_separation ("line\r\n", FALSE, TRUE, 2, 4, 6);
878 test_line_separation ("line\r", FALSE, TRUE, 2, 4, 5);
879 test_line_separation ("line\n", FALSE, TRUE, 2, 4, 5);
880 test_line_separation ("line\rqw", TRUE, FALSE, 2, 4, 5);
881 test_line_separation ("line\nqw", TRUE, FALSE, 2, 4, 5);
882 test_line_separation ("line\r\nqw", TRUE, FALSE, 2, 4, 6);
884 g_unichar_to_utf8 (PARAGRAPH_SEPARATOR, buf);
886 str = g_strdup_printf ("line%s", buf);
887 test_line_separation (str, FALSE, TRUE, 2, 4, 5);
889 str = g_strdup_printf ("line%sqw", buf);
890 test_line_separation (str, TRUE, FALSE, 2, 4, 5);
893 g_print ("Line separator tests passed\n");
897 logical_motion_tests (void)
900 char buf1[7] = { '\0', };
901 char buf2[7] = { '\0', };
902 char buf3[7] = { '\0', };
906 GtkTextBuffer *buffer;
909 buffer = gtk_text_buffer_new (NULL);
911 #define LEADING_JAMO 0x1111
912 #define VOWEL_JAMO 0x1167
913 #define TRAILING_JAMO 0x11B9
915 g_unichar_to_utf8 (LEADING_JAMO, buf1);
916 g_unichar_to_utf8 (VOWEL_JAMO, buf2);
917 g_unichar_to_utf8 (TRAILING_JAMO, buf3);
919 /* Build the string "abc<leading><vowel><trailing>def\r\nxyz" */
920 str = g_strconcat ("abc", buf1, buf2, buf3, "def\r\nxyz", NULL);
921 gtk_text_buffer_set_text (buffer, str, -1);
924 /* Check cursor positions */
925 memset (expected, 0, sizeof (expected));
926 expected[0] = 0; /* before 'a' */
927 expected[1] = 1; /* before 'b' */
928 expected[2] = 2; /* before 'c' */
929 expected[3] = 3; /* before jamo */
930 expected[4] = 6; /* before 'd' */
931 expected[5] = 7; /* before 'e' */
932 expected[6] = 8; /* before 'f' */
933 expected[7] = 9; /* before '\r' */
934 expected[8] = 11; /* before 'x' */
935 expected[9] = 12; /* before 'y' */
936 expected[10] = 13; /* before 'z' */
937 expected[11] = 14; /* after 'z' (only matters going backward) */
940 gtk_text_buffer_get_start_iter (buffer, &iter);
946 pos = gtk_text_iter_get_offset (&iter);
948 if (pos != expected[i])
950 g_error ("Cursor position %d, expected %d",
956 while (gtk_text_iter_forward_cursor_position (&iter));
958 if (!gtk_text_iter_is_end (&iter))
959 g_error ("Expected to stop at the end iterator\n");
961 if (!gtk_text_iter_is_cursor_position (&iter))
962 g_error ("Should be a cursor position before the end iterator");
964 if (i != expected_steps)
965 g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
972 pos = gtk_text_iter_get_offset (&iter);
974 if (pos != expected[i])
976 g_error ("Moving backward, cursor position %d, expected %d",
980 /* g_print ("%d = %d\n", pos, expected[i]); */
984 while (gtk_text_iter_backward_cursor_position (&iter));
987 g_error ("Expected %d steps, there were actually %d\n", expected_steps - i, i);
989 if (!gtk_text_iter_is_start (&iter))
990 g_error ("Expected to stop at the start iterator\n");
993 /* Check sentence boundaries */
995 gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
997 memset (expected, 0, sizeof (expected));
999 expected[0] = 0; /* before first Hi */
1000 expected[1] = 3; /* After first . */
1001 expected[2] = 7; /* After second . */
1002 expected[3] = 12; /* After ! */
1003 expected[4] = 16; /* After third . */
1004 expected[5] = 20; /* After ? */
1008 gtk_text_buffer_get_start_iter (buffer, &iter);
1014 pos = gtk_text_iter_get_offset (&iter);
1016 if (pos != expected[i])
1018 g_error ("Sentence position %d, expected %d",
1023 !gtk_text_iter_is_end (&iter) &&
1024 !gtk_text_iter_ends_sentence (&iter))
1025 g_error ("Iterator at %d should end a sentence", pos);
1029 while (gtk_text_iter_forward_sentence_end (&iter));
1031 if (i != expected_steps)
1032 g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
1034 if (!gtk_text_iter_is_end (&iter))
1035 g_error ("Expected to stop at the end iterator\n");
1037 gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
1039 memset (expected, 0, sizeof (expected));
1051 gtk_text_buffer_get_end_iter (buffer, &iter);
1057 pos = gtk_text_iter_get_offset (&iter);
1059 if (pos != expected[i])
1061 g_error ("Sentence position %d, expected %d",
1066 !gtk_text_iter_is_end (&iter) &&
1067 !gtk_text_iter_starts_sentence (&iter))
1068 g_error ("Iterator at %d should start a sentence", pos);
1072 while (gtk_text_iter_backward_sentence_start (&iter));
1074 if (i != expected_steps)
1075 g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
1077 if (gtk_text_iter_get_offset (&iter) != 0)
1078 g_error ("Expected to stop at the start iterator\n");
1080 g_print ("Logical motion tests passed\n");
1082 g_object_unref (G_OBJECT (buffer));