Compare commits
	
		
			10 Commits
		
	
	
		
			master
			...
			1278977C59
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 3482353e53 | ||
|  | 78ebd4a796 | ||
|  | beb28e4d99 | ||
|  | deeaeb942e | ||
|  | 2ba222fcc5 | ||
|  | 9a976a74c9 | ||
|  | c16b7aba31 | ||
|  | ecefcbd4aa | ||
|  | a5136dbdd2 | ||
|  | e1dd49835e | 
| @ -8,6 +8,7 @@ environment: | ||||
|       generator: "Visual Studio 15 2017" | ||||
|       build_system: cmake | ||||
|       APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 | ||||
|       enabled_on_pr: yes | ||||
| 
 | ||||
|     - compiler: msvc-15-seh | ||||
|       generator: "Visual Studio 15 2017 Win64" | ||||
| @ -28,6 +29,7 @@ environment: | ||||
|     - compiler: msvc-14-seh | ||||
|       build_system: cmake | ||||
|       generator: "Visual Studio 14 2015 Win64" | ||||
|       enabled_on_pr: yes | ||||
| 
 | ||||
|     - compiler: gcc-6.3.0-posix | ||||
|       build_system: cmake | ||||
|  | ||||
| @ -1184,6 +1184,46 @@ inline ::std::reference_wrapper<T> ByRef(T& l_value) {  // NOLINT | ||||
|   return ::std::reference_wrapper<T>(l_value); | ||||
| } | ||||
| 
 | ||||
