mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Add PredicateMatcher that takes an arbitrary predicate functions
Also adds `Predicate` helper function to create `PredicateMatcher`.
Because of limitations in type inference it needs to be explicitly
typed, like so
`Predicate<std::string>([](std::string const& str) { ... })`.
It also takes an optional second argument for description of the
predicate.
It is possible to infer the argument with sufficient TMP, see
https://stackoverflow.com/questions/43560492/how-to-extract-lambdas-return-type-and-variadic-parameters-pack-back-from-gener/43561563#43561563
but I don't think that the magic is worth introducing ATM.
Closes #1236
			
			
This commit is contained in:
		| @@ -11,6 +11,7 @@ | ||||
| #include "catch_capture.hpp" | ||||
| #include "catch_matchers.h" | ||||
| #include "catch_matchers_floating.h" | ||||
| #include "catch_matchers_generic.hpp" | ||||
| #include "catch_matchers_string.h" | ||||
| #include "catch_matchers_vector.h" | ||||
|  | ||||
|   | ||||
							
								
								
									
										9
									
								
								include/internal/catch_matchers_generic.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								include/internal/catch_matchers_generic.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| #include "catch_matchers_generic.hpp" | ||||
|  | ||||
| std::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::string& desc) { | ||||
|     if (desc.empty()) { | ||||
|         return "matches undescribed predicate"; | ||||
|     } else { | ||||
|         return "matches predicate: \"" + desc + '"'; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										58
									
								
								include/internal/catch_matchers_generic.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								include/internal/catch_matchers_generic.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| /* | ||||
|  *  Created by Martin Hořeňovský on 03/04/2017. | ||||
|  * | ||||
|  * Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
|  * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
| #ifndef TWOBLUECUBES_CATCH_MATCHERS_GENERIC_HPP_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_MATCHERS_GENERIC_HPP_INCLUDED | ||||
|  | ||||
| #include "catch_common.h" | ||||
| #include "catch_matchers.h" | ||||
|  | ||||
| #include <functional> | ||||
| #include <string> | ||||
|  | ||||
| namespace Catch { | ||||
| namespace Matchers { | ||||
| namespace Generic { | ||||
|  | ||||
| namespace Detail { | ||||
|     std::string finalizeDescription(const std::string& desc); | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| class PredicateMatcher : public MatcherBase<T> { | ||||
|     std::function<bool(T const&)> m_predicate; | ||||
|     std::string m_description; | ||||
| public: | ||||
|  | ||||
|     PredicateMatcher(std::function<bool(T const&)> const& elem, std::string const& descr) | ||||
|         :m_predicate(std::move(elem)), | ||||
|         m_description(Detail::finalizeDescription(descr)) | ||||
|     {} | ||||
|  | ||||
|     bool match( T const& item ) const override { | ||||
|         return m_predicate(item); | ||||
|     } | ||||
|  | ||||
|     std::string describe() const override { | ||||
|         return m_description; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| } // namespace Generic | ||||
|  | ||||
|     // The following functions create the actual matcher objects. | ||||
|     // The user has to explicitly specify type to the function, because | ||||
|     // infering std::function<bool(T const&)> is hard (but possible) and | ||||
|     // requires a lot of TMP. | ||||
|     template<typename T> | ||||
|     Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate, std::string const& description = "") { | ||||
|         return Generic::PredicateMatcher<T>(predicate, description); | ||||
|     } | ||||
|  | ||||
| } // namespace Matchers | ||||
| } // namespace Catch | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_MATCHERS_GENERIC_HPP_INCLUDED | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský