about summary refs log tree commit diff stats
path: root/tag.c
Commit message (Expand)AuthorAgeFilesLines
* fixing c->weight handlingAnselm R. Garbe2006-09-051-2/+3
* applied sanders patch to remove unnecessary commit()Anselm R. Garbe2006-08-311-13/+2
* configurenotify remembers max geom now, and restores this if necessary, howev...Anselm R. Garbe2006-08-291-3/+3
* applied patch similiar proposed by dave tweedAnselm R. Garbe2006-08-291-10/+13
* still something wrong with reorder()Anselm R. Garbe2006-08-291-4/+2
* fix client position in list also on tag and toggletagAnselm R. Garbe2006-08-291-0/+4
* updated man pageAnselm R. Garbe2006-08-231-0/+2
* implemented right tag drawing in the status bar and titlebarsAnselm R. Garbe2006-08-231-0/+2
* implemented class:inst:title matchingAnselm R. Garbe2006-08-231-4/+4
* separated several functions into view.cAnselm R. Garbe2006-08-221-186/+0
* fixed issue reported by sanderAnselm R.Garbe2006-08-161-3/+2
* added general centralization rule for new clients (works around various borke...Anselm R.Garbe2006-08-161-1/+4
* applied viewsel.patchAnselm R.Garbe2006-08-141-2/+6
* applied sanders tag()/toggletag() fixesAnselm R.Garbe2006-08-141-1/+4
* added missing arrangeAnselm R.Garbe2006-08-141-0/+1
* changed replacetag into toggletagAnselm R.Garbe2006-08-141-29/+36
* applied the saner patch (removed the pathetic one)Anselm R.Garbe2006-08-141-7/+3
* pplied Sanders appendtag patchAnselm R.Garbe2006-08-141-2/+6
* fixed a core dumpAnselm R.Garbe2006-08-141-2/+4
* implemented restack behavior (floats are on top in tiled mode)Anselm R.Garbe2006-08-141-10/+54
* removed viewnext/viewprevAnselm R.Garbe2006-08-141-20/+0
* made shortcuts like proposed by Sander, renamed viewextend to toggleview (mor...Anselm R.Garbe2006-08-131-1/+1
* implemented viewextend and added M-S-C-n shortcuts for extending the current ...Anselm R.Garbe2006-08-111-6/+19
* implement multi-tag selection through button3 click on the specific tagAnselm R.Garbe2006-08-111-9/+31
* fixed the issue reported by sander (gaps at left columns button due to round-...Anselm R.Garbe2006-08-101-1/+4
* fixed view-change bug reported on the listarg@10ksloc.org2006-08-041-14/+10
* switched to regexp matching for Rulesarg@10ksloc.org2006-08-041-17/+51
* removed TLast tag enum, now tags is simple defined as char *[] array, the res...arg@10ksloc.org2006-08-031-9/+10
* hotfix of settagsarg@10ksloc.org2006-08-031-2/+1
* changed Client->tags and Rule->tags to be Bool (I'll also try to remove the T...arg@10ksloc.org2006-08-031-5/+5
* made fullscreen apps working fine in floating mode (there is no sane way to m...arg@10ksloc.org2006-08-021-9/+8
* renamed ARRANGE into DEFMODEarg@10ksloc.org2006-08-011-1/+1
* centralized/externalized configuration to config.harg@10ksloc.org2006-08-011-18/+4
* applied Jukkas prev/next patch with XK_{h,l}arg@10ksloc.org2006-08-011-0/+14
* applied Sanders patchesarg@10ksloc.org2006-08-011-0/+4
* committed a patch which fixes the hints of Jukkaarg@10ksloc.org2006-08-011-4/+4
* some cleanups/fixes inspired by Jukka Salmi's feedbackarg@10ksloc.org2006-07-211-6/+1
* sanitization of several clunky stuff, removed heretag (rarely of use), simpli...arg@10ksloc.org2006-07-211-22/+4
* using double-linked list in order to get correct prev focus handlingarg@10ksloc.org2006-07-201-0/+7
* cleaned the CUSTOMIZE flagsarg@10ksloc.org2006-07-201-3/+5
* made status bar drawing more robust, implemented togglemax and togglemode, wo...arg@10ksloc.org2006-07-201-2/+9
* cleaned up codearg@10ksloc.org2006-07-201-4/+5
* removed c->f{x,y,w,h} and c->t{x,y,w,h} in favor for the new rule handling re...arg@10ksloc.org2006-07-201-18/+16
* implemented regexp matching for rulesarg@10ksloc.org2006-07-191-12/+28
* implemented fallback for too many clients in stacked modearg@10ksloc.org2006-07-191-1/+7
* applied Sanders resize patch, fixed lower bugarg@10ksloc.org2006-07-191-3/+3
* firefox instance is different nowarg@mmvi2006-07-181-1/+1
* implemened distinguishing float/managed geometries of clients (works quite well)Anselm R. Garbe2006-07-181-13/+16
* pop on heretagAnselm R. Garbe2006-07-181-1/+1
* added heretag command which allows to tag a client of a foreign tag with curr...Anselm R. Garbe2006-07-181-4/+23
background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#include <glib.h>
#include <setjmp.h>
#include <cmocka.h>
#include <string.h>

#include "ui/ui.h"
#include "ui/window.h"
#include "tests/helpers.h"

#include "xmpp/bookmark.h"

char output[256];

// Mocks and stubs

static
void _mock_cons_show(const char * const msg, ...)
{
    va_list args;
    va_start(args, msg);
    vsnprintf(output, sizeof(output), msg, args);
    check_expected(output);
    va_end(args);
}

static
void _stub_cons_show(const char * const msg, ...)
{
}

static
void _stub_ui_roster(void)
{
}

static
void _mock_cons_show_contact_online(PContact contact, Resource *resource, GDateTime *last_activity)
{
    check_expected(contact);
    check_expected(resource);
    check_expected(last_activity);
}

static
void _mock_cons_show_error(const char * const msg, ...)
{
    va_list args;
    va_start(args, msg);
    vsnprintf(output, sizeof(output), msg, args);
    check_expected(output);
    va_end(args);
}

static
void _mock_cons_show_account(ProfAccount *account)
{
    check_expected(account);
}

static
void _mock_cons_show_bookmarks(const GList *list)
{
    check_expected(list);
}

static
void _mock_cons_show_aliases(GList *aliases)
{
    check_expected(aliases);
}

static
void _mock_cons_show_account_list(gchar **accounts)
{
    check_expected(accounts);
}

static
char * _mock_ui_ask_password(void)
{
    return mock_ptr_type(char *);
}

static
char * _stub_ui_ask_password(void)
{
    return NULL;
}

static
win_type_t _mock_ui_current_win_type(void)
{
    return (win_type_t)mock();
}

static
char * _mock_ui_current_recipeint(void)
{
    return mock_ptr_type(char *);
}

static
void _mock_ui_handle_error(const char * const err_msg)
{
    check_expected(err_msg);
}

static
void _mock_ui_handle_recipient_error(const char * const recipient,
    const char * const err_msg)
{
    check_expected(recipient);
    check_expected(err_msg);
}

static
void _stub_ui_handle_recipient_error(const char * const recipient,
    const char * const err_msg)
{
}

static
void _mock_ui_handle_recipient_not_found(const char * const recipient,
    const char * const err_msg)
{
    check_expected(recipient);
    check_expected(err_msg);
}

static
void _stub_ui_chat_win_contact_online(PContact contact, Resource *resource, GDateTime *last_activity)
{
}

static
void _stub_ui_handle_recipient_not_found(const char * const recipient, const char * const err_msg)
{
}

static
void _mock_ui_current_print_formatted_line(const char show_char, int attrs, const char * const msg, ...)
{
    check_expected(show_char);
    check_expected(attrs);
    va_list args;
    va_start(args, msg);
    vsnprintf(output, sizeof(output), msg, args);
    check_expected(output);
    va_end(args);
}

static
void _mock_ui_current_print_line(const char * const msg, ...)
{
    va_list args;
    va_start(args, msg);
    vsnprintf(output, sizeof(output), msg, args);
    check_expected(output);
    va_end(args);
}

static
gboolean _mock_ui_current_win_is_otr(void)
{
    return (gboolean)mock();
}

static
void _mock_ui_room_join(const char * const room, gboolean focus)
{
    check_expected(room);
    check_expected(focus);
}

static
void _mock_cons_show_roster(GSList *list)
{
    check_expected(list);
}

static
gboolean _mock_ui_switch_win(const int i)
{
    check_expected(i);
    return (gboolean)mock();
}

// bind mocks and stubs

void
mock_cons_show(void)
{
    cons_show = _mock_cons_show;
}

void
mock_cons_show_contact_online(void)
{
    cons_show_contact_online = _mock_cons_show_contact_online;
}

void
stub_ui_chat_win_contact_online(void)
{
    ui_chat_win_contact_online = _stub_ui_chat_win_contact_online;
}

void
stub_ui_roster(void)
{
    ui_roster = _stub_ui_roster;
}

void
mock_cons_show_error(void)
{
    cons_show_error = _mock_cons_show_error;
}

void
mock_cons_show_account(void)
{
    cons_show_account = _mock_cons_show_account;
}

void
mock_cons_show_bookmarks(void)
{
    cons_show_bookmarks = _mock_cons_show_bookmarks;
}

void
mock_cons_show_aliases(void)
{
    cons_show_aliases = _mock_cons_show_aliases;
}

void
mock_cons_show_account_list(void)
{
    cons_show_account_list = _mock_cons_show_account_list;
}

void
mock_ui_ask_password(void)
{
    ui_ask_password = _mock_ui_ask_password;
}

void
mock_ui_current_recipient(void)
{
    ui_current_recipient = _mock_ui_current_recipeint;
}

void
stub_ui_ask_password(void)
{
    ui_ask_password = _stub_ui_ask_password;
}

void
stub_cons_show(void)
{
    cons_show = _stub_cons_show;
}

void
stub_ui_handle_recipient_not_found(void)
{
    ui_handle_recipient_not_found = _stub_ui_handle_recipient_not_found;
}

void
stub_ui_handle_recipient_error(void)
{
    ui_handle_recipient_error = _stub_ui_handle_recipient_error;
}

void
mock_ui_current_print_formatted_line(void)
{
    ui_current_print_formatted_line = _mock_ui_current_print_formatted_line;
}

void
mock_ui_current_print_line(void)
{
    ui_current_print_line = _mock_ui_current_print_line;
}

void
mock_cons_show_roster(void)
{
    cons_show_roster = _mock_cons_show_roster;
}

// expectations

void
expect_cons_show(char *expected)
{
    expect_string(_mock_cons_show, output, expected);
}

void
expect_cons_show_calls(int n)
{
    expect_any_count(_mock_cons_show, output, n);
}

void
expect_cons_show_error(char *expected)
{
    expect_string(_mock_cons_show_error, output, expected);
}

void
expect_cons_show_account(ProfAccount *account)
{
    expect_memory(_mock_cons_show_account, account, account, sizeof(ProfAccount));
}

static gboolean
_cmp_bookmark(Bookmark *bm1, Bookmark *bm2)
{
    if (strcmp(bm1->jid, bm2->jid) != 0) {
        return FALSE;
    }
    if (strcmp(bm1->nick, bm2->nick) != 0) {
        return FALSE;
    }
    if (bm1->autojoin != bm2->autojoin) {
        return FALSE;
    }

    return TRUE;
}

void
expect_cons_show_bookmarks(GList *bookmarks)
{
    glist_set_cmp((GCompareFunc)_cmp_bookmark);
    expect_any(_mock_cons_show_bookmarks, list);
//    expect_check(_mock_cons_show_bookmarks, list, (CheckParameterValue)glist_contents_equal, bookmarks);
}

void
expect_cons_show_account_list(gchar **accounts)
{
    expect_memory(_mock_cons_show_account_list, accounts, accounts, sizeof(accounts));
}

void
expect_cons_show_contact_online(PContact contact, Resource *resource, GDateTime *last_activity)
{
    expect_memory(_mock_cons_show_contact_online, contact, contact, sizeof(contact));
    expect_memory(_mock_cons_show_contact_online, resource, resource, sizeof(Resource));
    if (last_activity == NULL) {
        expect_value(_mock_cons_show_contact_online, last_activity, NULL);
    } else {
        expect_memory(_mock_cons_show_contact_online, last_activity, last_activity, sizeof(last_activity));
    }
}

void
expect_cons_show_aliases()
{
    // write a custom checker for the list
    expect_any(_mock_cons_show_aliases, aliases);
}

void
mock_ui_ask_password_returns(char *password)
{
    will_return(_mock_ui_ask_password, strdup(password));
}

void
expect_ui_handle_error(char *err_msg)
{
    ui_handle_error = _mock_ui_handle_error;
    expect_string(_mock_ui_handle_error, err_msg, err_msg);
}

void
expect_ui_handle_recipient_error(char *recipient, char *err_msg)
{
    ui_handle_recipient_error = _mock_ui_handle_recipient_error;
    expect_string(_mock_ui_handle_recipient_error, recipient, recipient);
    expect_string(_mock_ui_handle_recipient_error, err_msg, err_msg);
}

void
expect_ui_handle_recipient_not_found(char *recipient, char *err_msg)
{
    ui_handle_recipient_not_found = _mock_ui_handle_recipient_not_found;
    expect_string(_mock_ui_handle_recipient_not_found, recipient, recipient);
    expect_string(_mock_ui_handle_recipient_not_found, err_msg, err_msg);
}

void
mock_current_win_type(win_type_t type)
{
    ui_current_win_type = _mock_ui_current_win_type;
    will_return(_mock_ui_current_win_type, type);
}

void
ui_current_recipient_returns(char *jid)
{
    will_return(_mock_ui_current_recipeint, jid);
}

void
ui_current_print_formatted_line_expect(char show_char, int attrs, char *message)
{
    expect_value(_mock_ui_current_print_formatted_line, show_char, show_char);
    expect_value(_mock_ui_current_print_formatted_line, attrs, attrs);
    expect_string(_mock_ui_current_print_formatted_line, output, message);
}

void
ui_current_print_line_expect(char *message)
{
    expect_string(_mock_ui_current_print_line, output, message);
}

void
ui_current_win_is_otr_returns(gboolean result)
{
    ui_current_win_is_otr = _mock_ui_current_win_is_otr;
    will_return(_mock_ui_current_win_is_otr, result);
}

void
ui_room_join_expect(char *room, gboolean focus)
{
    ui_room_join = _mock_ui_room_join;
    expect_string(_mock_ui_room_join, room, room);
    expect_value(_mock_ui_room_join, focus, focus);
}

void
cons_show_roster_expect(GSList *list)
{
    expect_any(_mock_cons_show_roster, list);
}

void
ui_switch_win_expect_and_return(int given_i, gboolean result)
{
    ui_switch_win = _mock_ui_switch_win;
    expect_value(_mock_ui_switch_win, i, given_i);
    will_return(_mock_ui_switch_win, result);
}