Skip to content

Commit 00c0be2

Browse files
committed
Add unit tests for irc.mod
1 parent d796034 commit 00c0be2

2 files changed

Lines changed: 278 additions & 0 deletions

File tree

src/mod/irc.mod/Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ clean:
2727

2828
distclean: clean
2929

30+
# manual target in this directory for now
31+
.PHONY: test
32+
test:
33+
gcc -O0 -ggdb3 -std=gnu99 -I. -I../../.. -I.. -DHAVE_CONFIG_H -DMAKING_MODS -I/usr/include/tcl8.6 -o test test.c -ltcl8.6 -lcriterion && ./test
34+
3035
#safety hash
3136
../irc.o: .././irc.mod/irc.c ../../../src/mod/module.h \
3237
../../../src/main.h ../../../config.h ../../../eggint.h ../../../lush.h \

src/mod/irc.mod/test.c

Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,273 @@
1+
#include <criterion/criterion.h>
2+
#include <criterion/logging.h>
3+
#include <criterion/parameterized.h>
4+
#include <criterion/internal/assert.h>
5+
6+
#include "irc.c"
7+
#include "irc.h"
8+
9+
void test_putlog(int lvl, char *chan, const char *fmt, ...) {
10+
char buf[512];
11+
va_list args;
12+
13+
va_start(args, fmt);
14+
vsprintf(buf, fmt, args);
15+
va_end(args);
16+
17+
//printf("putlog(%d, \"%s\", \"%s\");\n", lvl, chan, buf);
18+
}
19+
20+
static Function *test_global = (Function []){
21+
[197] = (Function)test_putlog
22+
};
23+
24+
void test_irc_init(void) {
25+
global = test_global;
26+
}
27+
28+
/// Parsing errors
29+
Test(process_chanmodes, syntax_error1, .init = test_irc_init) {
30+
char *input = "";
31+
cr_assert_eq(-1, process_chanmodes(input), "process_chanmodes() did not fail on invalid syntax test input: \"%s\"", input);
32+
}
33+
34+
Test(process_chanmodes, syntax_error2, .init = test_irc_init) {
35+
char *input = "a";
36+
cr_assert_eq(-1, process_chanmodes(input), "process_chanmodes() did not fail on invalid syntax test input: \"%s\"", input);
37+
}
38+
39+
Test(process_chanmodes, syntax_error3, .init = test_irc_init) {
40+
char *input = "a,b";
41+
cr_assert_eq(-1, process_chanmodes(input), "process_chanmodes() did not fail on invalid syntax test input: \"%s\"", input);
42+
}
43+
44+
Test(process_chanmodes, syntax_error4, .init = test_irc_init) {
45+
char *input = "a,b,c";
46+
cr_assert_eq(-1, process_chanmodes(input), "process_chanmodes() did not fail on invalid syntax test input: \"%s\"", input);
47+
}
48+
49+
Test(process_chanmodes, syntax_error5, .init = test_irc_init) {
50+
char *input = "a,b,c,d,";
51+
cr_assert_eq(-1, process_chanmodes(input), "process_chanmodes() did not fail on invalid syntax test input: \"%s\"", input);
52+
}
53+
54+
Test(process_chanmodes, syntax_error6, .init = test_irc_init) {
55+
char *input = "a,b,c,d,e";
56+
cr_assert_eq(-1, process_chanmodes(input), "process_chanmodes() did not fail on invalid syntax test input: \"%s\"", input);
57+
}
58+
59+
/// Parsing OK
60+
Test(process_chanmodes, syntax_ok1, .init = test_irc_init) {
61+
char *input = "a,b,c,d";
62+
cr_assert_eq(0, process_chanmodes(input), "process_chanmodes() did not succees on valid syntax test input: \"%s\"", input);
63+
}
64+
65+
Test(process_chanmodes, syntax_ok2, .init = test_irc_init) {
66+
char *input = "a,b,c,";
67+
cr_assert_eq(0, process_chanmodes(input), "process_chanmodes() did not succees on valid syntax test input: \"%s\"", input);
68+
}
69+
70+
Test(process_chanmodes, syntax_ok3, .init = test_irc_init) {
71+
char *input = "a,b,,d";
72+
cr_assert_eq(0, process_chanmodes(input), "process_chanmodes() did not succees on valid syntax test input: \"%s\"", input);
73+
}
74+
75+
Test(process_chanmodes, syntax_ok4, .init = test_irc_init) {
76+
char *input = ",,,";
77+
cr_assert_eq(0, process_chanmodes(input), "process_chanmodes() did not succees on valid syntax test input: \"%s\"", input);
78+
}
79+
80+
/// Check internal state
81+
Test(process_chanmodes, parse1, .init = test_irc_init) {
82+
char *input = "a,b,c,d";
83+
cr_assert_eq(0, process_chanmodes(input));
84+
for (int i = 0; i < 256; i++) {
85+
if (i < 'a' || i > 'd') {
86+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE(i));
87+
}
88+
}
89+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('a'));
90+
cr_assert_eq(MODETYPE_KEY, MODE_TYPE('b'));
91+
cr_assert_eq(MODETYPE_LIMIT, MODE_TYPE('c'));
92+
cr_assert_eq(MODETYPE_FLAG, MODE_TYPE('d'));
93+
cr_assert(MODE_HAS_SET_ARG('a') && MODE_HAS_UNSET_ARG('a'));
94+
cr_assert(MODE_HAS_SET_ARG('b') && MODE_HAS_UNSET_ARG('b'));
95+
cr_assert(MODE_HAS_SET_ARG('c') && !MODE_HAS_UNSET_ARG('c'));
96+
cr_assert(!MODE_HAS_SET_ARG('d') && !MODE_HAS_UNSET_ARG('d'));
97+
}
98+
99+
Test(process_chanmodes, parse2, .init = test_irc_init) {
100+
char *input = "abcd,,,";
101+
cr_assert_eq(0, process_chanmodes(input));
102+
for (int i = 0; i < 256; i++) {
103+
if (i < 'a' || i > 'd') {
104+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE(i));
105+
}
106+
}
107+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('a'));
108+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('b'));
109+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('c'));
110+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('d'));
111+
}
112+
113+
Test(process_chanmodes, parse3, .init = test_irc_init) {
114+
char *input = "abcd,,efg,hij";
115+
cr_assert_eq(0, process_chanmodes(input));
116+
for (int i = 0; i < 256; i++) {
117+
if (i < 'a' || i > 'j') {
118+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE(i));
119+
}
120+
}
121+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('a'));
122+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('b'));
123+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('c'));
124+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('d'));
125+
cr_assert_eq(MODETYPE_LIMIT, MODE_TYPE('e'));
126+
cr_assert_eq(MODETYPE_LIMIT, MODE_TYPE('f'));
127+
cr_assert_eq(MODETYPE_LIMIT, MODE_TYPE('g'));
128+
cr_assert_eq(MODETYPE_FLAG, MODE_TYPE('h'));
129+
cr_assert_eq(MODETYPE_FLAG, MODE_TYPE('i'));
130+
cr_assert_eq(MODETYPE_FLAG, MODE_TYPE('j'));
131+
}
132+
133+
Test(process_chanmodes, reconfigure1, .init = test_irc_init) {
134+
char *input = "a,b,c,d", *input2 = "a,d,c,";
135+
cr_assert_eq(0, process_chanmodes(input));
136+
cr_assert_eq(0, process_chanmodes(input2));
137+
for (int i = 0; i < 256; i++) {
138+
if (i < 'a' || i > 'd') {
139+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE(i));
140+
}
141+
}
142+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('a'));
143+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE('b'));
144+
cr_assert_eq(MODETYPE_LIMIT, MODE_TYPE('c'));
145+
cr_assert_eq(MODETYPE_KEY, MODE_TYPE('d'));
146+
}
147+
148+
/// Prefixes
149+
Test(process_prefix, syntax_error1, .init = test_irc_init) {
150+
char *input = "";
151+
cr_assert_eq(-1, process_prefix(input), "process_prefix() did not fail on invalid syntax test input: \"%s\"", input);
152+
}
153+
154+
Test(process_prefix, syntax_error2, .init = test_irc_init) {
155+
char *input = "abc";
156+
cr_assert_eq(-1, process_prefix(input), "process_prefix() did not fail on invalid syntax test input: \"%s\"", input);
157+
}
158+
159+
Test(process_prefix, syntax_error3, .init = test_irc_init) {
160+
char *input = "(";
161+
cr_assert_eq(-1, process_prefix(input), "process_prefix() did not fail on invalid syntax test input: \"%s\"", input);
162+
}
163+
164+
Test(process_prefix, syntax_error4, .init = test_irc_init) {
165+
char *input = "(ov";
166+
cr_assert_eq(-1, process_prefix(input), "process_prefix() did not fail on invalid syntax test input: \"%s\"", input);
167+
}
168+
169+
Test(process_prefix, syntax_error5, .init = test_irc_init) {
170+
char *input = "(ov)@";
171+
cr_assert_eq(-1, process_prefix(input), "process_prefix() did not fail on invalid syntax test input: \"%s\"", input);
172+
}
173+
174+
Test(process_prefix, syntax_error6, .init = test_irc_init) {
175+
char *input = "(o)@+";
176+
cr_assert_eq(-1, process_prefix(input), "process_prefix() did not fail on invalid syntax test input: \"%s\"", input);
177+
}
178+
179+
Test(process_prefix, syntax_ok1, .init = test_irc_init) {
180+
char *input = "(o)@";
181+
cr_assert_eq(0, process_prefix(input), "process_prefix() did not succeed on valid syntax test input: \"%s\"", input);
182+
}
183+
184+
Test(process_prefix, syntax_ok2, .init = test_irc_init) {
185+
char *input = "(abcdef)@+!%$=";
186+
cr_assert_eq(0, process_prefix(input), "process_prefix() did not succeed on valid syntax test input: \"%s\"", input);
187+
}
188+
189+
Test(process_prefix, parse1, .init = test_irc_init) {
190+
char *input = "(abcdef)@+!%$=";
191+
cr_assert_eq(0, process_prefix(input));
192+
for (int i = 0; i < 256; i++) {
193+
if (i < 'a' || i > 'f') {
194+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE(i));
195+
}
196+
}
197+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('a'));
198+
cr_assert_eq('@', MODE_PREFIX('a'));
199+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('b'));
200+
cr_assert_eq('+', MODE_PREFIX('b'));
201+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('c'));
202+
cr_assert_eq('!', MODE_PREFIX('c'));
203+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('d'));
204+
cr_assert_eq('%', MODE_PREFIX('d'));
205+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('e'));
206+
cr_assert_eq('$', MODE_PREFIX('e'));
207+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('f'));
208+
cr_assert_eq('=', MODE_PREFIX('f'));
209+
}
210+
211+
Test(process_prefix, reconfigure1, .init = test_irc_init) {
212+
char *input = "(abc)@+!", *input2 = "(abd)@%!";
213+
cr_assert_eq(0, process_prefix(input));
214+
cr_assert_eq(0, process_prefix(input2));
215+
for (int i = 0; i < 256; i++) {
216+
if (i < 'a' || i > 'd') {
217+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE(i));
218+
}
219+
}
220+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('a'));
221+
cr_assert_eq('@', MODE_PREFIX('a'));
222+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('b'));
223+
cr_assert_eq('%', MODE_PREFIX('b'));
224+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE('c'));
225+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('d'));
226+
cr_assert_eq('!', MODE_PREFIX('d'));
227+
cr_assert(MODE_HAS_SET_ARG('a') && MODE_HAS_UNSET_ARG('a'));
228+
cr_assert(MODE_HAS_SET_ARG('b') && MODE_HAS_UNSET_ARG('b'));
229+
cr_assert(MODE_HAS_SET_ARG('d') && MODE_HAS_UNSET_ARG('d'));
230+
}
231+
232+
Test(process_chanmodes_and_prefix, reconfigure1, .init = test_irc_init) {
233+
char *chanmode = "a,b,c,d", *chanmode2 = "a,,c,f";
234+
char *prefix = "(ef)@+", *prefix2 = "(b)@";
235+
cr_assert_eq(0, process_chanmodes(chanmode));
236+
cr_assert_eq(0, process_prefix(prefix));
237+
cr_assert_eq(0, process_chanmodes(chanmode2));
238+
cr_assert_eq(0, process_prefix(prefix2));
239+
for (int i = 0; i < 256; i++) {
240+
if (i < 'a' || i > 'f') {
241+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE(i));
242+
}
243+
}
244+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('a'));
245+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('b'));
246+
cr_assert_eq('@', MODE_PREFIX('b'));
247+
cr_assert_eq(MODETYPE_LIMIT, MODE_TYPE('c'));
248+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE('d'));
249+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE('e'));
250+
cr_assert_eq(MODETYPE_FLAG, MODE_TYPE('f'));
251+
}
252+
253+
Test(process_chanmodes_and_prefix, reconfigure2, .init = test_irc_init) {
254+
char *chanmode = "a,b,c,d", *chanmode2 = "a,,c,f";
255+
char *prefix = "(ef)@+", *prefix2 = "(b)@";
256+
cr_assert_eq(0, process_chanmodes(chanmode));
257+
cr_assert_eq(0, process_prefix(prefix));
258+
// different arrival order than previous test
259+
cr_assert_eq(0, process_prefix(prefix2));
260+
cr_assert_eq(0, process_chanmodes(chanmode2));
261+
for (int i = 0; i < 256; i++) {
262+
if (i < 'a' || i > 'f') {
263+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE(i));
264+
}
265+
}
266+
cr_assert_eq(MODETYPE_LIST, MODE_TYPE('a'));
267+
cr_assert_eq(MODETYPE_PREFIX, MODE_TYPE('b'));
268+
cr_assert_eq('@', MODE_PREFIX('b'));
269+
cr_assert_eq(MODETYPE_LIMIT, MODE_TYPE('c'));
270+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE('d'));
271+
cr_assert_eq(MODETYPE_INVALID, MODE_TYPE('e'));
272+
cr_assert_eq(MODETYPE_FLAG, MODE_TYPE('f'));
273+
}

0 commit comments

Comments
 (0)