52 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_H_ 53 #define GOOGLETEST_INCLUDE_GTEST_GTEST_H_ 59 #include <type_traits> 98 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 99 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 143 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 144 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 368 #include <type_traits> 371 # include <sys/types.h> 372 # include <sys/stat.h> 373 #endif // !_WIN32_WCE 375 #if defined __APPLE__ 376 # include <AvailabilityMacros.h> 377 # include <TargetConditionals.h> 420 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ 421 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ 423 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ 458 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ 459 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ 463 # define GTEST_OS_CYGWIN 1 464 # elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__) 465 # define GTEST_OS_WINDOWS_MINGW 1 466 # define GTEST_OS_WINDOWS 1 468 # define GTEST_OS_WINDOWS 1 470 # define GTEST_OS_WINDOWS_MOBILE 1 471 # elif defined(WINAPI_FAMILY) 472 # include <winapifamily.h> 473 # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) 474 # define GTEST_OS_WINDOWS_DESKTOP 1 475 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) 476 # define GTEST_OS_WINDOWS_PHONE 1 477 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) 478 # define GTEST_OS_WINDOWS_RT 1 479 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE) 480 # define GTEST_OS_WINDOWS_PHONE 1 481 # define GTEST_OS_WINDOWS_TV_TITLE 1 485 # define GTEST_OS_WINDOWS_DESKTOP 1 488 # define GTEST_OS_WINDOWS_DESKTOP 1 489 # endif // _WIN32_WCE 490 #elif defined __OS2__ 491 # define GTEST_OS_OS2 1 492 #elif defined __APPLE__ 493 # define GTEST_OS_MAC 1 494 # include <TargetConditionals.h> 495 # if TARGET_OS_IPHONE 496 # define GTEST_OS_IOS 1 498 #elif defined __DragonFly__ 499 # define GTEST_OS_DRAGONFLY 1 500 #elif defined __FreeBSD__ 501 # define GTEST_OS_FREEBSD 1 502 #elif defined __Fuchsia__ 503 # define GTEST_OS_FUCHSIA 1 504 #elif defined(__GLIBC__) && defined(__FreeBSD_kernel__) 505 # define GTEST_OS_GNU_KFREEBSD 1 506 #elif defined __linux__ 507 # define GTEST_OS_LINUX 1 508 # if defined __ANDROID__ 509 # define GTEST_OS_LINUX_ANDROID 1 511 #elif defined __MVS__ 512 # define GTEST_OS_ZOS 1 513 #elif defined(__sun) && defined(__SVR4) 514 # define GTEST_OS_SOLARIS 1 516 # define GTEST_OS_AIX 1 517 #elif defined(__hpux) 518 # define GTEST_OS_HPUX 1 519 #elif defined __native_client__ 520 # define GTEST_OS_NACL 1 521 #elif defined __NetBSD__ 522 # define GTEST_OS_NETBSD 1 523 #elif defined __OpenBSD__ 524 # define GTEST_OS_OPENBSD 1 525 #elif defined __QNX__ 526 # define GTEST_OS_QNX 1 527 #elif defined(__HAIKU__) 528 #define GTEST_OS_HAIKU 1 529 #elif defined ESP8266 530 #define GTEST_OS_ESP8266 1 532 #define GTEST_OS_ESP32 1 533 #elif defined(__XTENSA__) 534 #define GTEST_OS_XTENSA 1 537 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ 539 #if !defined(GTEST_DEV_EMAIL_) 540 # define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" 541 # define GTEST_FLAG_PREFIX_ "gtest_" 542 # define GTEST_FLAG_PREFIX_DASH_ "gtest-" 543 # define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" 544 # define GTEST_NAME_ "Google Test" 545 # define GTEST_PROJECT_URL_ "https://github.com/google/googletest/" 546 #endif // !defined(GTEST_DEV_EMAIL_) 548 #if !defined(GTEST_INIT_GOOGLE_TEST_NAME_) 549 # define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest" 550 #endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_) 555 # define GTEST_GCC_VER_ \ 556 (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) 564 #if defined(_MSC_VER) 565 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \ 566 __pragma(warning(push)) \ 567 __pragma(warning(disable: warnings)) 568 # define GTEST_DISABLE_MSC_WARNINGS_POP_() \ 569 __pragma(warning(pop)) 572 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) 573 # define GTEST_DISABLE_MSC_WARNINGS_POP_() 579 # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ 580 _Pragma("clang diagnostic push") \ 581 _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ 582 _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"") 583 #define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ 584 _Pragma("clang diagnostic pop") 586 # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ 587 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) 588 # define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ 589 GTEST_DISABLE_MSC_WARNINGS_POP_() 596 # if !GTEST_OS_WINDOWS_MOBILE 601 #if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR) 604 typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
609 typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
611 #elif GTEST_OS_XTENSA 620 # include <strings.h> 621 #endif // GTEST_OS_WINDOWS 623 #if GTEST_OS_LINUX_ANDROID 625 # include <android/api-level.h> 630 #ifndef GTEST_HAS_POSIX_RE 631 # if GTEST_OS_LINUX_ANDROID 633 # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9) 635 #define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS && !GTEST_OS_XTENSA) 642 #elif GTEST_HAS_POSIX_RE 650 # define GTEST_USES_POSIX_RE 1 652 #elif GTEST_OS_WINDOWS 656 # define GTEST_USES_SIMPLE_RE 1 662 # define GTEST_USES_SIMPLE_RE 1 664 #endif // GTEST_USES_PCRE 666 #ifndef GTEST_HAS_EXCEPTIONS 669 # if defined(_MSC_VER) && defined(_CPPUNWIND) 671 # define GTEST_HAS_EXCEPTIONS 1 672 # elif defined(__BORLANDC__) 676 # ifndef _HAS_EXCEPTIONS 677 # define _HAS_EXCEPTIONS 1 678 # endif // _HAS_EXCEPTIONS 679 # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS 680 # elif defined(__clang__) 689 # define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions)) 690 # elif defined(__GNUC__) && __EXCEPTIONS 692 # define GTEST_HAS_EXCEPTIONS 1 693 # elif defined(__SUNPRO_CC) 697 # define GTEST_HAS_EXCEPTIONS 1 698 # elif defined(__IBMCPP__) && __EXCEPTIONS 700 # define GTEST_HAS_EXCEPTIONS 1 701 # elif defined(__HP_aCC) 704 # define GTEST_HAS_EXCEPTIONS 1 708 # define GTEST_HAS_EXCEPTIONS 0 709 # endif // defined(_MSC_VER) || defined(__BORLANDC__) 710 #endif // GTEST_HAS_EXCEPTIONS 712 #ifndef GTEST_HAS_STD_WSTRING 718 #define GTEST_HAS_STD_WSTRING \ 719 (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ 720 GTEST_OS_HAIKU || GTEST_OS_ESP32 || GTEST_OS_ESP8266 || GTEST_OS_XTENSA)) 722 #endif // GTEST_HAS_STD_WSTRING 725 #ifndef GTEST_HAS_RTTI 731 #ifdef _CPPRTTI // MSVC defines this macro if and only if RTTI is enabled. 732 # define GTEST_HAS_RTTI 1 734 # define GTEST_HAS_RTTI 0 739 # elif defined(__GNUC__) 746 # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \ 747 !defined(__EXCEPTIONS) 748 # define GTEST_HAS_RTTI 0 750 # define GTEST_HAS_RTTI 1 751 # endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS 753 # define GTEST_HAS_RTTI 0 754 # endif // __GXX_RTTI 759 # elif defined(__clang__) 761 # define GTEST_HAS_RTTI __has_feature(cxx_rtti) 765 # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) 768 # define GTEST_HAS_RTTI 1 770 # define GTEST_HAS_RTTI 0 776 # define GTEST_HAS_RTTI 1 780 #endif // GTEST_HAS_RTTI 789 #ifndef GTEST_HAS_PTHREAD 795 #define GTEST_HAS_PTHREAD \ 796 (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \ 797 GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \ 798 GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD || \ 800 #endif // GTEST_HAS_PTHREAD 802 #if GTEST_HAS_PTHREAD 805 # include <pthread.h> 815 #ifndef GTEST_HAS_CLONE 818 # if GTEST_OS_LINUX && !defined(__ia64__) 819 # if GTEST_OS_LINUX_ANDROID 822 # if defined(__LP64__) || \ 823 (defined(__arm__) && __ANDROID_API__ >= 9) || \ 824 (defined(__mips__) && __ANDROID_API__ >= 12) || \ 825 (defined(__i386__) && __ANDROID_API__ >= 17) 826 # define GTEST_HAS_CLONE 1 828 # define GTEST_HAS_CLONE 0 831 # define GTEST_HAS_CLONE 1 834 # define GTEST_HAS_CLONE 0 835 # endif // GTEST_OS_LINUX && !defined(__ia64__) 837 #endif // GTEST_HAS_CLONE 841 #ifndef GTEST_HAS_STREAM_REDIRECTION 844 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ 845 GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA 846 # define GTEST_HAS_STREAM_REDIRECTION 0 848 # define GTEST_HAS_STREAM_REDIRECTION 1 849 # endif // !GTEST_OS_WINDOWS_MOBILE 850 #endif // GTEST_HAS_STREAM_REDIRECTION 854 #if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ 855 (GTEST_OS_MAC && !GTEST_OS_IOS) || \ 856 (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW || \ 857 GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \ 858 GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \ 859 GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU) 860 # define GTEST_HAS_DEATH_TEST 1 867 #if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \ 868 defined(__IBMCPP__) || defined(__HP_aCC) 869 # define GTEST_HAS_TYPED_TEST 1 870 # define GTEST_HAS_TYPED_TEST_P 1 874 #define GTEST_WIDE_STRING_USES_UTF16_ \ 875 (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2) 878 #if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \ 879 GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD 880 # define GTEST_CAN_STREAM_RESULTS_ 1 893 #ifdef __INTEL_COMPILER 894 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ 896 # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT 910 #if defined(__GNUC__) && !defined(COMPILER_ICC) 911 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) 912 #elif defined(__clang__) 913 # if __has_attribute(unused) 914 # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) 917 #ifndef GTEST_ATTRIBUTE_UNUSED_ 918 # define GTEST_ATTRIBUTE_UNUSED_ 922 #if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC) 923 # if defined(__MINGW_PRINTF_FORMAT) 927 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ 928 __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \ 931 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ 932 __attribute__((__format__(__printf__, string_index, first_to_check))) 935 # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) 941 #define GTEST_DISALLOW_ASSIGN_(type) \ 942 type& operator=(type const &) = delete 946 #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \ 947 type(type const&) = delete; \ 948 type& operator=(type const&) = delete 952 #define GTEST_DISALLOW_MOVE_ASSIGN_(type) \ 953 type& operator=(type &&) noexcept = delete 957 #define GTEST_DISALLOW_MOVE_AND_ASSIGN_(type) \ 958 type(type&&) noexcept = delete; \ 959 type& operator=(type&&) noexcept = delete 966 #if defined(__GNUC__) && !defined(COMPILER_ICC) 967 # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) 969 # define GTEST_MUST_USE_RESULT_ 970 #endif // __GNUC__ && !COMPILER_ICC 980 # define GTEST_INTENTIONAL_CONST_COND_PUSH_() \ 981 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127) 982 # define GTEST_INTENTIONAL_CONST_COND_POP_() \ 983 GTEST_DISABLE_MSC_WARNINGS_POP_() 988 #ifndef GTEST_HAS_SEH 991 # if defined(_MSC_VER) || defined(__BORLANDC__) 993 # define GTEST_HAS_SEH 1 996 # define GTEST_HAS_SEH 0 999 #endif // GTEST_HAS_SEH 1001 #ifndef GTEST_IS_THREADSAFE 1003 #define GTEST_IS_THREADSAFE \ 1004 (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \ 1005 (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \ 1008 #endif // GTEST_IS_THREADSAFE 1016 # if GTEST_LINKED_AS_SHARED_LIBRARY 1017 # define GTEST_API_ __declspec(dllimport) 1018 # elif GTEST_CREATE_SHARED_LIBRARY 1019 # define GTEST_API_ __declspec(dllexport) 1021 #elif __GNUC__ >= 4 || defined(__clang__) 1022 # define GTEST_API_ __attribute__((visibility ("default"))) 1025 #endif // GTEST_API_ 1029 #endif // GTEST_API_ 1031 #ifndef GTEST_DEFAULT_DEATH_TEST_STYLE 1032 # define GTEST_DEFAULT_DEATH_TEST_STYLE "fast" 1033 #endif // GTEST_DEFAULT_DEATH_TEST_STYLE 1037 # define GTEST_NO_INLINE_ __attribute__((noinline)) 1039 # define GTEST_NO_INLINE_ 1043 #if !defined(GTEST_HAS_CXXABI_H_) 1044 # if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER)) 1045 # define GTEST_HAS_CXXABI_H_ 1 1047 # define GTEST_HAS_CXXABI_H_ 0 1053 #if defined(__clang__) 1054 # if __has_feature(memory_sanitizer) 1055 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \ 1056 __attribute__((no_sanitize_memory)) 1058 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ 1059 # endif // __has_feature(memory_sanitizer) 1061 # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ 1065 #if defined(__clang__) 1066 # if __has_feature(address_sanitizer) 1067 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \ 1068 __attribute__((no_sanitize_address)) 1070 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ 1071 # endif // __has_feature(address_sanitizer) 1073 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ 1077 #if defined(__clang__) 1078 # if __has_feature(hwaddress_sanitizer) 1079 # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ \ 1080 __attribute__((no_sanitize("hwaddress"))) 1082 # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ 1083 # endif // __has_feature(hwaddress_sanitizer) 1085 # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ 1089 #if defined(__clang__) 1090 # if __has_feature(thread_sanitizer) 1091 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \ 1092 __attribute__((no_sanitize_thread)) 1094 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ 1095 # endif // __has_feature(thread_sanitizer) 1097 # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ 1107 using std::make_tuple;
1109 using std::tuple_element;
1110 using std::tuple_size;
1112 namespace internal {
1128 #define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg) 1132 GTEST_API_
bool IsTrue(
bool condition);
1138 #elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE 1142 class GTEST_API_ RE {
1146 RE(
const RE& other) { Init(other.pattern()); }
1149 RE(const ::std::string& regex) { Init(regex.c_str()); }
1151 RE(
const char* regex) { Init(regex); }
1155 const char* pattern()
const {
return pattern_; }
1161 static bool FullMatch(const ::std::string& str,
const RE& re) {
1162 return FullMatch(str.c_str(), re);
1164 static bool PartialMatch(const ::std::string& str,
const RE& re) {
1165 return PartialMatch(str.c_str(), re);
1168 static bool FullMatch(
const char* str,
const RE& re);
1169 static bool PartialMatch(
const char* str,
const RE& re);
1172 void Init(
const char* regex);
1173 const char* pattern_;
1176 # if GTEST_USES_POSIX_RE 1178 regex_t full_regex_;
1179 regex_t partial_regex_;
1181 # else // GTEST_USES_SIMPLE_RE 1183 const char* full_pattern_;
1188 #endif // GTEST_USES_PCRE 1192 GTEST_API_ ::std::string FormatFileLocation(
const char* file,
int line);
1197 GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
const char* file,
1206 enum GTestLogSeverity {
1216 class GTEST_API_ GTestLog {
1218 GTestLog(GTestLogSeverity severity,
const char* file,
int line);
1223 ::std::ostream& GetStream() { return ::std::cerr; }
1226 const GTestLogSeverity severity_;
1228 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
1231 #if !defined(GTEST_LOG_) 1233 # define GTEST_LOG_(severity) \ 1234 ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ 1235 __FILE__, __LINE__).GetStream() 1237 inline void LogToStderr() {}
1238 inline void FlushInfoLog() { fflush(
nullptr); }
1240 #endif // !defined(GTEST_LOG_) 1242 #if !defined(GTEST_CHECK_) 1257 # define GTEST_CHECK_(condition) \ 1258 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1259 if (::testing::internal::IsTrue(condition)) \ 1262 GTEST_LOG_(FATAL) << "Condition " #condition " failed. " 1263 #endif // !defined(GTEST_CHECK_) 1270 #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ 1271 if (const int gtest_error = (posix_call)) \ 1272 GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ 1286 template <
typename T>
1287 struct ConstRef {
typedef const T& type; };
1288 template <
typename T>
1289 struct ConstRef<T&> {
typedef T& type; };
1292 #define GTEST_REFERENCE_TO_CONST_(T) \ 1293 typename ::testing::internal::ConstRef<T>::type 1315 template<
typename To>
1316 inline To ImplicitCast_(To x) {
return x; }
1339 template<
typename To,
typename From>
1340 inline To DownCast_(From* f) {
1345 GTEST_INTENTIONAL_CONST_COND_PUSH_()
1347 GTEST_INTENTIONAL_CONST_COND_POP_()
1348 const To to =
nullptr;
1349 ::
testing::internal::ImplicitCast_<From*>(to);
1354 GTEST_CHECK_(f ==
nullptr || dynamic_cast<To>(f) !=
nullptr);
1356 return static_cast<To
>(f);
1364 template <
class Derived,
class Base>
1365 Derived* CheckedDowncastToActualType(Base* base) {
1367 GTEST_CHECK_(
typeid(*base) ==
typeid(Derived));
1370 #if GTEST_HAS_DOWNCAST_ 1371 return ::down_cast<Derived*>(base);
1372 #elif GTEST_HAS_RTTI 1373 return dynamic_cast<Derived*
>(base);
1375 return static_cast<Derived*
>(base);
1379 #if GTEST_HAS_STREAM_REDIRECTION 1387 GTEST_API_
void CaptureStdout();
1388 GTEST_API_ std::string GetCapturedStdout();
1389 GTEST_API_
void CaptureStderr();
1390 GTEST_API_ std::string GetCapturedStderr();
1392 #endif // GTEST_HAS_STREAM_REDIRECTION 1394 GTEST_API_
size_t GetFileSize(FILE* file);
1397 GTEST_API_ std::string ReadEntireFile(FILE* file);
1400 GTEST_API_ std::vector<std::string> GetArgvs();
1402 #if GTEST_HAS_DEATH_TEST 1404 std::vector<std::string> GetInjectableArgvs();
1406 void SetInjectableArgvs(
const std::vector<std::string>* new_argvs);
1407 void SetInjectableArgvs(
const std::vector<std::string>& new_argvs);
1408 void ClearInjectableArgvs();
1410 #endif // GTEST_HAS_DEATH_TEST 1413 #if GTEST_IS_THREADSAFE 1414 # if GTEST_HAS_PTHREAD 1418 inline void SleepMilliseconds(
int n) {
1419 const timespec time = {
1423 nanosleep(&time,
nullptr);
1425 # endif // GTEST_HAS_PTHREAD 1427 # if GTEST_HAS_NOTIFICATION_ 1431 # elif GTEST_HAS_PTHREAD 1438 class Notification {
1440 Notification() : notified_(false) {
1441 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_,
nullptr));
1444 pthread_mutex_destroy(&mutex_);
1450 pthread_mutex_lock(&mutex_);
1452 pthread_mutex_unlock(&mutex_);
1457 void WaitForNotification() {
1459 pthread_mutex_lock(&mutex_);
1460 const bool notified = notified_;
1461 pthread_mutex_unlock(&mutex_);
1464 SleepMilliseconds(10);
1469 pthread_mutex_t mutex_;
1472 GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
1475 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 1477 GTEST_API_
void SleepMilliseconds(
int n);
1481 class GTEST_API_ AutoHandle {
1488 typedef void* Handle;
1490 explicit AutoHandle(Handle handle);
1496 void Reset(Handle handle);
1501 bool IsCloseable()
const;
1505 GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
1514 class GTEST_API_ Notification {
1518 void WaitForNotification();
1523 GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
1525 # endif // GTEST_HAS_NOTIFICATION_ 1530 # if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW 1537 class ThreadWithParamBase {
1539 virtual ~ThreadWithParamBase() {}
1540 virtual void Run() = 0;
1549 extern "C" inline void* ThreadFuncWithCLinkage(
void* thread) {
1550 static_cast<ThreadWithParamBase*
>(thread)->Run();
1566 template <
typename T>
1567 class ThreadWithParam :
public ThreadWithParamBase {
1569 typedef void UserThreadFunc(T);
1571 ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
1574 thread_can_start_(thread_can_start),
1576 ThreadWithParamBase*
const base =
this;
1579 GTEST_CHECK_POSIX_SUCCESS_(
1580 pthread_create(&thread_,
nullptr, &ThreadFuncWithCLinkage, base));
1582 ~ThreadWithParam()
override { Join(); }
1586 GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_,
nullptr));
1591 void Run()
override {
1592 if (thread_can_start_ !=
nullptr) thread_can_start_->WaitForNotification();
1597 UserThreadFunc*
const func_;
1601 Notification*
const thread_can_start_;
1606 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
1608 # endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD || 1611 # if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ 1615 # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 1631 class GTEST_API_ Mutex {
1633 enum MutexType { kStatic = 0, kDynamic = 1 };
1637 enum StaticConstructorSelector { kStaticMutex = 0 };
1642 explicit Mutex(StaticConstructorSelector ) {}
1657 void ThreadSafeLazyInit();
1661 unsigned int owner_thread_id_;
1666 long critical_section_init_phase_;
1667 GTEST_CRITICAL_SECTION* critical_section_;
1669 GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
1672 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 1673 extern ::testing::internal::Mutex mutex 1675 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ 1676 ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex) 1683 class GTestMutexLock {
1685 explicit GTestMutexLock(Mutex* mutex)
1686 : mutex_(mutex) { mutex_->Lock(); }
1688 ~GTestMutexLock() { mutex_->Unlock(); }
1691 Mutex*
const mutex_;
1693 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
1696 typedef GTestMutexLock MutexLock;
1700 class ThreadLocalValueHolderBase {
1702 virtual ~ThreadLocalValueHolderBase() {}
1707 class ThreadLocalBase {
1713 virtual ThreadLocalValueHolderBase* NewValueForCurrentThread()
const = 0;
1716 ThreadLocalBase() {}
1717 virtual ~ThreadLocalBase() {}
1720 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase);
1726 class GTEST_API_ ThreadLocalRegistry {
1730 static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
1731 const ThreadLocalBase* thread_local_instance);
1734 static void OnThreadLocalDestroyed(
1735 const ThreadLocalBase* thread_local_instance);
1738 class GTEST_API_ ThreadWithParamBase {
1745 virtual ~Runnable() {}
1746 virtual void Run() = 0;
1749 ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);
1750 virtual ~ThreadWithParamBase();
1757 template <
typename T>
1758 class ThreadWithParam :
public ThreadWithParamBase {
1760 typedef void UserThreadFunc(T);
1762 ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
1763 : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) {
1765 virtual ~ThreadWithParam() {}
1768 class RunnableImpl :
public Runnable {
1770 RunnableImpl(UserThreadFunc* func, T param)
1774 virtual ~RunnableImpl() {}
1775 virtual void Run() {
1780 UserThreadFunc*
const func_;
1783 GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl);
1786 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
1816 template <
typename T>
1817 class ThreadLocal :
public ThreadLocalBase {
1819 ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {}
1820 explicit ThreadLocal(
const T& value)
1821 : default_factory_(new InstanceValueHolderFactory(value)) {}
1823 ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(
this); }
1825 T* pointer() {
return GetOrCreateValue(); }
1826 const T* pointer()
const {
return GetOrCreateValue(); }
1827 const T&
get()
const {
return *pointer(); }
1828 void set(
const T& value) { *pointer() = value; }
1833 class ValueHolder :
public ThreadLocalValueHolderBase {
1835 ValueHolder() : value_() {}
1836 explicit ValueHolder(
const T& value) : value_(value) {}
1838 T* pointer() {
return &value_; }
1842 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
1846 T* GetOrCreateValue()
const {
1847 return static_cast<ValueHolder*
>(
1848 ThreadLocalRegistry::GetValueOnCurrentThread(
this))->pointer();
1851 virtual ThreadLocalValueHolderBase* NewValueForCurrentThread()
const {
1852 return default_factory_->MakeNewHolder();
1855 class ValueHolderFactory {
1857 ValueHolderFactory() {}
1858 virtual ~ValueHolderFactory() {}
1859 virtual ValueHolder* MakeNewHolder()
const = 0;
1862 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
1865 class DefaultValueHolderFactory :
public ValueHolderFactory {
1867 DefaultValueHolderFactory() {}
1868 ValueHolder* MakeNewHolder()
const override {
return new ValueHolder(); }
1871 GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
1874 class InstanceValueHolderFactory :
public ValueHolderFactory {
1876 explicit InstanceValueHolderFactory(
const T& value) : value_(value) {}
1877 ValueHolder* MakeNewHolder()
const override {
1878 return new ValueHolder(value_);
1884 GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
1887 std::unique_ptr<ValueHolderFactory> default_factory_;
1889 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
1892 # elif GTEST_HAS_PTHREAD 1899 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
1900 owner_ = pthread_self();
1911 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
1916 void AssertHeld()
const {
1917 GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
1918 <<
"The current thread is not holding the mutex @" <<
this;
1927 pthread_mutex_t mutex_;
1939 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 1940 extern ::testing::internal::MutexBase mutex 1948 #define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ 1949 ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0} 1953 class Mutex :
public MutexBase {
1956 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_,
nullptr));
1960 GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
1964 GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
1972 class GTestMutexLock {
1974 explicit GTestMutexLock(MutexBase* mutex)
1975 : mutex_(mutex) { mutex_->Lock(); }
1977 ~GTestMutexLock() { mutex_->Unlock(); }
1980 MutexBase*
const mutex_;
1982 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
1985 typedef GTestMutexLock MutexLock;
1993 class ThreadLocalValueHolderBase {
1995 virtual ~ThreadLocalValueHolderBase() {}
2000 extern "C" inline void DeleteThreadLocalValue(
void* value_holder) {
2001 delete static_cast<ThreadLocalValueHolderBase*
>(value_holder);
2005 template <
typename T>
2006 class GTEST_API_ ThreadLocal {
2009 : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}
2010 explicit ThreadLocal(
const T& value)
2011 : key_(CreateKey()),
2012 default_factory_(new InstanceValueHolderFactory(value)) {}
2016 DeleteThreadLocalValue(pthread_getspecific(key_));
2020 GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
2023 T* pointer() {
return GetOrCreateValue(); }
2024 const T* pointer()
const {
return GetOrCreateValue(); }
2025 const T&
get()
const {
return *pointer(); }
2026 void set(
const T& value) { *pointer() = value; }
2030 class ValueHolder :
public ThreadLocalValueHolderBase {
2032 ValueHolder() : value_() {}
2033 explicit ValueHolder(
const T& value) : value_(value) {}
2035 T* pointer() {
return &value_; }
2039 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
2042 static pthread_key_t CreateKey() {
2046 GTEST_CHECK_POSIX_SUCCESS_(
2047 pthread_key_create(&key, &DeleteThreadLocalValue));
2051 T* GetOrCreateValue()
const {
2052 ThreadLocalValueHolderBase*
const holder =
2053 static_cast<ThreadLocalValueHolderBase*
>(pthread_getspecific(key_));
2054 if (holder !=
nullptr) {
2055 return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
2058 ValueHolder*
const new_holder = default_factory_->MakeNewHolder();
2059 ThreadLocalValueHolderBase*
const holder_base = new_holder;
2060 GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
2061 return new_holder->pointer();
2064 class ValueHolderFactory {
2066 ValueHolderFactory() {}
2067 virtual ~ValueHolderFactory() {}
2068 virtual ValueHolder* MakeNewHolder()
const = 0;
2071 GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
2074 class DefaultValueHolderFactory :
public ValueHolderFactory {
2076 DefaultValueHolderFactory() {}
2077 ValueHolder* MakeNewHolder()
const override {
return new ValueHolder(); }
2080 GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
2083 class InstanceValueHolderFactory :
public ValueHolderFactory {
2085 explicit InstanceValueHolderFactory(
const T& value) : value_(value) {}
2086 ValueHolder* MakeNewHolder()
const override {
2087 return new ValueHolder(value_);
2093 GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
2097 const pthread_key_t key_;
2098 std::unique_ptr<ValueHolderFactory> default_factory_;
2100 GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
2103 # endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ 2105 #else // GTEST_IS_THREADSAFE 2117 void AssertHeld()
const {}
2120 # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ 2121 extern ::testing::internal::Mutex mutex 2123 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex 2130 class GTestMutexLock {
2132 explicit GTestMutexLock(Mutex*) {}
2135 typedef GTestMutexLock MutexLock;
2137 template <
typename T>
2138 class GTEST_API_ ThreadLocal {
2140 ThreadLocal() : value_() {}
2141 explicit ThreadLocal(
const T& value) : value_(value) {}
2142 T* pointer() {
return &value_; }
2143 const T* pointer()
const {
return &value_; }
2144 const T&
get()
const {
return value_; }
2145 void set(
const T& value) { value_ = value; }
2150 #endif // GTEST_IS_THREADSAFE 2154 GTEST_API_
size_t GetThreadCount();
2156 #if GTEST_OS_WINDOWS 2157 # define GTEST_PATH_SEP_ "\\" 2158 # define GTEST_HAS_ALT_PATH_SEP_ 1 2160 # define GTEST_PATH_SEP_ "/" 2161 # define GTEST_HAS_ALT_PATH_SEP_ 0 2162 #endif // GTEST_OS_WINDOWS 2171 inline bool IsAlpha(
char ch) {
2172 return isalpha(static_cast<unsigned char>(ch)) != 0;
2174 inline bool IsAlNum(
char ch) {
2175 return isalnum(static_cast<unsigned char>(ch)) != 0;
2177 inline bool IsDigit(
char ch) {
2178 return isdigit(static_cast<unsigned char>(ch)) != 0;
2180 inline bool IsLower(
char ch) {
2181 return islower(static_cast<unsigned char>(ch)) != 0;
2183 inline bool IsSpace(
char ch) {
2184 return isspace(static_cast<unsigned char>(ch)) != 0;
2186 inline bool IsUpper(
char ch) {
2187 return isupper(static_cast<unsigned char>(ch)) != 0;
2189 inline bool IsXDigit(
char ch) {
2190 return isxdigit(static_cast<unsigned char>(ch)) != 0;
2192 #ifdef __cpp_char8_t 2193 inline bool IsXDigit(char8_t ch) {
2194 return isxdigit(static_cast<unsigned char>(ch)) != 0;
2197 inline bool IsXDigit(char16_t ch) {
2198 const unsigned char low_byte =
static_cast<unsigned char>(ch);
2199 return ch == low_byte && isxdigit(low_byte) != 0;
2201 inline bool IsXDigit(char32_t ch) {
2202 const unsigned char low_byte =
static_cast<unsigned char>(ch);
2203 return ch == low_byte && isxdigit(low_byte) != 0;
2205 inline bool IsXDigit(
wchar_t ch) {
2206 const unsigned char low_byte =
static_cast<unsigned char>(ch);
2207 return ch == low_byte && isxdigit(low_byte) != 0;
2210 inline char ToLower(
char ch) {
2211 return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
2213 inline char ToUpper(
char ch) {
2214 return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
2217 inline std::string StripTrailingSpaces(std::string str) {
2218 std::string::iterator it = str.end();
2219 while (it != str.begin() && IsSpace(*--it))
2234 #if GTEST_OS_WINDOWS 2236 typedef struct _stat StatStruct;
2238 # ifdef __BORLANDC__ 2239 inline int DoIsATTY(
int fd) {
return isatty(fd); }
2240 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2241 return stricmp(s1, s2);
2243 inline char* StrDup(
const char* src) {
return strdup(src); }
2244 # else // !__BORLANDC__ 2245 # if GTEST_OS_WINDOWS_MOBILE 2246 inline int DoIsATTY(
int ) {
return 0; }
2248 inline int DoIsATTY(
int fd) {
return _isatty(fd); }
2249 # endif // GTEST_OS_WINDOWS_MOBILE 2250 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2251 return _stricmp(s1, s2);
2253 inline char* StrDup(
const char* src) {
return _strdup(src); }
2254 # endif // __BORLANDC__ 2256 # if GTEST_OS_WINDOWS_MOBILE 2257 inline int FileNo(FILE* file) {
return reinterpret_cast<int>(_fileno(file)); }
2261 inline int FileNo(FILE* file) {
return _fileno(file); }
2262 inline int Stat(
const char* path, StatStruct* buf) {
return _stat(path, buf); }
2263 inline int RmDir(
const char* dir) {
return _rmdir(dir); }
2264 inline bool IsDir(
const StatStruct& st) {
2265 return (_S_IFDIR & st.st_mode) != 0;
2267 # endif // GTEST_OS_WINDOWS_MOBILE 2269 #elif GTEST_OS_ESP8266 2270 typedef struct stat StatStruct;
2272 inline int FileNo(FILE* file) {
return fileno(file); }
2273 inline int DoIsATTY(
int fd) {
return isatty(fd); }
2274 inline int Stat(
const char* path, StatStruct* buf) {
2278 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2279 return strcasecmp(s1, s2);
2281 inline char* StrDup(
const char* src) {
return strdup(src); }
2282 inline int RmDir(
const char* dir) {
return rmdir(dir); }
2283 inline bool IsDir(
const StatStruct& st) {
return S_ISDIR(st.st_mode); }
2287 typedef struct stat StatStruct;
2289 inline int FileNo(FILE* file) {
return fileno(file); }
2290 inline int DoIsATTY(
int fd) {
return isatty(fd); }
2291 inline int Stat(
const char* path, StatStruct* buf) {
return stat(path, buf); }
2292 inline int StrCaseCmp(
const char* s1,
const char* s2) {
2293 return strcasecmp(s1, s2);
2295 inline char* StrDup(
const char* src) {
return strdup(src); }
2296 inline int RmDir(
const char* dir) {
return rmdir(dir); }
2297 inline bool IsDir(
const StatStruct& st) {
return S_ISDIR(st.st_mode); }
2299 #endif // GTEST_OS_WINDOWS 2301 inline int IsATTY(
int fd) {
2305 int savedErrno = errno;
2306 int isAttyValue = DoIsATTY(fd);
2314 GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
2320 #if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && \ 2321 !GTEST_OS_WINDOWS_RT && !GTEST_OS_ESP8266 && !GTEST_OS_XTENSA 2322 inline int ChDir(
const char* dir) {
return chdir(dir); }
2324 inline FILE* FOpen(
const char* path,
const char* mode) {
2325 #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW 2326 struct wchar_codecvt :
public std::codecvt<wchar_t, char, std::mbstate_t> {};
2327 std::wstring_convert<wchar_codecvt> converter;
2328 std::wstring wide_path = converter.from_bytes(path);
2329 std::wstring wide_mode = converter.from_bytes(mode);
2330 return _wfopen(wide_path.c_str(), wide_mode.c_str());
2331 #else // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW 2332 return fopen(path, mode);
2333 #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW 2335 #if !GTEST_OS_WINDOWS_MOBILE 2336 inline FILE *FReopen(
const char* path,
const char* mode, FILE* stream) {
2337 return freopen(path, mode, stream);
2339 inline FILE* FDOpen(
int fd,
const char* mode) {
return fdopen(fd, mode); }
2341 inline int FClose(FILE* fp) {
return fclose(fp); }
2342 #if !GTEST_OS_WINDOWS_MOBILE 2343 inline int Read(
int fd,
void* buf,
unsigned int count) {
2344 return static_cast<int>(read(fd, buf, count));
2346 inline int Write(
int fd,
const void* buf,
unsigned int count) {
2347 return static_cast<int>(write(fd, buf, count));
2349 inline int Close(
int fd) {
return close(fd); }
2350 inline const char* StrError(
int errnum) {
return strerror(errnum); }
2352 inline const char* GetEnv(
const char* name) {
2353 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ 2354 GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA 2356 static_cast<void>(name);
2358 #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) 2361 const char*
const env = getenv(name);
2362 return (env !=
nullptr && env[0] !=
'\0') ? env :
nullptr;
2364 return getenv(name);
2368 GTEST_DISABLE_MSC_DEPRECATED_POP_()
2370 #if GTEST_OS_WINDOWS_MOBILE 2374 [[noreturn]]
void Abort();
2376 [[noreturn]]
inline void Abort() { abort(); }
2377 #endif // GTEST_OS_WINDOWS_MOBILE 2386 #if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE 2388 # define GTEST_SNPRINTF_(buffer, size, format, ...) \ 2389 _snprintf_s(buffer, size, size, format, __VA_ARGS__) 2390 #elif defined(_MSC_VER) 2392 # define GTEST_SNPRINTF_ _snprintf 2394 # define GTEST_SNPRINTF_ snprintf 2400 using BiggestInt =
long long;
2403 constexpr BiggestInt kMaxBiggestInt = (std::numeric_limits<BiggestInt>::max)();
2423 template <
size_t size>
2424 class TypeWithSize {
2433 class TypeWithSize<4> {
2435 using Int = std::int32_t;
2436 using UInt = std::uint32_t;
2441 class TypeWithSize<8> {
2443 using Int = std::int64_t;
2444 using UInt = std::uint64_t;
2448 using TimeInMillis = int64_t;
2453 #if !defined(GTEST_FLAG) 2454 # define GTEST_FLAG(name) FLAGS_gtest_##name 2455 #endif // !defined(GTEST_FLAG) 2457 #if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) 2458 # define GTEST_USE_OWN_FLAGFILE_FLAG_ 1 2459 #endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) 2461 #if !defined(GTEST_DECLARE_bool_) 2462 # define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver 2465 # define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) 2466 # define GTEST_DECLARE_int32_(name) \ 2467 GTEST_API_ extern std::int32_t GTEST_FLAG(name) 2468 # define GTEST_DECLARE_string_(name) \ 2469 GTEST_API_ extern ::std::string GTEST_FLAG(name) 2472 # define GTEST_DEFINE_bool_(name, default_val, doc) \ 2473 GTEST_API_ bool GTEST_FLAG(name) = (default_val) 2474 # define GTEST_DEFINE_int32_(name, default_val, doc) \ 2475 GTEST_API_ std::int32_t GTEST_FLAG(name) = (default_val) 2476 # define GTEST_DEFINE_string_(name, default_val, doc) \ 2477 GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val) 2479 #endif // !defined(GTEST_DECLARE_bool_) 2482 #if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) 2483 # define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks) 2484 # define GTEST_LOCK_EXCLUDED_(locks) 2485 #endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) 2490 GTEST_API_
bool ParseInt32(
const Message& src_text,
const char* str,
2495 bool BoolFromGTestEnv(
const char* flag,
bool default_val);
2496 GTEST_API_ int32_t Int32FromGTestEnv(
const char* flag, int32_t default_val);
2497 std::string OutputFlagAlsoCheckEnvVar();
2498 const char* StringFromGTestEnv(
const char* flag,
const char* default_val);
2503 #if !defined(GTEST_INTERNAL_DEPRECATED) 2513 #if defined(_MSC_VER) 2514 #define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message)) 2515 #elif defined(__GNUC__) 2516 #define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message))) 2518 #define GTEST_INTERNAL_DEPRECATED(message) 2521 #endif // !defined(GTEST_INTERNAL_DEPRECATED) 2526 #define GTEST_INTERNAL_HAS_ANY 1 2527 #include "absl/types/any.h" 2529 namespace internal {
2530 using Any = ::absl::any;
2534 #ifdef __has_include 2535 #if __has_include(<any>) && __cplusplus >= 201703L 2538 #define GTEST_INTERNAL_HAS_ANY 1 2541 namespace internal {
2542 using Any = ::std::any;
2547 #endif // __has_include(<any>) && __cplusplus >= 201703L 2548 #endif // __has_include 2549 #endif // GTEST_HAS_ABSL 2554 #define GTEST_INTERNAL_HAS_OPTIONAL 1 2555 #include "absl/types/optional.h" 2557 namespace internal {
2558 template <
typename T>
2559 using Optional = ::absl::optional<T>;
2563 #ifdef __has_include 2564 #if __has_include(<optional>) && __cplusplus >= 201703L 2567 #define GTEST_INTERNAL_HAS_OPTIONAL 1 2570 namespace internal {
2571 template <
typename T>
2572 using Optional = ::std::optional<T>;
2577 #endif // __has_include(<optional>) && __cplusplus >= 201703L 2578 #endif // __has_include 2579 #endif // GTEST_HAS_ABSL 2584 # define GTEST_INTERNAL_HAS_STRING_VIEW 1 2585 #include "absl/strings/string_view.h" 2587 namespace internal {
2588 using StringView = ::absl::string_view;
2592 # ifdef __has_include 2593 # if __has_include(<string_view>) && __cplusplus >= 201703L 2596 # define GTEST_INTERNAL_HAS_STRING_VIEW 1 2597 #include <string_view> 2599 namespace internal {
2600 using StringView = ::std::string_view;
2605 # endif // __has_include(<string_view>) && __cplusplus >= 201703L 2606 # endif // __has_include 2607 #endif // GTEST_HAS_ABSL 2612 #define GTEST_INTERNAL_HAS_VARIANT 1 2613 #include "absl/types/variant.h" 2615 namespace internal {
2616 template <
typename... T>
2617 using Variant = ::absl::variant<T...>;
2621 #ifdef __has_include 2622 #if __has_include(<variant>) && __cplusplus >= 201703L 2625 #define GTEST_INTERNAL_HAS_VARIANT 1 2628 namespace internal {
2629 template <
typename... T>
2630 using Variant = ::std::variant<T...>;
2634 #endif // __has_include(<variant>) && __cplusplus >= 201703L 2635 #endif // __has_include 2636 #endif // GTEST_HAS_ABSL 2638 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ 2641 # include <stdlib.h> 2642 # include <sys/types.h> 2643 # include <sys/wait.h> 2644 # include <unistd.h> 2645 #endif // GTEST_OS_LINUX 2647 #if GTEST_HAS_EXCEPTIONS 2648 # include <stdexcept> 2660 #include <type_traits> 2709 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 2710 #define GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 2717 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
2722 void operator<<(const
testing::internal::Secret&,
int);
2752 class GTEST_API_ Message {
2756 typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
2763 Message(
const Message& msg) : ss_(new ::
std::stringstream) {
2764 *ss_ << msg.GetString();
2768 explicit Message(
const char* str) : ss_(new ::
std::stringstream) {
2773 template <
typename T>
2774 inline Message& operator <<(
const T& val) {
2789 using ::operator <<;
2807 template <
typename T>
2808 inline Message& operator <<(T*
const& pointer) {
2809 if (pointer ==
nullptr) {
2823 Message& operator <<(BasicNarrowIoManip val) {
2829 Message& operator <<(
bool b) {
2830 return *
this << (b ?
"true" :
"false");
2835 Message& operator <<(
const wchar_t* wide_c_str);
2836 Message& operator <<(
wchar_t* wide_c_str);
2838 #if GTEST_HAS_STD_WSTRING 2841 Message& operator <<(const ::std::wstring& wstr);
2842 #endif // GTEST_HAS_STD_WSTRING 2848 std::string GetString()
const;
2852 const std::unique_ptr< ::std::stringstream> ss_;
2856 void operator=(
const Message&);
2860 inline std::ostream& operator <<(std::ostream& os,
const Message& sb) {
2861 return os << sb.GetString();
2864 namespace internal {
2870 template <
typename T>
2871 std::string StreamableToString(
const T& streamable) {
2872 return (Message() << streamable).GetString();
2878 GTEST_DISABLE_MSC_WARNINGS_POP_()
2880 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 2920 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ 2921 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ 2963 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ 2964 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ 2977 namespace internal {
2980 class GTEST_API_ String {
2991 static const char* CloneCString(
const char* c_str);
2993 #if GTEST_OS_WINDOWS_MOBILE 3006 static LPCWSTR AnsiToUtf16(
const char* c_str);
3016 static const char* Utf16ToAnsi(LPCWSTR utf16_str);
3025 static bool CStringEquals(
const char* lhs,
const char* rhs);
3031 static std::string ShowWideCString(
const wchar_t* wide_c_str);
3039 static bool WideCStringEquals(
const wchar_t* lhs,
const wchar_t* rhs);
3047 static bool CaseInsensitiveCStringEquals(
const char* lhs,
3062 static bool CaseInsensitiveWideCStringEquals(
const wchar_t* lhs,
3063 const wchar_t* rhs);
3067 static bool EndsWithCaseInsensitive(
3068 const std::string& str,
const std::string& suffix);
3071 static std::string FormatIntWidth2(
int value);
3074 static std::string FormatIntWidthN(
int value,
int width);
3077 static std::string FormatHexInt(
int value);
3080 static std::string FormatHexUInt32(uint32_t value);
3083 static std::string FormatByte(
unsigned char value);
3091 GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
3096 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ 3098 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
3102 namespace internal {
3115 class GTEST_API_ FilePath {
3117 FilePath() : pathname_(
"") { }
3118 FilePath(
const FilePath& rhs) : pathname_(rhs.pathname_) { }
3120 explicit FilePath(
const std::string& pathname) : pathname_(pathname) {
3124 FilePath& operator=(
const FilePath& rhs) {
3129 void Set(
const FilePath& rhs) {
3130 pathname_ = rhs.pathname_;
3133 const std::string& string()
const {
return pathname_; }
3134 const char* c_str()
const {
return pathname_.c_str(); }
3137 static FilePath GetCurrentDir();
3143 static FilePath MakeFileName(
const FilePath& directory,
3144 const FilePath& base_name,
3146 const char* extension);
3151 static FilePath ConcatPaths(
const FilePath& directory,
3152 const FilePath& relative_path);
3162 static FilePath GenerateUniqueFileName(
const FilePath& directory,
3163 const FilePath& base_name,
3164 const char* extension);
3167 bool IsEmpty()
const {
return pathname_.empty(); }
3172 FilePath RemoveTrailingPathSeparator()
const;
3180 FilePath RemoveDirectoryName()
const;
3188 FilePath RemoveFileName()
const;
3194 FilePath RemoveExtension(
const char* extension)
const;
3200 bool CreateDirectoriesRecursively()
const;
3206 bool CreateFolder()
const;
3210 bool FileOrDirectoryExists()
const;
3214 bool DirectoryExists()
const;
3219 bool IsDirectory()
const;
3223 bool IsRootDirectory()
const;
3226 bool IsAbsolutePath()
const;
3254 const char* FindLastPathSeparator()
const;
3256 std::string pathname_;
3262 GTEST_DISABLE_MSC_WARNINGS_POP_()
3264 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ 3299 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ 3300 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ 3305 # if GTEST_HAS_CXXABI_H_ 3306 # include <cxxabi.h> 3307 # elif defined(__HP_aCC) 3308 # include <acxx_demangle.h> 3309 # endif // GTEST_HASH_CXXABI_H_ 3312 namespace internal {
3318 inline std::string CanonicalizeForStdLibVersioning(std::string s) {
3319 static const char prefix[] =
"std::__";
3320 if (s.compare(0, strlen(prefix), prefix) == 0) {
3321 std::string::size_type end = s.find(
"::", strlen(prefix));
3322 if (end != s.npos) {
3324 s.erase(strlen(
"std"), end - strlen(
"std"));
3332 inline std::string GetTypeName(
const std::type_info& type) {
3333 const char*
const name = type.name();
3334 #if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) 3338 #if GTEST_HAS_CXXABI_H_ 3339 using abi::__cxa_demangle;
3340 #endif // GTEST_HAS_CXXABI_H_ 3341 char*
const readable_name = __cxa_demangle(name,
nullptr,
nullptr, &status);
3342 const std::string name_str(status == 0 ? readable_name : name);
3343 free(readable_name);
3344 return CanonicalizeForStdLibVersioning(name_str);
3347 #endif // GTEST_HAS_CXXABI_H_ || __HP_aCC 3349 #endif // GTEST_HAS_RTTI 3355 template <
typename T>
3356 std::string GetTypeName() {
3358 return GetTypeName(
typeid(T));
3361 #endif // GTEST_HAS_RTTI 3367 # define GTEST_TEMPLATE_ template <typename T> class 3377 template <GTEST_TEMPLATE_ Tmpl>
3378 struct TemplateSel {
3379 template <
typename T>
3381 typedef Tmpl<T> type;
3385 # define GTEST_BIND_(TmplSel, T) \ 3386 TmplSel::template Bind<T>::type 3388 template <GTEST_TEMPLATE_ Head_, GTEST_TEMPLATE_... Tail_>
3390 using Head = TemplateSel<Head_>;
3391 using Tail = Templates<Tail_...>;
3394 template <GTEST_TEMPLATE_ Head_>
3395 struct Templates<Head_> {
3396 using Head = TemplateSel<Head_>;
3401 template <
typename Head_,
typename... Tail_>
3404 using Tail = Types<Tail_...>;
3407 template <
typename Head_>
3408 struct Types<Head_> {
3415 template <
typename... Ts>
3416 struct ProxyTypeList {
3417 using type = Types<Ts...>;
3421 struct is_proxy_type_list : std::false_type {};
3423 template <
typename... Ts>
3424 struct is_proxy_type_list<ProxyTypeList<Ts...>> : std::true_type {};
3429 template <
typename T>
3430 struct GenerateTypeList {
3432 using proxy =
typename std::conditional<is_proxy_type_list<T>::value, T,
3433 ProxyTypeList<T>>::type;
3436 using type =
typename proxy::type;
3441 template <
typename... Ts>
3442 using Types = internal::ProxyTypeList<Ts...>;
3446 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ 3456 #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) 3457 #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar 3468 #define GTEST_STRINGIFY_HELPER_(name, ...) #name 3469 #define GTEST_STRINGIFY_(...) GTEST_STRINGIFY_HELPER_(__VA_ARGS__, ) 3479 class AssertionResult;
3483 class TestPartResult;
3486 template <
typename T>
3487 ::std::string PrintToString(
const T& value);
3489 namespace internal {
3497 GTEST_API_
extern const char kStackTraceMarker[];
3500 class IgnoredValue {
3510 template <
typename T,
3511 typename std::enable_if<!std::is_convertible<T, Sink>::value,
3513 IgnoredValue(
const T& ) {}
3517 GTEST_API_ std::string AppendUserMessage(
3518 const std::string& gtest_msg,
const Message& user_msg);
3520 #if GTEST_HAS_EXCEPTIONS 3522 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4275 \
3531 class GTEST_API_ GoogleTestFailureException : public ::
std::runtime_error {
3533 explicit GoogleTestFailureException(
const TestPartResult& failure);
3536 GTEST_DISABLE_MSC_WARNINGS_POP_()
3538 #endif // GTEST_HAS_EXCEPTIONS 3540 namespace edit_distance {
3546 enum EditType { kMatch, kAdd, kRemove, kReplace };
3547 GTEST_API_ std::vector<EditType> CalculateOptimalEdits(
3548 const std::vector<size_t>& left,
const std::vector<size_t>& right);
3551 GTEST_API_ std::vector<EditType> CalculateOptimalEdits(
3552 const std::vector<std::string>& left,
3553 const std::vector<std::string>& right);
3556 GTEST_API_ std::string CreateUnifiedDiff(
const std::vector<std::string>& left,
3557 const std::vector<std::string>& right,
3558 size_t context = 2);
3566 GTEST_API_ std::string DiffStrings(
const std::string& left,
3567 const std::string& right,
3568 size_t* total_line_count);
3585 GTEST_API_ AssertionResult EqFailure(
const char* expected_expression,
3586 const char* actual_expression,
3587 const std::string& expected_value,
3588 const std::string& actual_value,
3589 bool ignoring_case);
3592 GTEST_API_ std::string GetBoolAssertionFailureMessage(
3593 const AssertionResult& assertion_result,
3594 const char* expression_text,
3595 const char* actual_predicate_value,
3596 const char* expected_predicate_value);
3627 template <
typename RawType>
3628 class FloatingPoint {
3632 typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
3637 static const size_t kBitCount = 8*
sizeof(RawType);
3640 static const size_t kFractionBitCount =
3641 std::numeric_limits<RawType>::digits - 1;
3644 static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
3647 static const Bits kSignBitMask =
static_cast<Bits
>(1) << (kBitCount - 1);
3650 static const Bits kFractionBitMask =
3651 ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
3654 static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
3668 static const uint32_t kMaxUlps = 4;
3676 explicit FloatingPoint(
const RawType& x) { u_.value_ = x; }
3683 static RawType ReinterpretBits(
const Bits bits) {
3684 FloatingPoint fp(0);
3686 return fp.u_.value_;
3690 static RawType Infinity() {
3691 return ReinterpretBits(kExponentBitMask);
3695 static RawType Max();
3700 const Bits &bits()
const {
return u_.bits_; }
3703 Bits exponent_bits()
const {
return kExponentBitMask & u_.bits_; }
3706 Bits fraction_bits()
const {
return kFractionBitMask & u_.bits_; }
3709 Bits sign_bit()
const {
return kSignBitMask & u_.bits_; }
3712 bool is_nan()
const {
3715 return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
3724 bool AlmostEquals(
const FloatingPoint& rhs)
const {
3727 if (is_nan() || rhs.is_nan())
return false;
3729 return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
3735 union FloatingPointUnion {
3755 static Bits SignAndMagnitudeToBiased(
const Bits &sam) {
3756 if (kSignBitMask & sam) {
3761 return kSignBitMask | sam;
3767 static Bits DistanceBetweenSignAndMagnitudeNumbers(
const Bits &sam1,
3769 const Bits biased1 = SignAndMagnitudeToBiased(sam1);
3770 const Bits biased2 = SignAndMagnitudeToBiased(sam2);
3771 return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
3774 FloatingPointUnion u_;
3780 inline float FloatingPoint<float>::Max() {
return FLT_MAX; }
3782 inline double FloatingPoint<double>::Max() {
return DBL_MAX; }
3786 typedef FloatingPoint<float> Float;
3787 typedef FloatingPoint<double> Double;
3795 typedef const void* TypeId;
3797 template <
typename T>
3798 class TypeIdHelper {
3806 template <
typename T>
3807 bool TypeIdHelper<T>::dummy_ =
false;
3812 template <
typename T>
3813 TypeId GetTypeId() {
3818 return &(TypeIdHelper<T>::dummy_);
3826 GTEST_API_ TypeId GetTestTypeId();
3830 class TestFactoryBase {
3832 virtual ~TestFactoryBase() {}
3836 virtual Test* CreateTest() = 0;
3839 TestFactoryBase() {}
3842 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
3847 template <
class TestClass>
3848 class TestFactoryImpl :
public TestFactoryBase {
3850 Test* CreateTest()
override {
return new TestClass; }
3853 #if GTEST_OS_WINDOWS 3859 GTEST_API_ AssertionResult IsHRESULTSuccess(
const char* expr,
3861 GTEST_API_ AssertionResult IsHRESULTFailure(
const char* expr,
3864 #endif // GTEST_OS_WINDOWS 3867 using SetUpTestSuiteFunc = void (*)();
3868 using TearDownTestSuiteFunc = void (*)();
3870 struct CodeLocation {
3871 CodeLocation(
const std::string& a_file,
int a_line)
3872 : file(a_file), line(a_line) {}
3882 using SetUpTearDownSuiteFuncType = void (*)();
3884 inline SetUpTearDownSuiteFuncType GetNotDefaultOrNull(
3885 SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) {
3886 return a == def ? nullptr : a;
3889 template <
typename T>
3893 struct SuiteApiResolver : T {
3897 typename std::conditional<sizeof(T) != 0, ::testing::Test, void>::type;
3899 static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(
const char* filename,
3901 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 3902 SetUpTearDownSuiteFuncType test_case_fp =
3903 GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase);
3904 SetUpTearDownSuiteFuncType test_suite_fp =
3905 GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite);
3907 GTEST_CHECK_(!test_case_fp || !test_suite_fp)
3908 <<
"Test can not provide both SetUpTestSuite and SetUpTestCase, please " 3909 "make sure there is only one present at " 3910 << filename <<
":" << line_num;
3912 return test_case_fp !=
nullptr ? test_case_fp : test_suite_fp;
3916 return &T::SetUpTestSuite;
3920 static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(
const char* filename,
3922 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 3923 SetUpTearDownSuiteFuncType test_case_fp =
3924 GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase);
3925 SetUpTearDownSuiteFuncType test_suite_fp =
3926 GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite);
3928 GTEST_CHECK_(!test_case_fp || !test_suite_fp)
3929 <<
"Test can not provide both TearDownTestSuite and TearDownTestCase," 3930 " please make sure there is only one present at" 3931 << filename <<
":" << line_num;
3933 return test_case_fp !=
nullptr ? test_case_fp : test_suite_fp;
3937 return &T::TearDownTestSuite;
3960 GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
3961 const char* test_suite_name,
const char* name,
const char* type_param,
3962 const char* value_param, CodeLocation code_location,
3963 TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,
3964 TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory);
3969 GTEST_API_
bool SkipPrefix(
const char* prefix,
const char** pstr);
3971 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
3975 class GTEST_API_ TypedTestSuitePState {
3977 TypedTestSuitePState() : registered_(false) {}
3982 bool AddTestName(
const char* file,
int line,
const char* case_name,
3983 const char* test_name) {
3986 "%s Test %s must be defined before " 3987 "REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n",
3988 FormatFileLocation(file, line).c_str(), test_name, case_name);
3992 registered_tests_.insert(
3993 ::std::make_pair(test_name, CodeLocation(file, line)));
3997 bool TestExists(
const std::string& test_name)
const {
3998 return registered_tests_.count(test_name) > 0;
4001 const CodeLocation& GetCodeLocation(
const std::string& test_name)
const {
4002 RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name);
4003 GTEST_CHECK_(it != registered_tests_.end());
4010 const char* VerifyRegisteredTestNames(
const char* test_suite_name,
4011 const char* file,
int line,
4012 const char* registered_tests);
4015 typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap;
4018 RegisteredTestsMap registered_tests_;
4022 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 4023 using TypedTestCasePState = TypedTestSuitePState;
4024 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 4026 GTEST_DISABLE_MSC_WARNINGS_POP_()
4030 inline const
char* SkipComma(const
char* str) {
4031 const char* comma = strchr(str,
',');
4032 if (comma ==
nullptr) {
4035 while (IsSpace(*(++comma))) {}
4041 inline std::string GetPrefixUntilComma(
const char* str) {
4042 const char* comma = strchr(str,
',');
4043 return comma ==
nullptr ? str : std::string(str, comma);
4048 void SplitString(const ::std::string& str,
char delimiter,
4049 ::std::vector< ::std::string>* dest);
4053 struct DefaultNameGenerator {
4054 template <
typename T>
4055 static std::string GetName(
int i) {
4056 return StreamableToString(i);
4060 template <
typename Prov
ided = DefaultNameGenerator>
4061 struct NameGeneratorSelector {
4062 typedef Provided type;
4065 template <
typename NameGenerator>
4066 void GenerateNamesRecursively(internal::None, std::vector<std::string>*,
int) {}
4068 template <
typename NameGenerator,
typename Types>
4069 void GenerateNamesRecursively(Types, std::vector<std::string>* result,
int i) {
4070 result->push_back(NameGenerator::template GetName<typename Types::Head>(i));
4071 GenerateNamesRecursively<NameGenerator>(
typename Types::Tail(), result,
4075 template <
typename NameGenerator,
typename Types>
4076 std::vector<std::string> GenerateNames() {
4077 std::vector<std::string> result;
4078 GenerateNamesRecursively<NameGenerator>(Types(), &result, 0);
4089 template <GTEST_TEMPLATE_ Fixture,
class TestSel,
typename Types>
4090 class TypeParameterizedTest {
4096 static bool Register(
const char* prefix,
const CodeLocation& code_location,
4097 const char* case_name,
const char* test_names,
int index,
4098 const std::vector<std::string>& type_names =
4099 GenerateNames<DefaultNameGenerator, Types>()) {
4100 typedef typename Types::Head Type;
4101 typedef Fixture<Type> FixtureClass;
4102 typedef typename GTEST_BIND_(TestSel, Type) TestClass;
4106 MakeAndRegisterTestInfo(
4107 (std::string(prefix) + (prefix[0] ==
'\0' ?
"" :
"/") + case_name +
4108 "/" + type_names[static_cast<size_t>(index)])
4110 StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),
4111 GetTypeName<Type>().c_str(),
4113 code_location, GetTypeId<FixtureClass>(),
4114 SuiteApiResolver<TestClass>::GetSetUpCaseOrSuite(
4115 code_location.file.c_str(), code_location.line),
4116 SuiteApiResolver<TestClass>::GetTearDownCaseOrSuite(
4117 code_location.file.c_str(), code_location.line),
4118 new TestFactoryImpl<TestClass>);
4121 return TypeParameterizedTest<Fixture, TestSel,
4122 typename Types::Tail>::Register(prefix,
4132 template <GTEST_TEMPLATE_ Fixture,
class TestSel>
4133 class TypeParameterizedTest<Fixture, TestSel, internal::None> {
4135 static bool Register(
const char* ,
const CodeLocation&,
4136 const char* ,
const char* ,
4138 const std::vector<std::string>& =
4139 std::vector<std::string>() ) {
4144 GTEST_API_
void RegisterTypeParameterizedTestSuite(
const char* test_suite_name,
4145 CodeLocation code_location);
4146 GTEST_API_
void RegisterTypeParameterizedTestSuiteInstantiation(
4147 const char* case_name);
4153 template <GTEST_TEMPLATE_ Fixture,
typename Tests,
typename Types>
4154 class TypeParameterizedTestSuite {
4156 static bool Register(
const char* prefix, CodeLocation code_location,
4157 const TypedTestSuitePState* state,
const char* case_name,
4158 const char* test_names,
4159 const std::vector<std::string>& type_names =
4160 GenerateNames<DefaultNameGenerator, Types>()) {
4161 RegisterTypeParameterizedTestSuiteInstantiation(case_name);
4162 std::string test_name = StripTrailingSpaces(
4163 GetPrefixUntilComma(test_names));
4164 if (!state->TestExists(test_name)) {
4165 fprintf(stderr,
"Failed to get code location for test %s.%s at %s.",
4166 case_name, test_name.c_str(),
4167 FormatFileLocation(code_location.file.c_str(),
4168 code_location.line).c_str());
4172 const CodeLocation& test_location = state->GetCodeLocation(test_name);
4174 typedef typename Tests::Head Head;
4177 TypeParameterizedTest<Fixture, Head, Types>::Register(
4178 prefix, test_location, case_name, test_names, 0, type_names);
4181 return TypeParameterizedTestSuite<Fixture,
typename Tests::Tail,
4182 Types>::Register(prefix, code_location,
4184 SkipComma(test_names),
4190 template <GTEST_TEMPLATE_ Fixture,
typename Types>
4191 class TypeParameterizedTestSuite<Fixture, internal::None, Types> {
4193 static bool Register(
const char* ,
const CodeLocation&,
4194 const TypedTestSuitePState* ,
4195 const char* ,
const char* ,
4196 const std::vector<std::string>& =
4197 std::vector<std::string>() ) {
4212 GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
4213 UnitTest* unit_test,
int skip_count);
4219 GTEST_API_
bool AlwaysTrue();
4222 inline bool AlwaysFalse() {
return !AlwaysTrue(); }
4227 struct GTEST_API_ ConstCharPtr {
4228 ConstCharPtr(
const char* str) : value(str) {}
4229 operator bool()
const {
return true; }
4235 struct TrueWithString {
4236 TrueWithString() =
default;
4237 explicit TrueWithString(
const char* str) : value(str) {}
4238 explicit TrueWithString(
const std::string& str) : value(str) {}
4239 explicit operator bool()
const {
return true; }
4248 class GTEST_API_ Random {
4250 static const uint32_t kMaxRange = 1u << 31;
4252 explicit Random(uint32_t seed) : state_(seed) {}
4254 void Reseed(uint32_t seed) { state_ = seed; }
4258 uint32_t Generate(uint32_t range);
4262 GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
4266 #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ 4267 typename std::remove_const<typename std::remove_reference<T>::type>::type 4272 template <
typename T>
4273 class HasDebugStringAndShortDebugString {
4275 template <
typename C>
4276 static auto CheckDebugString(C*) ->
typename std::is_same<
4277 std::string, decltype(std::declval<const C>().DebugString())>::type;
4279 static std::false_type CheckDebugString(...);
4281 template <
typename C>
4282 static auto CheckShortDebugString(C*) ->
typename std::is_same<
4283 std::string, decltype(std::declval<const C>().ShortDebugString())>::type;
4285 static std::false_type CheckShortDebugString(...);
4287 using HasDebugStringType = decltype(CheckDebugString<T>(
nullptr));
4288 using HasShortDebugStringType = decltype(CheckShortDebugString<T>(
nullptr));
4291 static constexpr
bool value =
4292 HasDebugStringType::value && HasShortDebugStringType::value;
4295 template <
typename T>
4296 constexpr
bool HasDebugStringAndShortDebugString<T>::value;
4322 typedef int IsContainer;
4324 class Iterator = decltype(::std::declval<const C&>().begin()),
4325 class = decltype(::std::declval<const C&>().end()),
4326 class = decltype(++::std::declval<Iterator&>()),
4327 class = decltype(*::std::declval<Iterator>()),
4328 class =
typename C::const_iterator>
4329 IsContainer IsContainerTest(
int ) {
4333 typedef char IsNotContainer;
4335 IsNotContainer IsContainerTest(
long ) {
return '\0'; }
4341 template <
typename T>
4342 struct IsHashTable {
4344 template <
typename U>
4345 static char test(
typename U::hasher*,
typename U::reverse_iterator*);
4346 template <
typename U>
4347 static int test(
typename U::hasher*, ...);
4348 template <
typename U>
4349 static char test(...);
4352 static const bool value =
sizeof(test<T>(
nullptr,
nullptr)) ==
sizeof(int);
4355 template <
typename T>
4356 const bool IsHashTable<T>::value;
4358 template <
typename C,
4359 bool =
sizeof(IsContainerTest<C>(0)) ==
sizeof(IsContainer)>
4360 struct IsRecursiveContainerImpl;
4362 template <
typename C>
4363 struct IsRecursiveContainerImpl<C, false> :
public std::false_type {};
4369 template <
typename C>
4370 struct IsRecursiveContainerImpl<C, true> {
4371 using value_type = decltype(*std::declval<typename C::const_iterator>());
4373 std::is_same<
typename std::remove_const<
4374 typename std::remove_reference<value_type>::type>::type,
4384 template <
typename C>
4385 struct IsRecursiveContainer :
public IsRecursiveContainerImpl<C>::type {};
4393 template <
typename T,
typename U>
4394 bool ArrayEq(
const T* lhs,
size_t size,
const U* rhs);
4397 template <
typename T,
typename U>
4398 inline bool ArrayEq(
const T& lhs,
const U& rhs) {
return lhs == rhs; }
4401 template <
typename T,
typename U,
size_t N>
4402 inline bool ArrayEq(
const T(&lhs)[N],
const U(&rhs)[N]) {
4403 return internal::ArrayEq(lhs, N, rhs);
4409 template <
typename T,
typename U>
4410 bool ArrayEq(
const T* lhs,
size_t size,
const U* rhs) {
4411 for (
size_t i = 0; i != size; i++) {
4412 if (!internal::ArrayEq(lhs[i], rhs[i]))
4420 template <
typename Iter,
typename Element>
4421 Iter ArrayAwareFind(Iter begin, Iter end,
const Element& elem) {
4422 for (Iter it = begin; it != end; ++it) {
4423 if (internal::ArrayEq(*it, elem))
4433 template <
typename T,
typename U>
4434 void CopyArray(
const T* from,
size_t size, U* to);
4437 template <
typename T,
typename U>
4438 inline void CopyArray(
const T& from, U* to) { *to = from; }
4441 template <
typename T,
typename U,
size_t N>
4442 inline void CopyArray(
const T(&from)[N], U(*to)[N]) {
4443 internal::CopyArray(from, N, *to);
4449 template <
typename T,
typename U>
4450 void CopyArray(
const T* from,
size_t size, U* to) {
4451 for (
size_t i = 0; i != size; i++) {
4452 internal::CopyArray(from[i], to + i);
4460 struct RelationToSourceReference {};
4461 struct RelationToSourceCopy {};
4471 template <
typename Element>
4475 typedef Element value_type;
4476 typedef Element* iterator;
4477 typedef const Element* const_iterator;
4480 NativeArray(
const Element* array,
size_t count, RelationToSourceReference) {
4481 InitRef(array, count);
4485 NativeArray(
const Element* array,
size_t count, RelationToSourceCopy) {
4486 InitCopy(array, count);
4490 NativeArray(
const NativeArray& rhs) {
4491 (this->*rhs.clone_)(rhs.array_, rhs.size_);
4495 if (clone_ != &NativeArray::InitRef)
4500 size_t size()
const {
return size_; }
4501 const_iterator begin()
const {
return array_; }
4502 const_iterator end()
const {
return array_ + size_; }
4503 bool operator==(
const NativeArray& rhs)
const {
4504 return size() == rhs.size() &&
4505 ArrayEq(begin(), size(), rhs.begin());
4509 static_assert(!std::is_const<Element>::value,
"Type must not be const");
4510 static_assert(!std::is_reference<Element>::value,
4511 "Type must not be a reference");
4514 void InitCopy(
const Element* array,
size_t a_size) {
4515 Element*
const copy =
new Element[a_size];
4516 CopyArray(array, a_size, copy);
4519 clone_ = &NativeArray::InitCopy;
4523 void InitRef(
const Element* array,
size_t a_size) {
4526 clone_ = &NativeArray::InitRef;
4529 const Element* array_;
4531 void (NativeArray::*clone_)(
const Element*, size_t);
4535 template <
size_t... Is>
4536 struct IndexSequence {
4537 using type = IndexSequence;
4541 template <
bool plus_one,
typename T,
size_t sizeofT>
4542 struct DoubleSequence;
4543 template <
size_t... I,
size_t sizeofT>
4544 struct DoubleSequence<true, IndexSequence<I...>, sizeofT> {
4545 using type = IndexSequence<I..., (sizeofT + I)..., 2 * sizeofT>;
4547 template <
size_t... I,
size_t sizeofT>
4548 struct DoubleSequence<false, IndexSequence<I...>, sizeofT> {
4549 using type = IndexSequence<I..., (sizeofT + I)...>;
4555 struct MakeIndexSequenceImpl
4556 : DoubleSequence<N % 2 == 1, typename MakeIndexSequenceImpl<N / 2>::type,
4560 struct MakeIndexSequenceImpl<0> : IndexSequence<> {};
4563 using MakeIndexSequence =
typename MakeIndexSequenceImpl<N>::type;
4565 template <
typename... T>
4566 using IndexSequenceFor =
typename MakeIndexSequence<
sizeof...(T)>::type;
4574 struct ElemFromListImpl;
4575 template <
size_t... I>
4576 struct ElemFromListImpl<IndexSequence<I...>> {
4581 template <
typename R>
4582 static R Apply(Ignore<0 * I>..., R (*)(), ...);
4585 template <
size_t N,
typename... T>
4586 struct ElemFromList {
4588 decltype(ElemFromListImpl<
typename MakeIndexSequence<N>::type>::Apply(
4589 static_cast<T (*)()
>(
nullptr)...));
4592 struct FlatTupleConstructTag {};
4594 template <
typename... T>
4597 template <
typename Derived,
size_t I>
4598 struct FlatTupleElemBase;
4600 template <
typename... T,
size_t I>
4601 struct FlatTupleElemBase<FlatTuple<T...>, I> {
4602 using value_type =
typename ElemFromList<I, T...>::type;
4603 FlatTupleElemBase() =
default;
4604 template <
typename Arg>
4605 explicit FlatTupleElemBase(FlatTupleConstructTag, Arg&& t)
4606 : value(
std::forward<Arg>(t)) {}
4610 template <
typename Derived,
typename Idx>
4611 struct FlatTupleBase;
4613 template <
size_t... Idx,
typename... T>
4614 struct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>>
4615 : FlatTupleElemBase<FlatTuple<T...>, Idx>... {
4616 using Indices = IndexSequence<Idx...>;
4617 FlatTupleBase() =
default;
4618 template <
typename... Args>
4619 explicit FlatTupleBase(FlatTupleConstructTag, Args&&... args)
4620 : FlatTupleElemBase<FlatTuple<T...>, Idx>(FlatTupleConstructTag{},
4621 std::forward<Args>(args))... {}
4624 const typename ElemFromList<I, T...>::type& Get()
const {
4625 return FlatTupleElemBase<FlatTuple<T...>, I>::value;
4629 typename ElemFromList<I, T...>::type& Get() {
4630 return FlatTupleElemBase<FlatTuple<T...>, I>::value;
4633 template <
typename F>
4634 auto Apply(F&& f) -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) {
4635 return std::forward<F>(f)(Get<Idx>()...);
4638 template <
typename F>
4639 auto Apply(F&& f)
const -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) {
4640 return std::forward<F>(f)(Get<Idx>()...);
4653 template <
typename... T>
4655 :
private FlatTupleBase<FlatTuple<T...>,
4656 typename MakeIndexSequence<sizeof...(T)>::type> {
4657 using Indices =
typename FlatTupleBase<
4658 FlatTuple<T...>,
typename MakeIndexSequence<
sizeof...(T)>::type>::Indices;
4661 FlatTuple() =
default;
4662 template <
typename... Args>
4663 explicit FlatTuple(FlatTupleConstructTag tag, Args&&... args)
4664 : FlatTuple::FlatTupleBase(tag,
std::forward<Args>(args)...) {}
4666 using FlatTuple::FlatTupleBase::Apply;
4667 using FlatTuple::FlatTupleBase::Get;
4672 GTEST_INTERNAL_DEPRECATED(
4673 "INSTANTIATE_TEST_CASE_P is deprecated, please use " 4674 "INSTANTIATE_TEST_SUITE_P")
4675 constexpr
bool InstantiateTestCase_P_IsDeprecated() {
return true; }
4677 GTEST_INTERNAL_DEPRECATED(
4678 "TYPED_TEST_CASE_P is deprecated, please use " 4679 "TYPED_TEST_SUITE_P")
4680 constexpr
bool TypedTestCase_P_IsDeprecated() {
return true; }
4682 GTEST_INTERNAL_DEPRECATED(
4683 "TYPED_TEST_CASE is deprecated, please use " 4685 constexpr
bool TypedTestCaseIsDeprecated() {
return true; }
4687 GTEST_INTERNAL_DEPRECATED(
4688 "REGISTER_TYPED_TEST_CASE_P is deprecated, please use " 4689 "REGISTER_TYPED_TEST_SUITE_P")
4690 constexpr
bool RegisterTypedTestCase_P_IsDeprecated() {
return true; }
4692 GTEST_INTERNAL_DEPRECATED(
4693 "INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use " 4694 "INSTANTIATE_TYPED_TEST_SUITE_P")
4695 constexpr
bool InstantiateTypedTestCase_P_IsDeprecated() {
return true; }
4705 #pragma clang diagnostic push 4706 #pragma clang diagnostic ignored "-Wmismatched-tags" 4708 template <
typename... Ts>
4709 struct tuple_size<testing::internal::FlatTuple<Ts...>>
4710 : std::integral_constant<size_t, sizeof...(Ts)> {};
4712 #pragma clang diagnostic pop 4716 #define GTEST_MESSAGE_AT_(file, line, message, result_type) \ 4717 ::testing::internal::AssertHelper(result_type, file, line, message) \ 4718 = ::testing::Message() 4720 #define GTEST_MESSAGE_(message, result_type) \ 4721 GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) 4723 #define GTEST_FATAL_FAILURE_(message) \ 4724 return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) 4726 #define GTEST_NONFATAL_FAILURE_(message) \ 4727 GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) 4729 #define GTEST_SUCCESS_(message) \ 4730 GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) 4732 #define GTEST_SKIP_(message) \ 4733 return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip) 4740 #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ 4741 if (::testing::internal::AlwaysTrue()) { \ 4744 static_assert(true, "") // User must have a semicolon after expansion. 4746 #if GTEST_HAS_EXCEPTIONS 4749 namespace internal {
4753 const char* what() const noexcept {
4754 return "this exception should never be thrown";
4763 #define GTEST_EXCEPTION_TYPE_(e) ::testing::internal::GetTypeName(typeid(e)) 4765 #else // GTEST_HAS_RTTI 4767 #define GTEST_EXCEPTION_TYPE_(e) \ 4768 std::string { "an std::exception-derived error" } 4770 #endif // GTEST_HAS_RTTI 4772 #define GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception) \ 4773 catch (typename std::conditional< \ 4774 std::is_same<typename std::remove_cv<typename std::remove_reference< \ 4775 expected_exception>::type>::type, \ 4776 std::exception>::value, \ 4777 const ::testing::internal::NeverThrown&, const std::exception&>::type \ 4779 gtest_msg.value = "Expected: " #statement \ 4780 " throws an exception of type " #expected_exception \ 4781 ".\n Actual: it throws "; \ 4782 gtest_msg.value += GTEST_EXCEPTION_TYPE_(e); \ 4783 gtest_msg.value += " with description \""; \ 4784 gtest_msg.value += e.what(); \ 4785 gtest_msg.value += "\"."; \ 4786 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 4789 #else // GTEST_HAS_EXCEPTIONS 4791 #define GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception) 4793 #endif // GTEST_HAS_EXCEPTIONS 4795 #define GTEST_TEST_THROW_(statement, expected_exception, fail) \ 4796 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 4797 if (::testing::internal::TrueWithString gtest_msg{}) { \ 4798 bool gtest_caught_expected = false; \ 4800 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 4801 } catch (expected_exception const&) { \ 4802 gtest_caught_expected = true; \ 4804 GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception) \ 4806 gtest_msg.value = "Expected: " #statement \ 4807 " throws an exception of type " #expected_exception \ 4808 ".\n Actual: it throws a different type."; \ 4809 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 4811 if (!gtest_caught_expected) { \ 4812 gtest_msg.value = "Expected: " #statement \ 4813 " throws an exception of type " #expected_exception \ 4814 ".\n Actual: it throws nothing."; \ 4815 goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 4818 GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__) \ 4819 : fail(gtest_msg.value.c_str()) 4821 #if GTEST_HAS_EXCEPTIONS 4823 #define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() \ 4824 catch (std::exception const& e) { \ 4825 gtest_msg.value = "it throws "; \ 4826 gtest_msg.value += GTEST_EXCEPTION_TYPE_(e); \ 4827 gtest_msg.value += " with description \""; \ 4828 gtest_msg.value += e.what(); \ 4829 gtest_msg.value += "\"."; \ 4830 goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ 4833 #else // GTEST_HAS_EXCEPTIONS 4835 #define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() 4837 #endif // GTEST_HAS_EXCEPTIONS 4839 #define GTEST_TEST_NO_THROW_(statement, fail) \ 4840 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 4841 if (::testing::internal::TrueWithString gtest_msg{}) { \ 4843 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 4845 GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() \ 4847 gtest_msg.value = "it throws."; \ 4848 goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ 4851 GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ 4852 fail(("Expected: " #statement " doesn't throw an exception.\n" \ 4853 " Actual: " + gtest_msg.value).c_str()) 4855 #define GTEST_TEST_ANY_THROW_(statement, fail) \ 4856 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 4857 if (::testing::internal::AlwaysTrue()) { \ 4858 bool gtest_caught_any = false; \ 4860 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 4863 gtest_caught_any = true; \ 4865 if (!gtest_caught_any) { \ 4866 goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ 4869 GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ 4870 fail("Expected: " #statement " throws an exception.\n" \ 4871 " Actual: it doesn't.") 4877 #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ 4878 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 4879 if (const ::testing::AssertionResult gtest_ar_ = \ 4880 ::testing::AssertionResult(expression)) \ 4883 fail(::testing::internal::GetBoolAssertionFailureMessage(\ 4884 gtest_ar_, text, #actual, #expected).c_str()) 4886 #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ 4887 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 4888 if (::testing::internal::AlwaysTrue()) { \ 4889 ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ 4890 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 4891 if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ 4892 goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ 4895 GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ 4896 fail("Expected: " #statement " doesn't generate new fatal " \ 4897 "failures in the current thread.\n" \ 4898 " Actual: it does.") 4901 #define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ 4902 test_suite_name##_##test_name##_Test 4905 #define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id) \ 4906 static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \ 4907 "test_suite_name must not be empty"); \ 4908 static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1, \ 4909 "test_name must not be empty"); \ 4910 class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ 4911 : public parent_class { \ 4913 GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() = default; \ 4914 ~GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() override = default; \ 4915 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ 4917 GTEST_DISALLOW_MOVE_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ 4921 void TestBody() override; \ 4922 static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \ 4925 ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \ 4926 test_name)::test_info_ = \ 4927 ::testing::internal::MakeAndRegisterTestInfo( \ 4928 #test_suite_name, #test_name, nullptr, nullptr, \ 4929 ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \ 4930 ::testing::internal::SuiteApiResolver< \ 4931 parent_class>::GetSetUpCaseOrSuite(__FILE__, __LINE__), \ 4932 ::testing::internal::SuiteApiResolver< \ 4933 parent_class>::GetTearDownCaseOrSuite(__FILE__, __LINE__), \ 4934 new ::testing::internal::TestFactoryImpl<GTEST_TEST_CLASS_NAME_( \ 4935 test_suite_name, test_name)>); \ 4936 void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() 4938 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 4976 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ 4977 #define GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ 5014 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 5015 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 5051 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ 5052 #define GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ 5058 #include <type_traits> 5159 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ 5160 #define GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ 5162 #include <functional> 5168 #include <type_traits> 5174 #include <typeindex> 5176 #endif // GTEST_HAS_RTTI 5182 namespace internal {
5184 template <
typename T>
5185 void UniversalPrint(
const T& value, ::std::ostream* os);
5189 struct ContainerPrinter {
5190 template <
typename T,
5191 typename =
typename std::enable_if<
5192 (
sizeof(IsContainerTest<T>(0)) ==
sizeof(IsContainer)) &&
5193 !IsRecursiveContainer<T>::value>::type>
5194 static void PrintValue(
const T& container, std::ostream* os) {
5195 const size_t kMaxCount = 32;
5198 for (
auto&& elem : container) {
5201 if (count == kMaxCount) {
5209 internal::UniversalPrint(elem, os);
5226 struct FunctionPointerPrinter {
5227 template <
typename T,
typename =
typename std::enable_if<
5228 std::is_function<T>::value>::type>
5229 static void PrintValue(T* p, ::std::ostream* os) {
5236 *os << reinterpret_cast<const void*>(p);
5241 struct PointerPrinter {
5242 template <
typename T>
5243 static void PrintValue(T* p, ::std::ostream* os) {
5255 namespace internal_stream_operator_without_lexical_name_lookup {
5261 struct LookupBlocker {};
5262 void operator<<(LookupBlocker, LookupBlocker);
5264 struct StreamPrinter {
5265 template <
typename T,
5268 typename =
typename std::enable_if<
5269 !std::is_member_pointer<T>::value>::type,
5272 typename = decltype(std::declval<std::ostream&>()
5273 << std::declval<const T&>())>
5274 static void PrintValue(
const T& value, ::std::ostream* os) {
5283 struct ProtobufPrinter {
5287 static const size_t kProtobufOneLinerMaxLength = 50;
5289 template <
typename T,
5290 typename =
typename std::enable_if<
5291 internal::HasDebugStringAndShortDebugString<T>::value>::type>
5292 static void PrintValue(
const T& value, ::std::ostream* os) {
5293 std::string pretty_str = value.ShortDebugString();
5294 if (pretty_str.length() > kProtobufOneLinerMaxLength) {
5295 pretty_str =
"\n" + value.DebugString();
5297 *os << (
"<" + pretty_str +
">");
5301 struct ConvertibleToIntegerPrinter {
5309 static void PrintValue(internal::BiggestInt value, ::std::ostream* os) {
5314 struct ConvertibleToStringViewPrinter {
5315 #if GTEST_INTERNAL_HAS_STRING_VIEW 5316 static void PrintValue(internal::StringView value, ::std::ostream* os) {
5317 internal::UniversalPrint(value, os);
5325 GTEST_API_
void PrintBytesInObjectTo(
const unsigned char* obj_bytes,
5327 ::std::ostream* os);
5328 struct RawBytesPrinter {
5330 template <
typename T,
size_t = sizeof(T)>
5331 static void PrintValue(
const T& value, ::std::ostream* os) {
5332 PrintBytesInObjectTo(
5333 static_cast<const unsigned char*>(
5335 reinterpret_cast<const void*>(std::addressof(value))),
5340 struct FallbackPrinter {
5341 template <
typename T>
5342 static void PrintValue(
const T&, ::std::ostream* os) {
5343 *os <<
"(incomplete type)";
5348 template <
typename T,
typename E,
typename Printer,
typename... Printers>
5349 struct FindFirstPrinter : FindFirstPrinter<T, E, Printers...> {};
5351 template <
typename T,
typename Printer,
typename... Printers>
5352 struct FindFirstPrinter<
5353 T, decltype(Printer::PrintValue(std::declval<const T&>(), nullptr)),
5354 Printer, Printers...> {
5355 using type = Printer;
5367 template <
typename T>
5368 void PrintWithFallback(
const T& value, ::std::ostream* os) {
5369 using Printer =
typename FindFirstPrinter<
5370 T, void, ContainerPrinter, FunctionPointerPrinter, PointerPrinter,
5371 internal_stream_operator_without_lexical_name_lookup::StreamPrinter,
5372 ProtobufPrinter, ConvertibleToIntegerPrinter,
5373 ConvertibleToStringViewPrinter, RawBytesPrinter, FallbackPrinter>::type;
5374 Printer::PrintValue(value, os);
5392 template <
typename ToPr
int,
typename OtherOperand>
5393 class FormatForComparison {
5395 static ::std::string Format(
const ToPrint& value) {
5396 return ::testing::PrintToString(value);
5401 template <
typename ToPr
int,
size_t N,
typename OtherOperand>
5402 class FormatForComparison<ToPrint[N], OtherOperand> {
5404 static ::std::string Format(
const ToPrint* value) {
5405 return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
5412 #define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \ 5413 template <typename OtherOperand> \ 5414 class FormatForComparison<CharType*, OtherOperand> { \ 5416 static ::std::string Format(CharType* value) { \ 5417 return ::testing::PrintToString(static_cast<const void*>(value)); \ 5421 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(
char);
5422 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(
const char);
5423 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(
wchar_t);
5424 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(
const wchar_t);
5425 #ifdef __cpp_char8_t 5426 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char8_t);
5427 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(
const char8_t);
5429 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char16_t);
5430 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(
const char16_t);
5431 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char32_t);
5432 GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(
const char32_t);
5434 #undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_ 5439 #define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \ 5441 class FormatForComparison<CharType*, OtherStringType> { \ 5443 static ::std::string Format(CharType* value) { \ 5444 return ::testing::PrintToString(value); \ 5448 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(
char, ::std::string);
5449 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(
const char, ::std::string);
5450 #ifdef __cpp_char8_t 5451 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char8_t, ::std::u8string);
5452 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(
const char8_t, ::std::u8string);
5454 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char16_t, ::std::u16string);
5455 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(
const char16_t, ::std::u16string);
5456 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char32_t, ::std::u32string);
5457 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(
const char32_t, ::std::u32string);
5459 #if GTEST_HAS_STD_WSTRING 5460 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(
wchar_t, ::std::wstring);
5461 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(
const wchar_t, ::std::wstring);
5464 #undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_ 5474 template <
typename T1,
typename T2>
5475 std::string FormatForComparisonFailureMessage(
5476 const T1& value,
const T2& ) {
5477 return FormatForComparison<T1, T2>::Format(value);
5487 template <
typename T>
5488 class UniversalPrinter;
5501 template <
typename T>
5502 void PrintTo(
const T& value, ::std::ostream* os) {
5503 internal::PrintWithFallback(value, os);
5511 GTEST_API_
void PrintTo(
unsigned char c, ::std::ostream* os);
5512 GTEST_API_
void PrintTo(
signed char c, ::std::ostream* os);
5513 inline void PrintTo(
char c, ::std::ostream* os) {
5517 PrintTo(static_cast<unsigned char>(c), os);
5521 inline void PrintTo(
bool x, ::std::ostream* os) {
5522 *os << (x ?
"true" :
"false");
5532 GTEST_API_
void PrintTo(
wchar_t wc, ::std::ostream* os);
5534 GTEST_API_
void PrintTo(char32_t c, ::std::ostream* os);
5535 inline void PrintTo(char16_t c, ::std::ostream* os) {
5536 PrintTo(ImplicitCast_<char32_t>(c), os);
5538 #ifdef __cpp_char8_t 5539 inline void PrintTo(char8_t c, ::std::ostream* os) {
5540 PrintTo(ImplicitCast_<char32_t>(c), os);
5545 GTEST_API_
void PrintTo(
const char* s, ::std::ostream* os);
5546 inline void PrintTo(
char* s, ::std::ostream* os) {
5547 PrintTo(ImplicitCast_<const char*>(s), os);
5552 inline void PrintTo(
const signed char* s, ::std::ostream* os) {
5553 PrintTo(ImplicitCast_<const void*>(s), os);
5555 inline void PrintTo(
signed char* s, ::std::ostream* os) {
5556 PrintTo(ImplicitCast_<const void*>(s), os);
5558 inline void PrintTo(
const unsigned char* s, ::std::ostream* os) {
5559 PrintTo(ImplicitCast_<const void*>(s), os);
5561 inline void PrintTo(
unsigned char* s, ::std::ostream* os) {
5562 PrintTo(ImplicitCast_<const void*>(s), os);
5564 #ifdef __cpp_char8_t 5566 void PrintTo(
const char8_t* s, ::std::ostream* os);
5567 inline void PrintTo(char8_t* s, ::std::ostream* os) {
5568 PrintTo(ImplicitCast_<const char8_t*>(s), os);
5572 void PrintTo(
const char16_t* s, ::std::ostream* os);
5573 inline void PrintTo(char16_t* s, ::std::ostream* os) {
5574 PrintTo(ImplicitCast_<const char16_t*>(s), os);
5577 void PrintTo(
const char32_t* s, ::std::ostream* os);
5578 inline void PrintTo(char32_t* s, ::std::ostream* os) {
5579 PrintTo(ImplicitCast_<const char32_t*>(s), os);
5587 #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) 5589 GTEST_API_
void PrintTo(
const wchar_t* s, ::std::ostream* os);
5590 inline void PrintTo(
wchar_t* s, ::std::ostream* os) {
5591 PrintTo(ImplicitCast_<const wchar_t*>(s), os);
5600 template <
typename T>
5601 void PrintRawArrayTo(
const T a[],
size_t count, ::std::ostream* os) {
5602 UniversalPrint(a[0], os);
5603 for (
size_t i = 1; i != count; i++) {
5605 UniversalPrint(a[i], os);
5610 GTEST_API_
void PrintStringTo(const ::std::string&s, ::std::ostream* os);
5611 inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
5612 PrintStringTo(s, os);
5616 #ifdef __cpp_char8_t 5617 GTEST_API_
void PrintU8StringTo(const ::std::u8string& s, ::std::ostream* os);
5618 inline void PrintTo(const ::std::u8string& s, ::std::ostream* os) {
5619 PrintU8StringTo(s, os);
5624 GTEST_API_
void PrintU16StringTo(const ::std::u16string& s, ::std::ostream* os);
5625 inline void PrintTo(const ::std::u16string& s, ::std::ostream* os) {
5626 PrintU16StringTo(s, os);
5630 GTEST_API_
void PrintU32StringTo(const ::std::u32string& s, ::std::ostream* os);
5631 inline void PrintTo(const ::std::u32string& s, ::std::ostream* os) {
5632 PrintU32StringTo(s, os);
5636 #if GTEST_HAS_STD_WSTRING 5637 GTEST_API_
void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
5638 inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
5639 PrintWideStringTo(s, os);
5641 #endif // GTEST_HAS_STD_WSTRING 5643 #if GTEST_INTERNAL_HAS_STRING_VIEW 5645 inline void PrintTo(internal::StringView sp, ::std::ostream* os) {
5646 PrintTo(::std::string(sp), os);
5648 #endif // GTEST_INTERNAL_HAS_STRING_VIEW 5650 inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os <<
"(nullptr)"; }
5652 template <
typename T>
5653 void PrintTo(std::reference_wrapper<T> ref, ::std::ostream* os) {
5654 UniversalPrinter<T&>::Print(ref.get(), os);
5657 inline const void* VoidifyPointer(
const void* p) {
return p; }
5658 inline const void* VoidifyPointer(
volatile const void* p) {
5659 return const_cast<const void*
>(p);
5662 template <
typename T,
typename Ptr>
5663 void PrintSmartPointer(
const Ptr& ptr, std::ostream* os,
char) {
5664 if (ptr ==
nullptr) {
5668 *os <<
"(" << (VoidifyPointer)(ptr.get()) <<
")";
5671 template <
typename T,
typename Ptr,
5672 typename =
typename std::enable_if<!std::is_void<T>::value &&
5673 !std::is_array<T>::value>::type>
5674 void PrintSmartPointer(
const Ptr& ptr, std::ostream* os,
int) {
5675 if (ptr ==
nullptr) {
5678 *os <<
"(ptr = " << (VoidifyPointer)(ptr.get()) <<
", value = ";
5679 UniversalPrinter<T>::Print(*ptr, os);
5684 template <
typename T,
typename D>
5685 void PrintTo(
const std::unique_ptr<T, D>& ptr, std::ostream* os) {
5686 (PrintSmartPointer<T>)(ptr, os, 0);
5689 template <
typename T>
5690 void PrintTo(
const std::shared_ptr<T>& ptr, std::ostream* os) {
5691 (PrintSmartPointer<T>)(ptr, os, 0);
5696 template <
typename T>
5697 void PrintTupleTo(
const T&, std::integral_constant<size_t, 0>,
5700 template <
typename T,
size_t I>
5701 void PrintTupleTo(
const T& t, std::integral_constant<size_t, I>,
5702 ::std::ostream* os) {
5703 PrintTupleTo(t, std::integral_constant<size_t, I - 1>(), os);
5704 GTEST_INTENTIONAL_CONST_COND_PUSH_()
5706 GTEST_INTENTIONAL_CONST_COND_POP_()
5709 UniversalPrinter<
typename std::tuple_element<I - 1, T>::type>::Print(
5710 std::get<I - 1>(t), os);
5713 template <
typename... Types>
5714 void PrintTo(const ::std::tuple<Types...>& t, ::std::ostream* os) {
5716 PrintTupleTo(t, std::integral_constant<
size_t,
sizeof...(Types)>(), os);
5721 template <
typename T1,
typename T2>
5722 void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
5726 UniversalPrinter<T1>::Print(value.first, os);
5728 UniversalPrinter<T2>::Print(value.second, os);
5733 inline void PrintTo(const ::std::type_info& value, ::std::ostream* os) {
5734 internal::PrintTo<::std::type_info>(value, os);
5735 *os <<
" (\"" << value.name() <<
"\")";
5738 inline void PrintTo(const ::std::type_index& value, ::std::ostream* os) {
5739 internal::PrintTo<::std::type_index>(value, os);
5740 *os <<
" (\"" << value.name() <<
"\")";
5742 #endif // GTEST_HAS_RTTI 5746 template <
typename T>
5747 class UniversalPrinter {
5751 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
5756 static
void Print(const T& value, ::
std::ostream* os) {
5768 GTEST_DISABLE_MSC_WARNINGS_POP_()
5772 template <
typename T>
5773 class UniversalPrinter<const T> :
public UniversalPrinter<T> {};
5775 #if GTEST_INTERNAL_HAS_ANY 5780 class UniversalPrinter<Any> {
5782 static void Print(
const Any& value, ::std::ostream* os) {
5783 if (value.has_value()) {
5784 *os <<
"value of type " << GetTypeName(value);
5791 static std::string GetTypeName(
const Any& value) {
5793 return internal::GetTypeName(value.type());
5795 static_cast<void>(value);
5796 return "<unknown_type>";
5797 #endif // GTEST_HAS_RTTI 5801 #endif // GTEST_INTERNAL_HAS_ANY 5803 #if GTEST_INTERNAL_HAS_OPTIONAL 5807 template <
typename T>
5808 class UniversalPrinter<Optional<T>> {
5810 static void Print(
const Optional<T>& value, ::std::ostream* os) {
5815 UniversalPrint(*value, os);
5821 #endif // GTEST_INTERNAL_HAS_OPTIONAL 5823 #if GTEST_INTERNAL_HAS_VARIANT 5827 template <
typename... T>
5828 class UniversalPrinter<Variant<T...>> {
5830 static void Print(
const Variant<T...>& value, ::std::ostream* os) {
5833 absl::visit(Visitor{os, value.index()}, value);
5835 std::visit(Visitor{os, value.index()}, value);
5836 #endif // GTEST_HAS_ABSL 5842 template <
typename U>
5843 void operator()(
const U& u)
const {
5844 *os <<
"'" << GetTypeName<U>() <<
"(index = " << index
5845 <<
")' with value ";
5846 UniversalPrint(u, os);
5853 #endif // GTEST_INTERNAL_HAS_VARIANT 5857 template <
typename T>
5858 void UniversalPrintArray(
const T* begin,
size_t len, ::std::ostream* os) {
5863 const size_t kThreshold = 18;
5864 const size_t kChunkSize = 8;
5868 if (len <= kThreshold) {
5869 PrintRawArrayTo(begin, len, os);
5871 PrintRawArrayTo(begin, kChunkSize, os);
5873 PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
5879 GTEST_API_
void UniversalPrintArray(
5880 const char* begin,
size_t len, ::std::ostream* os);
5882 #ifdef __cpp_char8_t 5884 GTEST_API_
void UniversalPrintArray(
const char8_t* begin,
size_t len,
5885 ::std::ostream* os);
5889 GTEST_API_
void UniversalPrintArray(
const char16_t* begin,
size_t len,
5890 ::std::ostream* os);
5893 GTEST_API_
void UniversalPrintArray(
const char32_t* begin,
size_t len,
5894 ::std::ostream* os);
5897 GTEST_API_
void UniversalPrintArray(
5898 const wchar_t* begin,
size_t len, ::std::ostream* os);
5901 template <
typename T,
size_t N>
5902 class UniversalPrinter<T[N]> {
5906 static void Print(
const T (&a)[N], ::std::ostream* os) {
5907 UniversalPrintArray(a, N, os);
5912 template <
typename T>
5913 class UniversalPrinter<T&> {
5917 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
5919 static
void Print(const T& value, ::
std::ostream* os) {
5922 *os <<
"@" <<
reinterpret_cast<const void*
>(&value) <<
" ";
5925 UniversalPrint(value, os);
5928 GTEST_DISABLE_MSC_WARNINGS_POP_()
5935 template <
typename T>
5936 class UniversalTersePrinter {
5938 static void Print(
const T& value, ::std::ostream* os) {
5939 UniversalPrint(value, os);
5942 template <
typename T>
5943 class UniversalTersePrinter<T&> {
5945 static void Print(
const T& value, ::std::ostream* os) {
5946 UniversalPrint(value, os);
5949 template <
typename T,
size_t N>
5950 class UniversalTersePrinter<T[N]> {
5952 static void Print(
const T (&value)[N], ::std::ostream* os) {
5953 UniversalPrinter<T[N]>::Print(value, os);
5957 class UniversalTersePrinter<const char*> {
5959 static void Print(
const char* str, ::std::ostream* os) {
5960 if (str ==
nullptr) {
5963 UniversalPrint(std::string(str), os);
5968 class UniversalTersePrinter<char*> :
public UniversalTersePrinter<const char*> {
5971 #ifdef __cpp_char8_t 5973 class UniversalTersePrinter<const char8_t*> {
5975 static void Print(
const char8_t* str, ::std::ostream* os) {
5976 if (str ==
nullptr) {
5979 UniversalPrint(::std::u8string(str), os);
5984 class UniversalTersePrinter<char8_t*>
5985 :
public UniversalTersePrinter<const char8_t*> {};
5989 class UniversalTersePrinter<const char16_t*> {
5991 static void Print(
const char16_t* str, ::std::ostream* os) {
5992 if (str ==
nullptr) {
5995 UniversalPrint(::std::u16string(str), os);
6000 class UniversalTersePrinter<char16_t*>
6001 :
public UniversalTersePrinter<const char16_t*> {};
6004 class UniversalTersePrinter<const char32_t*> {
6006 static void Print(
const char32_t* str, ::std::ostream* os) {
6007 if (str ==
nullptr) {
6010 UniversalPrint(::std::u32string(str), os);
6015 class UniversalTersePrinter<char32_t*>
6016 :
public UniversalTersePrinter<const char32_t*> {};
6018 #if GTEST_HAS_STD_WSTRING 6020 class UniversalTersePrinter<const wchar_t*> {
6022 static void Print(
const wchar_t* str, ::std::ostream* os) {
6023 if (str ==
nullptr) {
6026 UniversalPrint(::std::wstring(str), os);
6033 class UniversalTersePrinter<wchar_t*> {
6035 static void Print(
wchar_t* str, ::std::ostream* os) {
6036 UniversalTersePrinter<const wchar_t*>::Print(str, os);
6040 template <
typename T>
6041 void UniversalTersePrint(
const T& value, ::std::ostream* os) {
6042 UniversalTersePrinter<T>::Print(value, os);
6049 template <
typename T>
6050 void UniversalPrint(
const T& value, ::std::ostream* os) {
6054 UniversalPrinter<T1>::Print(value, os);
6057 typedef ::std::vector< ::std::string> Strings;
6061 template <
typename Tuple>
6062 void TersePrintPrefixToStrings(
const Tuple&, std::integral_constant<size_t, 0>,
6064 template <
typename Tuple,
size_t I>
6065 void TersePrintPrefixToStrings(
const Tuple& t,
6066 std::integral_constant<size_t, I>,
6068 TersePrintPrefixToStrings(t, std::integral_constant<size_t, I - 1>(),
6070 ::std::stringstream ss;
6071 UniversalTersePrint(std::get<I - 1>(t), &ss);
6072 strings->push_back(ss.str());
6078 template <
typename Tuple>
6079 Strings UniversalTersePrintTupleFieldsToStrings(
const Tuple& value) {
6081 TersePrintPrefixToStrings(
6082 value, std::integral_constant<
size_t, std::tuple_size<Tuple>::value>(),
6089 template <
typename T>
6090 ::std::string PrintToString(
const T& value) {
6091 ::std::stringstream ss;
6092 internal::UniversalTersePrinter<T>::Print(value, &ss);
6139 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ 6140 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ 6142 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ 6144 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ 6147 #if defined(_MSC_VER) && _MSC_VER >= 1915 6148 #define GTEST_MAYBE_5046_ 5046 6150 #define GTEST_MAYBE_5046_ 6153 GTEST_DISABLE_MSC_WARNINGS_PUSH_(
6154 4251 GTEST_MAYBE_5046_
6171 class MatchResultListener {
6176 explicit MatchResultListener(::std::ostream* os) : stream_(os) {}
6177 virtual ~MatchResultListener() = 0;
6181 template <
typename T>
6182 MatchResultListener& operator<<(
const T& x) {
6183 if (stream_ !=
nullptr) *stream_ << x;
6188 ::std::ostream* stream() {
return stream_; }
6194 bool IsInterested()
const {
return stream_ !=
nullptr; }
6197 ::std::ostream*
const stream_;
6199 GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);
6202 inline MatchResultListener::~MatchResultListener() {
6207 class MatcherDescriberInterface {
6209 virtual ~MatcherDescriberInterface() {}
6216 virtual void DescribeTo(::std::ostream* os)
const = 0;
6224 virtual void DescribeNegationTo(::std::ostream* os)
const {
6232 template <
typename T>
6233 class MatcherInterface :
public MatcherDescriberInterface {
6266 virtual bool MatchAndExplain(T x, MatchResultListener* listener)
const = 0;
6273 namespace internal {
6276 template <
typename A,
typename B>
6277 bool operator()(
const A& a,
const B& b)
const {
return a == b; }
6280 template <
typename A,
typename B>
6281 bool operator()(
const A& a,
const B& b)
const {
return a != b; }
6284 template <
typename A,
typename B>
6285 bool operator()(
const A& a,
const B& b)
const {
return a < b; }
6288 template <
typename A,
typename B>
6289 bool operator()(
const A& a,
const B& b)
const {
return a > b; }
6292 template <
typename A,
typename B>
6293 bool operator()(
const A& a,
const B& b)
const {
return a <= b; }
6296 template <
typename A,
typename B>
6297 bool operator()(
const A& a,
const B& b)
const {
return a >= b; }
6301 class DummyMatchResultListener :
public MatchResultListener {
6303 DummyMatchResultListener() : MatchResultListener(nullptr) {}
6306 GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);
6312 class StreamMatchResultListener :
public MatchResultListener {
6314 explicit StreamMatchResultListener(::std::ostream* os)
6315 : MatchResultListener(os) {}
6318 GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);
6321 struct SharedPayloadBase {
6322 std::atomic<int> ref{1};
6323 void Ref() { ref.fetch_add(1, std::memory_order_relaxed); }
6324 bool Unref() {
return ref.fetch_sub(1, std::memory_order_acq_rel) == 1; }
6327 template <
typename T>
6328 struct SharedPayload : SharedPayloadBase {
6329 explicit SharedPayload(
const T& v) : value(v) {}
6330 explicit SharedPayload(T&& v) : value(
std::move(v)) {}
6332 static void Destroy(SharedPayloadBase* shared) {
6333 delete static_cast<SharedPayload*
>(shared);
6339 template <
typename T>
6340 using is_trivially_copy_constructible =
6341 #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5 6342 std::has_trivial_copy_constructor<T>;
6344 std::is_trivially_copy_constructible<T>;
6350 template <
typename T>
6351 class MatcherBase :
private MatcherDescriberInterface {
6355 bool MatchAndExplain(
const T& x, MatchResultListener* listener)
const {
6356 GTEST_CHECK_(vtable_ !=
nullptr);
6357 return vtable_->match_and_explain(*
this, x, listener);
6361 bool Matches(
const T& x)
const {
6362 DummyMatchResultListener dummy;
6363 return MatchAndExplain(x, &dummy);
6367 void DescribeTo(::std::ostream* os)
const final {
6368 GTEST_CHECK_(vtable_ !=
nullptr);
6369 vtable_->describe(*
this, os,
false);
6373 void DescribeNegationTo(::std::ostream* os)
const final {
6374 GTEST_CHECK_(vtable_ !=
nullptr);
6375 vtable_->describe(*
this, os,
true);
6379 void ExplainMatchResultTo(
const T& x, ::std::ostream* os)
const {
6380 StreamMatchResultListener listener(os);
6381 MatchAndExplain(x, &listener);
6387 const MatcherDescriberInterface* GetDescriber()
const {
6388 if (vtable_ ==
nullptr)
return nullptr;
6389 return vtable_->get_describer(*
this);
6393 MatcherBase() : vtable_(nullptr), buffer_() {}
6396 template <
typename U>
6397 explicit MatcherBase(
const MatcherInterface<U>* impl)
6398 : vtable_(nullptr), buffer_() {
6402 template <
typename M,
typename =
typename std::remove_reference<
6403 M>::type::is_gtest_matcher>
6404 MatcherBase(M&& m) : vtable_(nullptr), buffer_() {
6405 Init(std::forward<M>(m));
6408 MatcherBase(
const MatcherBase& other)
6409 : vtable_(other.vtable_), buffer_(other.buffer_) {
6410 if (IsShared()) buffer_.shared->Ref();
6413 MatcherBase& operator=(
const MatcherBase& other) {
6414 if (
this == &other)
return *
this;
6416 vtable_ = other.vtable_;
6417 buffer_ = other.buffer_;
6418 if (IsShared()) buffer_.shared->Ref();
6422 MatcherBase(MatcherBase&& other)
6423 : vtable_(other.vtable_), buffer_(other.buffer_) {
6424 other.vtable_ =
nullptr;
6427 MatcherBase& operator=(MatcherBase&& other) {
6428 if (
this == &other)
return *
this;
6430 vtable_ = other.vtable_;
6431 buffer_ = other.buffer_;
6432 other.vtable_ =
nullptr;
6436 ~MatcherBase()
override { Destroy(); }
6440 bool (*match_and_explain)(
const MatcherBase&,
const T&,
6441 MatchResultListener*);
6442 void (*describe)(
const MatcherBase&, std::ostream*,
bool negation);
6445 const MatcherDescriberInterface* (*get_describer)(
const MatcherBase&);
6447 void (*shared_destroy)(SharedPayloadBase*);
6450 bool IsShared()
const {
6451 return vtable_ !=
nullptr && vtable_->shared_destroy !=
nullptr;
6455 template <
typename P>
6456 static auto MatchAndExplainImpl(
const MatcherBase& m,
const T& value,
6457 MatchResultListener* listener)
6458 -> decltype(P::Get(m).MatchAndExplain(value, listener->stream())) {
6459 return P::Get(m).MatchAndExplain(value, listener->stream());
6462 template <
typename P>
6463 static auto MatchAndExplainImpl(
const MatcherBase& m,
const T& value,
6464 MatchResultListener* listener)
6465 -> decltype(P::Get(m).MatchAndExplain(value, listener)) {
6466 return P::Get(m).MatchAndExplain(value, listener);
6469 template <
typename P>
6470 static void DescribeImpl(
const MatcherBase& m, std::ostream* os,
6473 P::Get(m).DescribeNegationTo(os);
6475 P::Get(m).DescribeTo(os);
6479 template <
typename P>
6480 static const MatcherDescriberInterface* GetDescriberImpl(
6481 const MatcherBase& m) {
6489 std::is_convertible<decltype(&P::Get(m)),
6490 const MatcherDescriberInterface*>::value
6492 : 0)>(std::make_tuple(&m, &P::Get(m)));
6495 template <
typename P>
6496 const VTable* GetVTable() {
6497 static constexpr VTable kVTable = {&MatchAndExplainImpl<P>,
6498 &DescribeImpl<P>, &GetDescriberImpl<P>,
6509 SharedPayloadBase* shared;
6513 if (IsShared() && buffer_.shared->Unref()) {
6514 vtable_->shared_destroy(buffer_.shared);
6518 template <
typename M>
6519 static constexpr
bool IsInlined() {
6520 return sizeof(M) <=
sizeof(Buffer) &&
alignof(M) <=
alignof(Buffer) &&
6521 is_trivially_copy_constructible<M>::value &&
6522 std::is_trivially_destructible<M>::value;
6525 template <
typename M,
bool = MatcherBase::IsInlined<M>()>
6526 struct ValuePolicy {
6527 static const M& Get(
const MatcherBase& m) {
6530 const M *ptr =
static_cast<const M*
>(
6531 static_cast<const void*
>(&m.buffer_));
6534 static void Init(MatcherBase& m, M impl) {
6535 ::new (static_cast<void*>(&m.buffer_)) M(impl);
6537 static constexpr auto shared_destroy =
nullptr;
6540 template <typename M>
6541 struct ValuePolicy<M, false> {
6542 using Shared = SharedPayload<M>;
6543 static const M& Get(
const MatcherBase& m) {
6544 return static_cast<Shared*
>(m.buffer_.shared)->value;
6546 template <
typename Arg>
6547 static void Init(MatcherBase& m, Arg&& arg) {
6548 m.buffer_.shared =
new Shared(std::forward<Arg>(arg));
6550 static constexpr
auto shared_destroy = &Shared::Destroy;
6553 template <
typename U,
bool B>
6554 struct ValuePolicy<const MatcherInterface<U>*, B> {
6555 using M =
const MatcherInterface<U>;
6556 using Shared = SharedPayload<std::unique_ptr<M>>;
6557 static const M& Get(
const MatcherBase& m) {
6558 return *
static_cast<Shared*
>(m.buffer_.shared)->value;
6560 static void Init(MatcherBase& m, M* impl) {
6561 m.buffer_.shared =
new Shared(std::unique_ptr<M>(impl));
6564 static constexpr
auto shared_destroy = &Shared::Destroy;
6567 template <
typename M>
6569 using MM =
typename std::decay<M>::type;
6570 using Policy = ValuePolicy<MM>;
6571 vtable_ = GetVTable<Policy>();
6572 Policy::Init(*
this, std::forward<M>(m));
6575 const VTable* vtable_;
6585 template <
typename T>
6586 class Matcher :
public internal::MatcherBase<T> {
6591 explicit Matcher() {}
6594 explicit Matcher(
const MatcherInterface<const T&>* impl)
6595 : internal::MatcherBase<T>(impl) {}
6597 template <
typename U>
6599 const MatcherInterface<U>* impl,
6600 typename std::enable_if<!std::is_same<U, const U&>::value>::type* =
6602 : internal::MatcherBase<T>(impl) {}
6604 template <
typename M,
typename =
typename std::remove_reference<
6605 M>::type::is_gtest_matcher>
6606 Matcher(M&& m) : internal::MatcherBase<T>(
std::forward<M>(m)) {}
6617 class GTEST_API_ Matcher<const
std::string&>
6618 :
public internal::MatcherBase<const std::string&> {
6622 explicit Matcher(
const MatcherInterface<const std::string&>* impl)
6623 : internal::MatcherBase<const
std::string&>(impl) {}
6625 template <
typename M,
typename =
typename std::remove_reference<
6626 M>::type::is_gtest_matcher>
6628 : internal::MatcherBase<const
std::string&>(
std::forward<M>(m)) {}
6632 Matcher(
const std::string& s);
6635 Matcher(
const char* s);
6639 class GTEST_API_ Matcher<
std::string>
6640 :
public internal::MatcherBase<std::string> {
6644 explicit Matcher(
const MatcherInterface<const std::string&>* impl)
6645 : internal::MatcherBase<
std::string>(impl) {}
6646 explicit Matcher(
const MatcherInterface<std::string>* impl)
6647 : internal::MatcherBase<
std::string>(impl) {}
6649 template <
typename M,
typename =
typename std::remove_reference<
6650 M>::type::is_gtest_matcher>
6652 : internal::MatcherBase<
std::string>(
std::forward<M>(m)) {}
6656 Matcher(
const std::string& s);
6659 Matcher(
const char* s);
6662 #if GTEST_INTERNAL_HAS_STRING_VIEW 6667 class GTEST_API_ Matcher<const internal::StringView&>
6668 :
public internal::MatcherBase<const internal::StringView&> {
6672 explicit Matcher(
const MatcherInterface<const internal::StringView&>* impl)
6673 : internal::MatcherBase<const internal::StringView&>(impl) {}
6675 template <
typename M,
typename =
typename std::remove_reference<
6676 M>::type::is_gtest_matcher>
6678 : internal::MatcherBase<const internal::StringView&>(
std::forward<M>(m)) {
6683 Matcher(
const std::string& s);
6686 Matcher(
const char* s);
6689 Matcher(internal::StringView s);
6693 class GTEST_API_ Matcher<internal::StringView>
6694 :
public internal::MatcherBase<internal::StringView> {
6698 explicit Matcher(
const MatcherInterface<const internal::StringView&>* impl)
6699 : internal::MatcherBase<internal::StringView>(impl) {}
6700 explicit Matcher(
const MatcherInterface<internal::StringView>* impl)
6701 : internal::MatcherBase<internal::StringView>(impl) {}
6703 template <
typename M,
typename =
typename std::remove_reference<
6704 M>::type::is_gtest_matcher>
6706 : internal::MatcherBase<internal::StringView>(
std::forward<M>(m)) {}
6710 Matcher(
const std::string& s);
6713 Matcher(
const char* s);
6716 Matcher(internal::StringView s);
6718 #endif // GTEST_INTERNAL_HAS_STRING_VIEW 6721 template <
typename T>
6722 std::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) {
6723 matcher.DescribeTo(&os);
6739 template <
class Impl>
6740 class PolymorphicMatcher {
6742 explicit PolymorphicMatcher(
const Impl& an_impl) : impl_(an_impl) {}
6746 Impl& mutable_impl() {
return impl_; }
6750 const Impl& impl()
const {
return impl_; }
6752 template <
typename T>
6753 operator Matcher<T>()
const {
6754 return Matcher<T>(
new MonomorphicImpl<const T&>(impl_));
6758 template <
typename T>
6759 class MonomorphicImpl :
public MatcherInterface<T> {
6761 explicit MonomorphicImpl(
const Impl& impl) : impl_(impl) {}
6763 void DescribeTo(::std::ostream* os)
const override { impl_.DescribeTo(os); }
6765 void DescribeNegationTo(::std::ostream* os)
const override {
6766 impl_.DescribeNegationTo(os);
6769 bool MatchAndExplain(T x, MatchResultListener* listener)
const override {
6770 return impl_.MatchAndExplain(x, listener);
6786 template <
typename T>
6787 inline Matcher<T> MakeMatcher(
const MatcherInterface<T>* impl) {
6788 return Matcher<T>(impl);
6798 template <
class Impl>
6799 inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(
const Impl& impl) {
6800 return PolymorphicMatcher<Impl>(impl);
6803 namespace internal {
6814 template <
typename D,
typename Rhs,
typename Op>
6815 class ComparisonBase {
6817 explicit ComparisonBase(
const Rhs& rhs) : rhs_(rhs) {}
6819 using is_gtest_matcher = void;
6821 template <
typename Lhs>
6822 bool MatchAndExplain(
const Lhs& lhs, std::ostream*)
const {
6823 return Op()(lhs, Unwrap(rhs_));
6825 void DescribeTo(std::ostream* os)
const {
6826 *os << D::Desc() <<
" ";
6827 UniversalPrint(Unwrap(rhs_), os);
6829 void DescribeNegationTo(std::ostream* os)
const {
6830 *os << D::NegatedDesc() <<
" ";
6831 UniversalPrint(Unwrap(rhs_), os);
6835 template <
typename T>
6836 static const T& Unwrap(
const T& v) {
6839 template <
typename T>
6840 static const T& Unwrap(std::reference_wrapper<T> v) {
6847 template <
typename Rhs>
6848 class EqMatcher :
public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {
6850 explicit EqMatcher(
const Rhs& rhs)
6851 : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { }
6852 static const char* Desc() {
return "is equal to"; }
6853 static const char* NegatedDesc() {
return "isn't equal to"; }
6855 template <
typename Rhs>
6856 class NeMatcher :
public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {
6858 explicit NeMatcher(
const Rhs& rhs)
6859 : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { }
6860 static const char* Desc() {
return "isn't equal to"; }
6861 static const char* NegatedDesc() {
return "is equal to"; }
6863 template <
typename Rhs>
6864 class LtMatcher :
public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {
6866 explicit LtMatcher(
const Rhs& rhs)
6867 : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { }
6868 static const char* Desc() {
return "is <"; }
6869 static const char* NegatedDesc() {
return "isn't <"; }
6871 template <
typename Rhs>
6872 class GtMatcher :
public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {
6874 explicit GtMatcher(
const Rhs& rhs)
6875 : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { }
6876 static const char* Desc() {
return "is >"; }
6877 static const char* NegatedDesc() {
return "isn't >"; }
6879 template <
typename Rhs>
6880 class LeMatcher :
public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {
6882 explicit LeMatcher(
const Rhs& rhs)
6883 : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { }
6884 static const char* Desc() {
return "is <="; }
6885 static const char* NegatedDesc() {
return "isn't <="; }
6887 template <
typename Rhs>
6888 class GeMatcher :
public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {
6890 explicit GeMatcher(
const Rhs& rhs)
6891 : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { }
6892 static const char* Desc() {
return "is >="; }
6893 static const char* NegatedDesc() {
return "isn't >="; }
6896 template <
typename T,
typename =
typename std::enable_if<
6897 std::is_constructible<std::string, T>::value>::type>
6898 using StringLike = T;
6903 class MatchesRegexMatcher {
6905 MatchesRegexMatcher(
const RE* regex,
bool full_match)
6906 : regex_(regex), full_match_(full_match) {}
6908 #if GTEST_INTERNAL_HAS_STRING_VIEW 6909 bool MatchAndExplain(
const internal::StringView& s,
6910 MatchResultListener* listener)
const {
6911 return MatchAndExplain(std::string(s), listener);
6913 #endif // GTEST_INTERNAL_HAS_STRING_VIEW 6920 template <
typename CharType>
6921 bool MatchAndExplain(CharType* s, MatchResultListener* listener)
const {
6922 return s !=
nullptr && MatchAndExplain(std::string(s), listener);
6929 template <
class MatcheeStringType>
6930 bool MatchAndExplain(
const MatcheeStringType& s,
6931 MatchResultListener* )
const {
6932 const std::string& s2(s);
6933 return full_match_ ? RE::FullMatch(s2, *regex_)
6934 : RE::PartialMatch(s2, *regex_);
6937 void DescribeTo(::std::ostream* os)
const {
6938 *os << (full_match_ ?
"matches" :
"contains") <<
" regular expression ";
6939 UniversalPrinter<std::string>::Print(regex_->pattern(), os);
6942 void DescribeNegationTo(::std::ostream* os)
const {
6943 *os <<
"doesn't " << (full_match_ ?
"match" :
"contain")
6944 <<
" regular expression ";
6945 UniversalPrinter<std::string>::Print(regex_->pattern(), os);
6949 const std::shared_ptr<const RE> regex_;
6950 const bool full_match_;
6956 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
6957 const internal::RE* regex) {
6958 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex,
true));
6960 template <
typename T = std::
string>
6961 PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
6962 const internal::StringLike<T>& regex) {
6963 return MatchesRegex(
new internal::RE(std::string(regex)));
6968 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
6969 const internal::RE* regex) {
6970 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex,
false));
6972 template <
typename T = std::
string>
6973 PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
6974 const internal::StringLike<T>& regex) {
6975 return ContainsRegex(
new internal::RE(std::string(regex)));
6981 template <
typename T>
6982 inline internal::EqMatcher<T> Eq(T x) {
return internal::EqMatcher<T>(x); }
6986 template <
typename T>
6987 Matcher<T>::Matcher(T value) { *
this = Eq(value); }
7001 template <
typename Lhs,
typename Rhs>
7002 inline Matcher<Lhs> TypedEq(
const Rhs& rhs) {
return Eq(rhs); }
7005 template <
typename Rhs>
7006 inline internal::GeMatcher<Rhs> Ge(Rhs x) {
7007 return internal::GeMatcher<Rhs>(x);
7011 template <
typename Rhs>
7012 inline internal::GtMatcher<Rhs> Gt(Rhs x) {
7013 return internal::GtMatcher<Rhs>(x);
7017 template <
typename Rhs>
7018 inline internal::LeMatcher<Rhs> Le(Rhs x) {
7019 return internal::LeMatcher<Rhs>(x);
7023 template <
typename Rhs>
7024 inline internal::LtMatcher<Rhs> Lt(Rhs x) {
7025 return internal::LtMatcher<Rhs>(x);
7029 template <
typename Rhs>
7030 inline internal::NeMatcher<Rhs> Ne(Rhs x) {
7031 return internal::NeMatcher<Rhs>(x);
7035 GTEST_DISABLE_MSC_WARNINGS_POP_()
7037 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ 7043 namespace internal {
7045 GTEST_DECLARE_string_(internal_run_death_test);
7048 const char kDeathTestStyleFlag[] =
"death_test_style";
7049 const char kDeathTestUseFork[] =
"death_test_use_fork";
7050 const char kInternalRunDeathTestFlag[] =
"internal_run_death_test";
7052 #if GTEST_HAS_DEATH_TEST 7054 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
7070 class GTEST_API_ DeathTest {
7080 static bool Create(
const char* statement, Matcher<const std::string&> matcher,
7081 const char* file,
int line, DeathTest**
test);
7083 virtual ~DeathTest() { }
7086 class ReturnSentinel {
7088 explicit ReturnSentinel(DeathTest*
test) : test_(test) { }
7089 ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
7091 DeathTest*
const test_;
7092 GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
7093 } GTEST_ATTRIBUTE_UNUSED_;
7100 enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
7104 TEST_ENCOUNTERED_RETURN_STATEMENT,
7105 TEST_THREW_EXCEPTION,
7110 virtual TestRole AssumeRole() = 0;
7113 virtual int Wait() = 0;
7122 virtual bool Passed(
bool exit_status_ok) = 0;
7125 virtual void Abort(AbortReason reason) = 0;
7129 static const char* LastMessage();
7131 static void set_last_death_test_message(
const std::string& message);
7135 static std::string last_death_test_message_;
7137 GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
7140 GTEST_DISABLE_MSC_WARNINGS_POP_()
7143 class DeathTestFactory {
7145 virtual ~DeathTestFactory() { }
7146 virtual bool Create(
const char* statement,
7147 Matcher<const std::string&> matcher,
const char* file,
7148 int line, DeathTest**
test) = 0;
7152 class DefaultDeathTestFactory :
public DeathTestFactory {
7154 bool Create(
const char* statement, Matcher<const std::string&> matcher,
7155 const char* file,
int line, DeathTest**
test)
override;
7160 GTEST_API_
bool ExitedUnsuccessfully(
int exit_status);
7165 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
7166 ::testing::internal::RE regex) {
7167 return ContainsRegex(regex.pattern());
7169 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
const char* regex) {
7170 return ContainsRegex(regex);
7172 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
7173 const ::std::string& regex) {
7174 return ContainsRegex(regex);
7179 inline Matcher<const ::std::string&> MakeDeathTestMatcher(
7180 Matcher<const ::std::string&> matcher) {
7186 # if GTEST_HAS_EXCEPTIONS 7187 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ 7189 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 7190 } catch (const ::std::exception& gtest_exception) { \ 7193 "\n%s: Caught std::exception-derived exception escaping the " \ 7194 "death test statement. Exception message: %s\n", \ 7195 ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ 7196 gtest_exception.what()); \ 7198 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ 7200 death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ 7204 # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ 7205 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) 7211 #define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \ 7212 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 7213 if (::testing::internal::AlwaysTrue()) { \ 7214 ::testing::internal::DeathTest* gtest_dt; \ 7215 if (!::testing::internal::DeathTest::Create( \ 7217 ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \ 7218 __FILE__, __LINE__, >est_dt)) { \ 7219 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ 7221 if (gtest_dt != nullptr) { \ 7222 std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \ 7223 switch (gtest_dt->AssumeRole()) { \ 7224 case ::testing::internal::DeathTest::OVERSEE_TEST: \ 7225 if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ 7226 goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ 7229 case ::testing::internal::DeathTest::EXECUTE_TEST: { \ 7230 ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \ 7232 GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ 7233 gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ 7241 GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \ 7242 : fail(::testing::internal::DeathTest::LastMessage()) 7251 #define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \ 7252 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 7253 if (::testing::internal::AlwaysTrue()) { \ 7254 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 7255 } else if (!::testing::internal::AlwaysTrue()) { \ 7256 ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \ 7258 ::testing::Message() 7263 class InternalRunDeathTestFlag {
7265 InternalRunDeathTestFlag(
const std::string& a_file,
7269 : file_(a_file), line_(a_line), index_(an_index),
7270 write_fd_(a_write_fd) {}
7272 ~InternalRunDeathTestFlag() {
7274 posix::Close(write_fd_);
7277 const std::string& file()
const {
return file_; }
7278 int line()
const {
return line_; }
7279 int index()
const {
return index_; }
7280 int write_fd()
const {
return write_fd_; }
7288 GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
7294 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
7296 #endif // GTEST_HAS_DEATH_TEST 7301 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ 7310 GTEST_DECLARE_string_(death_test_style);
7312 #if GTEST_HAS_DEATH_TEST 7314 namespace internal {
7321 GTEST_API_
bool InDeathTestChild();
7428 # define ASSERT_EXIT(statement, predicate, regex) \ 7429 GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) 7433 # define EXPECT_EXIT(statement, predicate, regex) \ 7434 GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) 7439 # define ASSERT_DEATH(statement, regex) \ 7440 ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) 7444 # define EXPECT_DEATH(statement, regex) \ 7445 EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) 7450 class GTEST_API_ ExitedWithCode {
7452 explicit ExitedWithCode(
int exit_code);
7453 ExitedWithCode(
const ExitedWithCode&) =
default;
7454 void operator=(
const ExitedWithCode& other) =
delete;
7455 bool operator()(
int exit_status)
const;
7457 const int exit_code_;
7460 # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA 7464 class GTEST_API_ KilledBySignal {
7466 explicit KilledBySignal(
int signum);
7467 bool operator()(
int exit_status)
const;
7471 # endif // !GTEST_OS_WINDOWS 7518 # define EXPECT_DEBUG_DEATH(statement, regex) \ 7519 GTEST_EXECUTE_STATEMENT_(statement, regex) 7521 # define ASSERT_DEBUG_DEATH(statement, regex) \ 7522 GTEST_EXECUTE_STATEMENT_(statement, regex) 7526 # define EXPECT_DEBUG_DEATH(statement, regex) \ 7527 EXPECT_DEATH(statement, regex) 7529 # define ASSERT_DEBUG_DEATH(statement, regex) \ 7530 ASSERT_DEATH(statement, regex) 7532 # endif // NDEBUG for EXPECT_DEBUG_DEATH 7533 #endif // GTEST_HAS_DEATH_TEST 7570 # define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \ 7571 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 7572 if (::testing::internal::AlwaysTrue()) { \ 7573 GTEST_LOG_(WARNING) \ 7574 << "Death tests are not supported on this platform.\n" \ 7575 << "Statement '" #statement "' cannot be verified."; \ 7576 } else if (::testing::internal::AlwaysFalse()) { \ 7577 ::testing::internal::RE::PartialMatch(".*", (regex)); \ 7578 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 7581 ::testing::Message() 7588 #if GTEST_HAS_DEATH_TEST 7589 # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ 7590 EXPECT_DEATH(statement, regex) 7591 # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ 7592 ASSERT_DEATH(statement, regex) 7594 # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ 7595 GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, ) 7596 # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ 7597 GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return) 7602 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ 7636 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ 7637 #define GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ 7654 class FooTest :
public ::testing::TestWithParam<const char*> {
7662 TEST_P(FooTest, DoesBlah) {
7665 EXPECT_TRUE(foo.Blah(GetParam()));
7669 TEST_P(FooTest, HasBlahBlah) {
7697 INSTANTIATE_TEST_SUITE_P(InstantiationName,
7699 Values(
"meeny",
"miny",
"moe"));
7720 const char* pets[] = {
"cat",
"dog"};
7721 INSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
7756 class BaseTest :
public ::testing::Test {
7761 class DerivedTest :
public BaseTest,
public ::testing::WithParamInterface<int> {
7765 TEST_F(BaseTest, HasFoo) {
7769 TEST_P(DerivedTest, DoesBlah) {
7771 EXPECT_TRUE(foo.Blah(GetParam()));
7813 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 7814 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 7823 #include <type_traits> 7858 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ 7859 #define GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ 7864 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
7873 class GTEST_API_ TestPartResult {
7887 TestPartResult(Type a_type,
const char* a_file_name,
int a_line_number,
7888 const char* a_message)
7890 file_name_(a_file_name == nullptr ?
"" : a_file_name),
7891 line_number_(a_line_number),
7892 summary_(ExtractSummary(a_message)),
7893 message_(a_message) {}
7896 Type type()
const {
return type_; }
7900 const char* file_name()
const {
7901 return file_name_.empty() ? nullptr : file_name_.c_str();
7906 int line_number()
const {
return line_number_; }
7909 const char* summary()
const {
return summary_.c_str(); }
7912 const char* message()
const {
return message_.c_str(); }
7915 bool skipped()
const {
return type_ == kSkip; }
7918 bool passed()
const {
return type_ == kSuccess; }
7921 bool nonfatally_failed()
const {
return type_ == kNonFatalFailure; }
7924 bool fatally_failed()
const {
return type_ == kFatalFailure; }
7927 bool failed()
const {
return fatally_failed() || nonfatally_failed(); }
7934 static std::string ExtractSummary(
const char* message);
7938 std::string file_name_;
7942 std::string summary_;
7943 std::string message_;
7947 std::ostream& operator<<(std::ostream& os,
const TestPartResult& result);
7953 class GTEST_API_ TestPartResultArray {
7955 TestPartResultArray() {}
7958 void Append(
const TestPartResult& result);
7961 const TestPartResult& GetTestPartResult(
int index)
const;
7967 std::vector<TestPartResult> array_;
7969 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
7973 class GTEST_API_ TestPartResultReporterInterface {
7975 virtual ~TestPartResultReporterInterface() {}
7977 virtual void ReportTestPartResult(
const TestPartResult& result) = 0;
7980 namespace internal {
7988 class GTEST_API_ HasNewFatalFailureHelper
7989 :
public TestPartResultReporterInterface {
7991 HasNewFatalFailureHelper();
7992 ~HasNewFatalFailureHelper()
override;
7993 void ReportTestPartResult(
const TestPartResult& result)
override;
7994 bool has_new_fatal_failure()
const {
return has_new_fatal_failure_; }
7996 bool has_new_fatal_failure_;
7997 TestPartResultReporterInterface* original_reporter_;
7999 GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
8006 GTEST_DISABLE_MSC_WARNINGS_POP_()
8008 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ 8013 template <
class ParamType>
8014 struct TestParamInfo {
8015 TestParamInfo(
const ParamType& a_param,
size_t an_index) :
8024 struct PrintToStringParamName {
8025 template <
class ParamType>
8026 std::string operator()(
const TestParamInfo<ParamType>&
info)
const {
8027 return PrintToString(info.param);
8031 namespace internal {
8040 GTEST_API_
void ReportInvalidTestSuiteType(
const char* test_suite_name,
8041 CodeLocation code_location);
8043 template <
typename>
class ParamGeneratorInterface;
8044 template <
typename>
class ParamGenerator;
8048 template <
typename T>
8049 class ParamIteratorInterface {
8051 virtual ~ParamIteratorInterface() {}
8055 virtual const ParamGeneratorInterface<T>* BaseGenerator()
const = 0;
8060 virtual void Advance() = 0;
8063 virtual ParamIteratorInterface* Clone()
const = 0;
8068 virtual const T* Current()
const = 0;
8072 virtual bool Equals(
const ParamIteratorInterface& other)
const = 0;
8078 template <
typename T>
8079 class ParamIterator {
8081 typedef T value_type;
8082 typedef const T& reference;
8083 typedef ptrdiff_t difference_type;
8086 ParamIterator(
const ParamIterator& other) : impl_(other.impl_->Clone()) {}
8087 ParamIterator& operator=(
const ParamIterator& other) {
8089 impl_.reset(other.impl_->Clone());
8093 const T& operator*()
const {
return *impl_->Current(); }
8094 const T* operator->()
const {
return impl_->Current(); }
8096 ParamIterator& operator++() {
8101 ParamIterator operator++(
int ) {
8102 ParamIteratorInterface<T>* clone = impl_->Clone();
8104 return ParamIterator(clone);
8106 bool operator==(
const ParamIterator& other)
const {
8107 return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
8109 bool operator!=(
const ParamIterator& other)
const {
8110 return !(*
this == other);
8114 friend class ParamGenerator<T>;
8115 explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
8116 std::unique_ptr<ParamIteratorInterface<T> > impl_;
8121 template <
typename T>
8122 class ParamGeneratorInterface {
8124 typedef T ParamType;
8126 virtual ~ParamGeneratorInterface() {}
8129 virtual ParamIteratorInterface<T>* Begin()
const = 0;
8130 virtual ParamIteratorInterface<T>* End()
const = 0;
8138 template<
typename T>
8139 class ParamGenerator {
8141 typedef ParamIterator<T> iterator;
8143 explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
8144 ParamGenerator(
const ParamGenerator& other) : impl_(other.impl_) {}
8146 ParamGenerator& operator=(
const ParamGenerator& other) {
8147 impl_ = other.impl_;
8151 iterator begin()
const {
return iterator(impl_->Begin()); }
8152 iterator end()
const {
return iterator(impl_->End()); }
8155 std::shared_ptr<const ParamGeneratorInterface<T> > impl_;
8162 template <
typename T,
typename IncrementT>
8163 class RangeGenerator :
public ParamGeneratorInterface<T> {
8165 RangeGenerator(T begin, T end, IncrementT step)
8166 : begin_(begin), end_(end),
8167 step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
8168 ~RangeGenerator()
override {}
8170 ParamIteratorInterface<T>* Begin()
const override {
8171 return new Iterator(
this, begin_, 0, step_);
8173 ParamIteratorInterface<T>* End()
const override {
8174 return new Iterator(
this, end_, end_index_, step_);
8178 class Iterator :
public ParamIteratorInterface<T> {
8180 Iterator(
const ParamGeneratorInterface<T>* base, T value,
int index,
8182 : base_(base), value_(value), index_(index), step_(step) {}
8183 ~Iterator()
override {}
8185 const ParamGeneratorInterface<T>* BaseGenerator()
const override {
8188 void Advance()
override {
8189 value_ =
static_cast<T
>(value_ + step_);
8192 ParamIteratorInterface<T>* Clone()
const override {
8193 return new Iterator(*
this);
8195 const T* Current()
const override {
return &value_; }
8196 bool Equals(
const ParamIteratorInterface<T>& other)
const override {
8199 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
8200 <<
"The program attempted to compare iterators " 8201 <<
"from different generators." << std::endl;
8202 const int other_index =
8203 CheckedDowncastToActualType<const Iterator>(&other)->index_;
8204 return index_ == other_index;
8208 Iterator(
const Iterator& other)
8209 : ParamIteratorInterface<T>(),
8210 base_(other.base_), value_(other.value_), index_(other.index_),
8211 step_(other.step_) {}
8214 void operator=(
const Iterator& other);
8216 const ParamGeneratorInterface<T>*
const base_;
8219 const IncrementT step_;
8222 static int CalculateEndIndex(
const T& begin,
8224 const IncrementT& step) {
8226 for (T i = begin; i < end; i = static_cast<T>(i + step))
8232 void operator=(
const RangeGenerator& other);
8236 const IncrementT step_;
8239 const int end_index_;
8247 template <
typename T>
8248 class ValuesInIteratorRangeGenerator :
public ParamGeneratorInterface<T> {
8250 template <
typename ForwardIterator>
8251 ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
8252 : container_(begin, end) {}
8253 ~ValuesInIteratorRangeGenerator()
override {}
8255 ParamIteratorInterface<T>* Begin()
const override {
8256 return new Iterator(
this, container_.begin());
8258 ParamIteratorInterface<T>* End()
const override {
8259 return new Iterator(
this, container_.end());
8263 typedef typename ::std::vector<T> ContainerType;
8265 class Iterator :
public ParamIteratorInterface<T> {
8267 Iterator(
const ParamGeneratorInterface<T>* base,
8268 typename ContainerType::const_iterator iterator)
8269 : base_(base), iterator_(iterator) {}
8270 ~Iterator()
override {}
8272 const ParamGeneratorInterface<T>* BaseGenerator()
const override {
8275 void Advance()
override {
8279 ParamIteratorInterface<T>* Clone()
const override {
8280 return new Iterator(*
this);
8289 const T* Current()
const override {
8290 if (value_.get() ==
nullptr) value_.reset(
new T(*iterator_));
8291 return value_.get();
8293 bool Equals(
const ParamIteratorInterface<T>& other)
const override {
8296 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
8297 <<
"The program attempted to compare iterators " 8298 <<
"from different generators." << std::endl;
8300 CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
8304 Iterator(
const Iterator& other)
8307 : ParamIteratorInterface<T>(),
8309 iterator_(other.iterator_) {}
8311 const ParamGeneratorInterface<T>*
const base_;
8312 typename ContainerType::const_iterator iterator_;
8318 mutable std::unique_ptr<const T> value_;
8322 void operator=(
const ValuesInIteratorRangeGenerator& other);
8324 const ContainerType container_;
8331 template <
class ParamType>
8332 std::string DefaultParamName(
const TestParamInfo<ParamType>&
info) {
8333 Message name_stream;
8334 name_stream << info.index;
8335 return name_stream.GetString();
8338 template <
typename T =
int>
8339 void TestNotEmpty() {
8340 static_assert(
sizeof(T) == 0,
"Empty arguments are not allowed.");
8342 template <
typename T =
int>
8343 void TestNotEmpty(
const T&) {}
8349 template <
class TestClass>
8350 class ParameterizedTestFactory :
public TestFactoryBase {
8352 typedef typename TestClass::ParamType ParamType;
8353 explicit ParameterizedTestFactory(ParamType parameter) :
8354 parameter_(parameter) {}
8355 Test* CreateTest()
override {
8356 TestClass::SetParam(¶meter_);
8357 return new TestClass();
8361 const ParamType parameter_;
8363 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
8370 template <
class ParamType>
8371 class TestMetaFactoryBase {
8373 virtual ~TestMetaFactoryBase() {}
8375 virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
8386 template <
class TestSuite>
8387 class TestMetaFactory
8388 :
public TestMetaFactoryBase<typename TestSuite::ParamType> {
8390 using ParamType =
typename TestSuite::ParamType;
8392 TestMetaFactory() {}
8394 TestFactoryBase* CreateTestFactory(ParamType parameter)
override {
8395 return new ParameterizedTestFactory<TestSuite>(parameter);
8399 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
8412 class ParameterizedTestSuiteInfoBase {
8414 virtual ~ParameterizedTestSuiteInfoBase() {}
8417 virtual const std::string& GetTestSuiteName()
const = 0;
8419 virtual TypeId GetTestSuiteTypeId()
const = 0;
8424 virtual void RegisterTests() = 0;
8427 ParameterizedTestSuiteInfoBase() {}
8430 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase);
8437 struct MarkAsIgnored {
8438 explicit MarkAsIgnored(
const char* test_suite);
8441 GTEST_API_
void InsertSyntheticTestCase(
const std::string& name,
8442 CodeLocation location,
bool has_test_p);
8451 template <
class TestSuite>
8452 class ParameterizedTestSuiteInfo :
public ParameterizedTestSuiteInfoBase {
8457 using ParamType =
typename TestSuite::ParamType;
8459 typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
8460 using ParamNameGeneratorFunc = std::string(
const TestParamInfo<ParamType>&);
8462 explicit ParameterizedTestSuiteInfo(
const char* name,
8463 CodeLocation code_location)
8464 : test_suite_name_(name), code_location_(code_location) {}
8467 const std::string& GetTestSuiteName()
const override {
8468 return test_suite_name_;
8471 TypeId GetTestSuiteTypeId()
const override {
return GetTypeId<TestSuite>(); }
8478 void AddTestPattern(
const char* test_suite_name,
const char* test_base_name,
8479 TestMetaFactoryBase<ParamType>* meta_factory,
8480 CodeLocation code_location) {
8481 tests_.push_back(std::shared_ptr<TestInfo>(
new TestInfo(
8482 test_suite_name, test_base_name, meta_factory, code_location)));
8486 int AddTestSuiteInstantiation(
const std::string& instantiation_name,
8487 GeneratorCreationFunc* func,
8488 ParamNameGeneratorFunc* name_func,
8489 const char* file,
int line) {
8490 instantiations_.push_back(
8491 InstantiationInfo(instantiation_name, func, name_func, file, line));
8499 void RegisterTests()
override {
8500 bool generated_instantiations =
false;
8502 for (
typename TestInfoContainer::iterator test_it = tests_.begin();
8503 test_it != tests_.end(); ++test_it) {
8504 std::shared_ptr<TestInfo> test_info = *test_it;
8505 for (
typename InstantiationContainer::iterator gen_it =
8506 instantiations_.begin(); gen_it != instantiations_.end();
8508 const std::string& instantiation_name = gen_it->name;
8509 ParamGenerator<ParamType> generator((*gen_it->generator)());
8510 ParamNameGeneratorFunc* name_func = gen_it->name_func;
8511 const char* file = gen_it->file;
8512 int line = gen_it->line;
8514 std::string test_suite_name;
8515 if ( !instantiation_name.empty() )
8516 test_suite_name = instantiation_name +
"/";
8517 test_suite_name += test_info->test_suite_base_name;
8520 std::set<std::string> test_param_names;
8521 for (
typename ParamGenerator<ParamType>::iterator param_it =
8523 param_it != generator.end(); ++param_it, ++i) {
8524 generated_instantiations =
true;
8526 Message test_name_stream;
8528 std::string param_name = name_func(
8529 TestParamInfo<ParamType>(*param_it, i));
8531 GTEST_CHECK_(IsValidParamName(param_name))
8532 <<
"Parameterized test name '" << param_name
8533 <<
"' is invalid, in " << file
8534 <<
" line " << line << std::endl;
8536 GTEST_CHECK_(test_param_names.count(param_name) == 0)
8537 <<
"Duplicate parameterized test name '" << param_name
8538 <<
"', in " << file <<
" line " << line << std::endl;
8540 test_param_names.insert(param_name);
8542 if (!test_info->test_base_name.empty()) {
8543 test_name_stream << test_info->test_base_name <<
"/";
8545 test_name_stream << param_name;
8546 MakeAndRegisterTestInfo(
8547 test_suite_name.c_str(), test_name_stream.GetString().c_str(),
8549 PrintToString(*param_it).c_str(), test_info->code_location,
8550 GetTestSuiteTypeId(),
8551 SuiteApiResolver<TestSuite>::GetSetUpCaseOrSuite(file, line),
8552 SuiteApiResolver<TestSuite>::GetTearDownCaseOrSuite(file, line),
8553 test_info->test_meta_factory->CreateTestFactory(*param_it));
8558 if (!generated_instantiations) {
8560 InsertSyntheticTestCase(GetTestSuiteName(), code_location_,
8569 TestInfo(
const char* a_test_suite_base_name,
const char* a_test_base_name,
8570 TestMetaFactoryBase<ParamType>* a_test_meta_factory,
8571 CodeLocation a_code_location)
8572 : test_suite_base_name(a_test_suite_base_name),
8573 test_base_name(a_test_base_name),
8574 test_meta_factory(a_test_meta_factory),
8575 code_location(a_code_location) {}
8577 const std::string test_suite_base_name;
8578 const std::string test_base_name;
8579 const std::unique_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
8580 const CodeLocation code_location;
8582 using TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo> >;
8586 struct InstantiationInfo {
8587 InstantiationInfo(
const std::string &name_in,
8588 GeneratorCreationFunc* generator_in,
8589 ParamNameGeneratorFunc* name_func_in,
8590 const char* file_in,
8593 generator(generator_in),
8594 name_func(name_func_in),
8599 GeneratorCreationFunc* generator;
8600 ParamNameGeneratorFunc* name_func;
8604 typedef ::std::vector<InstantiationInfo> InstantiationContainer;
8606 static bool IsValidParamName(
const std::string& name) {
8612 for (std::string::size_type index = 0; index < name.size(); ++index) {
8613 if (!isalnum(name[index]) && name[index] !=
'_')
8620 const std::string test_suite_name_;
8621 CodeLocation code_location_;
8622 TestInfoContainer tests_;
8623 InstantiationContainer instantiations_;
8625 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo);
8629 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 8630 template <
class TestCase>
8631 using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo<TestCase>;
8632 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 8640 class ParameterizedTestSuiteRegistry {
8642 ParameterizedTestSuiteRegistry() {}
8643 ~ParameterizedTestSuiteRegistry() {
8644 for (
auto& test_suite_info : test_suite_infos_) {
8645 delete test_suite_info;
8651 template <
class TestSuite>
8652 ParameterizedTestSuiteInfo<TestSuite>* GetTestSuitePatternHolder(
8653 const char* test_suite_name, CodeLocation code_location) {
8654 ParameterizedTestSuiteInfo<TestSuite>* typed_test_info =
nullptr;
8655 for (
auto& test_suite_info : test_suite_infos_) {
8656 if (test_suite_info->GetTestSuiteName() == test_suite_name) {
8657 if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {
8661 ReportInvalidTestSuiteType(test_suite_name, code_location);
8667 typed_test_info = CheckedDowncastToActualType<
8668 ParameterizedTestSuiteInfo<TestSuite> >(test_suite_info);
8673 if (typed_test_info ==
nullptr) {
8674 typed_test_info =
new ParameterizedTestSuiteInfo<TestSuite>(
8675 test_suite_name, code_location);
8676 test_suite_infos_.push_back(typed_test_info);
8678 return typed_test_info;
8680 void RegisterTests() {
8681 for (
auto& test_suite_info : test_suite_infos_) {
8682 test_suite_info->RegisterTests();
8686 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 8687 template <
class TestCase>
8688 ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
8689 const char* test_case_name, CodeLocation code_location) {
8690 return GetTestSuitePatternHolder<TestCase>(test_case_name, code_location);
8693 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 8696 using TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>;
8698 TestSuiteInfoContainer test_suite_infos_;
8700 GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry);
8706 class TypeParameterizedTestSuiteRegistry {
8709 void RegisterTestSuite(
const char* test_suite_name,
8710 CodeLocation code_location);
8713 void RegisterInstantiation(
const char* test_suite_name);
8717 void CheckForInstantiations();
8720 struct TypeParameterizedTestSuiteInfo {
8721 explicit TypeParameterizedTestSuiteInfo(CodeLocation c)
8722 : code_location(c), instantiated(false) {}
8724 CodeLocation code_location;
8728 std::map<std::string, TypeParameterizedTestSuiteInfo> suites_;
8735 template <
class Container>
8736 internal::ParamGenerator<typename Container::value_type> ValuesIn(
8737 const Container& container);
8739 namespace internal {
8743 #pragma warning(push) 8744 #pragma warning(disable : 4100) 8747 template <
typename... Ts>
8750 explicit ValueArray(Ts... v) : v_(FlatTupleConstructTag{}, std::move(v)...) {}
8752 template <
typename T>
8753 operator ParamGenerator<T>()
const {
8754 return ValuesIn(MakeVector<T>(MakeIndexSequence<
sizeof...(Ts)>()));
8758 template <
typename T,
size_t... I>
8759 std::vector<T> MakeVector(IndexSequence<I...>)
const {
8760 return std::vector<T>{
static_cast<T
>(v_.template Get<I>())...};
8763 FlatTuple<Ts...> v_;
8767 #pragma warning(pop) 8770 template <
typename... T>
8771 class CartesianProductGenerator
8772 :
public ParamGeneratorInterface<::std::tuple<T...>> {
8774 typedef ::std::tuple<T...> ParamType;
8776 CartesianProductGenerator(
const std::tuple<ParamGenerator<T>...>& g)
8778 ~CartesianProductGenerator()
override {}
8780 ParamIteratorInterface<ParamType>* Begin()
const override {
8781 return new Iterator(
this, generators_,
false);
8783 ParamIteratorInterface<ParamType>* End()
const override {
8784 return new Iterator(
this, generators_,
true);
8790 template <
size_t... I>
8791 class IteratorImpl<IndexSequence<I...>>
8792 :
public ParamIteratorInterface<ParamType> {
8794 IteratorImpl(
const ParamGeneratorInterface<ParamType>* base,
8795 const std::tuple<ParamGenerator<T>...>& generators,
bool is_end)
8797 begin_(
std::
get<I>(generators).begin()...),
8798 end_(
std::
get<I>(generators).end()...),
8799 current_(is_end ? end_ : begin_) {
8800 ComputeCurrentValue();
8802 ~IteratorImpl()
override {}
8804 const ParamGeneratorInterface<ParamType>* BaseGenerator()
const override {
8809 void Advance()
override {
8812 ++std::get<
sizeof...(T) - 1>(current_);
8814 AdvanceIfEnd<
sizeof...(T) - 1>();
8815 ComputeCurrentValue();
8817 ParamIteratorInterface<ParamType>* Clone()
const override {
8818 return new IteratorImpl(*
this);
8821 const ParamType* Current()
const override {
return current_value_.get(); }
8823 bool Equals(
const ParamIteratorInterface<ParamType>& other)
const override {
8826 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
8827 <<
"The program attempted to compare iterators " 8828 <<
"from different generators." << std::endl;
8829 const IteratorImpl* typed_other =
8830 CheckedDowncastToActualType<const IteratorImpl>(&other);
8835 if (AtEnd() && typed_other->AtEnd())
return true;
8839 (same = same && std::get<I>(current_) ==
8840 std::get<I>(typed_other->current_))...};
8846 template <
size_t ThisI>
8847 void AdvanceIfEnd() {
8848 if (std::get<ThisI>(current_) != std::get<ThisI>(end_))
return;
8850 bool last = ThisI == 0;
8856 constexpr
size_t NextI = ThisI - (ThisI != 0);
8857 std::get<ThisI>(current_) = std::get<ThisI>(begin_);
8858 ++std::get<NextI>(current_);
8859 AdvanceIfEnd<NextI>();
8862 void ComputeCurrentValue() {
8864 current_value_ = std::make_shared<ParamType>(*std::get<I>(current_)...);
8866 bool AtEnd()
const {
8867 bool at_end =
false;
8869 (at_end = at_end || std::get<I>(current_) == std::get<I>(end_))...};
8874 const ParamGeneratorInterface<ParamType>*
const base_;
8875 std::tuple<typename ParamGenerator<T>::iterator...> begin_;
8876 std::tuple<typename ParamGenerator<T>::iterator...> end_;
8877 std::tuple<typename ParamGenerator<T>::iterator...> current_;
8878 std::shared_ptr<ParamType> current_value_;
8881 using Iterator = IteratorImpl<
typename MakeIndexSequence<
sizeof...(T)>::type>;
8883 std::tuple<ParamGenerator<T>...> generators_;
8886 template <
class... Gen>
8887 class CartesianProductHolder {
8889 CartesianProductHolder(
const Gen&... g) : generators_(g...) {}
8890 template <
typename... T>
8891 operator ParamGenerator<::std::tuple<T...>>()
const {
8892 return ParamGenerator<::std::tuple<T...>>(
8893 new CartesianProductGenerator<T...>(generators_));
8897 std::tuple<Gen...> generators_;
8903 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 8949 template <
typename T,
typename IncrementT>
8950 internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
8951 return internal::ParamGenerator<T>(
8952 new internal::RangeGenerator<T, IncrementT>(start, end, step));
8955 template <
typename T>
8956 internal::ParamGenerator<T> Range(T start, T end) {
8957 return Range(start, end, 1);
9015 template <
typename ForwardIterator>
9016 internal::ParamGenerator<
9017 typename std::iterator_traits<ForwardIterator>::value_type>
9018 ValuesIn(ForwardIterator begin, ForwardIterator end) {
9019 typedef typename std::iterator_traits<ForwardIterator>::value_type ParamType;
9020 return internal::ParamGenerator<ParamType>(
9021 new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
9024 template <
typename T,
size_t N>
9025 internal::ParamGenerator<T> ValuesIn(
const T (&array)[N]) {
9026 return ValuesIn(array, array + N);
9029 template <
class Container>
9030 internal::ParamGenerator<typename Container::value_type> ValuesIn(
9031 const Container& container) {
9032 return ValuesIn(container.begin(), container.end());
9055 template <
typename... T>
9056 internal::ValueArray<T...> Values(T... v) {
9057 return internal::ValueArray<T...>(std::move(v)...);
9080 inline internal::ParamGenerator<bool> Bool() {
9081 return Values(
false,
true);
9128 template <
typename... Generator>
9129 internal::CartesianProductHolder<Generator...> Combine(
const Generator&... g) {
9130 return internal::CartesianProductHolder<Generator...>(g...);
9133 #define TEST_P(test_suite_name, test_name) \ 9134 class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ 9135 : public test_suite_name { \ 9137 GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ 9138 void TestBody() override; \ 9141 static int AddToRegistry() { \ 9142 ::testing::UnitTest::GetInstance() \ 9143 ->parameterized_test_registry() \ 9144 .GetTestSuitePatternHolder<test_suite_name>( \ 9145 GTEST_STRINGIFY_(test_suite_name), \ 9146 ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ 9148 GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name), \ 9149 new ::testing::internal::TestMetaFactory<GTEST_TEST_CLASS_NAME_( \ 9150 test_suite_name, test_name)>(), \ 9151 ::testing::internal::CodeLocation(__FILE__, __LINE__)); \ 9154 static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \ 9155 GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ 9158 int GTEST_TEST_CLASS_NAME_(test_suite_name, \ 9159 test_name)::gtest_registering_dummy_ = \ 9160 GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \ 9161 void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() 9176 #define GTEST_EXPAND_(arg) arg 9177 #define GTEST_GET_FIRST_(first, ...) first 9178 #define GTEST_GET_SECOND_(first, second, ...) second 9180 #define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \ 9181 static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \ 9182 gtest_##prefix##test_suite_name##_EvalGenerator_() { \ 9183 return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_)); \ 9185 static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \ 9186 const ::testing::TestParamInfo<test_suite_name::ParamType>& info) { \ 9187 if (::testing::internal::AlwaysFalse()) { \ 9188 ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_( \ 9190 ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \ 9192 auto t = std::make_tuple(__VA_ARGS__); \ 9193 static_assert(std::tuple_size<decltype(t)>::value <= 2, \ 9194 "Too Many Args!"); \ 9196 return ((GTEST_EXPAND_(GTEST_GET_SECOND_( \ 9198 ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \ 9199 DUMMY_PARAM_))))(info); \ 9201 static int gtest_##prefix##test_suite_name##_dummy_ \ 9202 GTEST_ATTRIBUTE_UNUSED_ = \ 9203 ::testing::UnitTest::GetInstance() \ 9204 ->parameterized_test_registry() \ 9205 .GetTestSuitePatternHolder<test_suite_name>( \ 9206 GTEST_STRINGIFY_(test_suite_name), \ 9207 ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ 9208 ->AddTestSuiteInstantiation( \ 9209 GTEST_STRINGIFY_(prefix), \ 9210 >est_##prefix##test_suite_name##_EvalGenerator_, \ 9211 >est_##prefix##test_suite_name##_EvalGenerateName_, \ 9216 #define GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(T) \ 9217 namespace gtest_do_not_use_outside_namespace_scope {} \ 9218 static const ::testing::internal::MarkAsIgnored gtest_allow_ignore_##T( \ 9219 GTEST_STRINGIFY_(T)) 9222 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9223 #define INSTANTIATE_TEST_CASE_P \ 9224 static_assert(::testing::internal::InstantiateTestCase_P_IsDeprecated(), \ 9226 INSTANTIATE_TEST_SUITE_P 9227 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9231 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ 9265 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_ 9266 #define GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_ 9289 #define FRIEND_TEST(test_case_name, test_name)\ 9290 friend class test_case_name##_##test_name##_Test 9292 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_ 9324 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ 9325 #define GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ 9337 template <
typename T>
9338 class FooTest :
public testing::Test {
9341 typedef std::list<T> List;
9349 typedef testing::Types<char, int, unsigned int> MyTypes;
9350 TYPED_TEST_SUITE(FooTest, MyTypes);
9358 TYPED_TEST(FooTest, DoesBlah) {
9362 TypeParam n = this->value_;
9366 n += TestFixture::shared_;
9370 typename TestFixture::List values;
9371 values.push_back(n);
9375 TYPED_TEST(FooTest, HasPropertyA) { ... }
9415 template <
typename T>
9416 class FooTest :
public testing::Test {
9423 TYPED_TEST_SUITE_P(FooTest);
9427 TYPED_TEST_P(FooTest, DoesBlah) {
9433 TYPED_TEST_P(FooTest, HasPropertyA) { ... }
9439 REGISTER_TYPED_TEST_SUITE_P(FooTest,
9440 DoesBlah, HasPropertyA);
9450 typedef testing::Types<char, int, unsigned int> MyTypes;
9451 INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
9471 #define GTEST_TYPE_PARAMS_(TestSuiteName) gtest_type_params_##TestSuiteName##_ 9475 #define GTEST_NAME_GENERATOR_(TestSuiteName) \ 9476 gtest_type_params_##TestSuiteName##_NameGenerator 9478 #define TYPED_TEST_SUITE(CaseName, Types, ...) \ 9479 typedef ::testing::internal::GenerateTypeList<Types>::type \ 9480 GTEST_TYPE_PARAMS_(CaseName); \ 9481 typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \ 9482 GTEST_NAME_GENERATOR_(CaseName) 9484 #define TYPED_TEST(CaseName, TestName) \ 9485 static_assert(sizeof(GTEST_STRINGIFY_(TestName)) > 1, \ 9486 "test-name must not be empty"); \ 9487 template <typename gtest_TypeParam_> \ 9488 class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ 9489 : public CaseName<gtest_TypeParam_> { \ 9491 typedef CaseName<gtest_TypeParam_> TestFixture; \ 9492 typedef gtest_TypeParam_ TypeParam; \ 9493 void TestBody() override; \ 9495 static bool gtest_##CaseName##_##TestName##_registered_ \ 9496 GTEST_ATTRIBUTE_UNUSED_ = ::testing::internal::TypeParameterizedTest< \ 9498 ::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \ 9500 GTEST_TYPE_PARAMS_( \ 9501 CaseName)>::Register("", \ 9502 ::testing::internal::CodeLocation( \ 9503 __FILE__, __LINE__), \ 9504 GTEST_STRINGIFY_(CaseName), \ 9505 GTEST_STRINGIFY_(TestName), 0, \ 9506 ::testing::internal::GenerateNames< \ 9507 GTEST_NAME_GENERATOR_(CaseName), \ 9508 GTEST_TYPE_PARAMS_(CaseName)>()); \ 9509 template <typename gtest_TypeParam_> \ 9510 void GTEST_TEST_CLASS_NAME_(CaseName, \ 9511 TestName)<gtest_TypeParam_>::TestBody() 9514 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9515 #define TYPED_TEST_CASE \ 9516 static_assert(::testing::internal::TypedTestCaseIsDeprecated(), ""); \ 9518 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9527 #define GTEST_SUITE_NAMESPACE_(TestSuiteName) gtest_suite_##TestSuiteName##_ 9533 #define GTEST_TYPED_TEST_SUITE_P_STATE_(TestSuiteName) \ 9534 gtest_typed_test_suite_p_state_##TestSuiteName##_ 9540 #define GTEST_REGISTERED_TEST_NAMES_(TestSuiteName) \ 9541 gtest_registered_test_names_##TestSuiteName##_ 9546 #define TYPED_TEST_SUITE_P(SuiteName) \ 9547 static ::testing::internal::TypedTestSuitePState \ 9548 GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName) 9551 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9552 #define TYPED_TEST_CASE_P \ 9553 static_assert(::testing::internal::TypedTestCase_P_IsDeprecated(), ""); \ 9555 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9557 #define TYPED_TEST_P(SuiteName, TestName) \ 9558 namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ 9559 template <typename gtest_TypeParam_> \ 9560 class TestName : public SuiteName<gtest_TypeParam_> { \ 9562 typedef SuiteName<gtest_TypeParam_> TestFixture; \ 9563 typedef gtest_TypeParam_ TypeParam; \ 9564 void TestBody() override; \ 9566 static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ 9567 GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \ 9568 __FILE__, __LINE__, GTEST_STRINGIFY_(SuiteName), \ 9569 GTEST_STRINGIFY_(TestName)); \ 9571 template <typename gtest_TypeParam_> \ 9572 void GTEST_SUITE_NAMESPACE_( \ 9573 SuiteName)::TestName<gtest_TypeParam_>::TestBody() 9576 #define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \ 9577 namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ 9578 typedef ::testing::internal::Templates<__VA_ARGS__> gtest_AllTests_; \ 9580 static const char* const GTEST_REGISTERED_TEST_NAMES_( \ 9581 SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \ 9582 GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \ 9583 GTEST_STRINGIFY_(SuiteName), __FILE__, __LINE__, #__VA_ARGS__) 9586 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9587 #define REGISTER_TYPED_TEST_CASE_P \ 9588 static_assert(::testing::internal::RegisterTypedTestCase_P_IsDeprecated(), \ 9590 REGISTER_TYPED_TEST_SUITE_P 9591 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9593 #define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \ 9594 static_assert(sizeof(GTEST_STRINGIFY_(Prefix)) > 1, \ 9595 "test-suit-prefix must not be empty"); \ 9596 static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \ 9597 ::testing::internal::TypeParameterizedTestSuite< \ 9598 SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \ 9599 ::testing::internal::GenerateTypeList<Types>::type>:: \ 9600 Register(GTEST_STRINGIFY_(Prefix), \ 9601 ::testing::internal::CodeLocation(__FILE__, __LINE__), \ 9602 >EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), \ 9603 GTEST_STRINGIFY_(SuiteName), \ 9604 GTEST_REGISTERED_TEST_NAMES_(SuiteName), \ 9605 ::testing::internal::GenerateNames< \ 9606 ::testing::internal::NameGeneratorSelector< \ 9607 __VA_ARGS__>::type, \ 9608 ::testing::internal::GenerateTypeList<Types>::type>()) 9611 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9612 #define INSTANTIATE_TYPED_TEST_CASE_P \ 9614 ::testing::internal::InstantiateTypedTestCase_P_IsDeprecated(), ""); \ 9615 INSTANTIATE_TYPED_TEST_SUITE_P 9616 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9618 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ 9620 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
9628 # pragma warning(push) 9629 # pragma warning(disable:4805) 9630 # pragma warning(disable:4100) 9637 GTEST_DECLARE_bool_(also_run_disabled_tests);
9640 GTEST_DECLARE_bool_(break_on_failure);
9644 GTEST_DECLARE_bool_(catch_exceptions);
9649 GTEST_DECLARE_string_(color);
9653 GTEST_DECLARE_bool_(fail_fast);
9657 GTEST_DECLARE_string_(filter);
9661 GTEST_DECLARE_bool_(install_failure_signal_handler);
9665 GTEST_DECLARE_bool_(list_tests);
9669 GTEST_DECLARE_string_(output);
9672 GTEST_DECLARE_bool_(brief);
9676 GTEST_DECLARE_bool_(print_time);
9679 GTEST_DECLARE_bool_(print_utf8);
9682 GTEST_DECLARE_int32_(random_seed);
9686 GTEST_DECLARE_int32_(repeat);
9690 GTEST_DECLARE_bool_(show_internal_stack_frames);
9693 GTEST_DECLARE_bool_(shuffle);
9697 GTEST_DECLARE_int32_(stack_trace_depth);
9702 GTEST_DECLARE_bool_(throw_on_failure);
9707 GTEST_DECLARE_string_(stream_result_to);
9709 #if GTEST_USE_OWN_FLAGFILE_FLAG_ 9710 GTEST_DECLARE_string_(flagfile);
9711 #endif // GTEST_USE_OWN_FLAGFILE_FLAG_ 9714 const int kMaxStackTraceDepth = 100;
9716 namespace internal {
9719 class DefaultGlobalTestPartResultReporter;
9720 class ExecDeathTest;
9721 class NoExecDeathTest;
9722 class FinalSuccessChecker;
9723 class GTestFlagSaver;
9724 class StreamingListenerTest;
9725 class TestResultAccessor;
9726 class TestEventListenersAccessor;
9727 class TestEventRepeater;
9728 class UnitTestRecordPropertyTestHelper;
9729 class WindowsDeathTest;
9730 class FuchsiaDeathTest;
9731 class UnitTestImpl* GetUnitTestImpl();
9732 void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
9733 const std::string& message);
9734 std::set<std::string>* GetIgnoredParameterizedTestSuites();
9745 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 9746 using TestCase = TestSuite;
9830 class GTEST_API_ AssertionResult {
9834 AssertionResult(
const AssertionResult& other);
9840 #if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920) 9841 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 )
9851 template <
typename T>
9852 explicit AssertionResult(
9854 typename std::enable_if<
9855 !std::is_convertible<T, AssertionResult>::value>::type*
9858 : success_(success) {}
9860 #if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920) 9861 GTEST_DISABLE_MSC_WARNINGS_POP_()
9865 AssertionResult& operator=(AssertionResult other) {
9871 operator bool()
const {
return success_; }
9874 AssertionResult operator!()
const;
9880 const char* message()
const {
9881 return message_.get() !=
nullptr ? message_->c_str() :
"";
9884 const char* failure_message()
const {
return message(); }
9887 template <
typename T> AssertionResult& operator<<(
const T& value) {
9888 AppendMessage(Message() << value);
9894 AssertionResult& operator<<(
9895 ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
9896 AppendMessage(Message() << basic_manipulator);
9902 void AppendMessage(
const Message& a_message) {
9903 if (message_.get() ==
nullptr) message_.reset(new ::std::string);
9904 message_->append(a_message.GetString().c_str());
9908 void swap(AssertionResult& other);
9916 std::unique_ptr< ::std::string> message_;
9920 GTEST_API_ AssertionResult AssertionSuccess();
9923 GTEST_API_ AssertionResult AssertionFailure();
9927 GTEST_API_ AssertionResult AssertionFailure(
const Message& msg);
9969 #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ 9970 #define GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ 10007 #define GTEST_ASSERT_(expression, on_failure) \ 10008 GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 10009 if (const ::testing::AssertionResult gtest_ar = (expression)) \ 10012 on_failure(gtest_ar.failure_message()) 10017 template <
typename Pred,
10019 AssertionResult AssertPred1Helper(
const char* pred_text,
10023 if (pred(v1))
return AssertionSuccess();
10025 return AssertionFailure()
10026 << pred_text <<
"(" << e1 <<
") evaluates to false, where" 10028 << e1 <<
" evaluates to " << ::testing::PrintToString(v1);
10033 #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ 10034 GTEST_ASSERT_(pred_format(#v1, v1), \ 10039 #define GTEST_PRED1_(pred, v1, on_failure)\ 10040 GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ 10046 #define EXPECT_PRED_FORMAT1(pred_format, v1) \ 10047 GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) 10048 #define EXPECT_PRED1(pred, v1) \ 10049 GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) 10050 #define ASSERT_PRED_FORMAT1(pred_format, v1) \ 10051 GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) 10052 #define ASSERT_PRED1(pred, v1) \ 10053 GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) 10059 template <
typename Pred,
10062 AssertionResult AssertPred2Helper(
const char* pred_text,
10068 if (pred(v1, v2))
return AssertionSuccess();
10070 return AssertionFailure()
10071 << pred_text <<
"(" << e1 <<
", " << e2
10072 <<
") evaluates to false, where" 10074 << e1 <<
" evaluates to " << ::testing::PrintToString(v1) <<
"\n" 10075 << e2 <<
" evaluates to " << ::testing::PrintToString(v2);
10080 #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ 10081 GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \ 10086 #define GTEST_PRED2_(pred, v1, v2, on_failure)\ 10087 GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ 10095 #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ 10096 GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) 10097 #define EXPECT_PRED2(pred, v1, v2) \ 10098 GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) 10099 #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ 10100 GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) 10101 #define ASSERT_PRED2(pred, v1, v2) \ 10102 GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) 10108 template <
typename Pred,
10112 AssertionResult AssertPred3Helper(
const char* pred_text,
10120 if (pred(v1, v2, v3))
return AssertionSuccess();
10122 return AssertionFailure()
10123 << pred_text <<
"(" << e1 <<
", " << e2 <<
", " << e3
10124 <<
") evaluates to false, where" 10126 << e1 <<
" evaluates to " << ::testing::PrintToString(v1) <<
"\n" 10127 << e2 <<
" evaluates to " << ::testing::PrintToString(v2) <<
"\n" 10128 << e3 <<
" evaluates to " << ::testing::PrintToString(v3);
10133 #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ 10134 GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \ 10139 #define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ 10140 GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ 10150 #define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ 10151 GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) 10152 #define EXPECT_PRED3(pred, v1, v2, v3) \ 10153 GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) 10154 #define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ 10155 GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) 10156 #define ASSERT_PRED3(pred, v1, v2, v3) \ 10157 GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) 10163 template <
typename Pred,
10168 AssertionResult AssertPred4Helper(
const char* pred_text,
10178 if (pred(v1, v2, v3, v4))
return AssertionSuccess();
10180 return AssertionFailure()
10181 << pred_text <<
"(" << e1 <<
", " << e2 <<
", " << e3 <<
", " << e4
10182 <<
") evaluates to false, where" 10184 << e1 <<
" evaluates to " << ::testing::PrintToString(v1) <<
"\n" 10185 << e2 <<
" evaluates to " << ::testing::PrintToString(v2) <<
"\n" 10186 << e3 <<
" evaluates to " << ::testing::PrintToString(v3) <<
"\n" 10187 << e4 <<
" evaluates to " << ::testing::PrintToString(v4);
10192 #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ 10193 GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \ 10198 #define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ 10199 GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ 10211 #define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ 10212 GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) 10213 #define EXPECT_PRED4(pred, v1, v2, v3, v4) \ 10214 GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) 10215 #define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ 10216 GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) 10217 #define ASSERT_PRED4(pred, v1, v2, v3, v4) \ 10218 GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) 10224 template <
typename Pred,
10230 AssertionResult AssertPred5Helper(
const char* pred_text,
10242 if (pred(v1, v2, v3, v4, v5))
return AssertionSuccess();
10244 return AssertionFailure()
10245 << pred_text <<
"(" << e1 <<
", " << e2 <<
", " << e3 <<
", " << e4
10246 <<
", " << e5 <<
") evaluates to false, where" 10248 << e1 <<
" evaluates to " << ::testing::PrintToString(v1) <<
"\n" 10249 << e2 <<
" evaluates to " << ::testing::PrintToString(v2) <<
"\n" 10250 << e3 <<
" evaluates to " << ::testing::PrintToString(v3) <<
"\n" 10251 << e4 <<
" evaluates to " << ::testing::PrintToString(v4) <<
"\n" 10252 << e5 <<
" evaluates to " << ::testing::PrintToString(v5);
10257 #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ 10258 GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \ 10263 #define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ 10264 GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ 10278 #define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ 10279 GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) 10280 #define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ 10281 GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) 10282 #define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ 10283 GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) 10284 #define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ 10285 GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) 10291 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ 10293 namespace testing {
10318 class GTEST_API_ Test {
10320 friend class TestInfo;
10331 static void SetUpTestSuite() {}
10339 static void TearDownTestSuite() {}
10343 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 10344 static void TearDownTestCase() {}
10345 static void SetUpTestCase() {}
10346 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 10349 static bool HasFatalFailure();
10352 static bool HasNonfatalFailure();
10355 static bool IsSkipped();
10359 static bool HasFailure() {
return HasFatalFailure() || HasNonfatalFailure(); }
10374 static void RecordProperty(
const std::string& key,
const std::string& value);
10375 static void RecordProperty(
const std::string& key,
int value);
10382 virtual void SetUp();
10385 virtual void TearDown();
10390 static bool HasSameFixtureClass();
10398 virtual void TestBody() = 0;
10405 void DeleteSelf_() {
delete this; }
10407 const std::unique_ptr<GTEST_FLAG_SAVER_> gtest_flag_saver_;
10425 struct Setup_should_be_spelled_SetUp {};
10426 virtual Setup_should_be_spelled_SetUp* Setup() {
return nullptr; }
10429 GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
10432 typedef internal::TimeInMillis TimeInMillis;
10438 class TestProperty {
10443 TestProperty(
const std::string& a_key,
const std::string& a_value) :
10444 key_(a_key), value_(a_value) {
10448 const char* key()
const {
10449 return key_.c_str();
10453 const char* value()
const {
10454 return value_.c_str();
10458 void SetValue(
const std::string& new_value) {
10459 value_ = new_value;
10466 std::string value_;
10475 class GTEST_API_ TestResult {
10485 int total_part_count()
const;
10488 int test_property_count()
const;
10491 bool Passed()
const {
return !Skipped() && !Failed(); }
10494 bool Skipped()
const;
10497 bool Failed()
const;
10500 bool HasFatalFailure()
const;
10503 bool HasNonfatalFailure()
const;
10506 TimeInMillis elapsed_time()
const {
return elapsed_time_; }
10510 TimeInMillis start_timestamp()
const {
return start_timestamp_; }
10514 const TestPartResult& GetTestPartResult(
int i)
const;
10519 const TestProperty& GetTestProperty(
int i)
const;
10522 friend class TestInfo;
10523 friend class TestSuite;
10524 friend class UnitTest;
10525 friend class internal::DefaultGlobalTestPartResultReporter;
10526 friend class internal::ExecDeathTest;
10527 friend class internal::TestResultAccessor;
10528 friend class internal::UnitTestImpl;
10529 friend class internal::WindowsDeathTest;
10530 friend class internal::FuchsiaDeathTest;
10533 const std::vector<TestPartResult>& test_part_results()
const {
10534 return test_part_results_;
10538 const std::vector<TestProperty>& test_properties()
const {
10539 return test_properties_;
10543 void set_start_timestamp(TimeInMillis start) { start_timestamp_ = start; }
10546 void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
10554 void RecordProperty(
const std::string& xml_element,
10555 const TestProperty& test_property);
10560 static bool ValidateTestProperty(
const std::string& xml_element,
10561 const TestProperty& test_property);
10564 void AddTestPartResult(
const TestPartResult& test_part_result);
10567 int death_test_count()
const {
return death_test_count_; }
10570 int increment_death_test_count() {
return ++death_test_count_; }
10573 void ClearTestPartResults();
10580 internal::Mutex test_properties_mutex_;
10583 std::vector<TestPartResult> test_part_results_;
10585 std::vector<TestProperty> test_properties_;
10587 int death_test_count_;
10589 TimeInMillis start_timestamp_;
10591 TimeInMillis elapsed_time_;
10594 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
10608 class GTEST_API_ TestInfo {
10615 const char* test_suite_name()
const {
return test_suite_name_.c_str(); }
10618 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 10619 const char* test_case_name()
const {
return test_suite_name(); }
10620 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 10623 const char* name()
const {
return name_.c_str(); }
10627 const char* type_param()
const {
10628 if (type_param_.get() !=
nullptr)
return type_param_->c_str();
10634 const char* value_param()
const {
10635 if (value_param_.get() !=
nullptr)
return value_param_->c_str();
10640 const char* file()
const {
return location_.file.c_str(); }
10643 int line()
const {
return location_.line; }
10646 bool is_in_another_shard()
const {
return is_in_another_shard_; }
10664 bool should_run()
const {
return should_run_; }
10667 bool is_reportable()
const {
10670 return matches_filter_ && !is_in_another_shard_;
10674 const TestResult* result()
const {
return &result_; }
10677 #if GTEST_HAS_DEATH_TEST 10678 friend class internal::DefaultDeathTestFactory;
10679 #endif // GTEST_HAS_DEATH_TEST 10681 friend class TestSuite;
10682 friend class internal::UnitTestImpl;
10683 friend class internal::StreamingListenerTest;
10684 friend TestInfo* internal::MakeAndRegisterTestInfo(
10685 const char* test_suite_name,
const char* name,
const char* type_param,
10686 const char* value_param, internal::CodeLocation code_location,
10687 internal::TypeId fixture_class_id, internal::SetUpTestSuiteFunc set_up_tc,
10688 internal::TearDownTestSuiteFunc tear_down_tc,
10689 internal::TestFactoryBase* factory);
10693 TestInfo(
const std::string& test_suite_name,
const std::string& name,
10694 const char* a_type_param,
10695 const char* a_value_param,
10696 internal::CodeLocation a_code_location,
10697 internal::TypeId fixture_class_id,
10698 internal::TestFactoryBase* factory);
10702 int increment_death_test_count() {
10703 return result_.increment_death_test_count();
10713 static void ClearTestResult(TestInfo* test_info) {
10714 test_info->result_.Clear();
10718 const std::string test_suite_name_;
10719 const std::string name_;
10722 const std::unique_ptr<const ::std::string> type_param_;
10725 const std::unique_ptr<const ::std::string> value_param_;
10726 internal::CodeLocation location_;
10727 const internal::TypeId fixture_class_id_;
10730 bool matches_filter_;
10732 bool is_in_another_shard_;
10733 internal::TestFactoryBase*
const factory_;
10738 TestResult result_;
10740 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
10746 class GTEST_API_ TestSuite {
10760 TestSuite(
const char* name,
const char* a_type_param,
10761 internal::SetUpTestSuiteFunc set_up_tc,
10762 internal::TearDownTestSuiteFunc tear_down_tc);
10765 virtual ~TestSuite();
10768 const char* name()
const {
return name_.c_str(); }
10772 const char* type_param()
const {
10773 if (type_param_.get() !=
nullptr)
return type_param_->c_str();
10778 bool should_run()
const {
return should_run_; }
10781 int successful_test_count()
const;
10784 int skipped_test_count()
const;
10787 int failed_test_count()
const;
10790 int reportable_disabled_test_count()
const;
10793 int disabled_test_count()
const;
10796 int reportable_test_count()
const;
10799 int test_to_run_count()
const;
10802 int total_test_count()
const;
10805 bool Passed()
const {
return !Failed(); }
10808 bool Failed()
const {
10809 return failed_test_count() > 0 || ad_hoc_test_result().Failed();
10813 TimeInMillis elapsed_time()
const {
return elapsed_time_; }
10817 TimeInMillis start_timestamp()
const {
return start_timestamp_; }
10821 const TestInfo* GetTestInfo(
int i)
const;
10825 const TestResult& ad_hoc_test_result()
const {
return ad_hoc_test_result_; }
10829 friend class internal::UnitTestImpl;
10832 std::vector<TestInfo*>& test_info_list() {
return test_info_list_; }
10835 const std::vector<TestInfo*>& test_info_list()
const {
10836 return test_info_list_;
10841 TestInfo* GetMutableTestInfo(
int i);
10844 void set_should_run(
bool should) { should_run_ = should; }
10848 void AddTestInfo(TestInfo * test_info);
10851 void ClearResult();
10854 static void ClearTestSuiteResult(TestSuite* test_suite) {
10855 test_suite->ClearResult();
10866 void RunSetUpTestSuite() {
10867 if (set_up_tc_ !=
nullptr) {
10874 void RunTearDownTestSuite() {
10875 if (tear_down_tc_ !=
nullptr) {
10876 (*tear_down_tc_)();
10881 static bool TestPassed(
const TestInfo* test_info) {
10882 return test_info->should_run() && test_info->result()->Passed();
10886 static bool TestSkipped(
const TestInfo* test_info) {
10887 return test_info->should_run() && test_info->result()->Skipped();
10891 static bool TestFailed(
const TestInfo* test_info) {
10892 return test_info->should_run() && test_info->result()->Failed();
10897 static bool TestReportableDisabled(
const TestInfo* test_info) {
10898 return test_info->is_reportable() && test_info->is_disabled_;
10902 static bool TestDisabled(
const TestInfo* test_info) {
10903 return test_info->is_disabled_;
10907 static bool TestReportable(
const TestInfo* test_info) {
10908 return test_info->is_reportable();
10912 static bool ShouldRunTest(
const TestInfo* test_info) {
10913 return test_info->should_run();
10917 void ShuffleTests(internal::Random* random);
10920 void UnshuffleTests();
10926 const std::unique_ptr<const ::std::string> type_param_;
10929 std::vector<TestInfo*> test_info_list_;
10933 std::vector<int> test_indices_;
10935 internal::SetUpTestSuiteFunc set_up_tc_;
10937 internal::TearDownTestSuiteFunc tear_down_tc_;
10941 TimeInMillis start_timestamp_;
10943 TimeInMillis elapsed_time_;
10946 TestResult ad_hoc_test_result_;
10949 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestSuite);
10966 class Environment {
10969 virtual ~Environment() {}
10972 virtual void SetUp() {}
10975 virtual void TearDown() {}
10979 struct Setup_should_be_spelled_SetUp {};
10980 virtual Setup_should_be_spelled_SetUp* Setup() {
return nullptr; }
10983 #if GTEST_HAS_EXCEPTIONS 10986 class GTEST_API_ AssertionException
10987 :
public internal::GoogleTestFailureException {
10989 explicit AssertionException(
const TestPartResult& result)
10990 : GoogleTestFailureException(result) {}
10993 #endif // GTEST_HAS_EXCEPTIONS 10997 class TestEventListener {
10999 virtual ~TestEventListener() {}
11002 virtual void OnTestProgramStart(
const UnitTest& unit_test) = 0;
11007 virtual void OnTestIterationStart(
const UnitTest& unit_test,
11008 int iteration) = 0;
11011 virtual void OnEnvironmentsSetUpStart(
const UnitTest& unit_test) = 0;
11014 virtual void OnEnvironmentsSetUpEnd(
const UnitTest& unit_test) = 0;
11017 virtual void OnTestSuiteStart(
const TestSuite& ) {}
11020 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11021 virtual void OnTestCaseStart(
const TestCase& ) {}
11022 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11025 virtual void OnTestStart(
const TestInfo& test_info) = 0;
11030 virtual void OnTestPartResult(
const TestPartResult& test_part_result) = 0;
11033 virtual void OnTestEnd(
const TestInfo& test_info) = 0;
11036 virtual void OnTestSuiteEnd(
const TestSuite& ) {}
11039 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11040 virtual void OnTestCaseEnd(
const TestCase& ) {}
11041 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11044 virtual void OnEnvironmentsTearDownStart(
const UnitTest& unit_test) = 0;
11047 virtual void OnEnvironmentsTearDownEnd(
const UnitTest& unit_test) = 0;
11050 virtual void OnTestIterationEnd(
const UnitTest& unit_test,
11051 int iteration) = 0;
11054 virtual void OnTestProgramEnd(
const UnitTest& unit_test) = 0;
11062 class EmptyTestEventListener :
public TestEventListener {
11064 void OnTestProgramStart(
const UnitTest& )
override {}
11065 void OnTestIterationStart(
const UnitTest& ,
11067 void OnEnvironmentsSetUpStart(
const UnitTest& )
override {}
11068 void OnEnvironmentsSetUpEnd(
const UnitTest& )
override {}
11069 void OnTestSuiteStart(
const TestSuite& )
override {}
11071 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11072 void OnTestCaseStart(
const TestCase& )
override {}
11073 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11075 void OnTestStart(
const TestInfo& )
override {}
11076 void OnTestPartResult(
const TestPartResult& )
override {}
11077 void OnTestEnd(
const TestInfo& )
override {}
11078 void OnTestSuiteEnd(
const TestSuite& )
override {}
11079 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11080 void OnTestCaseEnd(
const TestCase& )
override {}
11081 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11083 void OnEnvironmentsTearDownStart(
const UnitTest& )
override {}
11084 void OnEnvironmentsTearDownEnd(
const UnitTest& )
override {}
11085 void OnTestIterationEnd(
const UnitTest& ,
11087 void OnTestProgramEnd(
const UnitTest& )
override {}
11091 class GTEST_API_ TestEventListeners {
11093 TestEventListeners();
11094 ~TestEventListeners();
11099 void Append(TestEventListener* listener);
11104 TestEventListener* Release(TestEventListener* listener);
11111 TestEventListener* default_result_printer()
const {
11112 return default_result_printer_;
11122 TestEventListener* default_xml_generator()
const {
11123 return default_xml_generator_;
11127 friend class TestSuite;
11128 friend class TestInfo;
11129 friend class internal::DefaultGlobalTestPartResultReporter;
11130 friend class internal::NoExecDeathTest;
11131 friend class internal::TestEventListenersAccessor;
11132 friend class internal::UnitTestImpl;
11136 TestEventListener* repeater();
11143 void SetDefaultResultPrinter(TestEventListener* listener);
11150 void SetDefaultXmlGenerator(TestEventListener* listener);
11154 bool EventForwardingEnabled()
const;
11155 void SuppressEventForwarding();
11158 internal::TestEventRepeater* repeater_;
11160 TestEventListener* default_result_printer_;
11162 TestEventListener* default_xml_generator_;
11165 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
11178 class GTEST_API_ UnitTest {
11183 static UnitTest* GetInstance();
11191 int Run() GTEST_MUST_USE_RESULT_;
11195 const
char* original_working_dir() const;
11199 const TestSuite* current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_);
11202 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11203 const TestCase* current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_);
11208 const TestInfo* current_test_info() const
11209 GTEST_LOCK_EXCLUDED_(mutex_);
11212 int random_seed() const;
11218 internal::ParameterizedTestSuiteRegistry& parameterized_test_registry()
11219 GTEST_LOCK_EXCLUDED_(mutex_);
11222 int successful_test_suite_count() const;
11225 int failed_test_suite_count() const;
11228 int total_test_suite_count() const;
11232 int test_suite_to_run_count() const;
11235 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11236 int successful_test_case_count()
const;
11237 int failed_test_case_count()
const;
11238 int total_test_case_count()
const;
11239 int test_case_to_run_count()
const;
11240 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11243 int successful_test_count()
const;
11246 int skipped_test_count()
const;
11249 int failed_test_count()
const;
11252 int reportable_disabled_test_count()
const;
11255 int disabled_test_count()
const;
11258 int reportable_test_count()
const;
11261 int total_test_count()
const;
11264 int test_to_run_count()
const;
11268 TimeInMillis start_timestamp()
const;
11271 TimeInMillis elapsed_time()
const;
11275 bool Passed()
const;
11279 bool Failed()
const;
11283 const TestSuite* GetTestSuite(
int i)
const;
11286 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11287 const TestCase* GetTestCase(
int i)
const;
11288 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 11292 const TestResult& ad_hoc_test_result()
const;
11296 TestEventListeners& listeners();
11308 Environment* AddEnvironment(Environment* env);
11314 void AddTestPartResult(TestPartResult::Type result_type,
11315 const char* file_name,
11317 const std::string& message,
11318 const std::string& os_stack_trace)
11319 GTEST_LOCK_EXCLUDED_(mutex_);
11326 void RecordProperty(
const std::string& key,
const std::string& value);
11330 TestSuite* GetMutableTestSuite(
int i);
11333 internal::UnitTestImpl* impl() {
return impl_; }
11334 const internal::UnitTestImpl* impl()
const {
return impl_; }
11338 friend class ScopedTrace;
11340 friend class internal::AssertHelper;
11341 friend class internal::StreamingListenerTest;
11342 friend class internal::UnitTestRecordPropertyTestHelper;
11343 friend Environment* AddGlobalTestEnvironment(Environment* env);
11344 friend std::set<std::string>* internal::GetIgnoredParameterizedTestSuites();
11345 friend internal::UnitTestImpl* internal::GetUnitTestImpl();
11346 friend void internal::ReportFailureInUnknownLocation(
11347 TestPartResult::Type result_type,
11348 const std::string& message);
11354 virtual ~UnitTest();
11358 void PushGTestTrace(
const internal::TraceInfo& trace)
11359 GTEST_LOCK_EXCLUDED_(mutex_);
11362 void PopGTestTrace()
11363 GTEST_LOCK_EXCLUDED_(mutex_);
11367 mutable internal::Mutex mutex_;
11373 internal::UnitTestImpl* impl_;
11376 GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
11397 inline Environment* AddGlobalTestEnvironment(Environment* env) {
11398 return UnitTest::GetInstance()->AddEnvironment(env);
11410 GTEST_API_
void InitGoogleTest(
int* argc,
char** argv);
11414 GTEST_API_
void InitGoogleTest(
int* argc,
wchar_t** argv);
11418 GTEST_API_
void InitGoogleTest();
11420 namespace internal {
11425 template <
typename T1,
typename T2>
11426 AssertionResult CmpHelperEQFailure(
const char* lhs_expression,
11427 const char* rhs_expression,
11428 const T1& lhs,
const T2& rhs) {
11429 return EqFailure(lhs_expression,
11431 FormatForComparisonFailureMessage(lhs, rhs),
11432 FormatForComparisonFailureMessage(rhs, lhs),
11439 struct faketype {};
11440 inline bool operator==(faketype, faketype) {
return true; }
11441 inline bool operator!=(faketype, faketype) {
return false; }
11444 template <
typename T1,
typename T2>
11445 AssertionResult CmpHelperEQ(
const char* lhs_expression,
11446 const char* rhs_expression,
11450 return AssertionSuccess();
11453 return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
11460 typename T1,
typename T2,
11463 typename std::enable_if<!std::is_integral<T1>::value ||
11464 !std::is_pointer<T2>::value>::type* =
nullptr>
11465 static AssertionResult Compare(
const char* lhs_expression,
11466 const char* rhs_expression,
const T1& lhs,
11468 return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
11477 static AssertionResult Compare(
const char* lhs_expression,
11478 const char* rhs_expression,
11481 return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
11484 template <
typename T>
11485 static AssertionResult Compare(
11486 const char* lhs_expression,
const char* rhs_expression,
11488 std::nullptr_t , T* rhs) {
11490 return CmpHelperEQ(lhs_expression, rhs_expression, static_cast<T*>(
nullptr),
11498 template <
typename T1,
typename T2>
11499 AssertionResult CmpHelperOpFailure(
const char* expr1,
const char* expr2,
11500 const T1& val1,
const T2& val2,
11502 return AssertionFailure()
11503 <<
"Expected: (" << expr1 <<
") " << op <<
" (" << expr2
11504 <<
"), actual: " << FormatForComparisonFailureMessage(val1, val2)
11505 <<
" vs " << FormatForComparisonFailureMessage(val2, val1);
11514 #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ 11515 template <typename T1, typename T2>\ 11516 AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ 11517 const T1& val1, const T2& val2) {\ 11518 if (val1 op val2) {\ 11519 return AssertionSuccess();\ 11521 return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\ 11528 GTEST_IMPL_CMP_HELPER_(NE, !=)
11530 GTEST_IMPL_CMP_HELPER_(LE, <=)
11532 GTEST_IMPL_CMP_HELPER_(LT, <)
11534 GTEST_IMPL_CMP_HELPER_(GE, >=)
11536 GTEST_IMPL_CMP_HELPER_(GT, >)
11538 #undef GTEST_IMPL_CMP_HELPER_ 11543 GTEST_API_ AssertionResult CmpHelperSTREQ(
const char* s1_expression,
11544 const char* s2_expression,
11551 GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(
const char* s1_expression,
11552 const char* s2_expression,
11559 GTEST_API_ AssertionResult CmpHelperSTRNE(
const char* s1_expression,
11560 const char* s2_expression,
11567 GTEST_API_ AssertionResult CmpHelperSTRCASENE(
const char* s1_expression,
11568 const char* s2_expression,
11576 GTEST_API_ AssertionResult CmpHelperSTREQ(
const char* s1_expression,
11577 const char* s2_expression,
11579 const wchar_t* s2);
11584 GTEST_API_ AssertionResult CmpHelperSTRNE(
const char* s1_expression,
11585 const char* s2_expression,
11587 const wchar_t* s2);
11599 GTEST_API_ AssertionResult IsSubstring(
11600 const char* needle_expr,
const char* haystack_expr,
11601 const char* needle,
const char* haystack);
11602 GTEST_API_ AssertionResult IsSubstring(
11603 const char* needle_expr,
const char* haystack_expr,
11604 const wchar_t* needle,
const wchar_t* haystack);
11605 GTEST_API_ AssertionResult IsNotSubstring(
11606 const char* needle_expr,
const char* haystack_expr,
11607 const char* needle,
const char* haystack);
11608 GTEST_API_ AssertionResult IsNotSubstring(
11609 const char* needle_expr,
const char* haystack_expr,
11610 const wchar_t* needle,
const wchar_t* haystack);
11611 GTEST_API_ AssertionResult IsSubstring(
11612 const char* needle_expr,
const char* haystack_expr,
11613 const ::std::string& needle, const ::std::string& haystack);
11614 GTEST_API_ AssertionResult IsNotSubstring(
11615 const char* needle_expr,
const char* haystack_expr,
11616 const ::std::string& needle, const ::std::string& haystack);
11618 #if GTEST_HAS_STD_WSTRING 11619 GTEST_API_ AssertionResult IsSubstring(
11620 const char* needle_expr,
const char* haystack_expr,
11621 const ::std::wstring& needle, const ::std::wstring& haystack);
11622 GTEST_API_ AssertionResult IsNotSubstring(
11623 const char* needle_expr,
const char* haystack_expr,
11624 const ::std::wstring& needle, const ::std::wstring& haystack);
11625 #endif // GTEST_HAS_STD_WSTRING 11627 namespace internal {
11636 template <
typename RawType>
11637 AssertionResult CmpHelperFloatingPointEQ(
const char* lhs_expression,
11638 const char* rhs_expression,
11640 RawType rhs_value) {
11641 const FloatingPoint<RawType> lhs(lhs_value), rhs(rhs_value);
11643 if (lhs.AlmostEquals(rhs)) {
11644 return AssertionSuccess();
11647 ::std::stringstream lhs_ss;
11648 lhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
11651 ::std::stringstream rhs_ss;
11652 rhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
11655 return EqFailure(lhs_expression,
11657 StringStreamToString(&lhs_ss),
11658 StringStreamToString(&rhs_ss),
11665 GTEST_API_ AssertionResult DoubleNearPredFormat(
const char* expr1,
11667 const char* abs_error_expr,
11674 class GTEST_API_ AssertHelper {
11677 AssertHelper(TestPartResult::Type type,
11680 const char* message);
11685 void operator=(
const Message& message)
const;
11692 struct AssertHelperData {
11693 AssertHelperData(TestPartResult::Type t,
11694 const char* srcfile,
11697 : type(t), file(srcfile), line(line_num), message(msg) { }
11699 TestPartResult::Type
const type;
11700 const char*
const file;
11702 std::string
const message;
11705 GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
11708 AssertHelperData*
const data_;
11710 GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
11749 template <
typename T>
11750 class WithParamInterface {
11752 typedef T ParamType;
11753 virtual ~WithParamInterface() {}
11757 static const ParamType& GetParam() {
11758 GTEST_CHECK_(parameter_ !=
nullptr)
11759 <<
"GetParam() can only be called inside a value-parameterized test " 11760 <<
"-- did you intend to write TEST_P instead of TEST_F?";
11761 return *parameter_;
11767 static void SetParam(
const ParamType* parameter) {
11768 parameter_ = parameter;
11772 static const ParamType* parameter_;
11775 template <
class TestClass>
friend class internal::ParameterizedTestFactory;
11778 template <
typename T>
11779 const T* WithParamInterface<T>::parameter_ =
nullptr;
11784 template <
typename T>
11785 class TestWithParam :
public Test,
public WithParamInterface<T> {
11793 #define GTEST_SKIP() GTEST_SKIP_("") 11813 #define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed") 11817 #define ADD_FAILURE_AT(file, line) \ 11818 GTEST_MESSAGE_AT_(file, line, "Failed", \ 11819 ::testing::TestPartResult::kNonFatalFailure) 11822 #define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed") 11825 #define GTEST_FAIL_AT(file, line) \ 11826 GTEST_MESSAGE_AT_(file, line, "Failed", \ 11827 ::testing::TestPartResult::kFatalFailure) 11831 #if !GTEST_DONT_DEFINE_FAIL 11832 # define FAIL() GTEST_FAIL() 11836 #define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded") 11840 #if !GTEST_DONT_DEFINE_SUCCEED 11841 # define SUCCEED() GTEST_SUCCEED() 11853 #define EXPECT_THROW(statement, expected_exception) \ 11854 GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_) 11855 #define EXPECT_NO_THROW(statement) \ 11856 GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_) 11857 #define EXPECT_ANY_THROW(statement) \ 11858 GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_) 11859 #define ASSERT_THROW(statement, expected_exception) \ 11860 GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_) 11861 #define ASSERT_NO_THROW(statement) \ 11862 GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_) 11863 #define ASSERT_ANY_THROW(statement) \ 11864 GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_) 11869 #define GTEST_EXPECT_TRUE(condition) \ 11870 GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ 11871 GTEST_NONFATAL_FAILURE_) 11872 #define GTEST_EXPECT_FALSE(condition) \ 11873 GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ 11874 GTEST_NONFATAL_FAILURE_) 11875 #define GTEST_ASSERT_TRUE(condition) \ 11876 GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ 11877 GTEST_FATAL_FAILURE_) 11878 #define GTEST_ASSERT_FALSE(condition) \ 11879 GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ 11880 GTEST_FATAL_FAILURE_) 11885 #if !GTEST_DONT_DEFINE_EXPECT_TRUE 11886 #define EXPECT_TRUE(condition) GTEST_EXPECT_TRUE(condition) 11889 #if !GTEST_DONT_DEFINE_EXPECT_FALSE 11890 #define EXPECT_FALSE(condition) GTEST_EXPECT_FALSE(condition) 11893 #if !GTEST_DONT_DEFINE_ASSERT_TRUE 11894 #define ASSERT_TRUE(condition) GTEST_ASSERT_TRUE(condition) 11897 #if !GTEST_DONT_DEFINE_ASSERT_FALSE 11898 #define ASSERT_FALSE(condition) GTEST_ASSERT_FALSE(condition) 11947 #define EXPECT_EQ(val1, val2) \ 11948 EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2) 11949 #define EXPECT_NE(val1, val2) \ 11950 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) 11951 #define EXPECT_LE(val1, val2) \ 11952 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) 11953 #define EXPECT_LT(val1, val2) \ 11954 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) 11955 #define EXPECT_GE(val1, val2) \ 11956 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) 11957 #define EXPECT_GT(val1, val2) \ 11958 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) 11960 #define GTEST_ASSERT_EQ(val1, val2) \ 11961 ASSERT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2) 11962 #define GTEST_ASSERT_NE(val1, val2) \ 11963 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) 11964 #define GTEST_ASSERT_LE(val1, val2) \ 11965 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) 11966 #define GTEST_ASSERT_LT(val1, val2) \ 11967 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) 11968 #define GTEST_ASSERT_GE(val1, val2) \ 11969 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) 11970 #define GTEST_ASSERT_GT(val1, val2) \ 11971 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) 11976 #if !GTEST_DONT_DEFINE_ASSERT_EQ 11977 # define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2) 11980 #if !GTEST_DONT_DEFINE_ASSERT_NE 11981 # define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2) 11984 #if !GTEST_DONT_DEFINE_ASSERT_LE 11985 # define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2) 11988 #if !GTEST_DONT_DEFINE_ASSERT_LT 11989 # define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2) 11992 #if !GTEST_DONT_DEFINE_ASSERT_GE 11993 # define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2) 11996 #if !GTEST_DONT_DEFINE_ASSERT_GT 11997 # define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2) 12016 #define EXPECT_STREQ(s1, s2) \ 12017 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2) 12018 #define EXPECT_STRNE(s1, s2) \ 12019 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) 12020 #define EXPECT_STRCASEEQ(s1, s2) \ 12021 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2) 12022 #define EXPECT_STRCASENE(s1, s2)\ 12023 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) 12025 #define ASSERT_STREQ(s1, s2) \ 12026 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2) 12027 #define ASSERT_STRNE(s1, s2) \ 12028 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) 12029 #define ASSERT_STRCASEEQ(s1, s2) \ 12030 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2) 12031 #define ASSERT_STRCASENE(s1, s2)\ 12032 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) 12048 #define EXPECT_FLOAT_EQ(val1, val2)\ 12049 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \ 12052 #define EXPECT_DOUBLE_EQ(val1, val2)\ 12053 EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \ 12056 #define ASSERT_FLOAT_EQ(val1, val2)\ 12057 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \ 12060 #define ASSERT_DOUBLE_EQ(val1, val2)\ 12061 ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \ 12064 #define EXPECT_NEAR(val1, val2, abs_error)\ 12065 EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ 12066 val1, val2, abs_error) 12068 #define ASSERT_NEAR(val1, val2, abs_error)\ 12069 ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ 12070 val1, val2, abs_error) 12079 GTEST_API_ AssertionResult FloatLE(
const char* expr1,
const char* expr2,
12080 float val1,
float val2);
12081 GTEST_API_ AssertionResult DoubleLE(
const char* expr1,
const char* expr2,
12082 double val1,
double val2);
12085 #if GTEST_OS_WINDOWS 12096 # define EXPECT_HRESULT_SUCCEEDED(expr) \ 12097 EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) 12099 # define ASSERT_HRESULT_SUCCEEDED(expr) \ 12100 ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) 12102 # define EXPECT_HRESULT_FAILED(expr) \ 12103 EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) 12105 # define ASSERT_HRESULT_FAILED(expr) \ 12106 ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) 12108 #endif // GTEST_OS_WINDOWS 12120 #define ASSERT_NO_FATAL_FAILURE(statement) \ 12121 GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_) 12122 #define EXPECT_NO_FATAL_FAILURE(statement) \ 12123 GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_) 12135 class GTEST_API_ ScopedTrace {
12142 template <
typename T>
12143 ScopedTrace(
const char* file,
int line,
const T& message) {
12144 PushTrace(file, line, (Message() << message).GetString());
12148 ScopedTrace(
const char* file,
int line,
const char* message) {
12149 PushTrace(file, line, message ? message :
"(null)");
12152 ScopedTrace(
const char* file,
int line,
const std::string& message) {
12153 PushTrace(file, line, message);
12163 void PushTrace(
const char* file,
int line, std::string message);
12165 GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
12166 } GTEST_ATTRIBUTE_UNUSED_;
12185 #define SCOPED_TRACE(message) \ 12186 ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\ 12187 __FILE__, __LINE__, (message)) 12219 template <
typename T1,
typename T2>
12220 constexpr
bool StaticAssertTypeEq() noexcept {
12221 static_assert(std::is_same<T1, T2>::value,
"T1 and T2 are not the same type");
12250 #define GTEST_TEST(test_suite_name, test_name) \ 12251 GTEST_TEST_(test_suite_name, test_name, ::testing::Test, \ 12252 ::testing::internal::GetTestTypeId()) 12256 #if !GTEST_DONT_DEFINE_TEST 12257 #define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name) 12287 #if !GTEST_DONT_DEFINE_TEST 12288 #define TEST_F(test_fixture, test_name)\ 12289 GTEST_TEST_(test_fixture, test_name, test_fixture, \ 12290 ::testing::internal::GetTypeId<test_fixture>()) 12291 #endif // !GTEST_DONT_DEFINE_TEST 12295 GTEST_API_ std::string TempDir();
12298 # pragma warning(pop) 12358 template <
int&... ExplicitParameterBarrier,
typename Factory>
12359 TestInfo* RegisterTest(
const char* test_suite_name,
const char* test_name,
12360 const char* type_param,
const char* value_param,
12361 const char* file,
int line, Factory factory) {
12362 using TestT =
typename std::remove_pointer<decltype(factory())>::type;
12364 class FactoryImpl :
public internal::TestFactoryBase {
12366 explicit FactoryImpl(Factory f) : factory_(
std::move(f)) {}
12367 Test* CreateTest()
override {
return factory_(); }
12373 return internal::MakeAndRegisterTestInfo(
12374 test_suite_name, test_name, type_param, value_param,
12375 internal::CodeLocation(file, line), internal::GetTypeId<TestT>(),
12376 internal::SuiteApiResolver<TestT>::GetSetUpCaseOrSuite(file, line),
12377 internal::SuiteApiResolver<TestT>::GetTearDownCaseOrSuite(file, line),
12378 new FactoryImpl{std::move(factory)});
12391 int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
12393 inline
int RUN_ALL_TESTS() {
12394 return ::testing::UnitTest::GetInstance()->Run();
12397 GTEST_DISABLE_MSC_WARNINGS_POP_()
12399 #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_H_ bool test
enable/disable tests
Definition: distributed_functions.cxx:47
Definition: posix-mock.h:29
void info(const STRING &string, const int verbosity_level=1)
Use this function for writing informational messages.
Definition: info.h:51
const Array< num_dimensions - num_dimensions2, elemT > & get(const Array< num_dimensions, elemT > &a, const BasicCoordinate< num_dimensions2, int > &c)
an alternative for array indexing using BasicCoordinate objects
Definition: array_index_functions.inl:114