1
0
mirror of https://github.com/irssi/irssi.git synced 2024-06-09 06:20:45 +00:00

Add a test program to test mode parsing

This uses GLib's testing framework. It is to test the changes to the
mode parsing for #603.
This commit is contained in:
Will Storey 2017-10-21 20:01:04 -07:00 committed by ailin-nemui
parent 02aa8ee8bb
commit 1328e1ba08
8 changed files with 278 additions and 2 deletions

3
.gitignore vendored
View File

@ -49,6 +49,9 @@ src/perl/*/Makefile.old
src/fe-fuzz/crash-*
src/fe-fuzz/oom-*
tests/irc/core/test-irc
tests/irc/core/test-irc.trs
*.a
*.bs
*.la

View File

@ -49,5 +49,7 @@ before_script:
- echo ^quit >> irssi-test/startup
- irssi-build/bin/irssi --home irssi-test
- cat irc.log.*
- cd $TRAVIS_BUILD_DIR
script: true
script:
- make check

View File

@ -16,7 +16,7 @@ irssi-version.h:
VERSION="$(VERSION)" $(srcdir)/utils/irssi-version.sh $(srcdir) | \
cmp -s - $@ || VERSION="$(VERSION)" $(srcdir)/utils/irssi-version.sh $(srcdir) >$@
SUBDIRS = src docs scripts themes utils
SUBDIRS = src tests docs scripts themes utils
confdir = $(sysconfdir)
conf_DATA = irssi.conf

View File

@ -658,6 +658,9 @@ src/perl/ui/Makefile.PL
src/perl/textui/Makefile.PL
scripts/Makefile
scripts/examples/Makefile
tests/Makefile
tests/irc/Makefile
tests/irc/core/Makefile
docs/Makefile
docs/help/Makefile
docs/help/in/Makefile

1
tests/Makefile.am Normal file
View File

@ -0,0 +1 @@
SUBDIRS = irc

1
tests/irc/Makefile.am Normal file
View File

@ -0,0 +1 @@
SUBDIRS = core

View File

@ -0,0 +1,36 @@
AM_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/core \
-DSYSCONFDIR=\""$(sysconfdir)"\" \
$(GLIB_CFLAGS)
TESTS = test-irc
check_PROGRAMS = test-irc
test_irc_CPPFLAGS = \
-I$(top_srcdir)/src/irc/core \
$(AM_CPPFLAGS)
test_irc_DEPENDENCIES = \
../../../src/core/libcore.a \
../../../src/lib-config/libirssi_config.a
test_irc_LDADD = \
../../../src/core/libcore.a \
../../../src/lib-config/libirssi_config.a \
@GLIB_LIBS@ \
@OPENSSL_LIBS@
test_irc_SOURCES = \
test-irc.c \
../../../src/irc/core/irc-cap.c \
../../../src/irc/core/irc-nicklist.c \
../../../src/irc/core/irc-queries.c \
../../../src/irc/core/irc-servers-reconnect.c \
../../../src/irc/core/irc-servers-setup.c \
../../../src/irc/core/irc-servers.c \
../../../src/irc/core/irc.c \
../../../src/irc/core/mode-lists.c \
../../../src/irc/core/modes.c \
../../../src/irc/core/servers-idle.c \
../../../src/irc/core/servers-redirect.c

230
tests/irc/core/test-irc.c Normal file
View File

@ -0,0 +1,230 @@
/*
test-irc.c : irssi
Copyright (C) 2017 Will Storey
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <glib.h>
#include <irc.h>
#include <string.h>
static void test_event_get_param(void);
static void test_event_get_params(void);
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
g_test_add_func("/test/event_get_param", test_event_get_param);
g_test_add_func("/test/event_get_params", test_event_get_params);
return g_test_run();
}
static void test_event_get_param(void)
{
struct test_case {
char const *const description;
char const *const input;
char const *const input_after;
char const *const output;
};
struct test_case const tests[] = {
{
.description = "Zero parameters",
.input = "",
.input_after = "",
.output = "",
},
{
.description = "One parameter",
.input = "#test",
.input_after = "",
.output = "#test",
},
{
.description = "One parameter, trailing space",
.input = "#test ",
.input_after = "",
.output = "#test",
},
{
.description = "One parameter, more trailing space",
.input = "#test ",
.input_after = " ",
.output = "#test",
},
{
.description = "Two parameters",
.input = "#test +o",
.input_after = "+o",
.output = "#test",
},
{
.description = "Two parameters continued",
.input = "+o",
.input_after = "",
.output = "+o",
},
{
.description = "Two parameters with trailing space",
.input = "#test +o ",
.input_after = "+o ",
.output = "#test",
},
{
.description = "Two parameters with trailing space continued",
.input = "+o ",
.input_after = "",
.output = "+o",
},
{
.description = "Two parameters with inline and trailing space",
.input = "#test +o ",
.input_after = " +o ",
.output = "#test",
},
/* TODO: It seems not ideal that the caller has to deal with inline space.
*/
{
.description = "Two parameters with inline and trailing space continued",
.input = " +o ",
.input_after = "+o ",
.output = "",
},
};
char *buf = g_malloc0(1024);
int i = 0;
for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
struct test_case const test = tests[i];
memcpy(buf, test.input, strlen(test.input)+1);
char *input = buf;
char *const output = event_get_param(&input);
g_assert_cmpstr(input, ==, test.input_after);
g_assert_cmpstr(output, ==, test.output);
}
g_free(buf);
}
static void test_event_get_params(void)
{
struct test_case {
char const *const description;
char const *const input;
char const *const output0;
char const *const output1;
};
struct test_case const tests[] = {
{
.description = "Only a channel",
.input = "#test",
.output0 = "#test",
.output1 = "",
},
{
.description = "Only a channel with trailing space",
.input = "#test ",
.output0 = "#test",
.output1 = "",
},
{
.description = "No :<trailing>, channel mode with one parameter after channel name",
.input = "#test +i",
.output0 = "#test",
.output1 = "+i",
},
{
.description = "No :<trailing>, channel mode with two parameters after channel name",
.input = "#test +o tester",
.output0 = "#test",
.output1 = "+o tester",
},
{
.description = "No :<trailing>, channel mode with three parameters afer channel name",
.input = "#test +ov tester tester2",
.output0 = "#test",
.output1 = "+ov tester tester2",
},
{
.description = "No :<trailing>, channel mode with three parameters afer channel name, bunch of extra space",
.input = "#test +ov tester tester2 ",
.output0 = "#test",
.output1 = " +ov tester tester2 ",
},
{
.description = "Channel mode with one parameter after channel name, :<trailing> at the start of modes",
.input = "#test :+i",
.output0 = "#test",
.output1 = "+i",
},
{
.description = "Channel mode with two parameters after channel name, :<trailing> at the start of modes",
.input = "#test :+o tester",
.output0 = "#test",
.output1 = "+o tester",
},
{
.description = "Channel mode with three parameters after channel name, :<trailing> at the start of modes",
.input = "#test :+ov tester tester2",
.output0 = "#test",
.output1 = "+ov tester tester2",
},
{
.description = "Channel mode with two parameters after channel name, :<trailing> on the final parameter",
.input = "#test +o :tester",
.output0 = "#test",
.output1 = "+o tester",
},
{
.description = "Channel mode with three parameters after channel name, :<trailing> on the final parameter",
.input = "#test +ov tester :tester2",
.output0 = "#test",
.output1 = "+ov tester tester2",
},
{
.description = "Channel mode with three parameters after channel name, :<trailing> on the final parameter, also a second : present",
.input = "#test +ov tester :tester2 hi:there",
.output0 = "#test",
.output1 = "+ov tester tester2 hi:there",
},
};
int i = 0;
for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
struct test_case const test = tests[i];
char *output0 = NULL;
char *output1 = NULL;
char *const params = event_get_params(test.input, 2 | PARAM_FLAG_GETREST,
&output0, &output1);
/* params happens to always point at the first output */
g_assert_cmpstr(params, ==, test.output0);
g_assert_cmpstr(output0, ==, test.output0);
g_assert_cmpstr(output1, ==, test.output1);
g_free(params);
}
}