2011-08-19 5 views
2

범위 : Google 테스트 및 OpenCV 사용.Google 테스트의 맞춤 EXPECT_NEAR 매크로

Vec3f이 다른 Vec3f과 같음을 테스트하고 싶습니다. Vec3f은 차원 3의 OpenCV에있는 벡터이며 float를 입력합니다. == - 연산자가 정의되어 있으므로 EXPECT_EQ(Vec3f(), Vec3f())이 작동합니다.

하지만 이들은 부동 소수점 형이므로 EXPECT_NEAR(float a, float b, float delta) 매크로를 사용하고 싶습니다. EXPECT_NEAR(vec_a, vec_b, float delta)처럼 사용할 수 있도록하려면 어떻게해야합니까?

현재 벡터의 각 요소를 순환하면서 EXPECT_NEAR을 수행하고 있습니다.

관련이 될 수도 있습니다 : 당신은 기본적으로 올바른 일을하고있다 Convenient method in GoogleTest for a double comparison of not equal?

답변

3

. 그러나 다음과 같은 맞춤 어설 션 기능을 사용합니다.

::testing::AssertionResult AreAllElementsInVectorNear(const Vec3f& a, const Vect3f& b, float delta) { 
    if ([MAGIC]) 
    return ::testing::AssertionSuccess(); 
    else 
    return ::testing::AssertionFailure() << "Vectors differ by more than " << delta; 
} 

두 벡터의 크기가 같은지 비교하고 모든 요소를 ​​반복 한 다음 동일한 색인의 요소가 델타 이상 차이가 나는지 상호 검사합니다. 코드에서는 < < 연산자가 Vec3f에 제공된다고 가정합니다. 다음 사용

기능 :

EXPECT_TRUE(AreAllElementsInVectorNear(a, b, 0.1)) 

예상되는 경우는 출력이 될 수 실패

Value of: AreAllElementsInVectorNear(a, b, 0.1) 
    Actual: false (Vectors differ by more then 0.1) 
Expected: true 
5

당신은 구글 모의에서 Pointwise() 정규 사용할 수 있습니다. 두 인수가 가까이 있는지 확인하는 사용자 정의 정규 표현식과 결합하십시오.

#include <tr1/tuple> 
#include <gmock/gmock.h> 

using std::tr1::get; 
using testing::Pointwise; 

MATCHER_P(NearWithPrecision, precision, "") { 
    return abs(get<0>(arg) - get<1>(arg)) < precision; 
} 

TEST(FooTest, ArraysNear) { 
    EXPECT_THAT(result_array, Pointwise(NearWithPrecision(0.1), expected_array)); 
} 
관련 문제