| namespace internal { | ||||
| 
 | ||||
| // A macro from the ACTION* family (defined later in gmock-generated-actions.h)
 | ||||
| // defines an action that can be used in a mock function.  Typically,
 | ||||
| // these actions only care about a subset of the arguments of the mock
 | ||||
| // function.  For example, if such an action only uses the second
 | ||||
| // argument, it can be used in any mock function that takes >= 2
 | ||||
| // arguments where the type of the second argument is compatible.
 | ||||
| //
 | ||||
| // Therefore, the action implementation must be prepared to take more
 | ||||
| // arguments than it needs.  The ExcessiveArg type is used to
 | ||||
| // represent those excessive arguments.  In order to keep the compiler
 | ||||
| // error messages tractable, we define it in the testing namespace
 | ||||
| // instead of testing::internal.  However, this is an INTERNAL TYPE
 | ||||
| // and subject to change without notice, so a user MUST NOT USE THIS
 | ||||
| // TYPE DIRECTLY.
 | ||||
| struct ExcessiveArg {}; | ||||
| 
 | ||||
| // A helper class needed for implementing the ACTION* macros.
 | ||||
| template <typename Result, class Impl> | ||||
| class ActionHelper { | ||||
|  public: | ||||
|   template <typename... Ts> | ||||
|   static Result Perform(Impl* impl, const std::tuple<Ts...>& args) { | ||||
|     return Apply(impl, args, MakeIndexSequence<sizeof...(Ts)>{}, | ||||
|                  MakeIndexSequence<10 - sizeof...(Ts)>{}); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   template <typename... Ts, std::size_t... tuple_ids, std::size_t... rest_ids> | ||||
|   static Result Apply(Impl* impl, const std::tuple<Ts...>& args, | ||||
|                       IndexSequence<tuple_ids...>, IndexSequence<rest_ids...>) { | ||||
|     return impl->template gmock_PerformImpl<Ts...>( | ||||
|         args, std::get<tuple_ids>(args)..., | ||||
|         ((void)rest_ids, ExcessiveArg())...); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| 
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #ifdef _MSC_VER | ||||
|  | ||||
| @ -47,133 +47,6 @@ | ||||
| #include "gmock/gmock-actions.h" | ||||
| #include "gmock/internal/gmock-port.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| // A macro from the ACTION* family (defined later in this file)
 | ||||
| // defines an action that can be used in a mock function.  Typically,
 | ||||
| // these actions only care about a subset of the arguments of the mock
 | ||||
| // function.  For example, if such an action only uses the second
 | ||||
| // argument, it can be used in any mock function that takes >= 2
 | ||||
| // arguments where the type of the second argument is compatible.
 | ||||
| //
 | ||||
| // Therefore, the action implementation must be prepared to take more
 | ||||
| // arguments than it needs.  The ExcessiveArg type is used to
 | ||||
| // represent those excessive arguments.  In order to keep the compiler
 | ||||
| // error messages tractable, we define it in the testing namespace
 | ||||
| // instead of testing::internal.  However, this is an INTERNAL TYPE
 | ||||
| // and subject to change without notice, so a user MUST NOT USE THIS
 | ||||
| // TYPE DIRECTLY.
 | ||||
| struct ExcessiveArg {}; | ||||
| 
 | ||||
| // A helper class needed for implementing the ACTION* macros.
 | ||||
| template <typename Result, class Impl> | ||||
| class ActionHelper { | ||||
|  public: | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<>& args) { | ||||
|     return impl->template gmock_PerformImpl<>(args, ExcessiveArg(), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), | ||||
|         ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0>(args, std::get<0>(args), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), | ||||
|         ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0, typename A1> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0, A1>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0, A1>(args, std::get<0>(args), | ||||
|         std::get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), | ||||
|         ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0, typename A1, typename A2> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0, A1, A2>(args, | ||||
|         std::get<0>(args), std::get<1>(args), std::get<2>(args), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0, typename A1, typename A2, typename A3> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, | ||||
|         std::get<0>(args), std::get<1>(args), std::get<2>(args), | ||||
|         std::get<3>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0, typename A1, typename A2, typename A3, typename A4> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, | ||||
|       A4>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args, | ||||
|         std::get<0>(args), std::get<1>(args), std::get<2>(args), | ||||
|         std::get<3>(args), std::get<4>(args), ExcessiveArg(), ExcessiveArg(), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0, typename A1, typename A2, typename A3, typename A4, | ||||
|       typename A5> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, | ||||
|       A5>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args, | ||||
|         std::get<0>(args), std::get<1>(args), std::get<2>(args), | ||||
|         std::get<3>(args), std::get<4>(args), std::get<5>(args), | ||||
|         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0, typename A1, typename A2, typename A3, typename A4, | ||||
|       typename A5, typename A6> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5, | ||||
|       A6>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args, | ||||
|         std::get<0>(args), std::get<1>(args), std::get<2>(args), | ||||
|         std::get<3>(args), std::get<4>(args), std::get<5>(args), | ||||
|         std::get<6>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0, typename A1, typename A2, typename A3, typename A4, | ||||
|       typename A5, typename A6, typename A7> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5, | ||||
|       A6, A7>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, | ||||
|         A7>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args), | ||||
|         std::get<3>(args), std::get<4>(args), std::get<5>(args), | ||||
|         std::get<6>(args), std::get<7>(args), ExcessiveArg(), ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0, typename A1, typename A2, typename A3, typename A4, | ||||
|       typename A5, typename A6, typename A7, typename A8> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5, | ||||
|       A6, A7, A8>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, | ||||
|         A8>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args), | ||||
|         std::get<3>(args), std::get<4>(args), std::get<5>(args), | ||||
|         std::get<6>(args), std::get<7>(args), std::get<8>(args), | ||||
|         ExcessiveArg()); | ||||
|   } | ||||
| 
 | ||||
|   template <typename A0, typename A1, typename A2, typename A3, typename A4, | ||||
|       typename A5, typename A6, typename A7, typename A8, typename A9> | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5, | ||||
|       A6, A7, A8, A9>& args) { | ||||
|     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8, | ||||
|         A9>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args), | ||||
|         std::get<3>(args), std::get<4>(args), std::get<5>(args), | ||||
|         std::get<6>(args), std::get<7>(args), std::get<8>(args), | ||||
|         std::get<9>(args)); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| // The ACTION* family of macros can be used in a namespace scope to
 | ||||
| // define custom actions easily.  The syntax:
 | ||||
| //
 | ||||
