#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");
}