Googletest export
TestCase->TestSuite refactoring PiperOrigin-RevId: 227702164
This commit is contained in:
		@@ -91,7 +91,7 @@ class Message;                         // Represents a failure message.
 | 
			
		||||
class Test;                            // Represents a test.
 | 
			
		||||
class TestInfo;                        // Information about a test.
 | 
			
		||||
class TestPartResult;                  // Result of a test part.
 | 
			
		||||
class UnitTest;                        // A collection of test cases.
 | 
			
		||||
class UnitTest;                        // A collection of test suites.
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
::std::string PrintToString(const T& value);
 | 
			
		||||
@@ -412,7 +412,7 @@ typedef FloatingPoint<float> Float;
 | 
			
		||||
typedef FloatingPoint<double> Double;
 | 
			
		||||
 | 
			
		||||
// In order to catch the mistake of putting tests that use different
 | 
			
		||||
// test fixture classes in the same test case, we need to assign
 | 
			
		||||
// test fixture classes in the same test suite, we need to assign
 | 
			
		||||
// unique IDs to fixture classes and compare them.  The TypeId type is
 | 
			
		||||
// used to hold such IDs.  The user should treat TypeId as an opaque
 | 
			
		||||
// type: the only operation allowed on TypeId values is to compare
 | 
			
		||||
@@ -488,9 +488,9 @@ GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS
 | 
			
		||||
 | 
			
		||||
// Types of SetUpTestCase() and TearDownTestCase() functions.
 | 
			
		||||
typedef void (*SetUpTestCaseFunc)();
 | 
			
		||||
typedef void (*TearDownTestCaseFunc)();
 | 
			
		||||
// Types of SetUpTestSuite() and TearDownTestSuite() functions.
 | 
			
		||||
using SetUpTestSuiteFunc = void (*)();
 | 
			
		||||
using TearDownTestSuiteFunc = void (*)();
 | 
			
		||||
 | 
			
		||||
struct CodeLocation {
 | 
			
		||||
  CodeLocation(const std::string& a_file, int a_line)
 | 
			
