#define XXX
#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 GTEST_TEST_(test_case_name, test_name, parent_class)\
struct test_case_name ## test_name {};
#define GTEST_TEST(test_case_name, test_name)\
GTEST_TEST_(test_case_name, test_name)
#define TEST(test_case_name, test_name) \
GTEST_TEST(TEST_SUITE_NAME(test_case_name), test_name)
#define TEST_F_I(test_fixture, test_name, original_name) \
GTEST_TEST_(test_fixture, test_name, original_name)
#define TEST_F(test_fixture, test_name) \
TEST_F_I(TEST_SUITE_NAME(test_fixture), test_name, test_fixture)
#define TEST_F_YOUR_INVALID_MACRO(test_fixture, test_name) \
GTEST_TEST_(TEST_SUITE_NAME(test_fixture), test_name, test_fixture)
// Tests:
TEST_F_YOUR_INVALID_MACRO(ABC, DEF)
TEST_F(GHI, JKL)
TEST_F(MNO, PQR)
int main()
{
GHI_BUILDXJKL a;
MNO_BUILDXPQR b;
ABC_BUILDXDEF c;
return 0;
}
I2RlZmluZSBYWFgKCiNpZiBkZWZpbmVkKFhYWCkKICAgICNkZWZpbmUgX1ZFUiBCVUlMRFgKI2VsaWYgZGVmaW5lZChZWVkpCiAgICAjZGVmaW5lIF9WRVIgQlVJTERZCiNlbmRpZgoKI2RlZmluZSBfVEVTVF9TVUlURV9OQU1FX1BBQ0tBR0UoU3VpdGUsUGFja2FnZSkgU3VpdGUjI18jI1BhY2thZ2UKI2RlZmluZSBURVNUX1NVSVRFX05BTUVfUEFDS0FHRShTdWl0ZSxQYWNrYWdlKSBfVEVTVF9TVUlURV9OQU1FX1BBQ0tBR0UoU3VpdGUsUGFja2FnZSkKI2RlZmluZSBURVNUX1NVSVRFX05BTUUoU3VpdGUpIFRFU1RfU1VJVEVfTkFNRV9QQUNLQUdFKFN1aXRlLF9WRVIpCgojZGVmaW5lIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIHBhcmVudF9jbGFzcylcCnN0cnVjdCB0ZXN0X2Nhc2VfbmFtZSAjIyB0ZXN0X25hbWUge307CgojZGVmaW5lIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCiAgICBHVEVTVF9URVNUXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKQoKI2RlZmluZSBURVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKICAgIEdURVNUX1RFU1QoVEVTVF9TVUlURV9OQU1FKHRlc3RfY2FzZV9uYW1lKSwgdGVzdF9uYW1lKQoKI2RlZmluZSBURVNUX0ZfSSh0ZXN0X2ZpeHR1cmUsIHRlc3RfbmFtZSwgb3JpZ2luYWxfbmFtZSkgXAogICAgR1RFU1RfVEVTVF8odGVzdF9maXh0dXJlLCB0ZXN0X25hbWUsIG9yaWdpbmFsX25hbWUpCgojZGVmaW5lIFRFU1RfRih0ZXN0X2ZpeHR1cmUsIHRlc3RfbmFtZSkgXAogICAgVEVTVF9GX0koVEVTVF9TVUlURV9OQU1FKHRlc3RfZml4dHVyZSksIHRlc3RfbmFtZSwgdGVzdF9maXh0dXJlKQoKI2RlZmluZSBURVNUX0ZfWU9VUl9JTlZBTElEX01BQ1JPKHRlc3RfZml4dHVyZSwgdGVzdF9uYW1lKSBcCiAgICBHVEVTVF9URVNUXyhURVNUX1NVSVRFX05BTUUodGVzdF9maXh0dXJlKSwgdGVzdF9uYW1lLCB0ZXN0X2ZpeHR1cmUpCgovLyBUZXN0czoKClRFU1RfRl9ZT1VSX0lOVkFMSURfTUFDUk8oQUJDLCBERUYpCgpURVNUX0YoR0hJLCBKS0wpCgpURVNUX0YoTU5PLCBQUVIpCgppbnQgbWFpbigpCnsKICAgIEdISV9CVUlMRFhKS0wgYTsKICAgIE1OT19CVUlMRFhQUVIgYjsKICAgIEFCQ19CVUlMRFhERUYgYzsKCiAgICByZXR1cm4gMDsKfQoK
prog.cpp:29:45: error: pasting ")" and "DEF" does not give a valid preprocessing token
GTEST_TEST_(TEST_SUITE_NAME(test_fixture), test_name, test_fixture)
^
prog.cpp:14:8: note: in definition of macro ‘GTEST_TEST_’
struct test_case_name ## test_name {};
^
prog.cpp:33:1: note: in expansion of macro ‘TEST_F_YOUR_INVALID_MACRO’
TEST_F_YOUR_INVALID_MACRO(ABC, DEF)
^
prog.cpp:33:32: error: variable ‘ABC_BUILDX DEF’ has initializer but incomplete type
TEST_F_YOUR_INVALID_MACRO(ABC, DEF)
^
prog.cpp:14:26: note: in definition of macro ‘GTEST_TEST_’
struct test_case_name ## test_name {};
^
prog.cpp:33:1: note: in expansion of macro ‘TEST_F_YOUR_INVALID_MACRO’
TEST_F_YOUR_INVALID_MACRO(ABC, DEF)
^
prog.cpp: In function ‘int main()’:
prog.cpp:43:5: error: ‘ABC_BUILDXDEF’ was not declared in this scope
ABC_BUILDXDEF c;
^
prog.cpp:43:19: error: expected ‘;’ before ‘c’
ABC_BUILDXDEF c;
^
prog.cpp:41:19: warning: unused variable ‘a’ [-Wunused-variable]
GHI_BUILDXJKL a;
^
prog.cpp:42:19: warning: unused variable ‘b’ [-Wunused-variable]
MNO_BUILDXPQR b;
^