Пользовательский макрос EXPECT_NEAR в Google Test

Область применения: использование Google Test и OpenCV.

Я хотел бы проверить, что мой Vec3f равен другому Vec3f. Vec3f — это вектор в OpenCV размерности 3 и типа float. Оператор ==- определен, поэтому EXPECT_EQ(Vec3f(), Vec3f()) работает.

Но поскольку они являются числами с плавающей запятой, я бы хотел использовать макрос EXPECT_NEAR(float a, float b, float delta). Что я могу сделать, чтобы использовать его как EXPECT_NEAR(vec_a, vec_b, float delta)?

На данный момент я перебираю каждый элемент вектора и делаю там EXPECT_NEAR.

Это может быть связано: Удобный метод в GoogleTest для двойное сравнение не равно?


person Unapiedra    schedule 19.08.2011    source источник


Ответы (2)


Вы делаете в основном правильные вещи. Однако я бы использовал пользовательскую функцию утверждения, например:

::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;
}

Затем MAGIC включит ваш код, например. сравните, имеют ли оба вектора одинаковый размер, с последующим перебором всех элементов и взаимной проверкой, отличаются ли элементы с одним и тем же индексом не более чем на дельту. Обратите внимание, что в коде предполагается, что для 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
person dmeister    schedule 19.08.2011

Вы можете использовать сопоставитель Pointwise() из Google Mock. Объедините его с пользовательским сопоставлением, которое проверяет, что два аргумента находятся рядом:

#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));
}
person VladLosev    schedule 20.08.2011