		||||
@@ -500,12 +500,60 @@ struct CodeLocation {
 | 
			
		||||
  int line;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//  Helper to identify which setup function for TestCase / TestSuite to call.
 | 
			
		||||
//  Only one function is allowed, either TestCase or TestSute but not both.
 | 
			
		||||
 | 
			
		||||
// Utility functions to help SuiteApiResolver
 | 
			
		||||
using SetUpTearDownSuiteFuncType = void (*)();
 | 
			
		||||
 | 
			
		||||
inline SetUpTearDownSuiteFuncType GetNotDefaultOrNull(
 | 
			
		||||
    SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) {
 | 
			
		||||
  return a == def ? nullptr : a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
//  Note that SuiteApiResolver inherits from T because
 | 
			
		||||
//  SetUpTestSuite()/TearDownTestSuite() could be protected. Ths way
 | 
			
		||||
//  SuiteApiResolver can access them.
 | 
			
		||||
struct SuiteApiResolver : T {
 | 
			
		||||
  // testing::Test is only forward declared at this point. So we make it a
 | 
			
		||||
  // dependend class for the compiler to be OK with it.
 | 
			
		||||
  using Test =
 | 
			
		||||
      typename std::conditional<sizeof(T) != 0, ::testing::Test, void>::type;
 | 
			
		||||
 | 
			
		||||
  static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite() {
 | 
			
		||||
    SetUpTearDownSuiteFuncType test_case_fp =
 | 
			
		||||
        GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase);
 | 
			
		||||
    SetUpTearDownSuiteFuncType test_suite_fp =
 | 
			
		||||
        GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite);
 | 
			
		||||
 | 
			
		||||
    GTEST_CHECK_(!test_case_fp || !test_suite_fp)
 | 
			
		||||
        << "Test can not provide both SetUpTestSuite and SetUpTestCase, please "
 | 
			
		||||
           "make sure there is only one present ";
 | 
			
		||||
 | 
			
		||||
    return test_case_fp != nullptr ? test_case_fp : test_suite_fp;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite() {
 | 
			
		||||
    SetUpTearDownSuiteFuncType test_case_fp =
 | 
			
		||||
        GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase);
 | 
			
		||||
    SetUpTearDownSuiteFuncType test_suite_fp =
 | 
			
		||||
        GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite);
 | 
			
		||||
 | 
			
		||||
    GTEST_CHECK_(!test_case_fp || !test_suite_fp)
 | 
			
		||||
        << "Test can not provide both TearDownTestSuite and TearDownTestCase,"
 | 
			
		||||
           " please make sure there is only one present ";
 | 
			
		||||
 | 
			
		||||
    return test_case_fp != nullptr ? test_case_fp : test_suite_fp;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Creates a new TestInfo object and registers it with Google Test;
 | 
			
		||||
// returns the created object.
 | 
			
		||||
//
 | 
			
		||||
// Arguments:
 | 
			
		||||
//
 | 
			
		||||
//   test_case_name:   name of the test case
 | 
			
		||||
//   test_suite_name:   name of the test suite
 | 
			
		||||
//   name:             name of the test
 | 
			
		||||
//   type_param        the name of the test's type parameter, or NULL if
 | 
			
		||||
//                     this is not a typed or a type-parameterized test.
 | 
			
		||||
@@ -513,21 +561,16 @@ struct CodeLocation {
 | 
			
		||||
//                     or NULL if this is not a type-parameterized test.
 | 
			
		||||
//   code_location:    code location where the test is defined
 | 
			
		||||
//   fixture_class_id: ID of the test fixture class
 | 
			
		||||
//   set_up_tc:        pointer to the function that sets up the test case
 | 
			
		||||
//   tear_down_tc:     pointer to the function that tears down the test case
 | 
			
		||||
//   set_up_tc:        pointer to the function that sets up the test suite
 | 
			
		||||
//   tear_down_tc:     pointer to the function that tears down the test suite
 | 
			
		||||
//   factory:          pointer to the factory that creates a test object.
 | 
			
		||||
//                     The newly created TestInfo instance will assume
 | 
			
		||||
//                     ownership of the factory object.
 | 
			
		||||
GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
 | 
			
		||||
    const char* test_case_name,
 | 
			
		||||
    const char* name,
 | 
			
		||||
    const char* type_param,
 | 
			
		||||
    const char* value_param,
 | 
			
		||||
    CodeLocation code_location,
 | 
			
		||||
    TypeId fixture_class_id,
 | 
			
		||||
    SetUpTestCaseFunc set_up_tc,
 | 
			
		||||
    TearDownTestCaseFunc tear_down_tc,
 | 
			
		||||
    TestFactoryBase* factory);
 | 
			
		||||
    const char* test_suite_name, const char* name, const char* type_param,
 | 
			
		||||
    const char* value_param, CodeLocation code_location,
 | 
			
		||||
    TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,
 | 
			
		||||
    TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory);
 | 
			
		||||
 | 
			
		||||
// If *pstr starts with the given prefix, modifies *pstr to be right
 | 
			
		||||
// past the prefix and returns true; otherwise leaves *pstr unchanged
 | 
			
		||||
@@ -539,19 +582,20 @@ GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
 | 
			
		||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
 | 
			
		||||
/* class A needs to have dll-interface to be used by clients of class B */)
 | 
			
		||||
 | 
			
		||||
// State of the definition of a type-parameterized test case.
 | 
			
		||||
class GTEST_API_ TypedTestCasePState {
 | 
			
		||||
// State of the definition of a type-parameterized test suite.
 | 
			
		||||
class GTEST_API_ TypedTestSuitePState {
 | 
			
		||||
 public:
 | 
			
		||||
  TypedTestCasePState() : registered_(false) {}
 | 
			
		||||
  TypedTestSuitePState() : registered_(false) {}
 | 
			
		||||
 | 
			
		||||
  // Adds the given test name to defined_test_names_ and return true
 | 
			
		||||
  // if the test case hasn't been registered; otherwise aborts the
 | 
			
		||||
  // if the test suite hasn't been registered; otherwise aborts the
 | 
			
		||||
  // program.
 | 
			
