comparison tests/test-plugin-hangman.c @ 995:0d71bfa6c97a

tests: add plugin tests
author David Demelier <markand@malikania.fr>
date Thu, 11 Feb 2021 17:39:22 +0100
parents
children a35537c50f09
comparison
equal deleted inserted replaced
994:56114ae85868 995:0d71bfa6c97a
1 /*
2 * main.cpp -- test hangman plugin
3 *
4 * Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <err.h>
20
21 #define GREATEST_USE_ABBREVS 0
22 #include <greatest.h>
23
24 #include <irccd/compat.h>
25 #include <irccd/js-plugin.h>
26 #include <irccd/log.h>
27 #include <irccd/plugin.h>
28 #include <irccd/server.h>
29
30 #define CALL(t, m) do { \
31 memset(server->conn.out, 0, sizeof (server->conn.out)); \
32 irc_plugin_handle(plugin, &(const struct irc_event) { \
33 .type = t, \
34 .server = server, \
35 .message = { \
36 .origin = "jean!jean@localhost", \
37 .channel = "#hangman", \
38 .message = m \
39 } \
40 }); \
41 } while (0)
42
43 #define CALL_EX(t, o, c, m) do { \
44 memset(server->conn.out, 0, sizeof (server->conn.out)); \
45 irc_plugin_handle(plugin, &(const struct irc_event) { \
46 .type = t, \
47 .server = server, \
48 .message = { \
49 .origin = o, \
50 .channel = c, \
51 .message = m \
52 } \
53 }); \
54 } while (0)
55
56 static struct irc_server *server;
57 static struct irc_plugin *plugin;
58
59 static void
60 setup(void *udata)
61 {
62 (void)udata;
63
64 server = irc_server_new("test", "t", "t", "t", "127.0.0.1", 6667);
65 plugin = js_plugin_open("hangman", CMAKE_SOURCE_DIR "/plugins/hangman/hangman.js");
66
67 if (!plugin)
68 errx(1, "could not load plugin");
69
70 irc_log_to_console();
71 irc_server_incref(server);
72 irc_plugin_set_template(plugin, "asked", "asked=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}");
73 irc_plugin_set_template(plugin, "dead", "dead=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}");
74 irc_plugin_set_template(plugin, "found", "found=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}");
75 irc_plugin_set_template(plugin, "start", "start=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}");
76 irc_plugin_set_template(plugin, "running", "running=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}");
77 irc_plugin_set_template(plugin, "win", "win=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}");
78 irc_plugin_set_template(plugin, "wrong-letter", "wrong-letter=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}");
79 irc_plugin_set_template(plugin, "wrong-player", "wrong-player=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}");
80 irc_plugin_set_template(plugin, "wrong-word", "wrong-word=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}");
81 irc_plugin_set_option(plugin, "file", SOURCE "/data/words.conf");
82 irc_plugin_set_option(plugin, "collaborative", "false");
83 irc_plugin_load(plugin);
84
85 /* Fake server connected to send data. */
86 server->state = IRC_SERVER_STATE_CONNECTED;
87 }
88
89 static void
90 teardown(void *udata)
91 {
92 (void)udata;
93
94 irc_plugin_finish(plugin);
95 irc_server_decref(server);
96 }
97
98 GREATEST_TEST
99 basics_asked(void)
100 {
101 CALL(IRC_EVENT_COMMAND, "");
102 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :start=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ _\r\n", server->conn.out);
103
104 CALL(IRC_EVENT_MESSAGE, "s");
105 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _\r\n", server->conn.out);
106
107 CALL(IRC_EVENT_MESSAGE, "s");
108 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :asked=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s\r\n", server->conn.out);
109 GREATEST_PASS();
110 }
111
112 GREATEST_TEST
113 basics_dead(void)
114 {
115 CALL(IRC_EVENT_COMMAND, "");
116 CALL(IRC_EVENT_MESSAGE, "a");
117 CALL(IRC_EVENT_MESSAGE, "b");
118 CALL(IRC_EVENT_MESSAGE, "c");
119 CALL(IRC_EVENT_MESSAGE, "d");
120 CALL(IRC_EVENT_MESSAGE, "e");
121 CALL(IRC_EVENT_MESSAGE, "f");
122 CALL(IRC_EVENT_MESSAGE, "g");
123 CALL(IRC_EVENT_MESSAGE, "h");
124 CALL(IRC_EVENT_MESSAGE, "i");
125 CALL(IRC_EVENT_MESSAGE, "j");
126 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :dead=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky\r\n", server->conn.out);
127 GREATEST_PASS();
128 }
129
130 GREATEST_TEST
131 basics_found(void)
132 {
133 CALL(IRC_EVENT_COMMAND, "");
134 CALL(IRC_EVENT_MESSAGE, "s");
135 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _\r\n", server->conn.out);
136 GREATEST_PASS();
137 }
138
139 GREATEST_TEST
140 basics_start(void)
141 {
142 CALL(IRC_EVENT_COMMAND, "");
143 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :start=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ _\r\n", server->conn.out);
144 GREATEST_PASS();
145 }
146
147 GREATEST_TEST
148 basics_win1(void)
149 {
150 CALL(IRC_EVENT_COMMAND, "");
151 CALL(IRC_EVENT_MESSAGE, "s");
152 CALL(IRC_EVENT_MESSAGE, "k");
153 CALL(IRC_EVENT_MESSAGE, "y");
154 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :win=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky\r\n", server->conn.out);
155 GREATEST_PASS();
156 }
157
158 GREATEST_TEST
159 basics_win2(void)
160 {
161 CALL(IRC_EVENT_COMMAND, "");
162 CALL(IRC_EVENT_COMMAND, "sky");
163 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :win=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky\r\n", server->conn.out);
164 GREATEST_PASS();
165 }
166
167 GREATEST_TEST
168 basics_wrong_letter(void)
169 {
170 CALL(IRC_EVENT_COMMAND, "");
171 CALL(IRC_EVENT_MESSAGE, "x");
172 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :wrong-letter=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:x\r\n", server->conn.out);
173 GREATEST_PASS();
174 }
175
176 GREATEST_TEST
177 basics_wrong_word(void)
178 {
179 CALL(IRC_EVENT_COMMAND, "");
180 CALL(IRC_EVENT_COMMAND, "cheese");
181 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :wrong-word=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:cheese\r\n", server->conn.out);
182 GREATEST_PASS();
183 }
184
185 GREATEST_TEST
186 basics_collaborative_enabled(void)
187 {
188 irc_plugin_set_option(plugin, "collaborative", "true");
189
190 CALL(IRC_EVENT_COMMAND, "");
191 CALL(IRC_EVENT_MESSAGE, "s");
192
193 /* Forbidden to play twice. */
194 CALL(IRC_EVENT_MESSAGE, "k");
195 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :wrong-player=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:k\r\n", server->conn.out);
196
197 /* Use a different nickname now. */
198 CALL_EX(IRC_EVENT_MESSAGE, "francis!francis@localhost", "#hangman", "k");
199 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :found=hangman:!hangman:test:#hangman:francis!francis@localhost:francis:s k _\r\n", server->conn.out);
200
201 GREATEST_PASS();
202 }
203
204 GREATEST_TEST
205 basics_case_insensitive(void)
206 {
207 CALL_EX(IRC_EVENT_COMMAND, "jean!jean@localhost", "#hangman", "");
208
209 CALL_EX(IRC_EVENT_MESSAGE, "jean!jean@localhost", "#HANGMAN", "s");
210 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _\r\n", server->conn.out);
211
212 CALL_EX(IRC_EVENT_MESSAGE, "jean!jean@localhost", "#HaNGMaN", "k");
213 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s k _\r\n", server->conn.out);
214
215 GREATEST_PASS();
216 }
217
218 GREATEST_TEST
219 basics_query(void)
220 {
221 /*
222 * Set collaborative mode but in query it must be ignored since there is
223 * only one player against the bot.
224 */
225 irc_plugin_set_option(plugin, "collaborative", "true");
226
227 CALL_EX(IRC_EVENT_COMMAND, "jean!jean@localhost", "t", "");
228 GREATEST_ASSERT_STR_EQ("PRIVMSG jean!jean@localhost :start=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:_ _ _\r\n", server->conn.out);
229
230 CALL_EX(IRC_EVENT_MESSAGE, "jean!jean@localhost", "t", "s");
231 GREATEST_ASSERT_STR_EQ("PRIVMSG jean!jean@localhost :found=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:s _ _\r\n", server->conn.out);
232
233 CALL_EX(IRC_EVENT_MESSAGE, "jean!jean@localhost", "t", "k");
234 GREATEST_ASSERT_STR_EQ("PRIVMSG jean!jean@localhost :found=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:s k _\r\n", server->conn.out);
235
236 CALL_EX(IRC_EVENT_COMMAND, "jean!jean@localhost", "t", "sky");
237 GREATEST_ASSERT_STR_EQ("PRIVMSG jean!jean@localhost :win=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:sky\r\n", server->conn.out);
238
239 GREATEST_PASS();
240 }
241
242 GREATEST_TEST
243 basics_running(void)
244 {
245 CALL(IRC_EVENT_COMMAND, "");
246 CALL(IRC_EVENT_MESSAGE, "y");
247 CALL(IRC_EVENT_COMMAND, "");
248 GREATEST_ASSERT_STR_EQ("PRIVMSG #hangman :running=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ y\r\n", server->conn.out);
249 GREATEST_PASS();
250 }
251
252 GREATEST_SUITE(suite_basics)
253 {
254 GREATEST_SET_SETUP_CB(setup, NULL);
255 GREATEST_SET_TEARDOWN_CB(teardown, NULL);
256 GREATEST_RUN_TEST(basics_asked);
257 GREATEST_RUN_TEST(basics_dead);
258 GREATEST_RUN_TEST(basics_found);
259 GREATEST_RUN_TEST(basics_start);
260 GREATEST_RUN_TEST(basics_win1);
261 GREATEST_RUN_TEST(basics_win2);
262 GREATEST_RUN_TEST(basics_wrong_letter);
263 GREATEST_RUN_TEST(basics_wrong_word);
264 GREATEST_RUN_TEST(basics_collaborative_enabled);
265 GREATEST_RUN_TEST(basics_case_insensitive);
266 GREATEST_RUN_TEST(basics_query);
267 GREATEST_RUN_TEST(basics_running);
268 }
269
270 GREATEST_MAIN_DEFS();
271
272 int
273 main(int argc, char **argv)
274 {
275 GREATEST_MAIN_BEGIN();
276 GREATEST_RUN_SUITE(suite_basics);
277 GREATEST_MAIN_END();
278
279 return 0;
280 }