|  | ||||
| @ -49,54 +49,6 @@ $$}} This meta comment fixes auto-indentation in editors. | ||||
| #include "gmock/gmock-actions.h" | ||||
| #include "gmock/internal/gmock-port.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| // A macro from the ACTION* family (defined later in this file) | ||||
| // defines an action that can be used in a mock function.  Typically, | ||||
| // these actions only care about a subset of the arguments of the mock | ||||
| // function.  For example, if such an action only uses the second | ||||
| // argument, it can be used in any mock function that takes >= 2 | ||||
| // arguments where the type of the second argument is compatible. | ||||
| // | ||||
| // Therefore, the action implementation must be prepared to take more | ||||
| // arguments than it needs.  The ExcessiveArg type is used to | ||||
| // represent those excessive arguments.  In order to keep the compiler | ||||
| // error messages tractable, we define it in the testing namespace | ||||
| // instead of testing::internal.  However, this is an INTERNAL TYPE | ||||
| // and subject to change without notice, so a user MUST NOT USE THIS | ||||
| // TYPE DIRECTLY. | ||||
| struct ExcessiveArg {}; | ||||
| 
 | ||||
| // A helper class needed for implementing the ACTION* macros. | ||||
| template <typename Result, class Impl> | ||||
| class ActionHelper { | ||||
|  public: | ||||
| $range i 0..n | ||||
| $for i | ||||
| 
 | ||||
| [[ | ||||
| $var template = [[$if i==0 [[]] $else [[ | ||||
| $range j 0..i-1 | ||||
|   template <$for j, [[typename A$j]]> | ||||
| ]]]] | ||||
| $range j 0..i-1 | ||||
| $var As = [[$for j, [[A$j]]]] | ||||
| $var as = [[$for j, [[std::get<$j>(args)]]]] | ||||
| $range k 1..n-i | ||||
| $var eas = [[$for k, [[ExcessiveArg()]]]] | ||||
| $var arg_list = [[$if (i==0) | (i==n) [[$as$eas]] $else [[$as, $eas]]]] | ||||
| $template | ||||
|   static Result Perform(Impl* impl, const ::std::tuple<$As>& args) { | ||||
|     return impl->template gmock_PerformImpl<$As>(args, $arg_list); | ||||
|   } | ||||
| 
 | ||||
| ]] | ||||
| }; | ||||
| 
 | ||||
| }  // namespace internal | ||||
| }  // namespace testing | ||||
| 
 | ||||
| // The ACTION* family of macros can be used in a namespace scope to | ||||
| // define custom actions easily.  The syntax: | ||||
| // | ||||
|  | ||||
| @ -1350,12 +1350,6 @@ class ReferenceOrValueWrapper<T&> { | ||||
|   T* value_ptr_; | ||||
| }; | ||||
| 
 | ||||
| // MSVC warns about using 'this' in base member initializer list, so
 | ||||
| // we need to temporarily disable the warning.  We have to do it for
 | ||||
| // the entire class to suppress the warning, even though it's about
 | ||||
| // the constructor only.
 | ||||
| GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355) | ||||
| 
 | ||||
| // C++ treats the void type specially.  For example, you cannot define
 | ||||
| // a void-typed variable or pass a void value to a function.
 | ||||
| // ActionResultHolder<T> holds a value of type T, where T must be a
 | ||||
| @ -1786,8 +1780,6 @@ class FunctionMocker<R(Args...)> final : public UntypedFunctionMockerBase { | ||||
|   } | ||||
| };  // class FunctionMocker
 | ||||
| 
 | ||||
| GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4355
 | ||||
| 
 | ||||
| // Reports an uninteresting call (whose description is in msg) in the
 | ||||
| // manner specified by 'reaction'.
 | ||||
| void ReportUninterestingCall(CallReaction reaction, const std::string& msg); | ||||
|  | ||||
| @ -392,13 +392,6 @@ TEST(ElementsAreTest, AcceptsStringLiteral) { | ||||
|   EXPECT_THAT(array, Not(ElementsAre("hi", "one", "too"))); | ||||
| } | ||||
| 
 | ||||
| #ifndef _MSC_VER | ||||
| 
 | ||||
| // The following test passes a value of type const char[] to a
 | ||||
| // function template that expects const T&.  Some versions of MSVC
 | ||||
| // generates a compiler error C2665 for that.  We believe it's a bug
 | ||||
