comparison tests/src/plugin-hangman/main.cpp @ 581:a51b5dd5b761

Tests: put everything in src/
author David Demelier <markand@malikania.fr>
date Mon, 04 Dec 2017 14:12:13 +0100
parents tests/plugin-hangman/main.cpp@3d0dbc0bee7d
children 2c3122f23a04
comparison
equal deleted inserted replaced
580:2e16c3623531 581:a51b5dd5b761
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/irccd.hpp>
26 #include <irccd/server.hpp>
27
28 #include "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
114 BOOST_AUTO_TEST_CASE(found)
115 {
116 load({{ "collaborative", "false" }});
117
118 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
119 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
120
121 auto cmd = server_->cqueue().back();
122
123 BOOST_TEST(cmd["command"].get<std::string>() == "message");
124 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
125 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
126 }
127
128 BOOST_AUTO_TEST_CASE(start)
129 {
130 load();
131
132 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
133
134 auto cmd = server_->cqueue().back();
135
136 BOOST_TEST(cmd["command"].get<std::string>() == "message");
137 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
138 BOOST_TEST(cmd["message"].get<std::string>() == "start=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ _");
139 }
140
141 BOOST_AUTO_TEST_CASE(win1)
142 {
143 load({{ "collaborative", "false" }});
144
145 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
146 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
147 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "k"});
148 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "y"});
149
150 auto cmd = server_->cqueue().back();
151
152 BOOST_TEST(cmd["command"].get<std::string>() == "message");
153 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
154 BOOST_TEST(cmd["message"].get<std::string>() == "win=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky");
155 }
156
157 BOOST_AUTO_TEST_CASE(win2)
158 {
159 load({{ "collaborative", "false" }});
160
161 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
162 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", "sky"});
163
164 auto cmd = server_->cqueue().back();
165
166 BOOST_TEST(cmd["command"].get<std::string>() == "message");
167 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
168 BOOST_TEST(cmd["message"].get<std::string>() == "win=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky");
169 }
170
171 BOOST_AUTO_TEST_CASE(wrong_letter)
172 {
173 load();
174
175 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
176 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "x"});
177
178 auto cmd = server_->cqueue().back();
179
180 BOOST_TEST(cmd["command"].get<std::string>() == "message");
181 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
182 BOOST_TEST(cmd["message"].get<std::string>() == "wrong-letter=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:x");
183 }
184
185 BOOST_AUTO_TEST_CASE(wrongWord)
186 {
187 load();
188
189 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
190 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", "cheese"});
191
192 auto cmd = server_->cqueue().back();
193
194 BOOST_TEST(cmd["command"].get<std::string>() == "message");
195 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
196 BOOST_TEST(cmd["message"].get<std::string>() == "wrong-word=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:cheese");
197 }
198
199 BOOST_AUTO_TEST_CASE(collaborative_disabled)
200 {
201 // Disable collaborative mode.
202 load({{ "collaborative", "false" }});
203
204 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
205 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
206
207 auto cmd = server_->cqueue().back();
208
209 BOOST_TEST(cmd["command"].get<std::string>() == "message");
210 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
211 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
212
213 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "k"});
214 cmd = server_->cqueue().back();
215
216 BOOST_TEST(cmd["command"].get<std::string>() == "message");
217 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
218 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s k _");
219 }
220
221 BOOST_AUTO_TEST_CASE(collaborative_enabled)
222 {
223 // Enable collaborative mode.
224 load({{ "collaborative", "true" }});
225
226 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
227 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
228
229 auto cmd = server_->cqueue().back();
230
231 BOOST_TEST(cmd["command"].get<std::string>() == "message");
232 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
233 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
234
235 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "k"});
236 cmd = server_->cqueue().back();
237
238 BOOST_TEST(cmd["command"].get<std::string>() == "message");
239 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
240 BOOST_TEST(cmd["message"].get<std::string>() == "wrong-player=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:k");
241
242 plugin_->on_message(irccd_, {server_, "francis!francis@localhost", "#hangman", "k"});
243 cmd = server_->cqueue().back();
244
245 BOOST_TEST(cmd["command"].get<std::string>() == "message");
246 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
247 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:francis!francis@localhost:francis:s k _");
248 }
249
250 BOOST_AUTO_TEST_CASE(case_fix_642)
251 {
252 load();
253
254 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
255 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#HANGMAN", "s"});
256
257 auto cmd = server_->cqueue().back();
258
259 BOOST_TEST(cmd["command"].get<std::string>() == "message");
260 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
261 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
262
263 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#HaNGMaN", "k"});
264 cmd = server_->cqueue().back();
265
266 BOOST_TEST(cmd["command"].get<std::string>() == "message");
267 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
268 BOOST_TEST(cmd["message"].get<std::string>() == "wrong-player=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:k");
269
270 plugin_->on_message(irccd_, {server_, "francis!francis@localhost", "#hAngmAn", "k"});
271 cmd = server_->cqueue().back();
272
273 BOOST_TEST(cmd["command"].get<std::string>() == "message");
274 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
275 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:francis!francis@localhost:francis:s k _");
276 }
277
278 BOOST_AUTO_TEST_CASE(query)
279 {
280 load();
281
282 // Query mode is never collaborative.
283 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "irccd", ""});
284
285 auto cmd = server_->cqueue().back();
286
287 BOOST_TEST(cmd["command"].get<std::string>() == "message");
288 BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
289 BOOST_TEST(cmd["message"].get<std::string>() == "start=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:_ _ _");
290
291 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "irccd", "s"});
292 cmd = server_->cqueue().back();
293
294 BOOST_TEST(cmd["command"].get<std::string>() == "message");
295 BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
296 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:s _ _");
297
298 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "irccd", "k"});
299 cmd = server_->cqueue().back();
300
301 BOOST_TEST(cmd["command"].get<std::string>() == "message");
302 BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
303 BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:s k _");
304
305 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "irccd", "sky"});
306 cmd = server_->cqueue().back();
307
308 BOOST_TEST(cmd["command"].get<std::string>() == "message");
309 BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
310 BOOST_TEST(cmd["message"].get<std::string>() == "win=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:sky");
311 }
312
313 BOOST_AUTO_TEST_CASE(running)
314 {
315 load();
316
317 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
318 plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "y"});
319 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
320
321 auto cmd = server_->cqueue().back();
322
323 BOOST_TEST(cmd["command"].get<std::string>() == "message");
324 BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
325 BOOST_TEST(cmd["message"].get<std::string>() == "running=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ y");
326 }
327
328 BOOST_AUTO_TEST_CASE(wordlist_fix_644)
329 {
330 /*
331 * To be sure that the selection use the same list, we create a list of
332 * three words that has different size to determine which one was selected.
333 *
334 * Then we run 3 games and verify that the old selection is not the same
335 * as the current.
336 *
337 * This is not very accurate but it's better than nothing.
338 */
339 load({{ "file", CMAKE_CURRENT_SOURCE_DIR "/wordlist_fix_644.conf" }});
340
341 std::unordered_map<unsigned, std::string> words{
342 { 5, "abc" },
343 { 7, "abcd" },
344 { 9, "abcde" }
345 };
346 std::unordered_set<unsigned> found;
347
348 plugin_->set_formats({
349 { "start", "#{word}" }
350 });
351
352 unsigned last, current;
353
354 // 1. Initial game + finish.
355 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
356 last = server_->cqueue().back()["message"].get<std::string>().length();
357 found.insert(last);
358 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", words[last]});
359
360 // 2. Current must not be the last one.
361 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
362 current = server_->cqueue().back()["message"].get<std::string>().length();
363
364 BOOST_TEST(last != current);
365 BOOST_TEST(0U == found.count(current));
366
367 found.insert(current);
368 last = current;
369 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", words[current]});
370
371 // 3. Last word must be the one that is kept into the map.
372 plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
373 current = server_->cqueue().back()["message"].get<std::string>().length();
374
375 BOOST_TEST(last != current);
376 BOOST_TEST(0U == found.count(current));
377 }
378
379 BOOST_AUTO_TEST_SUITE_END()
380
381 } // !irccd