2016-11-29 1 views
0

J'écris des tests unitaires pour une application. J'ai quelques exceptions dans un constructeur, donc je l'ai écrit ceci:Problème C++ 11 avec GTest

TEST(Tablier, ConstructeurParamInvalide2) 
{ 
    ASSERT_THROW(Tablier t_tablier{10, 65} , PreconditionException); 
} 

Quand j'écris ceci, il semble que le ASSERT_THROW macro est pas satisfait et le test échoue. Voici l'expansion macro:

switch (0) case 0: default: \ 
    if (::testing::internal::ConstCharPtr gtest_msg = "") { \ 
    bool gtest_caught_expected = false; \ 
    try { \ 
     if (::testing::internal::AlwaysTrue()) { Tablier t_tablier{10; }; \ 
    } \ 
    catch (65} const&) { \ 
     gtest_caught_expected = true; \ 
    } \ 
    catch (...) { \ 
     gtest_msg.value = \ 
      "Expected: " "Tablier t_tablier{10" " throws an exception of type " \ 
      "65}" ".\n Actual: it throws a different type."; \ 
     goto gtest_label_testthrow_76; \ 
    } \ 
    if (!gtest_caught_expected) { \ 
     gtest_msg.value = \ 
      "Expected: " "Tablier t_tablier{10" " throws an exception of type " \ 
      "65}" ".\n Actual: it throws nothing."; \ 
     goto gtest_label_testthrow_76; \ 
    } \ 
    } else \ 
    gtest_label_testthrow_76: \ 
     return ::testing::internal::AssertHelper(::testing::TestPartResult::kFatalFailure, "/home/eric/Programming/cpp/Puissance4/pxTestsUnitaires/tests/test_Tablier.cpp", 76, gtest_msg.value) \ 
    = ::testing::Message() 

Notez que le Tablier t_tablier{10; }; Au lieu de cela, si j'écris ceci:

TEST(Tablier, ConstructeurParamInvalide2) 
{ 
    ASSERT_THROW(Tablier t_tablier(10, 65) , PreconditionException); 
} 

La macro fonctionne très bien et le test passe. Mon projet et compilateur sont configurés pour C++ 11, et de nombreux autres tests passent en utilisant la syntaxe C++ 11. Une idée de ce qui pourrait être le problème?

Cordialement

+1

double possible de [Passer une liste d'initialisation à une macro] (http://stackoverflow.com/questions/30372148/passing-an-initialization-list-to-a-macro) – neuront

Répondre

2

Cela devrait fonctionner:

ASSERT_THROW(Tablier t_tablier(10, 65) , PreconditionException); 
ASSERT_THROW(Tablier (10, 65) , PreconditionException); 

depuis l'expansion macro pense que la virgule entre 10 et 65 est delimiter des paramètres macro. Les parenthèses sont là pour dire au compilateur quel est le délimiteur.

De cpp.replace

La séquence de jetons de prétraitement délimitées par les parenthèses les plus à l'extérieur correspondant constitue la liste des arguments de la fonction de macro-like. Les arguments individuels dans la liste sont séparés par des jetons de prétraitement des virgules, mais les jetons de prétraitement des virgules entre les parenthèses internes correspondantes ne séparent pas les arguments.

+0

Macro cessé de se plaindre. Merci! – BobMorane

+0

BTW votre dernière édition est exactement ce qui a été montré comme fonctionnant déjà dans ma question ... – BobMorane