mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Added a vector approximate matcher
This commit is contained in:
		 Will Handley
					Will Handley
				
			
				
					committed by
					
						 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
			
				
	
			
			
			 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
						parent
						
							45e552528d
						
					
				
				
					commit
					91b617c462
				
			| @@ -9,6 +9,7 @@ | ||||
| #define TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED | ||||
|  | ||||
| #include "catch_matchers.h" | ||||
| #include "catch_approx.h" | ||||
|  | ||||
| #include <algorithm> | ||||
|  | ||||
| @@ -90,6 +91,42 @@ namespace Matchers { | ||||
|             std::vector<T> const& m_comparator; | ||||
|         }; | ||||
|  | ||||
|         template<typename T> | ||||
|         struct ApproxMatcher : MatcherBase<std::vector<T>> { | ||||
|  | ||||
|             ApproxMatcher(std::vector<T> const& comparator) : m_comparator( comparator ) {} | ||||
|  | ||||
|             bool match(std::vector<T> const &v) const override { | ||||
|                 if (m_comparator.size() != v.size()) | ||||
|                     return false; | ||||
|                 for (std::size_t i = 0; i < v.size(); ++i) | ||||
|                     if (m_comparator[i] != approx(v[i])) | ||||
|                         return false; | ||||
|                 return true; | ||||
|             } | ||||
|             std::string describe() const override { | ||||
|                 return "is approx: " + ::Catch::Detail::stringify( m_comparator ); | ||||
|             } | ||||
|             template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> | ||||
|             ApproxMatcher& epsilon( T const& newEpsilon ) { | ||||
|                 approx.epsilon(newEpsilon); | ||||
|                 return *this; | ||||
|             } | ||||
|             template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> | ||||
|             ApproxMatcher& margin( T const& newMargin ) { | ||||
|                 approx.margin(newMargin); | ||||
|                 return *this; | ||||
|             } | ||||
|             template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> | ||||
|             ApproxMatcher& scale( T const& newScale ) { | ||||
|                 approx.scale(newScale); | ||||
|                 return *this; | ||||
|             } | ||||
|  | ||||
|             std::vector<T> const& m_comparator; | ||||
|             mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom(); | ||||
|         }; | ||||
|  | ||||
|         template<typename T> | ||||
|         struct UnorderedEqualsMatcher : MatcherBase<std::vector<T>> { | ||||
|             UnorderedEqualsMatcher(std::vector<T> const& target) : m_target(target) {} | ||||
| @@ -129,6 +166,11 @@ namespace Matchers { | ||||
|         return Vector::EqualsMatcher<T>( comparator ); | ||||
|     } | ||||
|  | ||||
|     template<typename T> | ||||
|     Vector::ApproxMatcher<T> Approx( std::vector<T> const& comparator ) { | ||||
|         return Vector::ApproxMatcher<T>( comparator ); | ||||
|     } | ||||
|  | ||||
|     template<typename T> | ||||
|     Vector::UnorderedEqualsMatcher<T> UnorderedEquals(std::vector<T> const& target) { | ||||
|         return Vector::UnorderedEqualsMatcher<T>(target); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user