Blame gtk/tests/textbuffer.c

Packit Service fb6fa5
/* testtextbuffer.c -- Simplistic test suite
Packit Service fb6fa5
 * Copyright (C) 2000 Red Hat, Inc
Packit Service fb6fa5
 * Author: Havoc Pennington
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Library General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Library General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Library General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include <stdio.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <gtk/gtk.h>
Packit Service fb6fa5
#include "gtk/gtktexttypes.h" /* Private header, for UNKNOWN_CHAR */
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_text_iter_spew (const GtkTextIter *iter, const gchar *desc)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_print (" %20s: line %d / char %d / line char %d / line byte %d\n",
Packit Service fb6fa5
           desc,
Packit Service fb6fa5
           gtk_text_iter_get_line (iter),
Packit Service fb6fa5
           gtk_text_iter_get_offset (iter),
Packit Service fb6fa5
           gtk_text_iter_get_line_offset (iter),
Packit Service fb6fa5
           gtk_text_iter_get_line_index (iter));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
check_get_set_text (GtkTextBuffer *buffer,
Packit Service fb6fa5
                    const char    *str)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextIter start, end, iter;
Packit Service fb6fa5
  char *text;
Packit Service fb6fa5
  int n;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, str, -1);
Packit Service fb6fa5
  if (gtk_text_buffer_get_char_count (buffer) != g_utf8_strlen (str, -1))
Packit Service fb6fa5
    g_error ("Wrong number of chars (%d not %d)",
Packit Service fb6fa5
             gtk_text_buffer_get_char_count (buffer),
Packit Service fb6fa5
             (int) g_utf8_strlen (str, -1));
