comparison tests/src/plugins/hangman/main.cpp @ 611:9fbd1700435b

Tests: reoganize hierarchy
author David Demelier <markand@malikania.fr>
date Fri, 15 Dec 2017 15:37:58 +0100
parents tests/src/plugin-hangman/main.cpp@9d4da384f5d6
children 27587ff92a64
comparison
equal deleted inserted replaced
610:22b3cd6f991f 611:9fbd1700435b
1 /*
2 * main.cpp -- test hangman plugin
3 *
4 * Copyright (c) 2013-2017 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 <unordered_map>
20 #include <unordered_set>
21
22 #define BOOST_TEST_MODULE "Hangman plugin"
23 #include <boost/test/unit_test.hpp>
24
25 #include <irccd/daemon/irccd.hpp>
26 #include <irccd/daemon/server.hpp>
27
28 #include <irccd/test/plugin_test.hpp>
29
30 namespace irccd {
31
32 class hangman_test : public plugin_test {
33 public:
34 hangman_test()
35 : plugin_test(PLUGIN_NAME, PLUGIN_PATH)
36 {
37 plugin_->set_formats({
38 { "asked", "asked=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}" },
39 { "dead", "dead=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
40 { "found", "found=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
41 { "start", "start=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
42 { "running", "running=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
43 { "win", "win=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
44 { "wrong-letter", "wrong-letter=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}" },
45 { "wrong-player", "wrong-player=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}" },
46 { "wrong-word", "wrong-word=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" }
47 });
48 }
49
50 void load(plugin_config config = {})
51 {
52 // Add file if not there.
53 if (config.count("file") == 0)
54 config.emplace("file", CMAKE_CURRENT_SOURCE_DIR "/words.conf");
55
56 plugin_->set_config(config);
57 plugin_->on_load(irccd_);
58 }
59 };
60
61 BOOST_FIXTURE_TEST_SUITE(hangman_test_suite, hangman_test)
62
63 BOOST_AUTO_TEST_CASE(asked)
64 {
65 load({{ "collaborative", "false" }});
66
67 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
68
69 auto cmd = server_->cqueue().back();
70
71 BOOST_TEST(cmd["command"].get<std::string>() == "message");
72 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
73 BOOST_TEST(cmd["message"].get<std::string>() == "start=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ _");
74
75 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
76 cmd = server_->cqueue().back();
77
78 BOOST_TEST(cmd["command"].get<std::string>() == "message");
79 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
80 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
81
82 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
83 cmd = server_->cqueue().back();
84
85 BOOST_TEST(cmd["command"].get<std::string>() == "message");
86 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
87 BOOST_TEST(cmd["message"].get<std::string>() == "asked=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s");
88 }
89
90 BOOST_AUTO_TEST_CASE(dead)
91 {
92 load({{ "collaborative", "false" }});
93
94 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
95 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "a"});
96 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "b"});
97 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "c"});
98 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "d"});
99 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "e"});
100 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "f"});
101 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "g"});
102 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "h"});
103 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "i"});
104 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "j"});
105
106 auto cmd = server_->cqueue().back();
107
108 BOOST_TEST(cmd["command"].get<std::string>() == "message");
109 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
110 BOOST_TEST(cmd["message"].get<std::string>() == "dead=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky");
111 }
112
113 BOOST_AUTO_TEST_CASE(found)
114 {
115 load({{ "collaborative", "false" }});
116
117 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
118 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
119
120 auto cmd = server_->cqueue().back();
121
122 BOOST_TEST(cmd["command"].get<std::string>() == "message");
123 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
124 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
125 }
126
127 BOOST_AUTO_TEST_CASE(start)
128 {
129 load();
130
131 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
132
133 auto cmd = server_->cqueue().back();
134
135 BOOST_TEST(cmd["command"].get<std::string>() == "message");
136 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
137 BOOST_TEST(cmd["message"].get<std::string>() == "start=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ _");
138 }
139
140 BOOST_AUTO_TEST_CASE(win1)
141 {
142 load({{ "collaborative", "false" }});
143
144 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
145 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
146 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "k"});
147 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "y"});
148
149 auto cmd = server_->cqueue().back();
150
151 BOOST_TEST(cmd["command"].get<std::string>() == "message");
152 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
153 BOOST_TEST(cmd["message"].get<std::string>() == "win=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky");
154 }
155
156 BOOST_AUTO_TEST_CASE(win2)
157 {
158 load({{ "collaborative", "false" }});
159
160 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
161 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", "sky"});
162
163 auto cmd = server_->cqueue().back();
164
165 BOOST_TEST(cmd["command"].get<std::string>() == "message");
166 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
167 BOOST_TEST(cmd["message"].get<std::string>() == "win=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky");
168 }
169
170 BOOST_AUTO_TEST_CASE(wrong_letter)
171 {
172 load();
173
174 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
175 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "x"});
176
177 auto cmd = server_->cqueue().back();
178
179 BOOST_TEST(cmd["command"].get<std::string>() == "message");
180 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
181 BOOST_TEST(cmd["message"].get<std::string>() == "wrong-letter=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:x");
182 }
183
184 BOOST_AUTO_TEST_CASE(wrongWord)
185 {
186 load();
187
188 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
189 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", "cheese"});
190
191 auto cmd = server_->cqueue().back();
192
193 BOOST_TEST(cmd["command"].get<std::string>() == "message");
194 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
195 BOOST_TEST(cmd["message"].get<std::string>() == "wrong-word=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:cheese");
196 }
197
198 BOOST_AUTO_TEST_CASE(collaborative_disabled)
199 {
200 // Disable collaborative mode.
201 load({{ "collaborative", "false" }});
202
203 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
204 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
205
206 auto cmd = server_->cqueue().back();
207
208 BOOST_TEST(cmd["command"].get<std::string>() == "message");
209 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
210 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
211
212 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "k"});
213 cmd = server_->cqueue().back();
214
215 BOOST_TEST(cmd["command"].get<std::string>() == "message");
216 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
217 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s k _");
218 }
219
220 BOOST_AUTO_TEST_CASE(collaborative_enabled)
221 {
222 // Enable collaborative mode.
223 load({{ "collaborative", "true" }});
224
225 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
226 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
227
228 auto cmd = server_->cqueue().back();
229
230 BOOST_TEST(cmd["command"].get<std::string>() == "message");
231 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
232 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
233
234 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "k"});
235 cmd = server_->cqueue().back();
236
237 BOOST_TEST(cmd["command"].get<std::string>() == "message");
238 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
239 BOOST_TEST(cmd["message"].get<std::string>() == "wrong-player=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:k");
240
241 plugin_->on_message(irccd_, {server_, "francis!francis@localhost", "#hangman", "k"});
242 cmd = server_->cqueue().back();
243
244 BOOST_TEST(cmd["command"].get<std::string>() == "message");
245 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
246 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:francis!francis@localhost:francis:s k _");
247 }
248
249 BOOST_AUTO_TEST_CASE(case_fix_642)
250 {
251 load();
252
253 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
254 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#HANGMAN", "s"});
255
256 auto cmd = server_->cqueue().back();
257
258 BOOST_TEST(cmd["command"].get<std::string>() == "message");
259 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
260 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
261
262 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#HaNGMaN", "k"});
263 cmd = server_->cqueue().back();
264
265 BOOST_TEST(cmd["command"].get<std::string>() == "message");
266 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
267 BOOST_TEST(cmd["message"].get<std::string>() == "wrong-player=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:k");
268
269 plugin_->on_message(irccd_, {server_, "francis!francis@localhost", "#hAngmAn", "k"});
270 cmd = server_->cqueue().back();
271
272 BOOST_TEST(cmd["command"].get<std::string>() == "message");
273 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
274 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:francis!francis@localhost:francis:s k _");
275 }
276
277 BOOST_AUTO_TEST_CASE(query)
278 {
279 load();
280
281 // Query mode is never collaborative.
282 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "irccd", ""});
283
284 auto cmd = server_->cqueue().back();
285
286 BOOST_TEST(cmd["command"].get<std::string>() == "message");
287 BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
288 BOOST_TEST(cmd["message"].get<std::string>() == "start=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:_ _ _");
289
290 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "irccd", "s"});
291 cmd = server_->cqueue().back();
292
293 BOOST_TEST(cmd["command"].get<std::string>() == "message");
294 BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
295 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:s _ _");
296
297 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "irccd", "k"});
298 cmd = server_->cqueue().back();
299
300 BOOST_TEST(cmd["command"].get<std::string>() == "message");
301 BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
302 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:s k _");
303
304 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "irccd", "sky"});
305 cmd = server_->cqueue().back();
306
307 BOOST_TEST(cmd["command"].get<std::string>() == "message");
308 BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
309 BOOST_TEST(cmd["message"].get<std::string>() == "win=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:sky");
310 }
311
312 BOOST_AUTO_TEST_CASE(running)
313 {
314 load();
315
316 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
317 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "y"});
318 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
319
320 auto cmd = server_->cqueue().back();
321
322 BOOST_TEST(cmd["command"].get<std::string>() == "message");
323 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
324 BOOST_TEST(cmd["message"].get<std::string>() == "running=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ y");
325 }
326
327 BOOST_AUTO_TEST_CASE(wordlist_fix_644)
328 {
329 /*
330 * To be sure that the selection use the same list, we create a list of
331 * three words that has different size to determine which one was selected.
332 *
333 * Then we run 3 games and verify that the old selection is not the same
334 * as the current.
335 *
336 * This is not very accurate but it's better than nothing.
337 */
338 load({{ "file", CMAKE_CURRENT_SOURCE_DIR "/wordlist_fix_644.conf" }});
339
340 std::unordered_map<unsigned, std::string> words{
341 { 5, "abc" },
342 { 7, "abcd" },
343 { 9, "abcde" }
344 };
345 std::unordered_set<unsigned> found;
346
347 plugin_->set_formats({
348 { "start", "#{word}" }
349 });
350
351 unsigned last, current;
352
353 // 1. Initial game + finish.
354 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
355 last = server_->cqueue().back()["message"].get<std::string>().length();
356 found.insert(last);
357 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", words[last]});
358
359 // 2. Current must not be the last one.
360 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
361 current = server_->cqueue().back()["message"].get<std::string>().length();
362
363 BOOST_TEST(last != current);
364 BOOST_TEST(0U == found.count(current));
365
366 found.insert(current);
367 last = current;
368 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", words[current]});
369
370 // 3. Last word must be the one that is kept into the map.
371 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
372 current = server_->cqueue().back()["message"].get<std::string>().length();
373
374 BOOST_TEST(last != current);
375 BOOST_TEST(0U == found.count(current));
376 }
377
378 BOOST_AUTO_TEST_SUITE_END()
379
380 } // !irccd