2016-01-22 14 views
2

如何在不使用predicate formater函數內部的googletest內部東西的情況下使用ASSERT_NEAR或ASSERT_DOUBLE_EQ浮動比較?可以在googletest中的Predicate Formater中使用ASSERT_NEAR

template<typename A, typename B> 
::testing::AssertionResult assertNearArrays(const char * a_expr, 
               const char * b_expr, 
               const A & a, 
               const B & b, 
               PREC absError = 1e-6){ 

     test each value of a with b 
     using ASSERT_NEAR(a[i],b[i], 1e-6) 

} 

,我認爲是不是要去工作,我需要寫我自己比較的返回一個AssertionResultAssertionFailure。 但是,依靠googletest的浮點比較而不是我自己的...會很好嗎?

回答

3

可以在只有幾行的C++代碼編寫這樣的測試:

template<typename T>  
bool is_near(T val1, T val2, T abs_error) { 
    const T diff = std::abs(val1 - val2); 
    return diff <= abs_error: 
} 

你真的需要什麼GTEST ASSERT_NEAR不跟進?你可能想提供有關失敗比ASSERT_NEAR會做additionl信息,是這樣的:

if (!is_near(a[i], b[i], absError)) 
    return AssertionFailure() 
     << "The difference between a[i] and b[i]" 
     << " is " << (a[i] - b[i]) << ", which exceeds absError, where\n" 
     << "a[i] evaluates to " << a[i] << ",\n" 
     << "b[i] evaluates to " << b[i]<< ", and\n" 
     << "absError evaluates to " << absError << ", and\n" 
     << "i evaluates to " << i << "."; 

而且回AssertionSuccess();在assertNearArrays結尾

+0

jeah我雖然可以正確使用內部的東西(顯然在內部命名空間,建議不要使用) 所以整個ULP比較的東西不能被重用... – Gabriel