Je cherche quelque chose de similaire à ASSERT_EQ/ASSERT_NE pour ASSERT_DOUBLE_EQ.Méthode pratique dans GoogleTest pour une double comparaison de pas égal?
Peut-être que je manque un moyen facile de le faire sans avoir un ASSERT_DOUBLE_NE?
Je cherche quelque chose de similaire à ASSERT_EQ/ASSERT_NE pour ASSERT_DOUBLE_EQ.Méthode pratique dans GoogleTest pour une double comparaison de pas égal?
Peut-être que je manque un moyen facile de le faire sans avoir un ASSERT_DOUBLE_NE?
On dirait que vous n'avez pas de chance. Cependant, vous pouvez en ajouter un vous-même. J'ai construit le code suivant en utilisant ASSERT_DOUBLE_EQ et ASSERT_NE comme un modèle.
#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);
}
Vous pouvez utiliser le cadre de simulation compagnon Google Mock. Il dispose d'une bibliothèque puissante de matchers (a la Hamcrest), que vous pouvez utiliser avec les macros EXPECT_THAT/de ASSERT_THAT:
EXPECT_THAT(value, FloatEq(1));
EXPECT_THAT(another_value, Not(DoubleEq(3.14)));
au lieu de créer une nouvelle aide de CmpHelperFloatingPointNE, vous pouvez juste définir la macro comme l'inverse de la aide existante:
#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 \
)
Ce n'est pas aussi gracieuse que la solution de deft_code parce que lorsque l'assertion échoue, il n'y a pas de détails spécifiques comme « valeur attendue » et « valeur réelle », juste le numéro de la ligne et le fichier de l'affirmation. Pour mes fins, cependant, le numéro de ligne était suffisant.