Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_GTEST_PROD_UTIL_H_
      6 #define BASE_GTEST_PROD_UTIL_H_
      7 
      8 #if defined(HAS_GTEST)
      9 
     10 #include <gtest/gtest_prod.h>
     11 
     12 // This is a wrapper for gtest's FRIEND_TEST macro that friends
     13 // test with all possible prefixes. This is very helpful when changing the test
     14 // prefix, because the friend declarations don't need to be updated.
     15 //
     16 // Example usage:
     17 //
     18 // class MyClass {
     19 //  private:
     20 //   void MyMethod();
     21 //   FRIEND_TEST_ALL_PREFIXES(MyClassTest, MyMethod);
     22 // };
     23 #define FRIEND_TEST_ALL_PREFIXES(test_case_name, test_name) \
     24   FRIEND_TEST(test_case_name, test_name); \
     25   FRIEND_TEST(test_case_name, DISABLED_##test_name); \
     26   FRIEND_TEST(test_case_name, FLAKY_##test_name)
     27 
     28 // C++ compilers will refuse to compile the following code:
     29 //
     30 // namespace foo {
     31 // class MyClass {
     32 //  private:
     33 //   FRIEND_TEST_ALL_PREFIXES(MyClassTest, TestMethod);
     34 //   bool private_var;
     35 // };
     36 // }  // namespace foo
     37 //
     38 // class MyClassTest::TestMethod() {
     39 //   foo::MyClass foo_class;
     40 //   foo_class.private_var = true;
     41 // }
     42 //
     43 // Unless you forward declare MyClassTest::TestMethod outside of namespace foo.
     44 // Use FORWARD_DECLARE_TEST to do so for all possible prefixes.
     45 //
     46 // Example usage:
     47 //
     48 // FORWARD_DECLARE_TEST(MyClassTest, TestMethod);
     49 //
     50 // namespace foo {
     51 // class MyClass {
     52 //  private:
     53 //   FRIEND_TEST_ALL_PREFIXES(::MyClassTest, TestMethod);  // NOTE use of ::
     54 //   bool private_var;
     55 // };
     56 // }  // namespace foo
     57 //
     58 // class MyClassTest::TestMethod() {
     59 //   foo::MyClass foo_class;
     60 //   foo_class.private_var = true;
     61 // }
     62 
     63 #define FORWARD_DECLARE_TEST(test_case_name, test_name) \
     64   class test_case_name##_##test_name##_Test; \
     65   class test_case_name##_##DISABLED_##test_name##_Test; \
     66   class test_case_name##_##FLAKY_##test_name##_Test
     67 
     68 #else  // defined(HAS_GTEST)
     69 
     70 #define FRIEND_TEST_ALL_PREFIXES(test_case_name, test_name)
     71 
     72 #endif  // defined(HAS_GTEST)
     73 
     74 #endif  // BASE_GTEST_PROD_UTIL_H_
     75