mirror of https://github.com/procxx/kepka.git
				
				
				
			
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  *  Created by Martin on 19/07/2017.
 | |
|  *  Copyright 2017 Two Blue Cubes Ltd. All rights reserved.
 | |
|  *
 | |
|  *  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)
 | |
|  */
 | |
| 
 | |
| #include "catch_approx.h"
 | |
| 
 | |
| #include <cmath>
 | |
| #include <limits>
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| // Performs equivalent check of std::fabs(lhs - rhs) <= margin
 | |
| // But without the subtraction to allow for INFINITY in comparison
 | |
| bool marginComparison(double lhs, double rhs, double margin) {
 | |
|     return (lhs + margin >= rhs) && (rhs + margin >= lhs);
 | |
| }
 | |
| 
 | |
| }
 | |
| 
 | |
| namespace Catch {
 | |
| namespace Detail {
 | |
| 
 | |
|     Approx::Approx ( double value )
 | |
|     :   m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
 | |
|         m_margin( 0.0 ),
 | |
|         m_scale( 0.0 ),
 | |
|         m_value( value )
 | |
|     {}
 | |
| 
 | |
|     Approx Approx::custom() {
 | |
|         return Approx( 0 );
 | |
|     }
 | |
| 
 | |
|     std::string Approx::toString() const {
 | |
|         ReusableStringStream rss;
 | |
|         rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )";
 | |
|         return rss.str();
 | |
|     }
 | |
| 
 | |
|     bool Approx::equalityComparisonImpl(const double other) const {
 | |
|         // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value
 | |
|         // Thanks to Richard Harris for his help refining the scaled margin value
 | |
|         return marginComparison(m_value, other, m_margin) || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(m_value)));
 | |
|     }
 | |
| 
 | |
| } // end namespace Detail
 | |
| 
 | |
| std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) {
 | |
|     return value.toString();
 | |
| }
 | |
| 
 | |
| } // end namespace Catch
 |