// 301-Gen-MapTypeConversion.cpp // Shows how to use map to modify generator's return type. // TODO #include <catch2/catch.hpp> #include <string> #include <sstream> // Returns a line from a stream. You could have it e.g. read lines from // a file, but to avoid problems with paths in examples, we will use // a fixed stringstream. class LineGenerator : public Catch::Generators::IGenerator<std::string> { std::string m_line; std::stringstream m_stream; public: LineGenerator() { m_stream.str("1\n2\n3\n4\n"); if (!next()) { throw Catch::GeneratorException("Couldn't read a single line"); } } std::string const& get() const override { return m_line; } bool next() override { return !!std::getline(m_stream, m_line); } }; // This helper function provides a nicer UX when instantiating the generator // Notice that it returns an instance of GeneratorWrapper<std::string>, which // is a value-wrapper around std::unique_ptr<IGenerator<std::string>>. Catch::Generators::GeneratorWrapper<std::string> lines(std::string /* ignored for example */) { return Catch::Generators::GeneratorWrapper<std::string>( std::unique_ptr<Catch::Generators::IGenerator<std::string>>( new LineGenerator() ) ); } TEST_CASE("filter can convert types inside the generator expression", "[example][generator]") { auto num = GENERATE(map<int>([](std::string const& line) { return std::stoi(line); }, lines("fake-file"))); REQUIRE(num > 0); } // Compiling and running this file will result in 4 successful assertions