diff options
author | Will Storey <will@summercat.com> | 2017-10-21 20:01:04 -0700 |
---|---|---|
committer | ailin-nemui <ailin-nemui@users.noreply.github.com> | 2017-12-07 12:06:20 +0100 |
commit | 1328e1ba08430b0eaa589919272d732bb84a6921 (patch) | |
tree | 99a1097d9fc61c87a41143b2c09a71f9298ff774 | |
parent | 02aa8ee8bb7befc3c91f4b0fdfa17e4d721ba8d0 (diff) | |
download | irssi-1328e1ba08430b0eaa589919272d732bb84a6921.zip |
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.
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | .travis.yml | 4 | ||||
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/irc/Makefile.am | 1 | ||||
-rw-r--r-- | tests/irc/core/Makefile.am | 36 | ||||
-rw-r--r-- | tests/irc/core/test-irc.c | 230 |
8 files changed, 278 insertions, 2 deletions
@@ -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 diff --git a/.travis.yml b/.travis.yml index 1d8786c4..1e04d943 100644 --- a/.travis.yml +++ b/.travis.yml @@ -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 diff --git a/Makefile.am b/Makefile.am index f52ac92f..ba45d8ac 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/configure.ac b/configure.ac index 4b65d434..bf15e6ae 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 00000000..58c348df --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = irc diff --git a/tests/irc/Makefile.am b/tests/irc/Makefile.am new file mode 100644 index 00000000..52770885 --- /dev/null +++ b/tests/irc/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = core diff --git a/tests/irc/core/Makefile.am b/tests/irc/core/Makefile.am new file mode 100644 index 00000000..fff2a246 --- /dev/null +++ b/tests/irc/core/Makefile.am @@ -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 diff --git a/tests/irc/core/test-irc.c b/tests/irc/core/test-irc.c new file mode 100644 index 00000000..7e85c9ba --- /dev/null +++ b/tests/irc/core/test-irc.c @@ -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); + } +} |