src/test/irc_line.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 May 2009 23:57:48 +0300
branchnew-lib-errors
changeset 217 7728d6ec3abf
parent 190 69fd25c8484c
permissions -rw-r--r--
nexus.c compiles
#include "../irc_line.h"
#include "test.h"


void assert_irc_line_cmp (const struct irc_line *is, const struct irc_line *should_be)
{
    if (should_be->source) {
        assert(is->source);
        assert_strcmp(is->source->nickname, should_be->source->nickname);
        assert_strcmp(is->source->username, should_be->source->username);
        assert_strcmp(is->source->hostname, should_be->source->hostname);

    } else {
        assert_null(is->source);
    }
    
    assert_strcmp(is->command, should_be->command);
    
    for (size_t idx = 0; idx < IRC_ARG_MAX; idx++) {
        if (!should_be->args[idx])
            break;

        assert_strcmp(is->args[idx], should_be->args[idx]);
    }
}

void assert_irc_line_parse (const char *data, const struct irc_line *line)
{
    struct irc_line out_line;
    struct irc_nm nm;
    char buf[1024];

    assert(strlen(data) < 1024);
    strcpy(buf, data);

    assert_success(irc_line_parse(&out_line, &nm, buf));
    assert_irc_line_cmp(&out_line, line);
}

void assert_irc_line_build (const struct irc_line *line, const char *data)
{
    char buf[IRC_LINE_MAX];

    assert_success(irc_line_build(line, buf));
    assert_strcmp(buf, data);
}

void assert_irc_line_build_err (const struct irc_line *line, err_t err)
{
    char buf[IRC_LINE_MAX];

    assert_err(irc_line_build(line, buf), err);
}

#define TEST_IRC_LINE_PARSE(in, source, command, ...) \
    do {    \
        struct irc_line line = { source, command, { __VA_ARGS__, NULL } };  \
        assert_irc_line_parse(in, &line);   \
    } while (0)

void test_irc_line_parse (void)
{
    struct irc_nm source = { "nick", "user", "host" };
    struct irc_nm source_server = { NULL, NULL, "server" };

    TEST_IRC_LINE_PARSE("CMD_1",
            NULL, "CMD_1", NULL);
    
    TEST_IRC_LINE_PARSE(":nick!user@host CMD_2 arg1 arg2 :trailing arg",
            &source, "CMD_2", "arg1", "arg2", "trailing arg");
    
    TEST_IRC_LINE_PARSE(":nick!user@host CMD_3 :arg0",
            &source, "CMD_3", "arg0");
    
    TEST_IRC_LINE_PARSE(":server CMD_4 arg0",
            &source_server, "CMD_4", "arg0");
    
    TEST_IRC_LINE_PARSE(":foo!bar CMD_5 :arg0",
            NULL, "CMD_5", "arg0");
}


#define TEST_IRC_LINE_BUILD(out, command, ...) \
    do {    \
        struct irc_line line = { NULL, command, { __VA_ARGS__, NULL } };    \
        assert_irc_line_build(&line, out); \
    } while (0)

#define TEST_IRC_LINE_BUILD_ERR(err, command, ...) \
    do {    \
        struct irc_line line = { NULL, command, { __VA_ARGS__, NULL } };    \
        assert_irc_line_build_err(&line, err);   \
    } while (0)

void test_irc_line_build (void)
{
    TEST_IRC_LINE_BUILD("CMD_1",            
            "CMD_1", NULL);

    TEST_IRC_LINE_BUILD("CMD_2 arg0",       
            "CMD_2", "arg0");

    TEST_IRC_LINE_BUILD("CMD_3 arg0 arg1",
            "CMD_3", "arg0", "arg1");

    TEST_IRC_LINE_BUILD("CMD_4 :argX argX",
            "CMD_4", "argX argX");

    TEST_IRC_LINE_BUILD("CMD_5 arg0 :argX argX",
            "CMD_5", "arg0", "argX argX");
    
    TEST_IRC_LINE_BUILD_ERR(ERR_LINE_TOO_LONG,
              "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
              "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
              "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
              "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
              "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
              NULL);

    TEST_IRC_LINE_BUILD_ERR(ERR_LINE_INVALID_TOKEN,
            "XXX", "foo bar", "quux");

    TEST_IRC_LINE_BUILD_ERR(ERR_LINE_INVALID_TOKEN,
            "XXX", "foo\r\n");

    TEST_IRC_LINE_BUILD_ERR(ERR_LINE_INVALID_TOKEN,
            "XXX", "foo", "bar quux\r\n");

}