Add a IoTester class

This commit is contained in:
Florent Le Coz
2015-10-31 06:25:47 +01:00
parent 6fb4cf5e4d
commit 6430479a3a
2 changed files with 77 additions and 0 deletions
+30
View File
@@ -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");
}
}
+47
View File
@@ -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