Packit Service fb6fa5
  gtk_text_buffer_get_bounds (buffer, &start, &end;;
Packit Service fb6fa5
  text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
Packit Service fb6fa5
  if (strcmp (text, str) != 0)
Packit Service fb6fa5
    g_error ("Got '%s' as buffer contents", text);
Packit Service fb6fa5
  g_free (text);
Packit Service fb6fa5
Packit Service fb6fa5
  /* line char counts */
Packit Service fb6fa5
  iter = start;
Packit Service fb6fa5
  n = 0;
Packit Service fb6fa5
  do
Packit Service fb6fa5
    {
Packit Service fb6fa5
      n += gtk_text_iter_get_chars_in_line (&iter);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  while (gtk_text_iter_forward_line (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
  if (n != gtk_text_buffer_get_char_count (buffer))
Packit Service fb6fa5
    g_error ("Sum of chars in lines is %d but buffer char count is %d",
Packit Service fb6fa5
             n, gtk_text_buffer_get_char_count (buffer));
Packit Service fb6fa5
Packit Service fb6fa5
  /* line byte counts */
Packit Service fb6fa5
  iter = start;
Packit Service fb6fa5
  n = 0;
Packit Service fb6fa5
  do
Packit Service fb6fa5
    {
Packit Service fb6fa5
      n += gtk_text_iter_get_bytes_in_line (&iter);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  while (gtk_text_iter_forward_line (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
  if (n != strlen (str))
Packit Service fb6fa5
    g_error ("Sum of chars in lines is %d but buffer byte count is %d",
Packit Service fb6fa5
             n, (int) strlen (str));
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, "", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  n = gtk_text_buffer_get_line_count (buffer);
Packit Service fb6fa5
  if (n != 1)
Packit Service fb6fa5
    g_error ("%d lines, expected 1", n);
Packit Service fb6fa5
Packit Service fb6fa5
  n = gtk_text_buffer_get_char_count (buffer);
Packit Service fb6fa5
  if (n != 0)
Packit Service fb6fa5
    g_error ("%d chars, expected 0", n);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
count_toggles_at_iter (GtkTextIter *iter,
Packit Service fb6fa5
                       GtkTextTag  *of_tag)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSList *tags;
Packit Service fb6fa5
  GSList *tmp;
Packit Service fb6fa5
  gint count = 0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* get toggle-ons and toggle-offs */
Packit Service fb6fa5
  tags = gtk_text_iter_get_toggled_tags (iter, TRUE);
Packit Service fb6fa5
  tags = g_slist_concat (tags,
Packit Service fb6fa5
                         gtk_text_iter_get_toggled_tags (iter, FALSE));
Packit Service fb6fa5
  
Packit Service fb6fa5
  tmp = tags;
Packit Service fb6fa5
  while (tmp != NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (of_tag == NULL)
Packit Service fb6fa5
        ++count;
Packit Service fb6fa5
      else if (of_tag == tmp->data)
Packit Service fb6fa5
        ++count;
Packit Service fb6fa5
      
Packit Service fb6fa5
      tmp = g_slist_next (tmp);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_slist_free (tags);
Packit Service fb6fa5
Packit Service fb6fa5
  return count;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
count_toggles_in_range_by_char (GtkTextBuffer     *buffer,
Packit Service fb6fa5
                                GtkTextTag        *of_tag,
Packit Service fb6fa5
                                const GtkTextIter *start,
Packit Service fb6fa5
                                const GtkTextIter *end)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextIter iter;
Packit Service fb6fa5
  gint count = 0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  iter = *start;
Packit Service fb6fa5
  do
Packit Service fb6fa5
    {
Packit Service fb6fa5
      count += count_toggles_at_iter (&iter, of_tag);
Packit Service fb6fa5
      if (!gtk_text_iter_forward_char (&iter))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          /* end iterator */
Packit Service fb6fa5
          count += count_toggles_at_iter (&iter, of_tag);
Packit Service fb6fa5
          break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  while (gtk_text_iter_compare (&iter, end) <= 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return count;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
count_toggles_in_buffer (GtkTextBuffer *buffer,
Packit Service fb6fa5
                         GtkTextTag    *of_tag)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextIter start, end;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_get_bounds (buffer, &start, &end;;
Packit Service fb6fa5
Packit Service fb6fa5
  return count_toggles_in_range_by_char (buffer, of_tag, &start, &end;;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
check_specific_tag_in_range (GtkTextBuffer     *buffer,
Packit Service fb6fa5
                             const gchar       *tag_name,
Packit Service fb6fa5
                             const GtkTextIter *start,
Packit Service fb6fa5
                             const GtkTextIter *end)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextIter iter;
Packit Service fb6fa5
  GtkTextTag *tag;
Packit Service fb6fa5
  gboolean state;
Packit Service fb6fa5
  gint count;
Packit Service fb6fa5
  gint buffer_count;
Packit Service fb6fa5
  gint last_offset;
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_text_iter_compare (start, end) > 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_print ("  (inverted range for checking tags, skipping)\n");
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  tag = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table (buffer),
Packit Service fb6fa5
                                   tag_name);
Packit Service fb6fa5
Packit Service fb6fa5
  buffer_count = count_toggles_in_range_by_char (buffer, tag, start, end);
Packit Service fb6fa5
  
Packit Service fb6fa5
  state = FALSE;
Packit Service fb6fa5
  count = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  last_offset = -1;
Packit Service fb6fa5
  iter = *start;
Packit Service fb6fa5
  if (gtk_text_iter_toggles_tag (&iter, tag) ||
Packit Service fb6fa5
      gtk_text_iter_forward_to_tag_toggle (&iter, tag))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      do
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gint this_offset;
Packit Service fb6fa5
          
Packit Service fb6fa5
          ++count;
Packit Service fb6fa5
Packit Service fb6fa5
          this_offset = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
Packit Service fb6fa5
          if (this_offset <= last_offset)
Packit Service fb6fa5
            g_error ("forward_to_tag_toggle moved in wrong direction");
Packit Service fb6fa5
Packit Service fb6fa5
          last_offset = this_offset;
Packit Service fb6fa5
          
Packit Service fb6fa5
          if (gtk_text_iter_begins_tag (&iter, tag))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              if (state)
Packit Service fb6fa5
                g_error ("Tag %p is already on, and was toggled on?", tag);
Packit Service fb6fa5
              state = TRUE;
Packit Service fb6fa5
            }          
Packit Service fb6fa5
          else if (gtk_text_iter_ends_tag (&iter, tag))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              if (!state)
Packit Service fb6fa5
                g_error ("Tag %p toggled off, but wasn't toggled on?", tag);
Packit Service fb6fa5
              state = FALSE;
Packit Service fb6fa5
            }
Packit Service fb6fa5
          else
Packit Service fb6fa5
            g_error ("forward_to_tag_toggle went to a location without a toggle");
Packit Service fb6fa5
        }
Packit Service fb6fa5
      while (gtk_text_iter_forward_to_tag_toggle (&iter, tag) &&
Packit Service fb6fa5
             gtk_text_iter_compare (&iter, end) <= 0);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (count != buffer_count)
Packit Service fb6fa5
    g_error ("Counted %d tags iterating by char, %d iterating forward by tag toggle\n",
Packit Service fb6fa5
             buffer_count, count);
Packit Service fb6fa5
  
Packit Service fb6fa5
  state = FALSE;
Packit Service fb6fa5
  count = 0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  iter = *end;
Packit Service fb6fa5
  last_offset = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
  if (gtk_text_iter_toggles_tag (&iter, tag) ||
Packit Service fb6fa5
      gtk_text_iter_backward_to_tag_toggle (&iter, tag))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      do
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gint this_offset;
Packit Service fb6fa5
          
Packit Service fb6fa5
          ++count;
Packit Service fb6fa5
Packit Service fb6fa5
          this_offset = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
          
Packit Service fb6fa5
          if (this_offset >= last_offset)
Packit Service fb6fa5
            g_error ("backward_to_tag_toggle moved in wrong direction");
Packit Service fb6fa5
          
Packit Service fb6fa5
          last_offset = this_offset;
Packit Service fb6fa5
Packit Service fb6fa5
          if (gtk_text_iter_begins_tag (&iter, tag))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              if (!state)
Packit Service fb6fa5
                g_error ("Tag %p wasn't on when we got to the on toggle going backward?", tag);
Packit Service fb6fa5
              state = FALSE;
Packit Service fb6fa5
            }
Packit Service fb6fa5
          else if (gtk_text_iter_ends_tag (&iter, tag))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              if (state)
Packit Service fb6fa5
                g_error ("Tag %p off toggle, but we were already inside a tag?", tag);
Packit Service fb6fa5
              state = TRUE;
Packit Service fb6fa5
            }
Packit Service fb6fa5
          else
Packit Service fb6fa5
            g_error ("backward_to_tag_toggle went to a location without a toggle");
Packit Service fb6fa5
        }
Packit Service fb6fa5
      while (gtk_text_iter_backward_to_tag_toggle (&iter, tag) &&
Packit Service fb6fa5
             gtk_text_iter_compare (&iter, start) >= 0);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (count != buffer_count)
Packit Service fb6fa5
    g_error ("Counted %d tags iterating by char, %d iterating backward by tag toggle\n",
Packit Service fb6fa5
             buffer_count, count);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
check_specific_tag (GtkTextBuffer *buffer,
Packit Service fb6fa5
                    const gchar   *tag_name)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextIter start, end;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_get_bounds (buffer, &start, &end;;
Packit Service fb6fa5
  check_specific_tag_in_range (buffer, tag_name, &start, &end;;
Packit Service fb6fa5
  gtk_text_iter_forward_chars (&start, 2);
Packit Service fb6fa5
  gtk_text_iter_backward_chars (&end, 2);
Packit Service fb6fa5
  if (gtk_text_iter_compare (&start, &end) < 0)
Packit Service fb6fa5
    check_specific_tag_in_range (buffer, tag_name, &start, &end;;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
run_tests (GtkTextBuffer *buffer)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextIter iter;
Packit Service fb6fa5
  GtkTextIter start;
Packit Service fb6fa5
  GtkTextIter end;
Packit Service fb6fa5
  GtkTextIter mark;
Packit Service fb6fa5
  gint i, j;
Packit Service fb6fa5
  gint num_chars;
Packit Service fb6fa5
  GtkTextMark *bar_mark;
Packit Service fb6fa5
  GtkTextTag *tag;
Packit Service fb6fa5
  GHashTable *tag_states;
Packit Service fb6fa5
  gint count;
Packit Service fb6fa5
  gint buffer_count;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_get_bounds (buffer, &start, &end;;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Check that walking the tree via chars and via iterators produces
Packit Service fb6fa5
   * the same number of indexable locations.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  num_chars = gtk_text_buffer_get_char_count (buffer);
Packit Service fb6fa5
  iter = start;
Packit Service fb6fa5
  bar_mark = gtk_text_buffer_create_mark (buffer, "bar", &iter, FALSE);
Packit Service fb6fa5
  i = 0;
Packit Service fb6fa5
  while (i < num_chars)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTextIter current;
Packit Service fb6fa5
      GtkTextMark *foo_mark;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_offset (buffer, &current, i);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!gtk_text_iter_equal (&iter, &current))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_error ("get_char_index didn't return current iter");
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      j = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
Packit Service fb6fa5
      if (i != j)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_error ("iter converted to %d not %d", j, i);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      /* get/set mark */
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!gtk_text_iter_equal (&iter, &mark))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gtk_text_iter_spew (&iter, "iter");
Packit Service fb6fa5
          gtk_text_iter_spew (&mark, "mark");
Packit Service fb6fa5
          g_error ("Mark not moved to the right place.");
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
Packit Service fb6fa5
      gtk_text_buffer_delete_mark (buffer, foo_mark);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!gtk_text_iter_equal (&iter, &mark))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gtk_text_iter_spew (&iter, "iter");
Packit Service fb6fa5
          gtk_text_iter_spew (&mark, "mark");
Packit Service fb6fa5
          g_error ("Mark not created in the right place.");
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (gtk_text_iter_is_end (&iter))
Packit Service fb6fa5
        g_error ("iterators ran out before chars (offset %d of %d)",
Packit Service fb6fa5
                 i, num_chars);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_iter_forward_char (&iter);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
      ++i;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_text_iter_equal (&iter, &end))
Packit Service fb6fa5
    g_error ("Iterating over all chars didn't end with the end iter");
Packit Service fb6fa5
Packit Service fb6fa5
  /* Do the tree-walk backward
Packit Service fb6fa5
   */
Packit Service fb6fa5
  num_chars = gtk_text_buffer_get_char_count (buffer);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  i = num_chars;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_text_iter_equal (&iter, &end))
Packit Service fb6fa5
    g_error ("iter at char -1 is not equal to the end iterator");
Packit Service fb6fa5
Packit Service fb6fa5
  while (i >= 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTextIter current;
Packit Service fb6fa5
      GtkTextMark *foo_mark;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_offset (buffer, &current, i);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!gtk_text_iter_equal (&iter, &current))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_error ("get_char_index didn't return current iter while going backward");
Packit Service fb6fa5
        }
Packit Service fb6fa5
      j = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
Packit Service fb6fa5
      if (i != j)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_error ("going backward, iter converted to %d not %d", j, i);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      /* get/set mark */
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!gtk_text_iter_equal (&iter, &mark))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gtk_text_iter_spew (&iter, "iter");
Packit Service fb6fa5
          gtk_text_iter_spew (&mark, "mark");
Packit Service fb6fa5
          g_error ("Mark not moved to the right place.");
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
Packit Service fb6fa5
      gtk_text_buffer_delete_mark (buffer, foo_mark);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!gtk_text_iter_equal (&iter, &mark))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          gtk_text_iter_spew (&iter, "iter");
Packit Service fb6fa5
          gtk_text_iter_spew (&mark, "mark");
Packit Service fb6fa5
          g_error ("Mark not created in the right place.");
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (i > 0)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          if (!gtk_text_iter_backward_char (&iter))
Packit Service fb6fa5
            g_error ("iterators ran out before char indexes");
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        {
Packit Service fb6fa5
          if (gtk_text_iter_backward_char (&iter))
Packit Service fb6fa5
            g_error ("went backward from 0?");
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      --i;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_text_iter_equal (&iter, &start))
Packit Service fb6fa5
    g_error ("Iterating backward over all chars didn't end with the start iter");
Packit Service fb6fa5
Packit Service fb6fa5
  /*
Packit Service fb6fa5
   * Check that get_line_count returns the same number of lines
Packit Service fb6fa5
   * as walking the tree by line
Packit Service fb6fa5
   */
Packit Service fb6fa5
  i = 1; /* include current (first) line */
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
Packit Service fb6fa5
  while (gtk_text_iter_forward_line (&iter))
Packit Service fb6fa5
    ++i;
Packit Service fb6fa5
Packit Service fb6fa5
  if (i != gtk_text_buffer_get_line_count (buffer))
Packit Service fb6fa5
    g_error ("Counted %d lines, buffer has %d", i,
Packit Service fb6fa5
             gtk_text_buffer_get_line_count (buffer));
Packit Service fb6fa5
Packit Service fb6fa5
  /*
Packit Service fb6fa5
   * Check that moving over tag toggles thinks about working.
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  buffer_count = count_toggles_in_buffer (buffer, NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  tag_states = g_hash_table_new (NULL, NULL);
Packit Service fb6fa5
  count = 0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
Packit Service fb6fa5
  if (gtk_text_iter_toggles_tag (&iter, NULL) ||
Packit Service fb6fa5
      gtk_text_iter_forward_to_tag_toggle (&iter, NULL))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      do
Packit Service fb6fa5
        {
Packit Service fb6fa5
          GSList *tags;
Packit Service fb6fa5
          GSList *tmp;
Packit Service fb6fa5
          gboolean found_some = FALSE;
Packit Service fb6fa5
          
Packit Service fb6fa5
          /* get toggled-on tags */
Packit Service fb6fa5
          tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
          if (tags)
Packit Service fb6fa5
            found_some = TRUE;
Packit Service fb6fa5
          
Packit Service fb6fa5
          tmp = tags;
Packit Service fb6fa5
          while (tmp != NULL)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              ++count;
Packit Service fb6fa5
              
Packit Service fb6fa5
              tag = tmp->data;
Packit Service fb6fa5
              
Packit Service fb6fa5
              if (g_hash_table_lookup (tag_states, tag))
Packit Service fb6fa5
                g_error ("Tag %p is already on, and was toggled on?", tag);
Packit Service fb6fa5
Packit Service fb6fa5
              g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
Packit Service fb6fa5
          
Packit Service fb6fa5
              tmp = g_slist_next (tmp);
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          g_slist_free (tags);
Packit Service fb6fa5
      
Packit Service fb6fa5
          /* get toggled-off tags */
Packit Service fb6fa5
          tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
          if (tags)
Packit Service fb6fa5
            found_some = TRUE;
Packit Service fb6fa5
          
Packit Service fb6fa5
          tmp = tags;
Packit Service fb6fa5
          while (tmp != NULL)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              ++count;
Packit Service fb6fa5
              
Packit Service fb6fa5
              tag = tmp->data;
Packit Service fb6fa5
Packit Service fb6fa5
              if (!g_hash_table_lookup (tag_states, tag))
Packit Service fb6fa5
                g_error ("Tag %p is already off, and was toggled off?", tag);
Packit Service fb6fa5
Packit Service fb6fa5
              g_hash_table_remove (tag_states, tag);
Packit Service fb6fa5
          
Packit Service fb6fa5
              tmp = g_slist_next (tmp);
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          g_slist_free (tags);
Packit Service fb6fa5
Packit Service fb6fa5
          if (!found_some)
Packit Service fb6fa5
            g_error ("No tags found going forward to tag toggle.");
Packit Service fb6fa5
Packit Service fb6fa5
        }
