2016-12-15 39 views
7

在Catch C++ Unit測試框架中是否有任何可能性來比較基於浮點類型的std :: vectors?我知道我可以比較兩個容器和每個元素的大小(使用「近似」),但這很混亂。使用C++測試浮點std :: vector Catch

積分類型向量比較正常工作。現在

,我必須用這種結構

REQUIRE(computed.size() == expected.size()); 
for (size_t i = 0; i < computed.size(); ++i) 
    REQUIRE(computed[i] == Approx(expected[i])); 

但我想用一個襯墊(它爲整數類型):

REQUIRE(computed == expected); 
+1

確切比較有什麼問題? –

+0

舍入誤差 – miqelm

+0

如果您的舍入誤差在運行之間不一致,您的單元測試會更好地報告該誤差。 –

回答

0

你可以寫

CHECK_THAT(actual, EqualsApprox(expected)); 

使用此自定義匹配器:

#include <vector> 
#include <functional> 

#include <catch.hpp> 

template<typename T, typename Compare> 
struct CompareMatcher 
     : Catch::Matchers::Impl::MatcherBase<std::vector<T>, std::vector<T> > { 

    CompareMatcher(const std::vector<T> &comparator, const Compare &compare) 
      : m_comparator(comparator), 
       m_compare(compare) {} 

    bool match(const std::vector<T> &v) const CATCH_OVERRIDE { 
     if (m_comparator.size() != v.size()) { 
      return false; 
     } 
     for (size_t i = 0; i < v.size(); ++i) { 
      if (!m_compare(m_comparator[i], v[i])) { 
       return false; 
      } 
     } 
     return true; 
    } 

    virtual std::string describe() const CATCH_OVERRIDE { 
     return "Equals: " + Catch::toString(m_comparator); 
    } 

    const std::vector<T> &m_comparator; 
    Compare const &m_compare; 
}; 

template<typename T, typename C> 
CompareMatcher<T, C> 
Compare(const std::vector<T> &comparator, const C &compare) { 
    return CompareMatcher<T, C>(comparator, compare); 
} 

auto EqualsApprox(const std::vector<double> &comparator) { 
    return Compare(comparator, [=](double actual, double expected) { 
     return actual == Approx(expected); 
    }); 
} 

TEST_CASE("example", "[]") { 
    SECTION("passes") { 
     std::vector<double> actual {0, 1.00001}; 
     std::vector<double> expected {0, 1}; 
     CHECK_THAT(actual, EqualsApprox(expected)); 
    } 
    SECTION("fails") { 
     std::vector<double> actual {0, 1.0001}; 
     std::vector<double> expected {0, 1}; 
     CHECK_THAT(actual, EqualsApprox(expected)); 
    } 
} 
+0

最終如何「EqualsApprox」不是一個模板嗎? – aschepler

+0

'Approx'正在使用'double'。 – maiermic

相關問題