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 /* empty first line contains 0 chars */
71 gtk_text_buffer_get_start_iter (buffer, &start);
72 n = gtk_text_iter_get_chars_in_line (&start);
74 g_error ("%d chars in first line, expected 0", n);
75 n = gtk_text_iter_get_bytes_in_line (&start);
77 g_error ("%d bytes in first line, expected 0", n);
79 /* Run gruesome alien test suite on buffer */
82 /* Check set/get text */
83 check_get_set_text (buffer, "Hello");
84 check_get_set_text (buffer, "Hello\n");
85 check_get_set_text (buffer, "Hello\r\n");
86 check_get_set_text (buffer, "Hello\r");
87 check_get_set_text (buffer, "Hello\nBar\nFoo");
88 check_get_set_text (buffer, "Hello\nBar\nFoo\n");
90 g_print ("get/set tests passed.\n");
92 /* Put stuff in the buffer */
96 /* Subject stuff-bloated buffer to further torment */
99 /* Delete all stuff from the buffer */
100 gtk_text_buffer_get_bounds (buffer, &start, &end);
101 gtk_text_buffer_delete (buffer, &start, &end);
103 /* Check buffer for emptiness (note that a single
104 empty line always remains in the buffer) */
105 n = gtk_text_buffer_get_line_count (buffer);
107 g_error ("%d lines, expected 1", n);
109 n = gtk_text_buffer_get_char_count (buffer);
111 g_error ("%d chars, expected 0", n);
115 gtk_text_buffer_set_text (buffer, "adcdef", -1);
116 gtk_text_buffer_get_iter_at_offset (buffer, &start, 1);
117 gtk_text_buffer_get_iter_at_offset (buffer, &end, 3);
118 gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &start, &end);
122 g_object_unref (buffer);
124 g_print ("All tests passed.\n");
130 check_get_set_text (GtkTextBuffer *buffer,
133 GtkTextIter start, end, iter;
137 gtk_text_buffer_set_text (buffer, str, -1);
138 if (gtk_text_buffer_get_char_count (buffer) != g_utf8_strlen (str, -1))
139 g_error ("Wrong number of chars (%d not %d)",
140 gtk_text_buffer_get_char_count (buffer),
141 (int) g_utf8_strlen (str, -1));
142 gtk_text_buffer_get_bounds (buffer, &start, &end);
143 text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
144 if (strcmp (text, str) != 0)
145 g_error ("Got '%s' as buffer contents", text);
148 /* line char counts */
153 n += gtk_text_iter_get_chars_in_line (&iter);
155 while (gtk_text_iter_forward_line (&iter));
157 if (n != gtk_text_buffer_get_char_count (buffer))
158 g_error ("Sum of chars in lines is %d but buffer char count is %d",
159 n, gtk_text_buffer_get_char_count (buffer));
161 /* line byte counts */
166 n += gtk_text_iter_get_bytes_in_line (&iter);
168 while (gtk_text_iter_forward_line (&iter));
170 if (n != strlen (str))
171 g_error ("Sum of chars in lines is %d but buffer byte count is %d",
174 gtk_text_buffer_set_text (buffer, "", -1);
176 n = gtk_text_buffer_get_line_count (buffer);
178 g_error ("%d lines, expected 1", n);
180 n = gtk_text_buffer_get_char_count (buffer);
182 g_error ("%d chars, expected 0", n);
186 count_toggles_at_iter (GtkTextIter *iter,
193 /* get toggle-ons and toggle-offs */
194 tags = gtk_text_iter_get_toggled_tags (iter, TRUE);
195 tags = g_slist_concat (tags,
196 gtk_text_iter_get_toggled_tags (iter, FALSE));
203 else if (of_tag == tmp->data)
206 tmp = g_slist_next (tmp);
215 count_toggles_in_range_by_char (GtkTextBuffer *buffer,
217 const GtkTextIter *start,
218 const GtkTextIter *end)
226 count += count_toggles_at_iter (&iter, of_tag);
227 if (!gtk_text_iter_forward_char (&iter))
230 count += count_toggles_at_iter (&iter, of_tag);
234 while (gtk_text_iter_compare (&iter, end) <= 0);
240 count_toggles_in_buffer (GtkTextBuffer *buffer,
243 GtkTextIter start, end;
245 gtk_text_buffer_get_bounds (buffer, &start, &end);
247 return count_toggles_in_range_by_char (buffer, of_tag, &start, &end);
251 check_specific_tag_in_range (GtkTextBuffer *buffer,
252 const gchar *tag_name,
253 const GtkTextIter *start,
254 const GtkTextIter *end)
263 if (gtk_text_iter_compare (start, end) > 0)
265 g_print (" (inverted range for checking tags, skipping)\n");
269 tag = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table (buffer),
272 buffer_count = count_toggles_in_range_by_char (buffer, tag, start, end);
279 if (gtk_text_iter_toggles_tag (&iter, tag) ||
280 gtk_text_iter_forward_to_tag_toggle (&iter, tag))
288 this_offset = gtk_text_iter_get_offset (&iter);
290 if (this_offset <= last_offset)
291 g_error ("forward_to_tag_toggle moved in wrong direction");
293 last_offset = this_offset;
295 if (gtk_text_iter_begins_tag (&iter, tag))
298 g_error ("Tag %p is already on, and was toggled on?", tag);
301 else if (gtk_text_iter_ends_tag (&iter, tag))
304 g_error ("Tag %p toggled off, but wasn't toggled on?", tag);
308 g_error ("forward_to_tag_toggle went to a location without a toggle");
310 while (gtk_text_iter_forward_to_tag_toggle (&iter, tag) &&
311 gtk_text_iter_compare (&iter, end) <= 0);
314 if (count != buffer_count)
315 g_error ("Counted %d tags iterating by char, %d iterating forward by tag toggle\n",
316 buffer_count, count);
322 last_offset = gtk_text_iter_get_offset (&iter);
323 if (gtk_text_iter_toggles_tag (&iter, tag) ||
324 gtk_text_iter_backward_to_tag_toggle (&iter, tag))
332 this_offset = gtk_text_iter_get_offset (&iter);
334 if (this_offset >= last_offset)
335 g_error ("backward_to_tag_toggle moved in wrong direction");
337 last_offset = this_offset;
339 if (gtk_text_iter_begins_tag (&iter, tag))
342 g_error ("Tag %p wasn't on when we got to the on toggle going backward?", tag);
345 else if (gtk_text_iter_ends_tag (&iter, tag))
348 g_error ("Tag %p off toggle, but we were already inside a tag?", tag);
352 g_error ("backward_to_tag_toggle went to a location without a toggle");
354 while (gtk_text_iter_backward_to_tag_toggle (&iter, tag) &&
355 gtk_text_iter_compare (&iter, start) >= 0);
358 if (count != buffer_count)
359 g_error ("Counted %d tags iterating by char, %d iterating backward by tag toggle\n",
360 buffer_count, count);
364 check_specific_tag (GtkTextBuffer *buffer,
365 const gchar *tag_name)
367 GtkTextIter start, end;
369 gtk_text_buffer_get_bounds (buffer, &start, &end);
370 check_specific_tag_in_range (buffer, tag_name, &start, &end);
371 gtk_text_iter_forward_chars (&start, 2);
372 gtk_text_iter_backward_chars (&end, 2);
373 if (gtk_text_iter_compare (&start, &end) < 0)
374 check_specific_tag_in_range (buffer, tag_name, &start, &end);
378 run_tests (GtkTextBuffer *buffer)
386 GtkTextMark *bar_mark;
388 GHashTable *tag_states;
392 gtk_text_buffer_get_bounds (buffer, &start, &end);
394 /* Check that walking the tree via chars and via iterators produces
395 * the same number of indexable locations.
397 num_chars = gtk_text_buffer_get_char_count (buffer);
399 bar_mark = gtk_text_buffer_create_mark (buffer, "bar", &iter, FALSE);
401 while (i < num_chars)
404 GtkTextMark *foo_mark;
406 gtk_text_buffer_get_iter_at_offset (buffer, ¤t, i);
408 if (!gtk_text_iter_equal (&iter, ¤t))
410 g_error ("get_char_index didn't return current iter");
413 j = gtk_text_iter_get_offset (&iter);
417 g_error ("iter converted to %d not %d", j, i);
421 gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
423 if (!gtk_text_iter_equal (&iter, &mark))
425 gtk_text_iter_spew (&iter, "iter");
426 gtk_text_iter_spew (&mark, "mark");
427 g_error ("Mark not moved to the right place.");
430 foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
431 gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
432 gtk_text_buffer_delete_mark (buffer, foo_mark);
434 if (!gtk_text_iter_equal (&iter, &mark))
436 gtk_text_iter_spew (&iter, "iter");
437 gtk_text_iter_spew (&mark, "mark");
438 g_error ("Mark not created in the right place.");
441 if (gtk_text_iter_is_end (&iter))
442 g_error ("iterators ran out before chars (offset %d of %d)",
445 gtk_text_iter_forward_char (&iter);
447 gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
452 if (!gtk_text_iter_equal (&iter, &end))
453 g_error ("Iterating over all chars didn't end with the end iter");
455 /* Do the tree-walk backward
457 num_chars = gtk_text_buffer_get_char_count (buffer);
458 gtk_text_buffer_get_iter_at_offset (buffer, &iter, -1);
460 gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
464 if (!gtk_text_iter_equal (&iter, &end))
465 g_error ("iter at char -1 is not equal to the end iterator");
470 GtkTextMark *foo_mark;
472 gtk_text_buffer_get_iter_at_offset (buffer, ¤t, i);
474 if (!gtk_text_iter_equal (&iter, ¤t))
476 g_error ("get_char_index didn't return current iter while going backward");
478 j = gtk_text_iter_get_offset (&iter);
482 g_error ("going backward, iter converted to %d not %d", j, i);
486 gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
488 if (!gtk_text_iter_equal (&iter, &mark))
490 gtk_text_iter_spew (&iter, "iter");
491 gtk_text_iter_spew (&mark, "mark");
492 g_error ("Mark not moved to the right place.");
495 foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
496 gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
497 gtk_text_buffer_delete_mark (buffer, foo_mark);
499 if (!gtk_text_iter_equal (&iter, &mark))
501 gtk_text_iter_spew (&iter, "iter");
502 gtk_text_iter_spew (&mark, "mark");
503 g_error ("Mark not created in the right place.");
508 if (!gtk_text_iter_backward_char (&iter))
509 g_error ("iterators ran out before char indexes");
511 gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
515 if (gtk_text_iter_backward_char (&iter))
516 g_error ("went backward from 0?");
522 if (!gtk_text_iter_equal (&iter, &start))
523 g_error ("Iterating backward over all chars didn't end with the start iter");
526 * Check that get_line_count returns the same number of lines
527 * as walking the tree by line
529 i = 1; /* include current (first) line */
530 gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
531 while (gtk_text_iter_forward_line (&iter))
534 if (i != gtk_text_buffer_get_line_count (buffer))
535 g_error ("Counted %d lines, buffer has %d", i,
536 gtk_text_buffer_get_line_count (buffer));
539 * Check that moving over tag toggles thinks about working.
542 buffer_count = count_toggles_in_buffer (buffer, NULL);
544 tag_states = g_hash_table_new (NULL, NULL);
547 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
548 if (gtk_text_iter_toggles_tag (&iter, NULL) ||
549 gtk_text_iter_forward_to_tag_toggle (&iter, NULL))
555 gboolean found_some = FALSE;
557 /* get toggled-on tags */
558 tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
570 if (g_hash_table_lookup (tag_states, tag))
571 g_error ("Tag %p is already on, and was toggled on?", tag);
573 g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
575 tmp = g_slist_next (tmp);
580 /* get toggled-off tags */
581 tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
593 if (!g_hash_table_lookup (tag_states, tag))
594 g_error ("Tag %p is already off, and was toggled off?", tag);
596 g_hash_table_remove (tag_states, tag);
598 tmp = g_slist_next (tmp);
604 g_error ("No tags found going forward to tag toggle.");
607 while (gtk_text_iter_forward_to_tag_toggle (&iter, NULL));
610 g_hash_table_destroy (tag_states);
612 if (count != buffer_count)
613 g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
614 buffer_count, count);
616 /* Go backward; here TRUE in the hash means we saw
617 * an off toggle last.
620 tag_states = g_hash_table_new (NULL, NULL);
623 gtk_text_buffer_get_end_iter (buffer, &iter);
624 if (gtk_text_iter_toggles_tag (&iter, NULL) ||
625 gtk_text_iter_backward_to_tag_toggle (&iter, NULL))
631 gboolean found_some = FALSE;
633 /* get toggled-off tags */
634 tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
646 if (g_hash_table_lookup (tag_states, tag))
647 g_error ("Tag %p has two off-toggles in a row?", tag);
649 g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
651 tmp = g_slist_next (tmp);
656 /* get toggled-on tags */
657 tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
669 if (!g_hash_table_lookup (tag_states, tag))
670 g_error ("Tag %p was toggled on, but saw no off-toggle?", tag);
672 g_hash_table_remove (tag_states, tag);
674 tmp = g_slist_next (tmp);
680 g_error ("No tags found going backward to tag toggle.");
682 while (gtk_text_iter_backward_to_tag_toggle (&iter, NULL));
685 g_hash_table_destroy (tag_states);
687 if (count != buffer_count)
688 g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
689 buffer_count, count);
691 check_specific_tag (buffer, "fg_red");
692 check_specific_tag (buffer, "bg_green");
693 check_specific_tag (buffer, "front_tag");
694 check_specific_tag (buffer, "center_tag");
695 check_specific_tag (buffer, "end_tag");
699 static const char *book_closed_xpm[] = {
725 fill_buffer (GtkTextBuffer *buffer)
728 GdkColor color, color2;
734 color.red = color.green = 0;
740 gtk_text_buffer_create_tag (buffer, "fg_blue",
741 "foreground_gdk", &color,
742 "background_gdk", &color2,
743 "font", "-*-courier-bold-r-*-*-30-*-*-*-*-*-*-*",
746 color.blue = color.green = 0;
749 gtk_text_buffer_create_tag (buffer, "fg_red",
751 "foreground_gdk", &color,
754 color.blue = color.red = 0;
755 color.green = 0xffff;
757 gtk_text_buffer_create_tag (buffer, "bg_green",
758 "background_gdk", &color,
759 "font", "-*-courier-bold-r-*-*-10-*-*-*-*-*-*-*",
762 pixbuf = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
764 g_assert (pixbuf != NULL);
771 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
773 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
775 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 1);
777 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
779 str = g_strdup_printf ("%d Hello World!\nwoo woo woo woo woo woo woo woo\n",
782 gtk_text_buffer_insert (buffer, &iter, str, -1);
786 gtk_text_buffer_insert (buffer, &iter,
787 "(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"
788 /* This is UTF8 stuff, Emacs doesn't
789 really know how to display it */
790 "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",
793 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
794 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
796 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 4);
798 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
800 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 7);
802 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
804 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 8);
806 gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
808 gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 8);
810 gtk_text_iter_forward_chars (&iter2, 10);
812 gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
814 gtk_text_iter_forward_chars (&iter, 7);
815 gtk_text_iter_forward_chars (&iter2, 10);
817 gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
819 gtk_text_iter_forward_chars (&iter, 12);
820 gtk_text_iter_forward_chars (&iter2, 10);
822 gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
824 gtk_text_iter_forward_chars (&iter, 10);
825 gtk_text_iter_forward_chars (&iter2, 15);
827 gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
828 gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
830 gtk_text_iter_forward_chars (&iter, 20);
831 gtk_text_iter_forward_chars (&iter2, 20);
833 gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
834 gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
836 gtk_text_iter_backward_chars (&iter, 25);
837 gtk_text_iter_forward_chars (&iter2, 5);
839 gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
840 gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
842 gtk_text_iter_forward_chars (&iter, 15);
843 gtk_text_iter_backward_chars (&iter2, 10);
845 gtk_text_buffer_remove_tag_by_name (buffer, "fg_red", &iter, &iter2);
846 gtk_text_buffer_remove_tag_by_name (buffer, "fg_blue", &iter, &iter2);
851 /* Put in tags that are just at the beginning, and just near the end,
852 * and just near the middle.
854 tag = gtk_text_buffer_create_tag (buffer, "front_tag", NULL);
855 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
856 gtk_text_buffer_get_iter_at_offset (buffer, &iter2, 300);
858 gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
860 tag = gtk_text_buffer_create_tag (buffer, "end_tag", NULL);
861 gtk_text_buffer_get_end_iter (buffer, &iter2);
862 gtk_text_iter_backward_chars (&iter2, 12);
864 gtk_text_iter_backward_chars (&iter, 157);
866 gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
868 tag = gtk_text_buffer_create_tag (buffer, "center_tag", NULL);
869 gtk_text_buffer_get_iter_at_offset (buffer, &iter,
870 gtk_text_buffer_get_char_count (buffer)/2);
871 gtk_text_iter_backward_chars (&iter, 37);
873 gtk_text_iter_forward_chars (&iter2, 57);
875 gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
877 g_object_unref (pixbuf);
882 * Line separator tests (initially to avoid regression on bugzilla #57428)
886 test_line_separation (const char* str,
887 gboolean expect_next_line,
888 gboolean expect_end_iter,
889 int expected_line_count,
890 int expected_line_break,
891 int expected_next_line_start)
894 GtkTextBuffer* buffer;
895 gboolean on_next_line;
896 gboolean on_end_iter;
899 buffer = gtk_text_buffer_new (NULL);
901 gtk_text_buffer_set_text (buffer, str, -1);
902 gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
904 g_assert (gtk_text_iter_ends_line (&iter) || gtk_text_iter_is_end (&iter));
906 g_assert (gtk_text_buffer_get_line_count (buffer) == expected_line_count);
908 on_next_line = gtk_text_iter_forward_line (&iter);
910 g_assert (expect_next_line == on_next_line);
912 on_end_iter = gtk_text_iter_is_end (&iter);
914 g_assert (on_end_iter == expect_end_iter);
916 new_pos = gtk_text_iter_get_offset (&iter);
919 g_assert (expected_next_line_start == new_pos);
921 ++expected_line_break;
922 while (expected_line_break < expected_next_line_start)
924 gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
926 g_assert (!gtk_text_iter_ends_line (&iter));
928 on_next_line = gtk_text_iter_forward_line (&iter);
930 g_assert (expect_next_line == on_next_line);
932 new_pos = gtk_text_iter_get_offset (&iter);
935 g_assert (expected_next_line_start == new_pos);
937 ++expected_line_break;
940 /* FIXME tests for backward line */
942 g_object_unref (buffer);
947 line_separator_tests (void)
950 char buf[7] = { '\0', };
952 /* Only one character has type G_UNICODE_PARAGRAPH_SEPARATOR in
953 * Unicode 3.0; update this if that changes.
955 #define PARAGRAPH_SEPARATOR 0x2029
957 test_line_separation ("line", FALSE, TRUE, 1, 4, 4);
958 test_line_separation ("line\r\n", FALSE, TRUE, 2, 4, 6);
959 test_line_separation ("line\r", FALSE, TRUE, 2, 4, 5);
960 test_line_separation ("line\n", FALSE, TRUE, 2, 4, 5);
961 test_line_separation ("line\rqw", TRUE, FALSE, 2, 4, 5);
962 test_line_separation ("line\nqw", TRUE, FALSE, 2, 4, 5);
963 test_line_separation ("line\r\nqw", TRUE, FALSE, 2, 4, 6);
965 g_unichar_to_utf8 (PARAGRAPH_SEPARATOR, buf);
967 str = g_strdup_printf ("line%s", buf);
968 test_line_separation (str, FALSE, TRUE, 2, 4, 5);
970 str = g_strdup_printf ("line%sqw", buf);
971 test_line_separation (str, TRUE, FALSE, 2, 4, 5);
974 g_print ("Line separator tests passed\n");
978 logical_motion_tests (void)
981 char buf1[7] = { '\0', };
982 char buf2[7] = { '\0', };
983 char buf3[7] = { '\0', };
987 GtkTextBuffer *buffer;
990 buffer = gtk_text_buffer_new (NULL);
992 #define LEADING_JAMO 0x1111
993 #define VOWEL_JAMO 0x1167
994 #define TRAILING_JAMO 0x11B9
996 g_unichar_to_utf8 (LEADING_JAMO, buf1);
997 g_unichar_to_utf8 (VOWEL_JAMO, buf2);
998 g_unichar_to_utf8 (TRAILING_JAMO, buf3);
1000 /* Build the string "abc<leading><vowel><trailing>def\r\nxyz" */
1001 str = g_strconcat ("abc", buf1, buf2, buf3, "def\r\nxyz", NULL);
1002 gtk_text_buffer_set_text (buffer, str, -1);
1005 /* Check cursor positions */
1006 memset (expected, 0, sizeof (expected));
1007 expected[0] = 0; /* before 'a' */
1008 expected[1] = 1; /* before 'b' */
1009 expected[2] = 2; /* before 'c' */
1010 expected[3] = 3; /* before jamo */
1011 expected[4] = 6; /* before 'd' */
1012 expected[5] = 7; /* before 'e' */
1013 expected[6] = 8; /* before 'f' */
1014 expected[7] = 9; /* before '\r' */
1015 expected[8] = 11; /* before 'x' */
1016 expected[9] = 12; /* before 'y' */
1017 expected[10] = 13; /* before 'z' */
1018 expected[11] = 14; /* after 'z' (only matters going backward) */
1019 expected_steps = 11;
1021 gtk_text_buffer_get_start_iter (buffer, &iter);
1027 pos = gtk_text_iter_get_offset (&iter);
1029 if (pos != expected[i])
1031 g_error ("Cursor position %d, expected %d",
1037 while (gtk_text_iter_forward_cursor_position (&iter));
1039 if (!gtk_text_iter_is_end (&iter))
1040 g_error ("Expected to stop at the end iterator\n");
1042 if (!gtk_text_iter_is_cursor_position (&iter))
1043 g_error ("Should be a cursor position before the end iterator");
1045 if (i != expected_steps)
1046 g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
1053 pos = gtk_text_iter_get_offset (&iter);
1055 if (pos != expected[i])
1057 g_error ("Moving backward, cursor position %d, expected %d",
1061 /* g_print ("%d = %d\n", pos, expected[i]); */
1065 while (gtk_text_iter_backward_cursor_position (&iter));
1068 g_error ("Expected %d steps, there were actually %d\n", expected_steps - i, i);
1070 if (!gtk_text_iter_is_start (&iter))
1071 g_error ("Expected to stop at the start iterator\n");
1074 /* Check sentence boundaries */
1076 gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
1078 memset (expected, 0, sizeof (expected));
1080 expected[0] = 0; /* before first Hi */
1081 expected[1] = 3; /* After first . */
1082 expected[2] = 7; /* After second . */
1083 expected[3] = 12; /* After ! */
1084 expected[4] = 16; /* After third . */
1085 expected[5] = 20; /* After ? */
1089 gtk_text_buffer_get_start_iter (buffer, &iter);
1095 pos = gtk_text_iter_get_offset (&iter);
1097 if (pos != expected[i])
1099 g_error ("Sentence position %d, expected %d",
1104 !gtk_text_iter_is_end (&iter) &&
1105 !gtk_text_iter_ends_sentence (&iter))
1106 g_error ("Iterator at %d should end a sentence", pos);
1110 while (gtk_text_iter_forward_sentence_end (&iter));
1112 if (i != expected_steps)
1113 g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
1115 if (!gtk_text_iter_is_end (&iter))
1116 g_error ("Expected to stop at the end iterator\n");
1118 gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
1120 memset (expected, 0, sizeof (expected));
1132 gtk_text_buffer_get_end_iter (buffer, &iter);
1138 pos = gtk_text_iter_get_offset (&iter);
1140 if (pos != expected[i])
1142 g_error ("Sentence position %d, expected %d",
1147 !gtk_text_iter_is_end (&iter) &&
1148 !gtk_text_iter_starts_sentence (&iter))
1149 g_error ("Iterator at %d should start a sentence", pos);
1153 while (gtk_text_iter_backward_sentence_start (&iter));
1155 if (i != expected_steps)
1156 g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
1158 if (gtk_text_iter_get_offset (&iter) != 0)
1159 g_error ("Expected to stop at the start iterator\n");
1161 g_print ("Logical motion tests passed\n");
1163 g_object_unref (buffer);