Packit Service fb6fa5
      while (gtk_text_iter_forward_to_tag_toggle (&iter, NULL));
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_hash_table_destroy (tag_states);
Packit Service fb6fa5
Packit Service fb6fa5
  if (count != buffer_count)
Packit Service fb6fa5
    g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
Packit Service fb6fa5
             buffer_count, count);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Go backward; here TRUE in the hash means we saw
Packit Service fb6fa5
   * an off toggle last.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  
Packit Service fb6fa5
  tag_states = g_hash_table_new (NULL, NULL);
Packit Service fb6fa5
  count = 0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_get_end_iter (buffer, &iter);
Packit Service fb6fa5
  if (gtk_text_iter_toggles_tag (&iter, NULL) ||
Packit Service fb6fa5
      gtk_text_iter_backward_to_tag_toggle (&iter, NULL))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      do
Packit Service fb6fa5
        {
Packit Service fb6fa5
          GSList *tags;
Packit Service fb6fa5
          GSList *tmp;
Packit Service fb6fa5
          gboolean found_some = FALSE;
Packit Service fb6fa5
          
Packit Service fb6fa5
          /* get toggled-off tags */
Packit Service fb6fa5
          tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
          if (tags)
Packit Service fb6fa5
            found_some = TRUE;
Packit Service fb6fa5
          
Packit Service fb6fa5
          tmp = tags;
Packit Service fb6fa5
          while (tmp != NULL)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              ++count;
Packit Service fb6fa5
              
Packit Service fb6fa5
              tag = tmp->data;
Packit Service fb6fa5
Packit Service fb6fa5
              if (g_hash_table_lookup (tag_states, tag))
Packit Service fb6fa5
                g_error ("Tag %p has two off-toggles in a row?", tag);
Packit Service fb6fa5
          
Packit Service fb6fa5
              g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
Packit Service fb6fa5
          
Packit Service fb6fa5
              tmp = g_slist_next (tmp);
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          g_slist_free (tags);
Packit Service fb6fa5
      
Packit Service fb6fa5
          /* get toggled-on tags */
Packit Service fb6fa5
          tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
          if (tags)
Packit Service fb6fa5
            found_some = TRUE;
Packit Service fb6fa5
          
Packit Service fb6fa5
          tmp = tags;
Packit Service fb6fa5
          while (tmp != NULL)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              ++count;
Packit Service fb6fa5
              
Packit Service fb6fa5
              tag = tmp->data;
Packit Service fb6fa5
Packit Service fb6fa5
              if (!g_hash_table_lookup (tag_states, tag))
Packit Service fb6fa5
                g_error ("Tag %p was toggled on, but saw no off-toggle?", tag);
Packit Service fb6fa5
Packit Service fb6fa5
              g_hash_table_remove (tag_states, tag);
Packit Service fb6fa5
          
Packit Service fb6fa5
              tmp = g_slist_next (tmp);
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          g_slist_free (tags);
Packit Service fb6fa5
Packit Service fb6fa5
          if (!found_some)
Packit Service fb6fa5
            g_error ("No tags found going backward to tag toggle.");
Packit Service fb6fa5
        }
