ref: a80ed8b66a6fe7445c83907cbfdc82a397d29c52
dir: /test/parsetest.c/
#include <u.h>
#include <libc.h>
#include "../dat.h"
#include "../fns.h"
int debug;
char *sysnameb;
char *welcome;
char*
getversion(void)
{
return "";
}
User*
finduser(char*)
{
return nil;
}
User*
adduser(char*)
{
return nil;
}
Client*
findnick(char*)
{
return nil;
}
void
reply(Client*, Reply r, ...)
{
va_list arg;
va_start(arg, r);
va_end(arg);
}
typedef struct Req Req;
struct Req
{
char *cmd;
char *pname;
char *puser;
char *phost;
char *args[5];
};
static int
strmatch(char *is, char *should)
{
if (!!is == !!should) {
if (is && should)
return !strcmp(is, should);
} else
return 0;
return 1;
}
static int
runtest(char *line, Req ex)
{
char copy[513];
strncpy(copy, line, 513);
Request r = parseline(line);
if (!ex.cmd) {
/* if invalid command, but valid result */
if (r.cmd)
goto Fail;
if (r.cmd && r.cmd->name)
goto Fail;
} else {
/* if expected command */
if (!r.cmd || r.cmd->name) {
/* if command does not match */
if (strcmp(r.cmd->name, ex.cmd))
goto Fail;
}
}
if (!strmatch(ex.pname, r.prefix.name))
goto Fail;
if (!strmatch(ex.puser, r.prefix.user))
goto Fail;
if (!strmatch(ex.phost, r.prefix.host))
goto Fail;
for (int i = 0; i < 5; i++) {
if (!strmatch(ex.args[i], r.args[i]))
goto Fail;
}
return 0;
Fail:
fprint(2, "fail: %s\n", copy);
fprint(2, "got:%R\n", r);
return 1;
}
#define TEST(LINE, EXP) failed += runtest(LINE, EXP)
static Req
mkreq(char *cmd, char *pname, char *puser, char *phost, char *a1, char *a2, char *a3, char *a4, char *a5)
{
Req r;
r.cmd = cmd;
r.pname = pname;
r.puser = puser;
r.phost = phost;
r.args[0] = a1;
r.args[1] = a2;
r.args[2] = a3;
r.args[3] = a4;
r.args[4] = a5;
return r;
}
void
main(int, char**)
{
int failed = 0;
fmtinstall('R', Rfmt);
TEST("version",
mkreq("version", nil, nil, nil,
nil, nil, nil, nil, nil));
TEST(":name version",
mkreq("version", "name", nil, nil,
nil, nil, nil, nil, nil));
TEST(":name!user version",
mkreq("version", "name", "user", nil,
nil, nil, nil, nil, nil));
TEST(":name!user@host version",
mkreq("version", "name", "user", "host",
nil, nil, nil, nil, nil));
TEST(":name@host version",
mkreq("version", "name", nil, "host",
nil, nil, nil, nil, nil));
TEST(":name!user@host version arg1",
mkreq("version", "name", "user", "host",
"arg1", nil, nil, nil, nil));
TEST(":name version arg1 arg2",
mkreq("version", "name", nil, nil,
"arg1", "arg2", nil, nil, nil));
TEST(":name version arg1 :arg2 with spaces",
mkreq("version", "name", nil, nil,
"arg1", "arg2 with spaces", nil, nil, nil));
TEST("version arg1 arg2",
mkreq("version", nil, nil, nil,
"arg1", "arg2", nil, nil, nil));
TEST("version arg1 :arg2 with spaces",
mkreq("version", nil, nil, nil,
"arg1", "arg2 with spaces", nil, nil, nil));
exits(failed ? "failed" : nil);
}