changeset 736:49b7c7660a00

Tests: use structured bindings in irccdctl
author David Demelier <markand@malikania.fr>
date Tue, 24 Jul 2018 22:14:00 +0200
parents 64839725f346
children 190b16cfa848
files tests/src/irccdctl/cli-plugin-config/main.cpp tests/src/irccdctl/cli-plugin-info/main.cpp tests/src/irccdctl/cli-plugin-list/main.cpp tests/src/irccdctl/cli-plugin-load/main.cpp tests/src/irccdctl/cli-plugin-reload/main.cpp tests/src/irccdctl/cli-plugin-unload/main.cpp tests/src/irccdctl/cli-rule-add/main.cpp tests/src/irccdctl/cli-rule-edit/main.cpp tests/src/irccdctl/cli-rule-info/main.cpp tests/src/irccdctl/cli-rule-list/main.cpp tests/src/irccdctl/cli-rule-move/main.cpp tests/src/irccdctl/cli-rule-remove/main.cpp
diffstat 12 files changed, 298 insertions(+), 299 deletions(-) [+]
line wrap: on
line diff
--- a/tests/src/irccdctl/cli-plugin-config/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-plugin-config/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -73,20 +73,20 @@
 
     // First, configure. No output yet
     {
-        const auto result = exec({ "plugin-config", "conf2", "verbose", "false" });
+        const auto [out, err] = exec({ "plugin-config", "conf2", "verbose", "false" });
 
         // no output yet.
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     // Get the newly created value.
     {
-        const auto result = exec({ "plugin-config", "conf2", "verbose" });
+        const auto [out, err] = exec({ "plugin-config", "conf2", "verbose" });
 
-        BOOST_TEST(result.first.size() == 1U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0] == "false");
+        BOOST_TEST(out.size() == 1U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0] == "false");
     }
 }
 
@@ -94,12 +94,12 @@
 {
     start();
 
-    const auto result = exec({ "plugin-config", "conf1" });
+    const auto [out, err] = exec({ "plugin-config", "conf1" });
 
-    BOOST_TEST(result.first.size() == 2U);
-    BOOST_TEST(result.second.size() == 0U);
-    BOOST_TEST(result.first[0] == "v1               : 123");
-    BOOST_TEST(result.first[1] == "v2               : 456");
+    BOOST_TEST(out.size() == 2U);
+    BOOST_TEST(err.size() == 0U);
+    BOOST_TEST(out[0] == "v1               : 123");
+    BOOST_TEST(out[1] == "v2               : 456");
 }
 
 BOOST_AUTO_TEST_SUITE_END()
--- a/tests/src/irccdctl/cli-plugin-info/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-plugin-info/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -67,14 +67,14 @@
     irccd_.plugins().add(std::move(p));
     start();
 
-    const auto result = exec({ "plugin-info", "test" });
+    const auto [out, err] = exec({ "plugin-info", "test" });
 
-    BOOST_TEST(result.first.size() == 4U);
-    BOOST_TEST(result.second.size() == 0U);
-    BOOST_TEST(result.first[0] == "Author         : David Demelier <markand@malikania.fr>");
-    BOOST_TEST(result.first[1] == "License        : ISC");
-    BOOST_TEST(result.first[2] == "Summary        : foo");
-    BOOST_TEST(result.first[3] == "Version        : 0.0");
+    BOOST_TEST(out.size() == 4U);
+    BOOST_TEST(err.size() == 0U);
+    BOOST_TEST(out[0] == "Author         : David Demelier <markand@malikania.fr>");
+    BOOST_TEST(out[1] == "License        : ISC");
+    BOOST_TEST(out[2] == "Summary        : foo");
+    BOOST_TEST(out[3] == "Version        : 0.0");
 }
 
 BOOST_AUTO_TEST_SUITE_END()
--- a/tests/src/irccdctl/cli-plugin-list/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-plugin-list/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -46,12 +46,12 @@
     irccd_.plugins().add(std::make_unique<sample>("p2"));
     start();
 