Packit Service fb6fa5
      while (gtk_text_iter_backward_to_tag_toggle (&iter, NULL));
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_hash_table_destroy (tag_states);
Packit Service fb6fa5
Packit Service fb6fa5
  if (count != buffer_count)
Packit Service fb6fa5
    g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
Packit Service fb6fa5
             buffer_count, count);
Packit Service fb6fa5
Packit Service fb6fa5
  check_specific_tag (buffer, "fg_red");
Packit Service fb6fa5
  check_specific_tag (buffer, "bg_green");
Packit Service fb6fa5
  check_specific_tag (buffer, "front_tag");
Packit Service fb6fa5
  check_specific_tag (buffer, "center_tag");
Packit Service fb6fa5
  check_specific_tag (buffer, "end_tag");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static const char  *book_closed_xpm[] = {
Packit Service fb6fa5
"16 16 6 1",
Packit Service fb6fa5
"       c None s None",
Packit Service fb6fa5
".      c black",
Packit Service fb6fa5
"X      c red",
Packit Service fb6fa5
"o      c yellow",
Packit Service fb6fa5
"O      c #808080",
Packit Service fb6fa5
"#      c white",
Packit Service fb6fa5
"                ",
Packit Service fb6fa5
"       ..       ",
Packit Service fb6fa5
"     ..XX.      ",
Packit Service fb6fa5
"   ..XXXXX.     ",
Packit Service fb6fa5
" ..XXXXXXXX.    ",
Packit Service fb6fa5
".ooXXXXXXXXX.   ",
Packit Service fb6fa5
"..ooXXXXXXXXX.  ",
Packit Service fb6fa5
".X.ooXXXXXXXXX. ",
Packit Service fb6fa5
".XX.ooXXXXXX..  ",
Packit Service fb6fa5
" .XX.ooXXX..#O  ",
Packit Service fb6fa5
"  .XX.oo..##OO. ",
Packit Service fb6fa5
"   .XX..##OO..  ",
Packit Service fb6fa5
"    .X.#OO..    ",
Packit Service fb6fa5
"     ..O..      ",
Packit Service fb6fa5
"      ..        ",
Packit Service fb6fa5
"                "};
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
fill_buffer (GtkTextBuffer *buffer)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextTag *tag;
Packit Service fb6fa5
  GdkColor color, color2;
Packit Service fb6fa5
  GtkTextIter iter;
Packit Service fb6fa5
  GtkTextIter iter2;
Packit Service fb6fa5
  GdkPixbuf *pixbuf;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
Packit Service fb6fa5
  color.red = color.green = 0;
Packit Service fb6fa5
  color.blue = 0xffff;
Packit Service fb6fa5
  color2.red = 0xfff;
Packit Service fb6fa5
  color2.blue = 0x0;
Packit Service fb6fa5
  color2.green = 0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_create_tag (buffer, "fg_blue",
Packit Service fb6fa5
                              "foreground_gdk", &color,
Packit Service fb6fa5
                              "background_gdk", &color2,
Packit Service fb6fa5
                              "font", "-*-courier-bold-r-*-*-30-*-*-*-*-*-*-*",
Packit Service fb6fa5
                              NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  color.blue = color.green = 0;
Packit Service fb6fa5
  color.red = 0xffff;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_create_tag (buffer, "fg_red",
Packit Service fb6fa5
                              "rise", -4,
Packit Service fb6fa5
                              "foreground_gdk", &color,
Packit Service fb6fa5
                              NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  color.blue = color.red = 0;
Packit Service fb6fa5
  color.green = 0xffff;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_create_tag (buffer, "bg_green",
Packit Service fb6fa5
                              "background_gdk", &color,
Packit Service fb6fa5
                              "font", "-*-courier-bold-r-*-*-10-*-*-*-*-*-*-*",
Packit Service fb6fa5
                              NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  pixbuf = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (pixbuf != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  i = 0;
Packit Service fb6fa5
  while (i < 10)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gchar *str;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 1);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
Packit Service fb6fa5
Packit Service fb6fa5
      str = g_strdup_printf ("%d Hello World!\nwoo woo woo woo woo woo woo woo\n",
Packit Service fb6fa5
                            i);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_insert (buffer, &iter, str, -1);
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (str);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_insert (buffer, &iter,
Packit Service fb6fa5
                              "(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"
Packit Service fb6fa5
                              /* This is UTF8 stuff, Emacs doesn't
Packit Service fb6fa5
                                 really know how to display it */
Packit Service fb6fa5
                              "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",
Packit Service fb6fa5
                              -1);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
Packit Service fb6fa5
      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 4);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 7);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 8);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 8);
