summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/io_tester.cpp30
-rw-r--r--tests/io_tester.hpp47
2 files changed, 77 insertions, 0 deletions
diff --git a/tests/io_tester.cpp b/tests/io_tester.cpp
new file mode 100644
index 0000000..19c97c9
--- /dev/null
+++ b/tests/io_tester.cpp
@@ -0,0 +1,30 @@
+#include "io_tester.hpp"
+#include "catch.hpp"
+#include <iostream>
+
+/**
+ * Directly test this class here
+ */
+TEST_CASE()
+{
+ {
+ IoTester<std::ostream> out(std::cout);
+ std::cout << "test";
+ CHECK(out.str() == "test");
+ }
+ {
+ IoTester<std::ostream> out(std::cout);
+ CHECK(out.str().empty());
+ }
+}
+
+TEST_CASE()
+{
+ {
+ IoTester<std::istream> is(std::cin);
+ is.set_string("coucou");
+ std::string res;
+ std::cin >> res;
+ CHECK(res == "coucou");
+ }
+}
diff --git a/tests/io_tester.hpp b/tests/io_tester.hpp
new file mode 100644
index 0000000..8afa6f6
--- /dev/null
+++ b/tests/io_tester.hpp
@@ -0,0 +1,47 @@
+#ifndef BIBOUMI_IO_TESTER_HPP
+#define BIBOUMI_IO_TESTER_HPP
+
+#include <ostream>
+#include <sstream>
+
+/**
+ * Redirects a stream into a streambuf until the object is destroyed.
+ */
+template <typename StreamType>
+class IoTester
+{
+public:
+ IoTester(StreamType& ios):
+ stream{},
+ ios(ios),
+ old_buf(ios.rdbuf())
+ {
+ // Redirect the given os into our stringstream’s buf
+ this->ios.rdbuf(this->stream.rdbuf());
+ }
+ ~IoTester()
+ {
+ this->ios.rdbuf(this->old_buf);
+ }
+ IoTester& operator=(const IoTester&) = delete;
+ IoTester& operator=(IoTester&&) = delete;
+ IoTester(const IoTester&) = delete;
+ IoTester(IoTester&&) = delete;
+
+ std::string str() const
+ {
+ return this->stream.str();
+ }
+
+ void set_string(const std::string& s)
+ {
+ this->stream.str(s);
+ }
+
+private:
+ std::stringstream stream;
+ StreamType& ios;
+ std::streambuf* const old_buf;
+};
+
+#endif //BIBOUMI_IO_TESTER_HPP