-    const auto result = exec({ "plugin-list" });
+    const auto [out, err] = exec({ "plugin-list" });
 
-    BOOST_TEST(result.first.size() == 2U);
-    BOOST_TEST(result.second.size() == 0U);
-    BOOST_TEST(result.first[0] == "p1");
-    BOOST_TEST(result.first[1] == "p2");
+    BOOST_TEST(out.size() == 2U);
+    BOOST_TEST(err.size() == 0U);
+    BOOST_TEST(out[0] == "p1");
+    BOOST_TEST(out[1] == "p2");
 }
 
 BOOST_AUTO_TEST_SUITE_END()
--- a/tests/src/irccdctl/cli-plugin-load/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-plugin-load/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -66,21 +66,21 @@
 
     // Load a plugin first.
     {
-        const auto result = exec({ "plugin-load", "test-cli-plugin-load" });
+        const auto [out, err] = exec({ "plugin-load", "sample" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     // Get the new list of plugins.
     {
-        const auto result = exec({ "plugin-list" });
+        const auto [out, err] = exec({ "plugin-list" });
 
-        BOOST_TEST(result.first.size() == 3U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0] == "p1");
-        BOOST_TEST(result.first[1] == "p2");
-        BOOST_TEST(result.first[2] == "test-cli-plugin-load");
+        BOOST_TEST(out.size() == 3U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0] == "p1");
+        BOOST_TEST(out[1] == "p2");
+        BOOST_TEST(out[2] == "sample");
     }
 }
 
--- a/tests/src/irccdctl/cli-plugin-reload/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-plugin-reload/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -20,15 +20,14 @@
 #include <boost/test/unit_test.hpp>
 
 #include <irccd/test/plugin_cli_test.hpp>
