2017-01-25 6 views
2

저는 Catch 단위 테스트 프레임 워크를 사용하고 있으며, 두 배의 벡터를 비교하고 싶습니다. 이 other answer은 Approx를 사용하여 부동 소수점/이중 값을 비교할 것을 제안하지만,이 값은 벡터에 대해 작동하지 않습니다. 이 작업을 수행하는 편리한 방법이 있습니까?두 배의 벡터 비교 캐치 사용

편집 : 예제 다음 코드와

다음과 같이 내가 코드를 변경하는 경우

------------------------------------------------------------------------------- 
Compare Vectors 
------------------------------------------------------------------------------- 
test/UnitTests/test_Example/example.cc:4 
............................................................................... 

test/UnitTests/test_Example/example.cc:7: FAILED: 
    REQUIRE(vec1 == vec2) 
with expansion: 
    { 0, 1, 2, 3 } == { 0, 1, 2, 4 } 

=============================================================================== 
test cases: 1 | 1 failed 
assertions: 1 | 1 failed 

하지만, 내가 원하는 것 :

#define CATCH_CONFIG_MAIN 
#include "catch.hpp" 

TEST_CASE("Compare Vectors", "[vector]") { 
    std::vector<int> vec1 = {0, 1, 2, 3}; 
    std::vector<int> vec2 = {0, 1, 2, 4}; 
    REQUIRE(vec1 == vec2); 
} 

시험은 다음과 같은 보고서 실패 통과 할 테스트지만, 분명히하지 않습니다.

#define CATCH_CONFIG_MAIN 
#include "catch.hpp" 

TEST_CASE("Compare Vectors", "[vector]") { 
    std::vector<double> vec1 = {0, 1, 2, 3}; 
    std::vector<double> vec2 = {0, 1, 2, 3.000001}; 
    REQUIRE(vec1 == vec2); 
} 

내가 할 수있는 요소를 통해 루프 그들을 하나씩 비교하지만, 불일치의 경우에, 오류의 원인을 확인하는 것이 더 어려울 것이다.

+1

벡터를 반복하고 요소별로 비교하는 방법은 무엇입니까? [이 질문] (http://stackoverflow.com/q/41160846/3093378)도 참조하십시오. – vsoftco

+0

@vso 나는이 문제가 벡터 위로 반복하는 방법이 아니라 부동 소수점 숫자를 비교하는 방법이라고 생각한다. –

답변

1

당분간 나는 일종의 대안에 의지했습니다. 두 벡터를 확인하고 싶을 때마다 다음 두 함수를 사용하여 만들었습니다. (즉 REQUIRE(compareVectors(vec1, vec2));)

bool compareVectors(std::vector<double> a, std::vector<double> b) { 
    if (a.size() != b.size()) return false; 
    for (size_t i = 0; i < a.size(); i++) { 
     if (a[i] != Approx(b[i])) { 
      std::cout << a[i] << " Should == " << b[i] << std::endl; 
      return false; 
     } 
    } 
    return true; 
} 

bool compare2dVectors(std::vector<std::vector<double>> a, 
         std::vector<std::vector<double>> b) { 
    if (a.size() != b.size()) return false; 
    for (size_t i = 0; i < a.size(); i++) { 
     if (! compareVectors(a[i], b[i])) return false; 
    } 
    return true; 
} 

최소한 실패 벡터의 이름을 볼 수 있습니다 그 방법과 차이가 첫 번째 값.

그것은 이상적인 해결책이 아니므로 누군가가 더 나은 것을 만들어 낼 수 있기를 바라고 있습니다. 그러나 나는 적어도 누군가에게 도움이 될 수 있도록 지금까지 생각해 왔던 것을 나눌 것이라고 생각했습니다. .

+0

나는 똑같은 문제에 직면하고 있으며 더 우아한 해결책에 흥미가 있습니다. – schorsch312