diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/src/plugins/hangman/main.cpp	Fri Dec 15 15:37:58 2017 +0100
@@ -0,0 +1,380 @@
+/*
+ * main.cpp -- test hangman plugin
+ *
+ * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <unordered_map>
+#include <unordered_set>
+
+#define BOOST_TEST_MODULE "Hangman plugin"
+#include <boost/test/unit_test.hpp>
+
+#include <irccd/daemon/irccd.hpp>
+#include <irccd/daemon/server.hpp>
+
+#include <irccd/test/plugin_test.hpp>
+
+namespace irccd {
+
+class hangman_test : public plugin_test {
+public:
+    hangman_test()
+        : plugin_test(PLUGIN_NAME, PLUGIN_PATH)
+    {
+        plugin_->set_formats({
+            { "asked", "asked=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}" },
+            { "dead", "dead=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
+            { "found", "found=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
+            { "start", "start=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
+            { "running", "running=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
+            { "win", "win=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" },
+            { "wrong-letter", "wrong-letter=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}" },
+            { "wrong-player", "wrong-player=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{letter}" },
+            { "wrong-word", "wrong-word=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{word}" }
+        });
+    }
+
+    void load(plugin_config config = {})
+    {
+        // Add file if not there.
+        if (config.count("file") == 0)
+            config.emplace("file", CMAKE_CURRENT_SOURCE_DIR "/words.conf");
+
+        plugin_->set_config(config);
+        plugin_->on_load(irccd_);
+    }
+};
+
+BOOST_FIXTURE_TEST_SUITE(hangman_test_suite, hangman_test)
+
+BOOST_AUTO_TEST_CASE(asked)
+{
+    load({{ "collaborative", "false" }});
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "start=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ _");
+
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
+
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "asked=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s");
+}
+
+BOOST_AUTO_TEST_CASE(dead)
+{
+    load({{ "collaborative", "false" }});
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "a"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "b"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "c"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "d"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "e"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "f"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "g"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "h"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "i"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "j"});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "dead=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky");
+}
+
+BOOST_AUTO_TEST_CASE(found)
+{
+    load({{ "collaborative", "false" }});
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
+}
+
+BOOST_AUTO_TEST_CASE(start)
+{
+    load();
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "start=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ _");
+}
+
+BOOST_AUTO_TEST_CASE(win1)
+{
+    load({{ "collaborative", "false" }});
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "k"});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "y"});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "win=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky");
+}
+
+BOOST_AUTO_TEST_CASE(win2)
+{
+    load({{ "collaborative", "false" }});
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", "sky"});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "win=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:sky");
+}
+
+BOOST_AUTO_TEST_CASE(wrong_letter)
+{
+    load();
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "x"});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "wrong-letter=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:x");
+}
+
+BOOST_AUTO_TEST_CASE(wrongWord)
+{
+    load();
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", "cheese"});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "wrong-word=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:cheese");
+}
+
+BOOST_AUTO_TEST_CASE(collaborative_disabled)
+{
+    // Disable collaborative mode.
+    load({{ "collaborative", "false" }});
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
+
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "k"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s k _");
+}
+
+BOOST_AUTO_TEST_CASE(collaborative_enabled)
+{
+    // Enable collaborative mode.
+    load({{ "collaborative", "true" }});
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "s"});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
+
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "k"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "wrong-player=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:k");
+
+    plugin_->on_message(irccd_, {server_, "francis!francis@localhost", "#hangman", "k"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:francis!francis@localhost:francis:s k _");
+}
+
+BOOST_AUTO_TEST_CASE(case_fix_642)
+{
+    load();
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#HANGMAN", "s"});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:s _ _");
+
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#HaNGMaN", "k"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "wrong-player=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:k");
+
+    plugin_->on_message(irccd_, {server_, "francis!francis@localhost", "#hAngmAn", "k"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:#hangman:francis!francis@localhost:francis:s k _");
+}
+
+BOOST_AUTO_TEST_CASE(query)
+{
+    load();
+
+    // Query mode is never collaborative.
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "irccd", ""});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
+    BOOST_TEST(cmd["message"].get<std::string>() == "start=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:_ _ _");
+
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "irccd", "s"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:s _ _");
+
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "irccd", "k"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
+    BOOST_TEST(cmd["message"].get<std::string>() == "found=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:s k _");
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "irccd", "sky"});
+    cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "jean!jean@localhost");
+    BOOST_TEST(cmd["message"].get<std::string>() == "win=hangman:!hangman:test:jean!jean@localhost:jean!jean@localhost:jean:sky");
+}
+
+BOOST_AUTO_TEST_CASE(running)
+{
+    load();
+
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    plugin_->on_message(irccd_, {server_, "jean!jean@localhost", "#hangman", "y"});
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+
+    auto cmd = server_->cqueue().back();
+
+    BOOST_TEST(cmd["command"].get<std::string>() == "message");
+    BOOST_TEST(cmd["target"].get<std::string>() == "#hangman");
+    BOOST_TEST(cmd["message"].get<std::string>() == "running=hangman:!hangman:test:#hangman:jean!jean@localhost:jean:_ _ y");
+}
+
+BOOST_AUTO_TEST_CASE(wordlist_fix_644)
+{
+    /*
+     * To be sure that the selection use the same list, we create a list of
+     * three words that has different size to determine which one was selected.
+     *
+     * Then we run 3 games and verify that the old selection is not the same
+     * as the current.
+     *
+     * This is not very accurate but it's better than nothing.
+     */
+    load({{ "file", CMAKE_CURRENT_SOURCE_DIR "/wordlist_fix_644.conf" }});
+
+    std::unordered_map<unsigned, std::string> words{
+        { 5, "abc"     },
+        { 7, "abcd"    },
+        { 9, "abcde"   }
+    };
+    std::unordered_set<unsigned> found;
+
+    plugin_->set_formats({
+        { "start", "#{word}" }
+    });
+
+    unsigned last, current;
+
+    // 1. Initial game + finish.
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    last = server_->cqueue().back()["message"].get<std::string>().length();
+    found.insert(last);
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", words[last]});
+
+    // 2. Current must not be the last one.
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    current = server_->cqueue().back()["message"].get<std::string>().length();
+
+    BOOST_TEST(last != current);
+    BOOST_TEST(0U == found.count(current));
+
+    found.insert(current);
+    last = current;
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", words[current]});
+
+    // 3. Last word must be the one that is kept into the map.
+    plugin_->on_command(irccd_, {server_, "jean!jean@localhost", "#hangman", ""});
+    current = server_->cqueue().back()["message"].get<std::string>().length();
+
+    BOOST_TEST(last != current);
+    BOOST_TEST(0U == found.count(current));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // !irccd