【问题标题】:Multi-level preprocessor macro messing up string-ized output多级预处理器宏弄乱了字符串化的输出
【发布时间】:2014-09-01 10:13:47
【问题描述】:

我们在 2 种不同的配置下构建了一个 MSVC++ 单元测试项目,以针对不同的实现运行相同的测试。由于每个测试运行两次,我们使用预处理器 ugliness 破解测试名称:

#if defined(XXX)
    #define _VER BUILDX
#elif defined(YYY)
    #define _VER BUILDY
#endif

#define _TEST_SUITE_NAME_PACKAGE(Suite,Package) Suite##_##Package
#define TEST_SUITE_NAME_PACKAGE(Suite,Package) _TEST_SUITE_NAME_PACKAGE(Suite,Package)
#define TEST_SUITE_NAME(Suite) TEST_SUITE_NAME_PACKAGE(Suite,_VER)

#define TEST(test_case_name, test_name) GTEST_TEST(TEST_SUITE_NAME(test_case_name), test_name)

这一切都完美无缺,重新定义了 google-test TEST 宏以使用字符串化技巧修改测试套件名称。

但以下操作不起作用

#define TEST_F(test_fixture, test_name)\
  GTEST_TEST_(TEST_SUITE_NAME(test_fixture), test_name, test_fixture, \
              ::testing::internal::GetTypeId<test_fixture>())

使用TEST(StringTestSuite,EqualityTest) 代替像StringTestSuite_XXX.EqualityTest 这样的输出,使用TEST_F 会给出如下输出:

TEST_SUITE_NAME(StringTestSuite).EqualityTest

我可以通过一些简单的调整来实现它吗?

作为参考,这里是GTEST_TEST_ 的 gtest 代码。而在gtest.h中,GTEST_TEST定义为:

#define GTEST_TEST(test_case_name, test_name)\
  GTEST_TEST_(test_case_name, test_name, \
              ::testing::Test, ::testing::internal::GetTestTypeId())

【问题讨论】:

    标签: c++ visual-c++ googletest c-preprocessor


    【解决方案1】:

    只需再添加一个宏即可实现多一层间接性,以便在该级别上对宏进行评估:

    #define TEST_F_I(test_fixture, test_name, original_name) \
        GTEST_TEST_(test_fixture, test_name, original_name, \
             ::testing::internal::GetTypeId<original_name>())
    
    #define TEST_F(test_fixture, test_name) \
        TEST_F_I(TEST_SUITE_NAME(test_fixture), test_name, test_fixture)
    

    My macro live demo link.

    Your macro live demo link.

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 2012-07-21
      • 1970-01-01
      • 2017-09-18
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多