Blob Blame History Raw
# -*- Autotest -*-

AT_BANNER([TextBuffer search])

## -------------------------- ##
## compares two search items  ##
## -------------------------- ##

AT_TESTFUN([sitem_compare],
[[
#include "internal_libreport.h"
#include "search_item.h"
#include <assert.h>

/* comparing two items */
int test()
{
    char text[] = "Some text";
    GtkTextBuffer *buffer = gtk_text_buffer_new(gtk_text_tag_table_new());
    gtk_text_buffer_insert_at_cursor(buffer, text, strlen(text));
    GtkTextIter start;
    gtk_text_buffer_get_start_iter(buffer, &start);
    GtkTextIter end;
    gtk_text_buffer_get_end_iter(buffer, &end);

    search_item_t *sitem1 = sitem_new(
            0,
            buffer,
            NULL, //not needed, maybe we can remove it from the sitem struct?
            start,
            end
        );

    search_item_t *sitem2 = sitem_new(  //yes, it's the same, so it should return 0
            0,
            buffer,
            NULL, //not needed, maybe we can remove it from the sitem struct?
            start,
            end
        );

    return sitem_compare(sitem1, sitem2);
}

int main(void)
{
    glib_init();

    assert(test() == 0);

    return 0;
}
]])

AT_TESTFUN([sitem_is_in_sitemlist],
[[
#include "internal_libreport.h"
#include "search_item.h"
#include <assert.h>

static GList *find_words_in_text_buffer(GtkTextBuffer *buffer, GList *words)
{
    GList *found_words = NULL;
    GtkTextIter start;
    GtkTextIter end;

    for (GList *w = words; w; w = g_list_next(w))
    {
        gtk_text_buffer_get_start_iter(buffer, &start);

        const char *search_word = w->data;
        while (search_word && search_word[0] && gtk_text_iter_forward_search(&start, search_word,
                    GTK_TEXT_SEARCH_TEXT_ONLY,
                    &start,
                    &end, NULL))
        {
            search_item_t *found_word = sitem_new(
                    0,
                    buffer,
                    NULL,
                    start,
                    end
                );
            int offset = gtk_text_iter_get_offset(&end);
            gtk_text_buffer_get_iter_at_offset(buffer, &start, offset);
            found_words = g_list_prepend(found_words, found_word);
        }
    }

    return found_words;
}

int test()
{
    const char text[] = "Some text with few words and I don't want lorem ipsum";
    GtkTextBuffer *buffer = gtk_text_buffer_new(gtk_text_tag_table_new());
    gtk_text_buffer_insert_at_cursor(buffer, text, strlen(text));

    const char *blacklist = "few,tex";
    const char *whitelist = "few,text";
    const char *whitelist_2 = "words";
    GList *blacklist_in = parse_list(blacklist);
    GList *whitelist_in = parse_list(whitelist);
    GList *whitelist_not_in = parse_list(whitelist_2);

    GList *blacklist_sitems = find_words_in_text_buffer(buffer, blacklist_in);
    GList *whitelist_sitems = find_words_in_text_buffer(buffer, whitelist_in);
    GList *whitelist_2_sitems = find_words_in_text_buffer(buffer, whitelist_not_in);

    for(GList *sitems = blacklist_sitems; sitems; sitems = g_list_next(sitems))
    {
        if (!sitem_is_in_sitemlist((search_item_t *)sitems->data, whitelist_sitems))
        {
            printf("'%s' should be in list!\n", gtk_text_buffer_get_text
                (
                    buffer,
                    sitem_get_start_iter((search_item_t *)sitems->data),
                    sitem_get_end_iter((search_item_t *)sitems->data),
                    false
                )
            );
            return 1;
        }

        if (sitem_is_in_sitemlist((search_item_t *)sitems->data, whitelist_2_sitems))
        {
            printf("'%s' should NOT be in the list!\n", gtk_text_buffer_get_text
                    (
                        buffer,
                        sitem_get_start_iter((search_item_t *)sitems->data),
                        sitem_get_end_iter((search_item_t *)sitems->data),
                        false
                    )
            );
            return 1;
        }

    }

    return 0;
}

int main(void)
{
    glib_init();

    assert(test() == 0);

    return 0;
}
]])