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 #include "testing/gtest/include/gtest/gtest_prod.h"
      9 
     10 // This is a wrapper for gtest's FRIEND_TEST macro that friends
     11 // test with all possible prefixes. This is very helpful when changing the test
     12 // prefix, because the friend declarations don't need to be updated.
     13 //
     14 // Example usage:
     15 //
     16 // class MyClass {
     17 //  private:
     18 //   void MyMethod();
     19 //   FRIEND_TEST_ALL_PREFIXES(MyClassTest, MyMethod);
     20 // };
     21 #define FRIEND_TEST_ALL_PREFIXES(test_case_name, test_name) \
     22   FRIEND_TEST(test_case_name, test_name); \
     23   FRIEND_TEST(test_case_name, DISABLED_##test_name); \
     24   FRIEND_TEST(test_case_name, FLAKY_##test_name)
     25 
     26 // C++ compilers will refuse to compile the following code:
     27 //
     28 // namespace foo {
     29 // class MyClass {
     30 //  private:
     31 //   FRIEND_TEST_ALL_PREFIXES(MyClassTest, TestMethod);
     32 //   bool private_var;
     33 // };
     34 // }  // namespace foo
     35 //
     36 // class MyClassTest::TestMethod() {
     37 //   foo::MyClass foo_class;
     38 //   foo_class.private_var = true;
     39 // }
     40 //
     41 // Unless you forward declare MyClassTest::TestMethod outside of namespace foo.
     42 // Use FORWARD_DECLARE_TEST to do so for all possible prefixes.
     43 //
     44 // Example usage:
     45 //
     46 // FORWARD_DECLARE_TEST(MyClassTest, TestMethod);
     47 //
     48 // namespace foo {
     49 // class MyClass {
     50 //  private:
     51 //   FRIEND_TEST_ALL_PREFIXES(::MyClassTest, TestMethod);  // NOTE use of ::
     52 //   bool private_var;
     53 // };
     54 // }  // namespace foo
     55 //
     56 // class MyClassTest::TestMethod() {
     57 //   foo::MyClass foo_class;
     58 //   foo_class.private_var = true;
     59 // }
     60 
     61 #define FORWARD_DECLARE_TEST(test_case_name, test_name) \
     62   class test_case_name##_##test_name##_Test; \
     63   class test_case_name##_##DISABLED_##test_name##_Test; \
     64   class test_case_name##_##FLAKY_##test_name##_Test
     65 
     66 #endif  // BASE_GTEST_PROD_UTIL_H_
     67