Packit Service fb6fa5
      iter2 = iter;
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter2, 10);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter, 7);
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter2, 10);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter, 12);
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter2, 10);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter, 10);
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter2, 15);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
Packit Service fb6fa5
      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter, 20);
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter2, 20);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
Packit Service fb6fa5
      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_iter_backward_chars (&iter, 25);
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter2, 5);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
Packit Service fb6fa5
      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_iter_forward_chars (&iter, 15);
Packit Service fb6fa5
      gtk_text_iter_backward_chars (&iter2, 10);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_text_buffer_remove_tag_by_name (buffer, "fg_red", &iter, &iter2);
Packit Service fb6fa5
      gtk_text_buffer_remove_tag_by_name (buffer, "fg_blue", &iter, &iter2);
Packit Service fb6fa5
Packit Service fb6fa5
      ++i;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Put in tags that are just at the beginning, and just near the end,
Packit Service fb6fa5
   * and just near the middle.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  tag = gtk_text_buffer_create_tag (buffer, "front_tag", NULL);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter2, 300);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);  
Packit Service fb6fa5
  
Packit Service fb6fa5
  tag = gtk_text_buffer_create_tag (buffer, "end_tag", NULL);
Packit Service fb6fa5
  gtk_text_buffer_get_end_iter (buffer, &iter2);
Packit Service fb6fa5
  gtk_text_iter_backward_chars (&iter2, 12);
Packit Service fb6fa5
  iter = iter2;
Packit Service fb6fa5
  gtk_text_iter_backward_chars (&iter, 157);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
Packit Service fb6fa5
  
Packit Service fb6fa5
  tag = gtk_text_buffer_create_tag (buffer, "center_tag", NULL);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter,
Packit Service fb6fa5
                                      gtk_text_buffer_get_char_count (buffer)/2);
Packit Service fb6fa5
  gtk_text_iter_backward_chars (&iter, 37);
Packit Service fb6fa5
  iter2 = iter;
