995
|
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 } |