37 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 38 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 40 #include "gtest/internal/gtest-port.h" 44 # include <sys/types.h> 45 # include <sys/wait.h> 47 #endif // GTEST_OS_LINUX 49 #if GTEST_HAS_EXCEPTIONS 61 #include <type_traits> 64 #include "gtest/gtest-message.h" 65 #include "gtest/internal/gtest-filepath.h" 66 #include "gtest/internal/gtest-string.h" 67 #include "gtest/internal/gtest-type-util.h" 77 #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) 78 #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar 81 #define GTEST_STRINGIFY_(name) #name 83 class ProtocolMessage;
84 namespace proto2 {
class Message; }
90 class AssertionResult;
98 ::std::string PrintToString(
const T& value);
108 GTEST_API_
extern const char kStackTraceMarker[];
121 template <
typename T,
122 typename std::enable_if<!std::is_convertible<T, Sink>::value,
130 template <
typename T>
131 using TypeIsValidNullptrConstant = std::integral_constant<
132 bool, std::is_same<typename std::decay<T>::type, std::nullptr_t>::value ||
133 !std::is_convertible<T, Secret*>::value>;
147 std::true_type IsNullLiteralHelper(Secret*, std::true_type);
148 std::false_type IsNullLiteralHelper(
IgnoredValue, std::false_type);
149 std::false_type IsNullLiteralHelper(
IgnoredValue, std::true_type);
153 #define GTEST_IS_NULL_LITERAL_(x) \ 154 decltype(::testing::internal::IsNullLiteralHelper( \ 156 ::testing::internal::TypeIsValidNullptrConstant<decltype(x)>()))::value 159 GTEST_API_ std::string AppendUserMessage(
160 const std::string& gtest_msg,
const Message& user_msg);
162 #if GTEST_HAS_EXCEPTIONS 164 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4275 \
173 class GTEST_API_ GoogleTestFailureException :
public ::std::runtime_error {
175 explicit GoogleTestFailureException(
const TestPartResult& failure);
178 GTEST_DISABLE_MSC_WARNINGS_POP_()
180 #endif // GTEST_HAS_EXCEPTIONS 182 namespace edit_distance {
188 enum EditType { kMatch, kAdd, kRemove, kReplace };
189 GTEST_API_ std::vector<EditType> CalculateOptimalEdits(
190 const std::vector<size_t>& left,
const std::vector<size_t>& right);
193 GTEST_API_ std::vector<EditType> CalculateOptimalEdits(
194 const std::vector<std::string>& left,
195 const std::vector<std::string>& right);
198 GTEST_API_ std::string CreateUnifiedDiff(
const std::vector<std::string>& left,
199 const std::vector<std::string>& right,
208 GTEST_API_ std::string DiffStrings(
const std::string& left,
209 const std::string& right,
210 size_t* total_line_count);
227 GTEST_API_ AssertionResult EqFailure(
const char* expected_expression,
228 const char* actual_expression,
229 const std::string& expected_value,
230 const std::string& actual_value,
234 GTEST_API_ std::string GetBoolAssertionFailureMessage(
235 const AssertionResult& assertion_result,
236 const char* expression_text,
237 const char* actual_predicate_value,
238 const char* expected_predicate_value);
269 template <
typename RawType>
279 static const size_t kBitCount = 8*
sizeof(RawType);
282 static const size_t kFractionBitCount =
283 std::numeric_limits<RawType>::digits - 1;
286 static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
289 static const Bits kSignBitMask =
static_cast<Bits
>(1) << (kBitCount - 1);
292 static const Bits kFractionBitMask =
293 ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
296 static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
310 static const size_t kMaxUlps = 4;
325 static RawType ReinterpretBits(
const Bits bits) {
332 static RawType Infinity() {
333 return ReinterpretBits(kExponentBitMask);
337 static RawType Max();
342 const Bits &bits()
const {
return u_.bits_; }
345 Bits exponent_bits()
const {
return kExponentBitMask & u_.bits_; }
348 Bits fraction_bits()
const {
return kFractionBitMask & u_.bits_; }
351 Bits sign_bit()
const {
return kSignBitMask & u_.bits_; }
354 bool is_nan()
const {
357 return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
369 if (is_nan() || rhs.is_nan())
return false;
371 return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
377 union FloatingPointUnion {
397 static Bits SignAndMagnitudeToBiased(
const Bits &sam) {
398 if (kSignBitMask & sam) {
403 return kSignBitMask | sam;
409 static Bits DistanceBetweenSignAndMagnitudeNumbers(
const Bits &sam1,
411 const Bits biased1 = SignAndMagnitudeToBiased(sam1);
412 const Bits biased2 = SignAndMagnitudeToBiased(sam2);
413 return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
416 FloatingPointUnion u_;
437 typedef const void* TypeId;
439 template <
typename T>
448 template <
typename T>
454 template <
typename T>
460 return &(TypeIdHelper<T>::dummy_);
468 GTEST_API_ TypeId GetTestTypeId();
478 virtual Test* CreateTest() = 0;
489 template <
class TestClass>
492 Test* CreateTest()
override {
return new TestClass; }
501 GTEST_API_ AssertionResult IsHRESULTSuccess(
const char* expr,
503 GTEST_API_ AssertionResult IsHRESULTFailure(
const char* expr,
506 #endif // GTEST_OS_WINDOWS 509 using SetUpTestSuiteFunc = void (*)();
510 using TearDownTestSuiteFunc = void (*)();
514 : file(a_file), line(a_line) {}
524 using SetUpTearDownSuiteFuncType = void (*)();
526 inline SetUpTearDownSuiteFuncType GetNotDefaultOrNull(
527 SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) {
528 return a == def ?
nullptr : a;
531 template <
typename T>
539 typename std::conditional<sizeof(T) != 0, ::testing::Test, void>::type;
541 static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite() {
542 SetUpTearDownSuiteFuncType test_case_fp =
543 GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase);
544 SetUpTearDownSuiteFuncType test_suite_fp =
545 GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite);
547 GTEST_CHECK_(!test_case_fp || !test_suite_fp)
548 <<
"Test can not provide both SetUpTestSuite and SetUpTestCase, please " 549 "make sure there is only one present ";
551 return test_case_fp !=
nullptr ? test_case_fp : test_suite_fp;
554 static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite() {
555 SetUpTearDownSuiteFuncType test_case_fp =
556 GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase);
557 SetUpTearDownSuiteFuncType test_suite_fp =
558 GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite);
560 GTEST_CHECK_(!test_case_fp || !test_suite_fp)
561 <<
"Test can not provide both TearDownTestSuite and TearDownTestCase," 562 " please make sure there is only one present ";
564 return test_case_fp !=
nullptr ? test_case_fp : test_suite_fp;
586 GTEST_API_
TestInfo* MakeAndRegisterTestInfo(
587 const char* test_suite_name,
const char* name,
const char* type_param,
589 TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,
595 GTEST_API_
bool SkipPrefix(
const char* prefix,
const char** pstr);
597 #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P 599 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
603 class GTEST_API_ TypedTestSuitePState {
605 TypedTestSuitePState() : registered_(
false) {}
610 bool AddTestName(
const char* file,
int line,
const char* case_name,
611 const char* test_name) {
614 "%s Test %s must be defined before " 615 "REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n",
616 FormatFileLocation(file, line).c_str(), test_name, case_name);
620 registered_tests_.insert(
625 bool TestExists(
const std::string& test_name)
const {
626 return registered_tests_.count(test_name) > 0;
629 const CodeLocation& GetCodeLocation(
const std::string& test_name)
const {
630 RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name);
631 GTEST_CHECK_(it != registered_tests_.end());
638 const char* VerifyRegisteredTestNames(
639 const char* file,
int line,
const char* registered_tests);
642 typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap;
645 RegisteredTestsMap registered_tests_;
649 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 650 using TypedTestCasePState = TypedTestSuitePState;
651 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 653 GTEST_DISABLE_MSC_WARNINGS_POP_()
657 inline const char* SkipComma(
const char* str) {
658 const char* comma = strchr(str,
',');
659 if (comma ==
nullptr) {
662 while (IsSpace(*(++comma))) {}
668 inline std::string GetPrefixUntilComma(
const char* str) {
669 const char* comma = strchr(str,
',');
670 return comma ==
nullptr ? str : std::string(str, comma);
675 void SplitString(const ::std::string& str,
char delimiter,
676 ::std::vector< ::std::string>* dest);
680 struct DefaultNameGenerator {
681 template <
typename T>
682 static std::string GetName(
int i) {
683 return StreamableToString(i);
687 template <
typename Prov
ided = DefaultNameGenerator>
688 struct NameGeneratorSelector {
689 typedef Provided type;
692 template <
typename NameGenerator>
693 void GenerateNamesRecursively(Types0, std::vector<std::string>*,
int) {}
695 template <
typename NameGenerator,
typename Types>
696 void GenerateNamesRecursively(Types, std::vector<std::string>* result,
int i) {
697 result->push_back(NameGenerator::template GetName<typename Types::Head>(i));
698 GenerateNamesRecursively<NameGenerator>(
typename Types::Tail(), result,
702 template <
typename NameGenerator,
typename Types>
703 std::vector<std::string> GenerateNames() {
704 std::vector<std::string> result;
705 GenerateNamesRecursively<NameGenerator>(Types(), &result, 0);
716 template <GTEST_TEMPLATE_ Fixture,
class TestSel,
typename Types>
717 class TypeParameterizedTest {
723 static bool Register(
const char* prefix,
const CodeLocation& code_location,
724 const char* case_name,
const char* test_names,
int index,
725 const std::vector<std::string>& type_names =
726 GenerateNames<DefaultNameGenerator, Types>()) {
727 typedef typename Types::Head Type;
729 typedef typename GTEST_BIND_(TestSel, Type) TestClass;
733 MakeAndRegisterTestInfo(
734 (std::string(prefix) + (prefix[0] ==
'\0' ?
"" :
"/") + case_name +
735 "/" + type_names[index])
737 StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),
738 GetTypeName<Type>().c_str(),
740 code_location, GetTypeId<FixtureClass>(),
746 return TypeParameterizedTest<
Fixture, TestSel,
747 typename Types::Tail>::Register(prefix,
757 template <GTEST_TEMPLATE_ Fixture,
class TestSel>
758 class TypeParameterizedTest<Fixture, TestSel, Types0> {
761 const char* ,
const char* ,
763 const std::vector<std::string>& =
764 std::vector<std::string>() ) {
773 template <GTEST_TEMPLATE_ Fixture,
typename Tests,
typename Types>
774 class TypeParameterizedTestSuite {
776 static bool Register(
const char* prefix,
CodeLocation code_location,
777 const TypedTestSuitePState* state,
const char* case_name,
778 const char* test_names,
779 const std::vector<std::string>& type_names =
780 GenerateNames<DefaultNameGenerator, Types>()) {
781 std::string test_name = StripTrailingSpaces(
782 GetPrefixUntilComma(test_names));
783 if (!state->TestExists(test_name)) {
784 fprintf(stderr,
"Failed to get code location for test %s.%s at %s.",
785 case_name, test_name.c_str(),
786 FormatFileLocation(code_location.file.c_str(),
787 code_location.line).c_str());
791 const CodeLocation& test_location = state->GetCodeLocation(test_name);
793 typedef typename Tests::Head Head;
796 TypeParameterizedTest<Fixture, Head, Types>::Register(
797 prefix, test_location, case_name, test_names, 0, type_names);
800 return TypeParameterizedTestSuite<Fixture,
typename Tests::Tail,
801 Types>::Register(prefix, code_location,
803 SkipComma(test_names),
809 template <GTEST_TEMPLATE_ Fixture,
typename Types>
810 class TypeParameterizedTestSuite<Fixture, Templates0, Types> {
813 const TypedTestSuitePState* ,
814 const char* ,
const char* ,
815 const std::vector<std::string>& =
816 std::vector<std::string>() ) {
821 #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P 833 GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
834 UnitTest* unit_test,
int skip_count);
840 GTEST_API_
bool AlwaysTrue();
843 inline bool AlwaysFalse() {
return !AlwaysTrue(); }
850 operator bool()
const {
return true; }
861 static const UInt32 kMaxRange = 1u << 31;
863 explicit Random(UInt32 seed) : state_(seed) {}
865 void Reseed(UInt32 seed) { state_ = seed; }
869 UInt32 Generate(UInt32 range);
873 GTEST_DISALLOW_COPY_AND_ASSIGN_(
Random);
878 template <
typename T1,
typename T2>
881 template <
typename T>
888 template <
typename T>
890 template <
typename T>
895 #define GTEST_REMOVE_REFERENCE_(T) \ 896 typename ::testing::internal::RemoveReference<T>::type 901 template <
typename T>
903 template <
typename T>
909 template <
typename T,
size_t N>
911 typedef typename RemoveConst<T>::type type[N];
916 #define GTEST_REMOVE_CONST_(T) \ 917 typename ::testing::internal::RemoveConst<T>::type 920 #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ 921 GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) 926 template <
typename T>
929 std::is_convertible<const T*, const ::ProtocolMessage*>::value ||
930 std::is_convertible<const T*, const ::proto2::Message*>::value> {
957 typedef int IsContainer;
959 class Iterator = decltype(::std::declval<const C&>().begin()),
960 class = decltype(::std::declval<const C&>().end()),
961 class = decltype(++::std::declval<Iterator&>()),
962 class = decltype(*::std::declval<Iterator>()),
963 class =
typename C::const_iterator>
964 IsContainer IsContainerTest(
int ) {
968 typedef char IsNotContainer;
970 IsNotContainer IsContainerTest(
long ) {
return '\0'; }
976 template <
typename T>
979 template <
typename U>
980 static char test(
typename U::hasher*,
typename U::reverse_iterator*);
981 template <
typename U>
982 static int test(
typename U::hasher*, ...);
983 template <
typename U>
984 static char test(...);
987 static const bool value =
sizeof(test<T>(
nullptr,
nullptr)) ==
sizeof(int);
990 template <
typename T>
993 template <
typename C,
994 bool =
sizeof(IsContainerTest<C>(0)) ==
sizeof(IsContainer)>
997 template <
typename C>
1004 template <
typename C>
1006 using value_type = decltype(*std::declval<typename C::const_iterator>());
1008 is_same<
typename std::remove_const<
1009 typename std::remove_reference<value_type>::type>
::type,
1019 template <
typename C>
1027 template<>
struct EnableIf<true> {
typedef void type; };
1035 template <
typename T,
typename U>
1036 bool ArrayEq(
const T* lhs,
size_t size,
const U* rhs);
1039 template <
typename T,
typename U>
1040 inline bool ArrayEq(
const T& lhs,
const U& rhs) {
return lhs == rhs; }
1043 template <
typename T,
typename U,
size_t N>
1044 inline bool ArrayEq(
const T(&lhs)[N],
const U(&rhs)[N]) {
1045 return internal::ArrayEq(lhs, N, rhs);
1051 template <
typename T,
typename U>
1052 bool ArrayEq(
const T* lhs,
size_t size,
const U* rhs) {
1053 for (
size_t i = 0; i != size; i++) {
1054 if (!internal::ArrayEq(lhs[i], rhs[i]))
1062 template <
typename Iter,
typename Element>
1063 Iter ArrayAwareFind(Iter begin, Iter end,
const Element& elem) {
1064 for (Iter it = begin; it != end; ++it) {
1065 if (internal::ArrayEq(*it, elem))
1075 template <
typename T,
typename U>
1076 void CopyArray(
const T* from,
size_t size, U* to);
1079 template <
typename T,
typename U>
1080 inline void CopyArray(
const T& from, U* to) { *to = from; }
1083 template <
typename T,
typename U,
size_t N>
1084 inline void CopyArray(
const T(&from)[N], U(*to)[N]) {
1085 internal::CopyArray(from, N, *to);
1091 template <
typename T,
typename U>
1092 void CopyArray(
const T* from,
size_t size, U* to) {
1093 for (
size_t i = 0; i != size; i++) {
1094 internal::CopyArray(from[i], to + i);
1113 template <
typename Element>
1117 typedef Element value_type;
1118 typedef Element* iterator;
1119 typedef const Element* const_iterator;
1123 InitRef(array, count);
1128 InitCopy(array, count);
1133 (this->*rhs.clone_)(rhs.array_, rhs.size_);
1137 if (clone_ != &NativeArray::InitRef)
1142 size_t size()
const {
return size_; }
1143 const_iterator begin()
const {
return array_; }
1144 const_iterator end()
const {
return array_ + size_; }
1146 return size() == rhs.size() &&
1147 ArrayEq(begin(), size(), rhs.begin());
1153 Element, GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>::value
1157 void InitCopy(
const Element* array,
size_t a_size) {
1158 Element*
const copy =
new Element[a_size];
1159 CopyArray(array, a_size, copy);
1162 clone_ = &NativeArray::InitCopy;
1166 void InitRef(
const Element* array,
size_t a_size) {
1169 clone_ = &NativeArray::InitRef;
1172 const Element* array_;
1174 void (
NativeArray::*clone_)(
const Element*, size_t);
1180 template <
size_t... Is>
1186 template <
bool plus_one,
typename T,
size_t sizeofT>
1188 template <
size_t... I,
size_t sizeofT>
1192 template <
size_t... I,
size_t sizeofT>
1201 :
DoubleSequence<N % 2 == 1, typename MakeIndexSequence<N / 2>::type,
1210 template <
typename T,
size_t,
size_t>
1213 template <
typename T,
size_t I>
1220 template <
size_t N,
typename I,
typename... T>
1223 template <
size_t N,
size_t... I,
typename... T>
1227 template <
typename... T>
1230 template <
typename Derived,
size_t I>
1233 template <
typename... T,
size_t I>
1243 template <
typename Derived,
typename Idx>
1246 template <
size_t... Idx,
typename... T>
1264 template <
typename... T>
1267 typename MakeIndexSequence<sizeof...(T)>::type> {
1268 using Indices =
typename FlatTuple::FlatTupleBase::Indices;
1272 explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {}
1275 const typename ElemFromList<I, Indices, T...>::type& Get()
const {
1287 GTEST_INTERNAL_DEPRECATED(
1288 "INSTANTIATE_TEST_CASE_P is deprecated, please use " 1289 "INSTANTIATE_TEST_SUITE_P")
1290 constexpr
bool InstantiateTestCase_P_IsDeprecated() {
return true; }
1292 GTEST_INTERNAL_DEPRECATED(
1293 "TYPED_TEST_CASE_P is deprecated, please use " 1294 "TYPED_TEST_SUITE_P")
1295 constexpr
bool TypedTestCase_P_IsDeprecated() {
return true; }
1297 GTEST_INTERNAL_DEPRECATED(
1298 "TYPED_TEST_CASE is deprecated, please use " 1300 constexpr
bool TypedTestCaseIsDeprecated() {
return true; }
1302 GTEST_INTERNAL_DEPRECATED(
1303 "REGISTER_TYPED_TEST_CASE_P is deprecated, please use " 1304 "REGISTER_TYPED_TEST_SUITE_P")
1305 constexpr
bool RegisterTypedTestCase_P_IsDeprecated() {
return true; }
1307 GTEST_INTERNAL_DEPRECATED(
1308 "INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use " 1309 "INSTANTIATE_TYPED_TEST_SUITE_P")
1310 constexpr
bool InstantiateTypedTestCase_P_IsDeprecated() {
return true; }
1315 #define GTEST_MESSAGE_AT_(file, line, message, result_type) \ 1316 ::testing::internal::AssertHelper(result_type, file, line, message) \ 1317 = ::testing::Message() 1319 #define GTEST_MESSAGE_(message, result_type) \ 1320 GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) 1322 #define GTEST_FATAL_FAILURE_(message) \ 1323 return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) 1325 #define GTEST_NONFATAL_FAILURE_(message) \ 1326 GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) 1328 #define GTEST_SUCCESS_(message) \ 1329 GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) 1331 #define GTEST_SKIP_(message) \ 1332 return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip) 1337 #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ 1338 if (::testing::internal::AlwaysTrue()) { statement; } 1340 #define GTEST_TEST_THROW_(statement, expected_exception, fail) \ 1341 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1342 if (::testing::internal::ConstCharPtr gtest_msg = "") { \ 1343 bool gtest_caught_expected = false; \ 1345 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 1347 catch (expected_exception const&) { \ 1348 gtest_caught_expected = true; \ 1352 "Expected: " #statement " throws an exception of type " \ 1353 #expected_exception ".\n Actual: it throws a different type."; \ 1354 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 1356 if (!gtest_caught_expected) { \ 1358 "Expected: " #statement " throws an exception of type " \ 1359 #expected_exception ".\n Actual: it throws nothing."; \ 1360 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 1363 GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ 1364 fail(gtest_msg.value) 1366 #define GTEST_TEST_NO_THROW_(statement, fail) \ 1367 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1368 if (::testing::internal::AlwaysTrue()) { \ 1370 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 1373 goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ 1376 GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ 1377 fail("Expected: " #statement " doesn't throw an exception.\n" \ 1378 " Actual: it throws.") 1380 #define GTEST_TEST_ANY_THROW_(statement, fail) \ 1381 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1382 if (::testing::internal::AlwaysTrue()) { \ 1383 bool gtest_caught_any = false; \ 1385 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 1388 gtest_caught_any = true; \ 1390 if (!gtest_caught_any) { \ 1391 goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ 1394 GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ 1395 fail("Expected: " #statement " throws an exception.\n" \ 1396 " Actual: it doesn't.") 1402 #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ 1403 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1404 if (const ::testing::AssertionResult gtest_ar_ = \ 1405 ::testing::AssertionResult(expression)) \ 1408 fail(::testing::internal::GetBoolAssertionFailureMessage(\ 1409 gtest_ar_, text, #actual, #expected).c_str()) 1411 #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ 1412 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1413 if (::testing::internal::AlwaysTrue()) { \ 1414 ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ 1415 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 1416 if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ 1417 goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ 1420 GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ 1421 fail("Expected: " #statement " doesn't generate new fatal " \ 1422 "failures in the current thread.\n" \ 1423 " Actual: it does.") 1426 #define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ 1427 test_suite_name##_##test_name##_Test 1430 #define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id) \ 1431 class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ 1432 : public parent_class { \ 1434 GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ 1437 virtual void TestBody(); \ 1438 static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \ 1439 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ 1443 ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \ 1444 test_name)::test_info_ = \ 1445 ::testing::internal::MakeAndRegisterTestInfo( \ 1446 #test_suite_name, #test_name, nullptr, nullptr, \ 1447 ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \ 1448 ::testing::internal::SuiteApiResolver< \ 1449 parent_class>::GetSetUpCaseOrSuite(), \ 1450 ::testing::internal::SuiteApiResolver< \ 1451 parent_class>::GetTearDownCaseOrSuite(), \ 1452 new ::testing::internal::TestFactoryImpl<GTEST_TEST_CLASS_NAME_( \ 1453 test_suite_name, test_name)>); \ 1454 void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() 1456 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ Definition: gmock-actions.h:59
Definition: gtest-internal.h:1114
Definition: gtest-internal.h:995
Definition: gtest_skip_test.cc:42
Definition: gtest-internal.h:848
Definition: gtest-internal.h:535
Definition: gtest-internal.h:889
Definition: gtest-internal.h:859
Definition: gtest-port.h:2208
Definition: gtest-internal.h:1221
Definition: gtest-internal.h:490
Definition: gtest-internal.h:879
Definition: gtest-message.h:90
Definition: gtest-internal.h:472
Definition: gtest-internal.h:1005
Definition: gtest-internal.h:512
Definition: gtest-internal.h:1244
Definition: gtest-internal.h:1026
Definition: gtest-internal.h:977
Definition: gtest-port.h:858
Definition: gtest-internal.h:1200
Definition: gtest-internal.h:1187
Definition: gtest-internal.h:1181
Definition: gtest-port.h:1950
Definition: gmock-internal-utils_test.cc:62
Definition: gtest-internal.h:270
Definition: gtest-internal.h:998
Definition: gtest-internal.h:1102
Definition: gtest-port.h:1960
Definition: gtest-internal.h:927
Definition: gtest-internal.h:1103
Definition: gtest-internal.h:440
Definition: gtest-internal.h:1228
Definition: gtest-internal.h:1020
Definition: gtest-internal.h:902
Definition: gtest-internal.h:1231
Definition: gtest-internal.h:1211
Definition: gtest-internal.h:111