		||||
  bool AddTestName(const char* file, int line, const char* case_name,
 | 
			
		||||
                   const char* test_name) {
 | 
			
		||||
    if (registered_) {
 | 
			
		||||
      fprintf(stderr, "%s Test %s must be defined before "
 | 
			
		||||
              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
 | 
			
		||||
      fprintf(stderr,
 | 
			
		||||
              "%s Test %s must be defined before "
 | 
			
		||||
              "REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n",
 | 
			
		||||
              FormatFileLocation(file, line).c_str(), test_name, case_name);
 | 
			
		||||
      fflush(stderr);
 | 
			
		||||
      posix::Abort();
 | 
			
		||||
@@ -584,6 +628,11 @@ class GTEST_API_ TypedTestCasePState {
 | 
			
		||||
  RegisteredTestsMap registered_tests_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//  Legacy API is deprecated but still available
 | 
			
		||||
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
 | 
			
		||||
using TypedTestCasePState = TypedTestSuitePState;
 | 
			
		||||
#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
 | 
			
		||||
 | 
			
		||||
GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251
 | 
			
		||||
 | 
			
		||||
// Skips to the first non-space char after the first comma in 'str';
 | 
			
		||||
@@ -651,7 +700,7 @@ template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
 | 
			
		||||
class TypeParameterizedTest {
 | 
			
		||||
 public:
 | 
			
		||||
  // 'index' is the index of the test in the type list 'Types'
 | 
			
		||||
  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
 | 
			
		||||
  // specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite,
 | 
			
		||||
  // Types).  Valid values for 'index' are [0, N - 1] where N is the
 | 
			
		||||
  // length of Types.
 | 
			
		||||
  static bool Register(const char* prefix, const CodeLocation& code_location,
 | 
			
		||||
@@ -671,8 +720,10 @@ class TypeParameterizedTest {
 | 
			
		||||
        StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),
 | 
			
		||||
        GetTypeName<Type>().c_str(),
 | 
			
		||||
        nullptr,  // No value parameter.
 | 
			
		||||
        code_location, GetTypeId<FixtureClass>(), TestClass::SetUpTestCase,
 | 
			
		||||
        TestClass::TearDownTestCase, new TestFactoryImpl<TestClass>);
 | 
			
		||||
        code_location, GetTypeId<FixtureClass>(),
 | 
			
		||||
        SuiteApiResolver<TestClass>::GetSetUpCaseOrSuite(),
 | 
			
		||||
        SuiteApiResolver<TestClass>::GetTearDownCaseOrSuite(),
 | 
			
		||||
        new TestFactoryImpl<TestClass>);
 | 
			
		||||
 | 
			
		||||
    // Next, recurses (at compile time) with the tail of the type list.
 | 
			
		||||
    return TypeParameterizedTest<Fixture, TestSel,
 | 
			
		||||
@@ -698,15 +749,15 @@ class TypeParameterizedTest<Fixture, TestSel, Types0> {
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
 | 
			
		||||
// TypeParameterizedTestSuite<Fixture, Tests, Types>::Register()
 | 
			
		||||
// registers *all combinations* of 'Tests' and 'Types' with Google
 | 
			
		||||
// Test.  The return value is insignificant - we just need to return
 | 
			
		||||
// something such that we can call this function in a namespace scope.
 | 
			
		||||
template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
 | 
			
		||||
class TypeParameterizedTestCase {
 | 
			
		||||
class TypeParameterizedTestSuite {
 | 
			
		||||
 public:
 | 
			
		||||
  static bool Register(const char* prefix, CodeLocation code_location,
 | 
			
		||||
                       const TypedTestCasePState* state, const char* case_name,
 | 
			
		||||
                       const TypedTestSuitePState* state, const char* case_name,
 | 
			
		||||
                       const char* test_names,
 | 
			
		||||
                       const std::vector<std::string>& type_names =
 | 
			
		||||
                           GenerateNames<DefaultNameGenerator, Types>()) {
 | 
			
		||||
@@ -729,20 +780,20 @@ class TypeParameterizedTestCase {
 | 
			
		||||
        prefix, test_location, case_name, test_names, 0, type_names);
 | 
			
		||||
 | 
			
		||||
    // Next, recurses (at compile time) with the tail of the test list.
 | 
			
		||||
    return TypeParameterizedTestCase<Fixture, typename Tests::Tail,
 | 
			
		||||
                                     Types>::Register(prefix, code_location,
 | 
			
		||||
                                                      state, case_name,
 | 
			
		||||
                                                      SkipComma(test_names),
 | 
			
		||||
                                                      type_names);
 | 
			
		||||
    return TypeParameterizedTestSuite<Fixture, typename Tests::Tail,
 | 
			
		||||
                                      Types>::Register(prefix, code_location,
 | 
			
		||||
                                                       state, case_name,
 | 
			
		||||
                                                       SkipComma(test_names),
 | 
			
		||||
                                                       type_names);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// The base case for the compile time recursion.
 | 
			
		||||
template <GTEST_TEMPLATE_ Fixture, typename Types>
 | 
			
		||||
class TypeParameterizedTestCase<Fixture, Templates0, Types> {
 | 
			
		||||
class TypeParameterizedTestSuite<Fixture, Templates0, Types> {
 | 
			
		||||
 public:
 | 
			
		||||
  static bool Register(const char* /*prefix*/, const CodeLocation&,
 | 
			
		||||
                       const TypedTestCasePState* /*state*/,
 | 
			
		||||
                       const TypedTestSuitePState* /*state*/,
 | 
			
		||||
                       const char* /*case_name*/, const char* /*test_names*/,
 | 
			
		||||
                       const std::vector<std::string>& =
 | 
			
		||||
                           std::vector<std::string>() /*type_names*/) {
 | 
			
		||||
@@ -1376,32 +1427,35 @@ class FlatTuple
 | 
			
		||||
           "  Actual: it does.")
 | 
			
		||||
 | 
			
		||||
// Expands to the name of the class that implements the given test.
 | 
			
		||||
#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
 | 
			
		||||
  test_case_name##_##test_name##_Test
 | 
			
		||||
#define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \
 | 
			
		||||
  test_suite_name##_##test_name##_Test
 | 
			
		||||
 | 
			
		||||
// Helper macro for defining tests.
 | 
			
		||||
#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)       \
 | 
			
		||||
  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name)                     \
 | 
			
		||||
#define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id)      \
 | 
			
		||||
  class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)                    \
 | 
			
		||||
      : public parent_class {                                                 \
 | 
			
		||||
   public:                                                                    \
 | 
			
		||||
    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}                    \
 | 
			
		||||
    GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {}                   \
 | 
			
		||||
                                                                              \
 | 
			
		||||
   private:                                                                   \
 | 
			
		||||
    virtual void TestBody();                                                  \
 | 
			
		||||
    static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;     \
 | 
			
		||||
    GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_case_name,    \
 | 
			
		||||
    GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name,   \
 | 
			
		||||
                                                           test_name));       \
 | 
			
		||||
  };                                                                          \
 | 
			
		||||
                                                                              \
 | 
			
		||||
  ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name,           \
 | 
			
		||||
  ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name,          \
 | 
			
		||||
                                                    test_name)::test_info_ =  \
 | 
			
		||||
      ::testing::internal::MakeAndRegisterTestInfo(                           \
 | 
			
		||||
          #test_case_name, #test_name, nullptr, nullptr,                      \
 | 
			
		||||
          #test_suite_name, #test_name, nullptr, nullptr,                     \
 | 
			
		||||
          ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \
 | 
			
		||||
          parent_class::SetUpTestCase, parent_class::TearDownTestCase,        \
 | 
			
		||||
          ::testing::internal::SuiteApiResolver<                              \
 | 
			
		||||
              parent_class>::GetSetUpCaseOrSuite(),                           \
 | 
			
		||||
          ::testing::internal::SuiteApiResolver<                              \
 | 
			
		||||
              parent_class>::GetTearDownCaseOrSuite(),                        \
 | 
			
		||||
          new ::testing::internal::TestFactoryImpl<GTEST_TEST_CLASS_NAME_(    \
 | 
			
		||||
              test_case_name, test_name)>);                                   \
 | 
			
		||||
  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
 | 
			
		||||
              test_suite_name, test_name)>);                                  \
 | 
			
		||||
  void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()
 | 
			
		||||
 | 
			
		||||
// Internal Macro to mark an API deprecated, for googletest usage only
 | 
			
		||||
// Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user