Packit Service fb6fa5
  gtk_text_iter_forward_chars (&iter2, 57);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);  
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (pixbuf);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Line separator tests (initially to avoid regression on bugzilla #57428)
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_line_separation (const char* str,
Packit Service fb6fa5
                      gboolean    expect_next_line,
Packit Service fb6fa5
                      gboolean    expect_end_iter,
Packit Service fb6fa5
                      int         expected_line_count,
Packit Service fb6fa5
                      int         expected_line_break,
Packit Service fb6fa5
                      int         expected_next_line_start)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextIter iter;
Packit Service fb6fa5
  GtkTextBuffer* buffer;
Packit Service fb6fa5
  gboolean on_next_line;
Packit Service fb6fa5
  gboolean on_end_iter;
Packit Service fb6fa5
  gint new_pos;
Packit Service fb6fa5
Packit Service fb6fa5
  buffer = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, str, -1);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (gtk_text_iter_ends_line (&iter) || gtk_text_iter_is_end (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (gtk_text_buffer_get_line_count (buffer) == expected_line_count);
Packit Service fb6fa5
  
Packit Service fb6fa5
  on_next_line = gtk_text_iter_forward_line (&iter);
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (expect_next_line == on_next_line);
Packit Service fb6fa5
Packit Service fb6fa5
  on_end_iter = gtk_text_iter_is_end (&iter);
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (on_end_iter == expect_end_iter);
Packit Service fb6fa5
  
Packit Service fb6fa5
  new_pos = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
    
Packit Service fb6fa5
  if (on_next_line)
Packit Service fb6fa5
    g_assert (expected_next_line_start == new_pos);
Packit Service fb6fa5
Packit Service fb6fa5
  ++expected_line_break;
Packit Service fb6fa5
  while (expected_line_break < expected_next_line_start)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
Packit Service fb6fa5
Packit Service fb6fa5
      g_assert (!gtk_text_iter_ends_line (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
      on_next_line = gtk_text_iter_forward_line (&iter);
Packit Service fb6fa5
        
Packit Service fb6fa5
      g_assert (expect_next_line == on_next_line);
Packit Service fb6fa5
        
Packit Service fb6fa5
      new_pos = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
        
Packit Service fb6fa5
      if (on_next_line)
Packit Service fb6fa5
        g_assert (expected_next_line_start == new_pos);
Packit Service fb6fa5
        
Packit Service fb6fa5
      ++expected_line_break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* FIXME tests for backward line */
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_unref (buffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* there are cases where \r and \n should not be treated like \r\n,
Packit Service fb6fa5
 * originally bug #337022. */
Packit Service fb6fa5
static void
Packit Service fb6fa5
split_r_n_separators_test (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextBuffer *buffer;
Packit Service fb6fa5
  GtkTextIter iter;
Packit Service fb6fa5
Packit Service fb6fa5
  buffer = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, "foo\ra\nbar\n", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  /* delete 'a' so that we have
Packit Service fb6fa5
Packit Service fb6fa5
     1 foo\r
Packit Service fb6fa5
     2 \n
Packit Service fb6fa5
     3 bar\n
Packit Service fb6fa5
Packit Service fb6fa5
   * and both \r and \n are line separators */
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 5);
Packit Service fb6fa5
  gtk_text_buffer_backspace (buffer, &iter, TRUE, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (gtk_text_iter_ends_line (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
Packit Service fb6fa5
  g_assert (gtk_text_iter_ends_line (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (buffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_line_separator (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  char *str;
Packit Service fb6fa5
  char buf[7] = { '\0', };
Packit Service fb6fa5
Packit Service fb6fa5
  /* Only one character has type G_UNICODE_PARAGRAPH_SEPARATOR in
Packit Service fb6fa5
   * Unicode 3.0; update this if that changes.
Packit Service fb6fa5
   */
Packit Service fb6fa5
#define PARAGRAPH_SEPARATOR 0x2029
Packit Service fb6fa5
  
Packit Service fb6fa5
  test_line_separation ("line", FALSE, TRUE, 1, 4, 4);
Packit Service fb6fa5
  test_line_separation ("line\r\n", FALSE, TRUE, 2, 4, 6);
Packit Service fb6fa5
  test_line_separation ("line\r", FALSE, TRUE, 2, 4, 5);
Packit Service fb6fa5
  test_line_separation ("line\n", FALSE, TRUE, 2, 4, 5);
Packit Service fb6fa5
  test_line_separation ("line\rqw", TRUE, FALSE, 2, 4, 5);
Packit Service fb6fa5
  test_line_separation ("line\nqw", TRUE, FALSE, 2, 4, 5);
Packit Service fb6fa5
  test_line_separation ("line\r\nqw", TRUE, FALSE, 2, 4, 6);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_unichar_to_utf8 (PARAGRAPH_SEPARATOR, buf);
Packit Service fb6fa5
  
Packit Service fb6fa5
  str = g_strdup_printf ("line%s", buf);
Packit Service fb6fa5
  test_line_separation (str, FALSE, TRUE, 2, 4, 5);
Packit Service fb6fa5
  g_free (str);
Packit Service fb6fa5
  str = g_strdup_printf ("line%sqw", buf);
Packit Service fb6fa5
  test_line_separation (str, TRUE, FALSE, 2, 4, 5);
Packit Service fb6fa5
  g_free (str);
Packit Service fb6fa5
Packit Service fb6fa5
  split_r_n_separators_test ();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_backspace (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextBuffer *buffer;
Packit Service fb6fa5
  GtkTextIter iter;
Packit Service fb6fa5
  gboolean ret;
Packit Service fb6fa5
Packit Service fb6fa5
  buffer = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, "foo", -1);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 2);
Packit Service fb6fa5
  ret = gtk_text_buffer_backspace (buffer, &iter, TRUE, TRUE);
Packit Service fb6fa5
  g_assert (ret);
Packit Service fb6fa5
  g_assert_cmpint (1, ==, gtk_text_iter_get_offset (&iter));
Packit Service fb6fa5
  g_assert_cmpint (2, ==, gtk_text_buffer_get_char_count (buffer));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, "foo", -1);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
Packit Service fb6fa5
  ret = gtk_text_buffer_backspace (buffer, &iter, TRUE, TRUE);
Packit Service fb6fa5
  g_assert (!ret);
Packit Service fb6fa5
  g_assert_cmpint (0, ==, gtk_text_iter_get_offset (&iter));
Packit Service fb6fa5
  g_assert_cmpint (3, ==, gtk_text_buffer_get_char_count (buffer));
Packit Service fb6fa5
Packit Service fb6fa5
  /* test bug #544724 */
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, "foo\r\n\r\nbar", -1);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 5);
Packit Service fb6fa5
  ret = gtk_text_buffer_backspace (buffer, &iter, TRUE, TRUE);
Packit Service fb6fa5
  g_assert (ret);
Packit Service fb6fa5
  g_assert_cmpint (0, ==, gtk_text_iter_get_line (&iter));
Packit Service fb6fa5
  g_assert_cmpint (8, ==, gtk_text_buffer_get_char_count (buffer));
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (buffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_logical_motion (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  char *str;
Packit Service fb6fa5
  char buf1[7] = { '\0', };
Packit Service fb6fa5
  char buf2[7] = { '\0', };
Packit Service fb6fa5
  char buf3[7] = { '\0', };
Packit Service fb6fa5
  int expected[30];
Packit Service fb6fa5
  int expected_steps;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  GtkTextBuffer *buffer;
Packit Service fb6fa5
  GtkTextIter iter;
Packit Service fb6fa5
  
Packit Service fb6fa5
  buffer = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
#define LEADING_JAMO 0x1111
Packit Service fb6fa5
#define VOWEL_JAMO 0x1167
Packit Service fb6fa5
#define TRAILING_JAMO 0x11B9
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_unichar_to_utf8 (LEADING_JAMO, buf1);
Packit Service fb6fa5
  g_unichar_to_utf8 (VOWEL_JAMO, buf2);
Packit Service fb6fa5
  g_unichar_to_utf8 (TRAILING_JAMO, buf3);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Build the string "abc<leading><vowel><trailing>def\r\nxyz" */
Packit Service fb6fa5
  str = g_strconcat ("abc", buf1, buf2, buf3, "def\r\nxyz", NULL);
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, str, -1);
Packit Service fb6fa5
  g_free (str);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Check cursor positions */
Packit Service fb6fa5
  memset (expected, 0, sizeof (expected));
Packit Service fb6fa5
  expected[0] = 0;    /* before 'a' */
Packit Service fb6fa5
  expected[1] = 1;    /* before 'b' */
Packit Service fb6fa5
  expected[2] = 2;    /* before 'c' */
Packit Service fb6fa5
  expected[3] = 3;    /* before jamo */
Packit Service fb6fa5
  expected[4] = 6;    /* before 'd' */
Packit Service fb6fa5
  expected[5] = 7;    /* before 'e' */
Packit Service fb6fa5
  expected[6] = 8;    /* before 'f' */
Packit Service fb6fa5
  expected[7] = 9;    /* before '\r' */
Packit Service fb6fa5
  expected[8] = 11;   /* before 'x' */
Packit Service fb6fa5
  expected[9] = 12;   /* before 'y' */
Packit Service fb6fa5
  expected[10] = 13;  /* before 'z' */
Packit Service fb6fa5
  expected[11] = 14;  /* after 'z' (only matters going backward) */
Packit Service fb6fa5
  expected_steps = 11;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_get_start_iter (buffer, &iter);
Packit Service fb6fa5
  i = 0;
Packit Service fb6fa5
  do
Packit Service fb6fa5
    {
Packit Service fb6fa5
      int pos;
Packit Service fb6fa5
Packit Service fb6fa5
      pos = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (pos != expected[i])
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_error ("Cursor position %d, expected %d",
Packit Service fb6fa5
                   pos, expected[i]);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      ++i;      
Packit Service fb6fa5
    }
Packit Service fb6fa5
  while (gtk_text_iter_forward_cursor_position (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_text_iter_is_end (&iter))
Packit Service fb6fa5
    g_error ("Expected to stop at the end iterator\n");
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_text_iter_is_cursor_position (&iter))
Packit Service fb6fa5
    g_error ("Should be a cursor position before the end iterator");
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (i != expected_steps)
Packit Service fb6fa5
    g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
Packit Service fb6fa5
Packit Service fb6fa5
  i = expected_steps;
Packit Service fb6fa5
  do
Packit Service fb6fa5
    {
Packit Service fb6fa5
      int pos;
Packit Service fb6fa5
Packit Service fb6fa5
      pos = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (pos != expected[i])
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_error ("Moving backward, cursor position %d, expected %d",
Packit Service fb6fa5
                   pos, expected[i]);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      /* g_print ("%d = %d\n", pos, expected[i]); */
Packit Service fb6fa5
      
Packit Service fb6fa5
      --i;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  while (gtk_text_iter_backward_cursor_position (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
  if (i != -1)
Packit Service fb6fa5
    g_error ("Expected %d steps, there were actually %d\n", expected_steps - i, i);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_text_iter_is_start (&iter))
Packit Service fb6fa5
    g_error ("Expected to stop at the start iterator\n");
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  /* Check sentence boundaries */
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  memset (expected, 0, sizeof (expected));
Packit Service fb6fa5
Packit Service fb6fa5
  expected[0] = 0;    /* before first Hi */
Packit Service fb6fa5
  expected[1] = 3;    /* After first . */
Packit Service fb6fa5
  expected[2] = 7;    /* After second . */
Packit Service fb6fa5
  expected[3] = 12;   /* After ! */
Packit Service fb6fa5
  expected[4] = 16;   /* After third . */
Packit Service fb6fa5
  expected[5] = 20;   /* After ? */
Packit Service fb6fa5
  
Packit Service fb6fa5
  expected_steps = 6;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_get_start_iter (buffer, &iter);
Packit Service fb6fa5
  i = 0;
Packit Service fb6fa5
  do
Packit Service fb6fa5
    {
Packit Service fb6fa5
      int pos;
Packit Service fb6fa5
Packit Service fb6fa5
      pos = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
Packit Service fb6fa5
      if (pos != expected[i])
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_error ("Sentence position %d, expected %d",
Packit Service fb6fa5
                   pos, expected[i]);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (i != 0 &&
Packit Service fb6fa5
          !gtk_text_iter_is_end (&iter) &&
Packit Service fb6fa5
          !gtk_text_iter_ends_sentence (&iter))
Packit Service fb6fa5
        g_error ("Iterator at %d should end a sentence", pos);
Packit Service fb6fa5
      
Packit Service fb6fa5
      ++i;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  while (gtk_text_iter_forward_sentence_end (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
  if (i != expected_steps)
Packit Service fb6fa5
    g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_text_iter_is_end (&iter))
Packit Service fb6fa5
    g_error ("Expected to stop at the end iterator\n");
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
Packit Service fb6fa5
Packit Service fb6fa5
  memset (expected, 0, sizeof (expected));
Packit Service fb6fa5
Packit Service fb6fa5
  expected[0] = 24;
Packit Service fb6fa5
  expected[1] = 21;
Packit Service fb6fa5
  expected[2] = 17;
Packit Service fb6fa5
  expected[3] = 13;
Packit Service fb6fa5
  expected[4] = 9;
Packit Service fb6fa5
  expected[5] = 4;
Packit Service fb6fa5
  expected[6] = 0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  expected_steps = 7;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_text_buffer_get_end_iter (buffer, &iter);
Packit Service fb6fa5
  i = 0;
Packit Service fb6fa5
  do
Packit Service fb6fa5
    {
Packit Service fb6fa5
      int pos;
Packit Service fb6fa5
Packit Service fb6fa5
      pos = gtk_text_iter_get_offset (&iter);
Packit Service fb6fa5
Packit Service fb6fa5
      if (pos != expected[i])
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_error ("Sentence position %d, expected %d",
Packit Service fb6fa5
                   pos, expected[i]);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (pos != 0 &&
Packit Service fb6fa5
          !gtk_text_iter_is_end (&iter) &&
Packit Service fb6fa5
          !gtk_text_iter_starts_sentence (&iter))
Packit Service fb6fa5
        g_error ("Iterator at %d should start a sentence", pos);
Packit Service fb6fa5
      
Packit Service fb6fa5
      ++i;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  while (gtk_text_iter_backward_sentence_start (&iter));
Packit Service fb6fa5
Packit Service fb6fa5
  if (i != expected_steps)
Packit Service fb6fa5
    g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_text_iter_get_offset (&iter) != 0)
Packit Service fb6fa5
    g_error ("Expected to stop at the start iterator\n");
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_unref (buffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_marks (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextBuffer *buf1, *buf2;
Packit Service fb6fa5
  GtkTextMark *mark;
Packit Service fb6fa5
  GtkTextIter iter;
Packit Service fb6fa5
Packit Service fb6fa5
  buf1 = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
  buf2 = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_get_start_iter (buf1, &iter);
Packit Service fb6fa5
  mark = gtk_text_buffer_create_mark (buf1, "foo", &iter, TRUE);
Packit Service fb6fa5
  g_object_ref (mark);
Packit Service fb6fa5
  gtk_text_mark_set_visible (mark, TRUE);
Packit Service fb6fa5
  gtk_text_buffer_delete_mark (buf1, mark);
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_visible (mark));
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_left_gravity (mark));
Packit Service fb6fa5
  g_assert (!strcmp ("foo", gtk_text_mark_get_name (mark)));
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_buffer (mark) == NULL);
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_deleted (mark));
Packit Service fb6fa5
  g_assert (gtk_text_buffer_get_mark (buf1, "foo") == NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_get_start_iter (buf2, &iter);
Packit Service fb6fa5
  gtk_text_buffer_add_mark (buf2, mark, &iter);
Packit Service fb6fa5
  gtk_text_buffer_insert (buf2, &iter, "ewfwefwefwe", -1);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_mark (buf2, &iter, mark);
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_visible (mark));
Packit Service fb6fa5
  g_assert (gtk_text_iter_is_start (&iter));
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_left_gravity (mark));
Packit Service fb6fa5
  g_assert (!strcmp ("foo", gtk_text_mark_get_name (mark)));
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_buffer (mark) == buf2);
Packit Service fb6fa5
  g_assert (!gtk_text_mark_get_deleted (mark));
Packit Service fb6fa5
  g_assert (gtk_text_buffer_get_mark (buf2, "foo") == mark);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_delete_mark (buf2, mark);
Packit Service fb6fa5
  gtk_text_mark_set_visible (mark, FALSE);
Packit Service fb6fa5
  g_object_unref (mark);
Packit Service fb6fa5
Packit Service fb6fa5
  mark = gtk_text_mark_new ("blah", TRUE);
Packit Service fb6fa5
  gtk_text_buffer_get_start_iter (buf1, &iter);
Packit Service fb6fa5
  gtk_text_mark_set_visible (mark, TRUE);
Packit Service fb6fa5
  gtk_text_buffer_add_mark (buf1, mark, &iter);
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_visible (mark));
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_buffer (mark) == buf1);
Packit Service fb6fa5
  g_assert (!gtk_text_mark_get_deleted (mark));
Packit Service fb6fa5
  g_assert (gtk_text_buffer_get_mark (buf1, "blah") == mark);
Packit Service fb6fa5
  g_assert (!strcmp ("blah", gtk_text_mark_get_name (mark)));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_mark_set_visible (mark, FALSE);
Packit Service fb6fa5
  gtk_text_buffer_delete_mark (buf1, mark);
Packit Service fb6fa5
  g_assert (!gtk_text_mark_get_visible (mark));
Packit Service fb6fa5
  g_assert (gtk_text_buffer_get_mark (buf1, "blah") == NULL);
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_buffer (mark) == NULL);
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_deleted (mark));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_get_start_iter (buf2, &iter);
Packit Service fb6fa5
  gtk_text_buffer_add_mark (buf2, mark, &iter);
Packit Service fb6fa5
  g_assert (gtk_text_mark_get_buffer (mark) == buf2);
Packit Service fb6fa5
  g_assert (!gtk_text_mark_get_deleted (mark));
Packit Service fb6fa5
  g_assert (gtk_text_buffer_get_mark (buf2, "blah") == mark);
Packit Service fb6fa5
  g_assert (!strcmp ("blah", gtk_text_mark_get_name (mark)));
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (mark);
Packit Service fb6fa5
  g_object_unref (buf1);
Packit Service fb6fa5
  g_object_unref (buf2);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_utf8 (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gunichar ch;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Check UTF8 unknown char thing */
Packit Service fb6fa5
  g_assert (g_utf8_strlen (gtk_text_unknown_char_utf8, 3) == 1);
Packit Service fb6fa5
  ch = g_utf8_get_char (gtk_text_unknown_char_utf8);
Packit Service fb6fa5
  g_assert (ch == GTK_TEXT_UNKNOWN_CHAR);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_empty_buffer (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextBuffer *buffer;
Packit Service fb6fa5
  int n;
Packit Service fb6fa5
  GtkTextIter start;
Packit Service fb6fa5
Packit Service fb6fa5
  buffer = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Check that buffer starts with one empty line and zero chars */
Packit Service fb6fa5
  n = gtk_text_buffer_get_line_count (buffer);
Packit Service fb6fa5
  if (n != 1)
Packit Service fb6fa5
    g_error ("%d lines, expected 1", n);
Packit Service fb6fa5
Packit Service fb6fa5
  n = gtk_text_buffer_get_char_count (buffer);
Packit Service fb6fa5
  if (n != 0)
Packit Service fb6fa5
    g_error ("%d chars, expected 0", n);
Packit Service fb6fa5
Packit Service fb6fa5
  /* empty first line contains 0 chars */
Packit Service fb6fa5
  gtk_text_buffer_get_start_iter (buffer, &start;;
Packit Service fb6fa5
  n = gtk_text_iter_get_chars_in_line (&start;;
Packit Service fb6fa5
  if (n != 0)
Packit Service fb6fa5
    g_error ("%d chars in first line, expected 0", n);
Packit Service fb6fa5
  n = gtk_text_iter_get_bytes_in_line (&start;;
Packit Service fb6fa5
  if (n != 0)
Packit Service fb6fa5
    g_error ("%d bytes in first line, expected 0", n);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Run gruesome alien test suite on buffer */
Packit Service fb6fa5
  run_tests (buffer);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (buffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_get_set(void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextBuffer *buffer;
Packit Service fb6fa5
Packit Service fb6fa5
  buffer = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  check_get_set_text (buffer, "Hello");
Packit Service fb6fa5
  check_get_set_text (buffer, "Hello\n");
Packit Service fb6fa5
  check_get_set_text (buffer, "Hello\r\n");
Packit Service fb6fa5
  check_get_set_text (buffer, "Hello\r");
Packit Service fb6fa5
  check_get_set_text (buffer, "Hello\nBar\nFoo");
Packit Service fb6fa5
  check_get_set_text (buffer, "Hello\nBar\nFoo\n");
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (buffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_fill_empty (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextBuffer *buffer;
Packit Service fb6fa5
  int n;
Packit Service fb6fa5
  GtkTextIter start, end;
Packit Service fb6fa5
  
Packit Service fb6fa5
  buffer = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Put stuff in the buffer */
Packit Service fb6fa5
  fill_buffer (buffer);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Subject stuff-bloated buffer to further torment */
Packit Service fb6fa5
  run_tests (buffer);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Delete all stuff from the buffer */
Packit Service fb6fa5
  gtk_text_buffer_get_bounds (buffer, &start, &end;;
Packit Service fb6fa5
  gtk_text_buffer_delete (buffer, &start, &end;;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Check buffer for emptiness (note that a single
Packit Service fb6fa5
     empty line always remains in the buffer) */
Packit Service fb6fa5
  n = gtk_text_buffer_get_line_count (buffer);
Packit Service fb6fa5
  if (n != 1)
Packit Service fb6fa5
    g_error ("%d lines, expected 1", n);
Packit Service fb6fa5
Packit Service fb6fa5
  n = gtk_text_buffer_get_char_count (buffer);
Packit Service fb6fa5
  if (n != 0)
Packit Service fb6fa5
    g_error ("%d chars, expected 0", n);
Packit Service fb6fa5
Packit Service fb6fa5
  run_tests (buffer);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (buffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
test_tag (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTextBuffer *buffer;
Packit Service fb6fa5
  GtkTextIter start, end;
Packit Service fb6fa5
  
Packit Service fb6fa5
  buffer = gtk_text_buffer_new (NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  fill_buffer (buffer);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_text_buffer_set_text (buffer, "adcdef", -1);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &start, 1);
Packit Service fb6fa5
  gtk_text_buffer_get_iter_at_offset (buffer, &end, 3);
Packit Service fb6fa5
  gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &start, &end;;
Packit Service fb6fa5
  
Packit Service fb6fa5
  run_tests (buffer);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_unref (buffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
extern void pixbuf_init (void);
Packit Service fb6fa5
Packit Service fb6fa5
int
Packit Service fb6fa5
main (int argc, char** argv)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* First, we turn on btree debugging. */
Packit Service fb6fa5
  gtk_debug_flags |= GTK_DEBUG_TEXT;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_test_init (&argc, &argv);
Packit Service fb6fa5
  pixbuf_init ();
Packit Service fb6fa5
Packit Service fb6fa5
  g_test_add_func ("/TextBuffer/UTF8 unknown char", test_utf8);
Packit Service fb6fa5
  g_test_add_func ("/TextBuffer/Line separator", test_line_separator);
Packit Service fb6fa5
  g_test_add_func ("/TextBuffer/Backspace", test_backspace);
Packit Service fb6fa5
  g_test_add_func ("/TextBuffer/Logical motion", test_logical_motion);
Packit Service fb6fa5
  g_test_add_func ("/TextBuffer/Marks", test_marks);
Packit Service fb6fa5
  g_test_add_func ("/TextBuffer/Empty buffer", test_empty_buffer);
Packit Service fb6fa5
  g_test_add_func ("/TextBuffer/Get and Set", test_get_set);
Packit Service fb6fa5
  g_test_add_func ("/TextBuffer/Fill and Empty", test_fill_empty);
Packit Service fb6fa5
  g_test_add_func ("/TextBuffer/Tag", test_tag);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return g_test_run();
Packit Service fb6fa5
}