+#include <irccd/test/mock.hpp>
 
 namespace irccd {
 
 namespace {
 
-class reloadable_plugin : public plugin {
+class reloadable_plugin : public mock, public plugin {
 public:
-    bool reloaded{false};
-
     reloadable_plugin()
         : plugin("test")
     {
@@ -41,7 +40,7 @@
 
     void handle_reload(irccd&) override
     {
-        reloaded = true;
+        push("handle_reload");
     }
 };
 
@@ -54,11 +53,11 @@
     irccd_.plugins().add(plugin);
     start();
 
-    const auto result = exec({ "plugin-reload", "test" });
+    const auto [out, err] = exec({ "plugin-reload", "test" });
 
-    BOOST_TEST(result.first.size() == 0U);
-    BOOST_TEST(result.second.size() == 0U);
-    BOOST_TEST(plugin->reloaded);
+    BOOST_TEST(out.size() == 0U);
+    BOOST_TEST(err.size() == 0U);
+    BOOST_TEST(plugin->find("handle_reload").size() == 1U);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
--- a/tests/src/irccdctl/cli-plugin-unload/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-plugin-unload/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -20,15 +20,14 @@
 #include <boost/test/unit_test.hpp>
 
 #include <irccd/test/plugin_cli_test.hpp>
+#include <irccd/test/mock.hpp>
 
 namespace irccd {
 
 namespace {
 
-class unloadable_plugin : public plugin {
+class unloadable_plugin : public mock, public plugin {
 public:
-    bool unloaded{false};
-
     unloadable_plugin()
         : plugin("test")
     {
@@ -41,7 +40,7 @@
 
     void handle_unload(irccd&) override
     {
-        unloaded = true;
+        push("handle_unload");
     }
 };
 
@@ -54,10 +53,11 @@
     irccd_.plugins().add(plugin);
     start();
 
-    const auto result = exec({ "plugin-unload", "test" });
+    const auto [out, err] = exec({ "plugin-unload", "test" });
 
-    BOOST_TEST(result.first.size() == 0U);
-    BOOST_TEST(result.second.size() == 0U);
+    BOOST_TEST(out.size() == 0U);
+    BOOST_TEST(err.size() == 0U);
+    BOOST_TEST(plugin->find("handle_unload").size() == 1U);
     BOOST_TEST(!irccd_.plugins().has("p"));
 }
 
--- a/tests/src/irccdctl/cli-rule-add/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-rule-add/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -32,7 +32,7 @@
     start();
 
     {
-        const auto result = exec({ "rule-add",
+        const auto [out, err] = exec({ "rule-add",
             "-c c1",        "--add-channel c2",
             "-e onMessage", "--add-event onCommand",
             "-p p1",        "--add-plugin p2",
@@ -40,21 +40,21 @@
             "drop"
         });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s1 s2 ");
-        BOOST_TEST(result.first[2]  == "channels:    c1 c2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p1 p2 ");
-        BOOST_TEST(result.first[4]  == "events:      onCommand onMessage ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s1 s2 ");
+        BOOST_TEST(out[2]  == "channels:    c1 c2 ");
+        BOOST_TEST(out[3]  == "plugins:     p1 p2 ");
+        BOOST_TEST(out[4]  == "events:      onCommand onMessage ");
+        BOOST_TEST(out[5]  == "action:      drop");
     }
 }
 
@@ -63,23 +63,23 @@
     start();
 
     {
-        const auto result = exec({ "rule-add", "-s s1", "--add-server s2", "drop" });
+        const auto [out, err] = exec({ "rule-add", "-s s1", "--add-server s2", "drop" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s1 s2 ");
-        BOOST_TEST(result.first[2]  == "channels:    ");
-        BOOST_TEST(result.first[3]  == "plugins:     ");
-        BOOST_TEST(result.first[4]  == "events:      ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s1 s2 ");
+        BOOST_TEST(out[2]  == "channels:    ");
+        BOOST_TEST(out[3]  == "plugins:     ");
+        BOOST_TEST(out[4]  == "events:      ");
+        BOOST_TEST(out[5]  == "action:      drop");
     }
 }
 
@@ -88,23 +88,23 @@
     start();
 
     {
-        const auto result = exec({ "rule-add", "-c c1", "--add-channel c2", "drop" });
+        const auto [out, err] = exec({ "rule-add", "-c c1", "--add-channel c2", "drop" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     ");
-        BOOST_TEST(result.first[2]  == "channels:    c1 c2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     ");
-        BOOST_TEST(result.first[4]  == "events:      ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     ");
+        BOOST_TEST(out[2]  == "channels:    c1 c2 ");
+        BOOST_TEST(out[3]  == "plugins:     ");
+        BOOST_TEST(out[4]  == "events:      ");
+        BOOST_TEST(out[5]  == "action:      drop");
     }
 }
 
@@ -113,23 +113,23 @@
     start();
 
     {
-        const auto result = exec({ "rule-add", "-p p1", "--add-plugin p2", "drop" });
+        const auto [out, err] = exec({ "rule-add", "-p p1", "--add-plugin p2", "drop" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     ");
-        BOOST_TEST(result.first[2]  == "channels:    ");
-        BOOST_TEST(result.first[3]  == "plugins:     p1 p2 ");
-        BOOST_TEST(result.first[4]  == "events:      ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     ");
+        BOOST_TEST(out[2]  == "channels:    ");
+        BOOST_TEST(out[3]  == "plugins:     p1 p2 ");
+        BOOST_TEST(out[4]  == "events:      ");
+        BOOST_TEST(out[5]  == "action:      drop");
     }
 }
 
@@ -138,23 +138,23 @@
     start();
 
     {
-        const auto result = exec({ "rule-add", "-e onMessage", "--add-event onCommand", "drop" });
+        const auto [out, err] = exec({ "rule-add", "-e onMessage", "--add-event onCommand", "drop" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     ");
-        BOOST_TEST(result.first[2]  == "channels:    ");
-        BOOST_TEST(result.first[3]  == "plugins:     ");
-        BOOST_TEST(result.first[4]  == "events:      onCommand onMessage ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     ");
+        BOOST_TEST(out[2]  == "channels:    ");
+        BOOST_TEST(out[3]  == "plugins:     ");
+        BOOST_TEST(out[4]  == "events:      onCommand onMessage ");
+        BOOST_TEST(out[5]  == "action:      drop");
     }
 }
 
--- a/tests/src/irccdctl/cli-rule-edit/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-rule-edit/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -47,27 +47,27 @@
     start();
 
     {
-        const auto result = exec({ "rule-edit",
+        const auto [out, err] = exec({ "rule-edit",
             "-s ts1",   "--add-server ts2",
             "-S s1",    "--remove-server s2",
             "0"
         });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     ts1 ts2 ");
-        BOOST_TEST(result.first[2]  == "channels:    c1 c2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p1 p2 ");
-        BOOST_TEST(result.first[4]  == "events:      onCommand onMessage ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     ts1 ts2 ");
+        BOOST_TEST(out[2]  == "channels:    c1 c2 ");
+        BOOST_TEST(out[3]  == "plugins:     p1 p2 ");
+        BOOST_TEST(out[4]  == "events:      onCommand onMessage ");
+        BOOST_TEST(out[5]  == "action:      drop");
     }
 }
 
@@ -76,27 +76,27 @@
     start();
 
     {
-        const auto result = exec({ "rule-edit",
+        const auto [out, err] = exec({ "rule-edit",
             "-c tc1",   "--add-channel tc2",
             "-C c1",    "--remove-channel c2",
             "0"
         });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s1 s2 ");
-        BOOST_TEST(result.first[2]  == "channels:    tc1 tc2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p1 p2 ");
-        BOOST_TEST(result.first[4]  == "events:      onCommand onMessage ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s1 s2 ");
+        BOOST_TEST(out[2]  == "channels:    tc1 tc2 ");
+        BOOST_TEST(out[3]  == "plugins:     p1 p2 ");
+        BOOST_TEST(out[4]  == "events:      onCommand onMessage ");
+        BOOST_TEST(out[5]  == "action:      drop");
     }
 }
 
@@ -105,27 +105,27 @@
     start();
 
     {
-        const auto result = exec({ "rule-edit",
+        const auto [out, err] = exec({ "rule-edit",
             "-p tp1",   "--add-plugin tp2",
             "-P p1",    "--remove-plugin p2",
             "0"
         });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s1 s2 ");
-        BOOST_TEST(result.first[2]  == "channels:    c1 c2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     tp1 tp2 ");
-        BOOST_TEST(result.first[4]  == "events:      onCommand onMessage ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s1 s2 ");
+        BOOST_TEST(out[2]  == "channels:    c1 c2 ");
+        BOOST_TEST(out[3]  == "plugins:     tp1 tp2 ");
+        BOOST_TEST(out[4]  == "events:      onCommand onMessage ");
+        BOOST_TEST(out[5]  == "action:      drop");
     }
 }
 
@@ -134,27 +134,27 @@
     start();
 
     {
-        const auto result = exec({ "rule-edit",
+        const auto [out, err] = exec({ "rule-edit",
             "-e onKick",    "--add-event onNickname",
             "-E onMessage", "--remove-event onCommand",
             "0"
         });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s1 s2 ");
-        BOOST_TEST(result.first[2]  == "channels:    c1 c2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p1 p2 ");
-        BOOST_TEST(result.first[4]  == "events:      onKick onNickname ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s1 s2 ");
+        BOOST_TEST(out[2]  == "channels:    c1 c2 ");
+        BOOST_TEST(out[3]  == "plugins:     p1 p2 ");
+        BOOST_TEST(out[4]  == "events:      onKick onNickname ");
+        BOOST_TEST(out[5]  == "action:      drop");
     }
 }
 
@@ -163,23 +163,23 @@
     start();
 
     {
-        const auto result = exec({ "rule-edit", "-a accept", "0" });
+        const auto [out, err] = exec({ "rule-edit", "-a accept", "0" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s1 s2 ");
-        BOOST_TEST(result.first[2]  == "channels:    c1 c2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p1 p2 ");
-        BOOST_TEST(result.first[4]  == "events:      onCommand onMessage ");
-        BOOST_TEST(result.first[5]  == "action:      accept");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s1 s2 ");
+        BOOST_TEST(out[2]  == "channels:    c1 c2 ");
+        BOOST_TEST(out[3]  == "plugins:     p1 p2 ");
+        BOOST_TEST(out[4]  == "events:      onCommand onMessage ");
+        BOOST_TEST(out[5]  == "action:      accept");
     }
 }
 
@@ -188,23 +188,23 @@
     start();
 
     {
-        const auto result = exec({ "rule-edit", "--action accept", "0" });
+        const auto [out, err] = exec({ "rule-edit", "--action accept", "0" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 7U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s1 s2 ");
-        BOOST_TEST(result.first[2]  == "channels:    c1 c2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p1 p2 ");
-        BOOST_TEST(result.first[4]  == "events:      onCommand onMessage ");
-        BOOST_TEST(result.first[5]  == "action:      accept");
+        BOOST_TEST(out.size() == 7U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s1 s2 ");
+        BOOST_TEST(out[2]  == "channels:    c1 c2 ");
+        BOOST_TEST(out[3]  == "plugins:     p1 p2 ");
+        BOOST_TEST(out[4]  == "events:      onCommand onMessage ");
+        BOOST_TEST(out[5]  == "action:      accept");
     }
 }
 
--- a/tests/src/irccdctl/cli-rule-info/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-rule-info/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -39,16 +39,16 @@
     });
     start();
 
-    const auto result = exec({ "rule-info", "0" });
+    const auto [out, err] = exec({ "rule-info", "0" });
 
-    BOOST_TEST(result.first.size() == 7U);
-    BOOST_TEST(result.second.size() == 0U);
-    BOOST_TEST(result.first[0]  == "rule:        0");
-    BOOST_TEST(result.first[1]  == "servers:     s1 s2 ");
-    BOOST_TEST(result.first[2]  == "channels:    c1 c2 ");
-    BOOST_TEST(result.first[3]  == "plugins:     p1 p2 ");
-    BOOST_TEST(result.first[4]  == "events:      onCommand onMessage ");
-    BOOST_TEST(result.first[5]  == "action:      drop");
+    BOOST_TEST(out.size() == 7U);
+    BOOST_TEST(err.size() == 0U);
+    BOOST_TEST(out[0]  == "rule:        0");
+    BOOST_TEST(out[1]  == "servers:     s1 s2 ");
+    BOOST_TEST(out[2]  == "channels:    c1 c2 ");
+    BOOST_TEST(out[3]  == "plugins:     p1 p2 ");
+    BOOST_TEST(out[4]  == "events:      onCommand onMessage ");
+    BOOST_TEST(out[5]  == "action:      drop");
 }
 
 BOOST_AUTO_TEST_SUITE_END()
--- a/tests/src/irccdctl/cli-rule-list/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-rule-list/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -39,16 +39,16 @@
     });
     start();
 
-    const auto result = exec({ "rule-list" });
+    const auto [out, err] = exec({ "rule-list" });
 
-    BOOST_TEST(result.first.size() == 7U);
-    BOOST_TEST(result.second.size() == 0U);
-    BOOST_TEST(result.first[0]  == "rule:        0");
-    BOOST_TEST(result.first[1]  == "servers:     s1 s2 ");
-    BOOST_TEST(result.first[2]  == "channels:    c1 c2 ");
-    BOOST_TEST(result.first[3]  == "plugins:     p1 p2 ");
-    BOOST_TEST(result.first[4]  == "events:      onCommand onMessage ");
-    BOOST_TEST(result.first[5]  == "action:      drop");
+    BOOST_TEST(out.size() == 7U);
+    BOOST_TEST(err.size() == 0U);
+    BOOST_TEST(out[0]  == "rule:        0");
+    BOOST_TEST(out[1]  == "servers:     s1 s2 ");
+    BOOST_TEST(out[2]  == "channels:    c1 c2 ");
+    BOOST_TEST(out[3]  == "plugins:     p1 p2 ");
+    BOOST_TEST(out[4]  == "events:      onCommand onMessage ");
+    BOOST_TEST(out[5]  == "action:      drop");
 }
 
 BOOST_AUTO_TEST_SUITE_END()
--- a/tests/src/irccdctl/cli-rule-move/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-rule-move/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -63,38 +63,38 @@
     start();
 
     {
-        const auto result = exec({ "rule-move", "0", "1" });
+        const auto [out, err] = exec({ "rule-move", "0", "1" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 21U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s2 ");
-        BOOST_TEST(result.first[2]  == "channels:    c2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p2 ");
-        BOOST_TEST(result.first[4]  == "events:      onCommand ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
-        BOOST_TEST(result.first[6]  == "");
-        BOOST_TEST(result.first[7]  == "rule:        1");
-        BOOST_TEST(result.first[8]  == "servers:     s1 ");
-        BOOST_TEST(result.first[9]  == "channels:    c1 ");
-        BOOST_TEST(result.first[10] == "plugins:     p1 ");
-        BOOST_TEST(result.first[11] == "events:      onTopic ");
-        BOOST_TEST(result.first[12] == "action:      accept");
-        BOOST_TEST(result.first[13] == "");
-        BOOST_TEST(result.first[14] == "rule:        2");
-        BOOST_TEST(result.first[15] == "servers:     s3 ");
-        BOOST_TEST(result.first[16] == "channels:    c3 ");
-        BOOST_TEST(result.first[17] == "plugins:     p3 ");
-        BOOST_TEST(result.first[18] == "events:      onMessage ");
-        BOOST_TEST(result.first[19] == "action:      accept");
-        BOOST_TEST(result.first[20] == "");
+        BOOST_TEST(out.size() == 21U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s2 ");
+        BOOST_TEST(out[2]  == "channels:    c2 ");
+        BOOST_TEST(out[3]  == "plugins:     p2 ");
+        BOOST_TEST(out[4]  == "events:      onCommand ");
+        BOOST_TEST(out[5]  == "action:      drop");
+        BOOST_TEST(out[6]  == "");
+        BOOST_TEST(out[7]  == "rule:        1");
+        BOOST_TEST(out[8]  == "servers:     s1 ");
+        BOOST_TEST(out[9]  == "channels:    c1 ");
+        BOOST_TEST(out[10] == "plugins:     p1 ");
+        BOOST_TEST(out[11] == "events:      onTopic ");
+        BOOST_TEST(out[12] == "action:      accept");
+        BOOST_TEST(out[13] == "");
+        BOOST_TEST(out[14] == "rule:        2");
+        BOOST_TEST(out[15] == "servers:     s3 ");
+        BOOST_TEST(out[16] == "channels:    c3 ");
+        BOOST_TEST(out[17] == "plugins:     p3 ");
+        BOOST_TEST(out[18] == "events:      onMessage ");
+        BOOST_TEST(out[19] == "action:      accept");
+        BOOST_TEST(out[20] == "");
     }
 }
 
@@ -103,38 +103,38 @@
     start();
 
     {
-        const auto result = exec({ "rule-move", "2", "0" });
+        const auto [out, err] = exec({ "rule-move", "2", "0" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 21U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s3 ");
-        BOOST_TEST(result.first[2]  == "channels:    c3 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p3 ");
-        BOOST_TEST(result.first[4]  == "events:      onMessage ");
-        BOOST_TEST(result.first[5]  == "action:      accept");
-        BOOST_TEST(result.first[6]  == "");
-        BOOST_TEST(result.first[7]  == "rule:        1");
-        BOOST_TEST(result.first[8]  == "servers:     s1 ");
-        BOOST_TEST(result.first[9]  == "channels:    c1 ");
-        BOOST_TEST(result.first[10] == "plugins:     p1 ");
-        BOOST_TEST(result.first[11] == "events:      onTopic ");
-        BOOST_TEST(result.first[12] == "action:      accept");
-        BOOST_TEST(result.first[13] == "");
-        BOOST_TEST(result.first[14] == "rule:        2");
-        BOOST_TEST(result.first[15] == "servers:     s2 ");
-        BOOST_TEST(result.first[16] == "channels:    c2 ");
-        BOOST_TEST(result.first[17] == "plugins:     p2 ");
-        BOOST_TEST(result.first[18] == "events:      onCommand ");
-        BOOST_TEST(result.first[19] == "action:      drop");
-        BOOST_TEST(result.first[20] == "");
+        BOOST_TEST(out.size() == 21U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s3 ");
+        BOOST_TEST(out[2]  == "channels:    c3 ");
+        BOOST_TEST(out[3]  == "plugins:     p3 ");
+        BOOST_TEST(out[4]  == "events:      onMessage ");
+        BOOST_TEST(out[5]  == "action:      accept");
+        BOOST_TEST(out[6]  == "");
+        BOOST_TEST(out[7]  == "rule:        1");
+        BOOST_TEST(out[8]  == "servers:     s1 ");
+        BOOST_TEST(out[9]  == "channels:    c1 ");
+        BOOST_TEST(out[10] == "plugins:     p1 ");
+        BOOST_TEST(out[11] == "events:      onTopic ");
+        BOOST_TEST(out[12] == "action:      accept");
+        BOOST_TEST(out[13] == "");
+        BOOST_TEST(out[14] == "rule:        2");
+        BOOST_TEST(out[15] == "servers:     s2 ");
+        BOOST_TEST(out[16] == "channels:    c2 ");
+        BOOST_TEST(out[17] == "plugins:     p2 ");
+        BOOST_TEST(out[18] == "events:      onCommand ");
+        BOOST_TEST(out[19] == "action:      drop");
+        BOOST_TEST(out[20] == "");
     }
 }
 
@@ -143,38 +143,38 @@
     start();
 
     {
-        const auto result = exec({ "rule-move", "2", "2" });
+        const auto [out, err] = exec({ "rule-move", "2", "2" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 21U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s1 ");
-        BOOST_TEST(result.first[2]  == "channels:    c1 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p1 ");
-        BOOST_TEST(result.first[4]  == "events:      onTopic ");
-        BOOST_TEST(result.first[5]  == "action:      accept");
-        BOOST_TEST(result.first[6]  == "");
-        BOOST_TEST(result.first[7]  == "rule:        1");
-        BOOST_TEST(result.first[8]  == "servers:     s2 ");
-        BOOST_TEST(result.first[9]  == "channels:    c2 ");
-        BOOST_TEST(result.first[10] == "plugins:     p2 ");
-        BOOST_TEST(result.first[11] == "events:      onCommand ");
-        BOOST_TEST(result.first[12] == "action:      drop");
-        BOOST_TEST(result.first[13] == "");
-        BOOST_TEST(result.first[14] == "rule:        2");
-        BOOST_TEST(result.first[15] == "servers:     s3 ");
-        BOOST_TEST(result.first[16] == "channels:    c3 ");
-        BOOST_TEST(result.first[17] == "plugins:     p3 ");
-        BOOST_TEST(result.first[18] == "events:      onMessage ");
-        BOOST_TEST(result.first[19] == "action:      accept");
-        BOOST_TEST(result.first[20] == "");
+        BOOST_TEST(out.size() == 21U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s1 ");
+        BOOST_TEST(out[2]  == "channels:    c1 ");
+        BOOST_TEST(out[3]  == "plugins:     p1 ");
+        BOOST_TEST(out[4]  == "events:      onTopic ");
+        BOOST_TEST(out[5]  == "action:      accept");
+        BOOST_TEST(out[6]  == "");
+        BOOST_TEST(out[7]  == "rule:        1");
+        BOOST_TEST(out[8]  == "servers:     s2 ");
+        BOOST_TEST(out[9]  == "channels:    c2 ");
+        BOOST_TEST(out[10] == "plugins:     p2 ");
+        BOOST_TEST(out[11] == "events:      onCommand ");
+        BOOST_TEST(out[12] == "action:      drop");
+        BOOST_TEST(out[13] == "");
+        BOOST_TEST(out[14] == "rule:        2");
+        BOOST_TEST(out[15] == "servers:     s3 ");
+        BOOST_TEST(out[16] == "channels:    c3 ");
+        BOOST_TEST(out[17] == "plugins:     p3 ");
+        BOOST_TEST(out[18] == "events:      onMessage ");
+        BOOST_TEST(out[19] == "action:      accept");
+        BOOST_TEST(out[20] == "");
     }
 }
 
--- a/tests/src/irccdctl/cli-rule-remove/main.cpp	Tue Jul 24 22:00:00 2018 +0200
+++ b/tests/src/irccdctl/cli-rule-remove/main.cpp	Tue Jul 24 22:14:00 2018 +0200
@@ -63,31 +63,31 @@
     start();
 
     {
-        const auto result = exec({ "rule-remove", "0" });
+        const auto [out, err] = exec({ "rule-remove", "0" });
 
-        BOOST_TEST(result.first.size() == 0U);
-        BOOST_TEST(result.second.size() == 0U);
+        BOOST_TEST(out.size() == 0U);
+        BOOST_TEST(err.size() == 0U);
     }
 
     {
-        const auto result = exec({ "rule-list" });
+        const auto [out, err] = exec({ "rule-list" });
 
-        BOOST_TEST(result.first.size() == 14U);
-        BOOST_TEST(result.second.size() == 0U);
-        BOOST_TEST(result.first[0]  == "rule:        0");
-        BOOST_TEST(result.first[1]  == "servers:     s2 ");
-        BOOST_TEST(result.first[2]  == "channels:    c2 ");
-        BOOST_TEST(result.first[3]  == "plugins:     p2 ");
-        BOOST_TEST(result.first[4]  == "events:      onCommand ");
-        BOOST_TEST(result.first[5]  == "action:      drop");
-        BOOST_TEST(result.first[6]  == "");
-        BOOST_TEST(result.first[7]  == "rule:        1");
-        BOOST_TEST(result.first[8]  == "servers:     s3 ");
-        BOOST_TEST(result.first[9]  == "channels:    c3 ");
-        BOOST_TEST(result.first[10] == "plugins:     p3 ");
-        BOOST_TEST(result.first[11] == "events:      onMessage ");
-        BOOST_TEST(result.first[12] == "action:      accept");
-        BOOST_TEST(result.first[13] == "");
+        BOOST_TEST(out.size() == 14U);
+        BOOST_TEST(err.size() == 0U);
+        BOOST_TEST(out[0]  == "rule:        0");
+        BOOST_TEST(out[1]  == "servers:     s2 ");
+        BOOST_TEST(out[2]  == "channels:    c2 ");
+        BOOST_TEST(out[3]  == "plugins:     p2 ");
+        BOOST_TEST(out[4]  == "events:      onCommand ");
+        BOOST_TEST(out[5]  == "action:      drop");
+        BOOST_TEST(out[6]  == "");
+        BOOST_TEST(out[7]  == "rule:        1");
+        BOOST_TEST(out[8]  == "servers:     s3 ");
+        BOOST_TEST(out[9]  == "channels:    c3 ");
+        BOOST_TEST(out[10] == "plugins:     p3 ");
+        BOOST_TEST(out[11] == "events:      onMessage ");
+        BOOST_TEST(out[12] == "action:      accept");
+        BOOST_TEST(out[13] == "");
     }
 }