mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Add another example for generators
This commit is contained in:
		
							
								
								
									
										54
									
								
								examples/301-Gen-MapTypeConversion.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								examples/301-Gen-MapTypeConversion.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| // 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 | ||||
| @@ -45,6 +45,7 @@ set( SOURCES_IDIOMATIC_TESTS | ||||
|     120-Bdd-ScenarioGivenWhenThen.cpp | ||||
|     210-Evt-EventListeners.cpp | ||||
|     300-Gen-OwnGenerator.cpp | ||||
|     301-Gen-MapTypeConversion.cpp | ||||
|     310-Gen-VariablesInGenerators.cpp | ||||
| ) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský