Fixes the test gmock_output_test.py with MSVC

For MSVC, gmock_output_test.py output struct std::pair<int,bool>, for GCC, it's output
std::pair<int, bool>, it's not the same, my intention is getting these to be same by removing
struct  for MSVC's outptu, and strip redundant space for GCC.

As a by-product,
```
#ifdef _MSC_VER
#define ERROR_DESC "class std::runtime_error"
#else
#define ERROR_DESC "std::runtime_error"
#endif
```
can be simplified to

```
#define ERROR_DESC "std::runtime_error"
```

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
This commit is contained in:
Yonggang Luo 2022-11-24 23:54:19 +08:00
parent 097f64e986
commit 6f1c4b3d7b
3 changed files with 31 additions and 5 deletions

View File

@ -292,7 +292,7 @@ Stack trace:
FILE:#: Failure FILE:#: Failure
Value of: (std::pair<int, bool>(42, true)) Value of: (std::pair<int, bool>(42, true))
Expected: is pair (first: is >= 48, second: true) Expected: is pair (first: is >= 48, second: true)
Actual: (42, true) (of type std::pair<int, bool>) Actual: (42, true) (of type std::pair<int,bool>)
[ FAILED ] GMockOutputTest.PrintsMatcher [ FAILED ] GMockOutputTest.PrintsMatcher
[ FAILED ] GMockOutputTest.UnexpectedCall [ FAILED ] GMockOutputTest.UnexpectedCall
[ FAILED ] GMockOutputTest.UnexpectedCallToVoidFunction [ FAILED ] GMockOutputTest.UnexpectedCallToVoidFunction

View File

@ -67,6 +67,22 @@ inline std::string CanonicalizeForStdLibVersioning(std::string s) {
s.erase(strlen("std"), end - strlen("std")); s.erase(strlen("std"), end - strlen("std"));
} }
} }
/* Strip redundant spaces in typename to match MSVC */
/* For example, std::pair<int, bool> -> std::pair<int,bool> */
static const char to_search[] = ", ";
static const char replace_str[] = ",";
size_t pos = 0;
while (true) {
// Get the next occurrence from the current position
pos = s.find(to_search, pos);
if (pos == std::string::npos) {
break;
}
// Replace this occurrence of substring
s.replace(pos, strlen(to_search), replace_str);
pos += strlen(replace_str);
}
return s; return s;
} }
@ -85,6 +101,20 @@ inline std::string GetTypeName(const std::type_info& type) {
const std::string name_str(status == 0 ? readable_name : name); const std::string name_str(status == 0 ? readable_name : name);
free(readable_name); free(readable_name);
return CanonicalizeForStdLibVersioning(name_str); return CanonicalizeForStdLibVersioning(name_str);
#elif defined(_MSC_VER)
// Strip struct and class due to differences between
// MSVC and other compilers. std::pair<int,bool> is printed as
// "struct std::pair<int,bool>" when using MSVC vs "std::pair<int, bool>" with
// other compilers.
std::string s = name;
// Only strip the leading "struct " and "class ", so uses rfind == 0 to
// ensure that
if (s.rfind("struct ", 0) == 0) {
s = s.substr(strlen("struct "));
} else if (s.rfind("class ", 0) == 0) {
s = s.substr(strlen("class "));
}
return s;
#else #else
return name; return name;
#endif // GTEST_HAS_CXXABI_H_ || __HP_aCC #endif // GTEST_HAS_CXXABI_H_ || __HP_aCC

View File

@ -3314,11 +3314,7 @@ TEST_F(SingleEvaluationTest, OtherCases) {
#if GTEST_HAS_RTTI #if GTEST_HAS_RTTI
#ifdef _MSC_VER
#define ERROR_DESC "class std::runtime_error"
#else
#define ERROR_DESC "std::runtime_error" #define ERROR_DESC "std::runtime_error"
#endif
#else // GTEST_HAS_RTTI #else // GTEST_HAS_RTTI