shithub: ircd

ref: a80ed8b66a6fe7445c83907cbfdc82a397d29c52
dir: /test/parsetest.c/

View raw version
#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);
}