diff options
author | Florent Le Coz <louiz@louiz.org> | 2015-10-31 06:25:47 +0100 |
---|---|---|
committer | Florent Le Coz <louiz@louiz.org> | 2015-10-31 06:25:47 +0100 |
commit | 6430479a3a6f15e221f0b9f3e822b44ca37af0f8 (patch) | |
tree | d0d787a426197563d37e203a6572da7a4cd5385d | |
parent | 6fb4cf5e4db2babad567524df6be3e2798a0fb63 (diff) | |
download | biboumi-6430479a3a6f15e221f0b9f3e822b44ca37af0f8.tar.gz biboumi-6430479a3a6f15e221f0b9f3e822b44ca37af0f8.tar.bz2 biboumi-6430479a3a6f15e221f0b9f3e822b44ca37af0f8.tar.xz biboumi-6430479a3a6f15e221f0b9f3e822b44ca37af0f8.zip |
Add a IoTester class
-rw-r--r-- | tests/io_tester.cpp | 30 | ||||
-rw-r--r-- | tests/io_tester.hpp | 47 |
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 |