| // in MSVC.  Therefore this test is #if-ed out for MSVC.
 | ||||
| 
 | ||||
| // Declared here with the size unknown.  Defined AFTER the following test.
 | ||||
| extern const char kHi[]; | ||||
| 
 | ||||
| @ -415,8 +408,6 @@ TEST(ElementsAreTest, AcceptsArrayWithUnknownSize) { | ||||
| 
 | ||||
| const char kHi[] = "hi"; | ||||
| 
 | ||||
| #endif  // _MSC_VER
 | ||||
| 
 | ||||
| TEST(ElementsAreTest, MakesCopyOfArguments) { | ||||
|   int x = 1; | ||||
|   int y = 2; | ||||
|  | ||||
| @ -42,12 +42,14 @@ | ||||
| #include <memory> | ||||
| #include <set> | ||||
| #include <tuple> | ||||
| #include <type_traits> | ||||
| #include <utility> | ||||
| #include <vector> | ||||
| 
 | ||||
| #include "gtest/internal/gtest-internal.h" | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| #include "gtest/gtest-printers.h" | ||||
| #include "gtest/gtest-test-part.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| // Input to a parameterized test name generator, describing a test parameter.
 | ||||
| @ -472,6 +474,9 @@ class ParameterizedTestSuiteInfoBase { | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase); | ||||
| }; | ||||
| 
 | ||||
| GTEST_API_ void InsertSyntheticTestCase(const std::string& name, | ||||
|                                         CodeLocation location); | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P
 | ||||
| @ -522,11 +527,13 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { | ||||
|     return 0;  // Return value used only to run this method in namespace scope.
 | ||||
|   } | ||||
|   // UnitTest class invokes this method to register tests in this test suite
 | ||||
|   // test suites right before running tests in RUN_ALL_TESTS macro.
 | ||||
|   // right before running tests in RUN_ALL_TESTS macro.
 | ||||
|   // This method should not be called more than once on any single
 | ||||
|   // instance of a ParameterizedTestSuiteInfoBase derived class.
 | ||||
|   // UnitTest has a guard to prevent from calling this method more than once.
 | ||||
|   void RegisterTests() override { | ||||
|     bool generated_instantiations = false; | ||||
| 
 | ||||
|     for (typename TestInfoContainer::iterator test_it = tests_.begin(); | ||||
|          test_it != tests_.end(); ++test_it) { | ||||
|       std::shared_ptr<TestInfo> test_info = *test_it; | ||||
| @ -549,6 +556,8 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { | ||||
|         for (typename ParamGenerator<ParamType>::iterator param_it = | ||||
|                  generator.begin(); | ||||
|              param_it != generator.end(); ++param_it, ++i) { | ||||
|           generated_instantiations = true; | ||||
| 
 | ||||
|           Message test_name_stream; | ||||
| 
 | ||||
|           std::string param_name = name_func( | ||||
| @ -577,6 +586,11 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { | ||||
|         }  // for param_it
 | ||||
|       }  // for gen_it
 | ||||
|     }  // for test_it
 | ||||
| 
 | ||||
|     if (!generated_instantiations) { | ||||
|       // There are no generaotrs, or they all generate nothing ...
 | ||||
|       InsertSyntheticTestCase(GetTestSuiteName(), code_location_); | ||||
|     } | ||||
|   }    // RegisterTests
 | ||||
| 
 | ||||
|  private: | ||||
|  | ||||
| @ -407,6 +407,66 @@ void AssertHelper::operator=(const Message& message) const { | ||||
|                       );  // NOLINT
 | ||||
| } | ||||
| 
 | ||||
| namespace { | ||||
| 
 | ||||
| // When TEST_P is found without a matching INSTANTIATE_TEST_SUITE_P
 | ||||
| // to creates test cases for it, a syntetic test case is
 | ||||
| // inserted to report ether an error or a log message.
 | ||||
| //
 | ||||
| // This configuration bit will likely be removed at some point.
 | ||||
| constexpr bool kErrorOnUninstantiatedParameterizedTest = false; | ||||
| 
 | ||||
| // A test that fails at a given file/line location with a given message.
 | ||||
| class FailureTest : public Test { | ||||
|  public: | ||||
|   explicit FailureTest(const CodeLocation& loc, std::string error_message, | ||||
|                        bool as_error) | ||||
|       : loc_(loc), | ||||
|         error_message_(std::move(error_message)), | ||||
|         as_error_(as_error) {} | ||||
| 
 | ||||
|   void TestBody() override { | ||||
|     if (as_error_) { | ||||
|       AssertHelper(TestPartResult::kNonFatalFailure, loc_.file.c_str(), | ||||
|                    loc_.line, "") = Message() << error_message_; | ||||
|     } else { | ||||
|       std::cout << error_message_ << std::endl; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   const CodeLocation loc_; | ||||
|   const std::string error_message_; | ||||
|   const bool as_error_; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| }  // namespace
 | ||||
| 
 | ||||
| // If this parameterized test suite has no instantiations (and that
 | ||||
| // has not been marked as okay), emit a test case reporting that.
 | ||||
| void InsertSyntheticTestCase(const std::string &name, CodeLocation location) { | ||||
|   std::string message = | ||||
|       "Paramaterized test suite " + name + | ||||
|       " is defined via TEST_P, but never instantiated. None of the test cases " | ||||
|       "will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only " | ||||
|       "ones provided expand to nothing." | ||||
|       "\n\n" | ||||
|       "Ideally, TEST_P definitions should only ever be included as part of " | ||||
|       "binaries that intend to use them. (As opposed to, for example, being " | ||||
|       "placed in a library that may be linked in to get other utilities.)"; | ||||
| 
 | ||||
|   std::string full_name = "UninstantiatedParamaterizedTestSuite<" + name + ">"; | ||||
|   RegisterTest(  //
 | ||||
|       "GoogleTestVerification", full_name.c_str(), | ||||
|       nullptr,  // No type parameter.
 | ||||
|       nullptr,  // No value parameter.
 | ||||
|       location.file.c_str(), location.line, [message, location] { | ||||
|         return new FailureTest(location, message, | ||||
|                                kErrorOnUninstantiatedParameterizedTest); | ||||
|       }); | ||||
| } | ||||
| 
 | ||||
| // A copy of all command line arguments.  Set by InitGoogleTest().
 | ||||
| static ::std::vector<std::string> g_argvs; | ||||
| 
 | ||||
|  | ||||
| @ -12,7 +12,7 @@ Expected equality of these values: | ||||
|   3 | ||||
| Stack trace: (omitted) | ||||
| 
 | ||||
| [0;32m[==========] [mRunning 84 tests from 39 test suites. | ||||
| [0;32m[==========] [mRunning 85 tests from 40 test suites. | ||||
| [0;32m[----------] [mGlobal test environment set-up. | ||||
| FooEnvironment::SetUp() called. | ||||
| BarEnvironment::SetUp() called. | ||||
| @ -979,6 +979,12 @@ Expected failure | ||||
| Stack trace: (omitted) | ||||
| 
 | ||||
| [0;31m[  FAILED  ] [mPrintingStrings/ParamTest.Failure/a, where GetParam() = "a" | ||||
| [0;32m[----------] [m1 test from GoogleTestVerification | ||||
| [0;32m[ RUN      ] [mGoogleTestVerification.UninstantiatedParamaterizedTestSuite<DetectNotInstantiatedTest> | ||||
| Paramaterized test suite DetectNotInstantiatedTest is defined via TEST_P, but never instantiated. None of the test cases will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only ones provided expand to nothing. | ||||
| 
 | ||||
| Ideally, TEST_P definitions should only ever be included as part of binaries that intend to use them. (As opposed to, for example, being placed in a library that may be linked in to get other utilities.) | ||||
| [0;32m[       OK ] [mGoogleTestVerification.UninstantiatedParamaterizedTestSuite<DetectNotInstantiatedTest> | ||||
| [0;32m[----------] [mGlobal test environment tear-down | ||||
| BarEnvironment::TearDown() called. | ||||
| googletest-output-test_.cc:#: Failure | ||||
| @ -992,8 +998,8 @@ Failed | ||||
| Expected fatal failure. | ||||
| Stack trace: (omitted) | ||||
| 
 | ||||
| [0;32m[==========] [m84 tests from 39 test suites ran. | ||||
| [0;32m[  PASSED  ] [m30 tests. | ||||
| [0;32m[==========] [m85 tests from 40 test suites ran. | ||||
| [0;32m[  PASSED  ] [m31 tests. | ||||
| [0;31m[  FAILED  ] [m54 tests, listed below: | ||||
| [0;31m[  FAILED  ] [mNonfatalFailureTest.EscapesStringOperands | ||||
| [0;31m[  FAILED  ] [mNonfatalFailureTest.DiffForLongStrings | ||||
|  | ||||
| @ -782,6 +782,13 @@ INSTANTIATE_TEST_SUITE_P(PrintingStrings, | ||||
|                          testing::Values(std::string("a")), | ||||
|                          ParamNameFunc); | ||||
| 
 | ||||
| // fails under kErrorOnUninstantiatedParameterizedTest=true
 | ||||
| class DetectNotInstantiatedTest : public testing::TestWithParam<int> {}; | ||||
| TEST_P(DetectNotInstantiatedTest, Used) { } | ||||
| 
 | ||||
| // This would make the test failure from the above go away.
 | ||||
| // INSTANTIATE_TEST_SUITE_P(Fix, DetectNotInstantiatedTest, testing::Values(1));
 | ||||
| 
 | ||||
| // This #ifdef block tests the output of typed tests.
 | ||||
| #if GTEST_HAS_TYPED_TEST | ||||
| 
 | ||||
|  | ||||
| @ -1068,6 +1068,12 @@ TEST_P(MyEnumTest, ChecksParamMoreThanZero) { EXPECT_GE(10, GetParam()); } | ||||
| INSTANTIATE_TEST_SUITE_P(MyEnumTests, MyEnumTest, | ||||
|                          ::testing::Values(ENUM1, ENUM2, 0)); | ||||
| 
 | ||||
| namespace works_here { | ||||
| // Never used not instantiated, this should work.
 | ||||
| class NotUsedTest : public testing::TestWithParam<int> {}; | ||||
| 
 | ||||
| }  // namespace works_here
 | ||||
| 
 | ||||
| int main(int argc, char **argv) { | ||||
|   // Used in TestGenerationTest test suite.
 | ||||
|   AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance()); | ||||
|  | ||||
| @ -2926,8 +2926,6 @@ TEST_F(FloatTest, EXPECT_NEAR) { | ||||
|   EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f, 1.5f, 0.25f),  // NOLINT
 | ||||
|                           "The difference between 1.0f and 1.5f is 0.5, " | ||||
|                           "which exceeds 0.25f"); | ||||
|   // To work around a bug in gcc 2.95.0, there is intentionally no
 | ||||
|   // space after the first comma in the previous line.
 | ||||
| } | ||||
| 
 | ||||
| // Tests ASSERT_NEAR.
 | ||||
| @ -2937,8 +2935,6 @@ TEST_F(FloatTest, ASSERT_NEAR) { | ||||
|   EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f, 1.5f, 0.25f),  // NOLINT
 | ||||
|                        "The difference between 1.0f and 1.5f is 0.5, " | ||||
|                        "which exceeds 0.25f"); | ||||
|   // To work around a bug in gcc 2.95.0, there is intentionally no
 | ||||
|   // space after the first comma in the previous line.
 | ||||
| } | ||||
| 
 | ||||
| // Tests the cases where FloatLE() should succeed.
 | ||||
| @ -4323,8 +4319,6 @@ TEST(AssertionWithMessageTest, ASSERT_FLOATING) { | ||||
|   ASSERT_DOUBLE_EQ(1, 1) << "This should succeed."; | ||||
|   EXPECT_FATAL_FAILURE(ASSERT_NEAR(1, 1.2, 0.1) << "Expect failure.",  // NOLINT
 | ||||
|                        "Expect failure."); | ||||
|   // To work around a bug in gcc 2.95.0, there is intentionally no
 | ||||
|   // space after the first comma in the previous statement.
 | ||||
| } | ||||
| 
 | ||||
| // Tests using ASSERT_FALSE with a streamed message.
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user