Удобный метод в GoogleTest для двойного сравнения не равных? - PullRequest
8 голосов
/ 18 августа 2010

Я ищу что-то похожее на ASSERT_EQ / ASSERT_NE для ASSERT_DOUBLE_EQ.

Может быть, я упускаю простой способ сделать это без ASSERT_DOUBLE_NE?

Ответы [ 3 ]

6 голосов
/ 03 сентября 2010

Вы можете использовать сопутствующую среду для насмешек Google Mock.Он имеет мощную библиотеку совпадений (в стиле Hamcrest), которую вы можете использовать с макросами EXPECT_THAT / ASSERT_THAT:

EXPECT_THAT(value, FloatEq(1));
EXPECT_THAT(another_value, Not(DoubleEq(3.14)));
1 голос
/ 18 августа 2010

Похоже, вам не повезло. Тем не менее, вы можете добавить один самостоятельно. Я построил следующий код, используя ASSERT_DOUBLE_EQ и ASSERT_NE в качестве шаблона.

#define ASSERT_DOUBLE_NE(expected, actual)\
  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointNE<double>, \
                      expected, actual)


// Helper template function for comparing floating-points.
//
// Template parameter:
//
//   RawType: the raw floating-point type (either float or double)
//
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
template <typename RawType>
AssertionResult CmpHelperFloatingPointNE(const char* expected_expression,
                                         const char* actual_expression,
                                         RawType expected,
                                         RawType actual) {
  const FloatingPoint<RawType> lhs(expected), rhs(actual);

  if ( ! lhs.AlmostEquals(rhs)) {
    return AssertionSuccess();
  }

  StrStream expected_ss;
  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
              << expected;

  StrStream actual_ss;
  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
            << actual;

  Message msg;
  msg << "Expected: (" << expected_expression << ") != (" << actual_expression
      << "), actual: (" << StrStreamToString(expected_ss) << ") == ("
      << StrStreamToString(actual_ss) << ")";
  return AssertionFailure(msg);   
}
0 голосов
/ 09 июня 2016

вместо создания нового помощника CmpHelperFloatingPointNE, вы можете просто определить макрос как инверсию существующего помощника:

#include "gtest/gtest.h"

#define ASSERT_FLOAT_NE(val1, val2) ASSERT_PRED_FORMAT2( \
  !::testing::internal::CmpHelperFloatingPointEQ<float>, val1, val2 \
)

#define ASSERT_DOUBLE_NE(val1, val2) ASSERT_PRED_FORMAT2( \
  !::testing::internal::CmpHelperFloatingPointEQ<double>, val1, val2 \
)

Это не так изящно, как решение deft_code, потому что, когда утверждение не выполняется, нет никаких конкретных деталей, таких как «ожидаемое значение» и «фактическое значение», только номер строки и файл утверждения. Однако для моих целей достаточно было номера строки.

...