Skip to content

Commit

Permalink
Fix testsuite on MinGW + MSVCRT
Browse files Browse the repository at this point in the history
Fixes #2952. The testsuite indirectly called strftime() with conversion
specifiers defined only in C99. In MSVCRT this function conforms only to
C89. Only in the updated UCRT this functon provides the functionality of
C99.
  • Loading branch information
dimztimz committed Aug 8, 2022
1 parent 682e097 commit 54715ce
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
11 changes: 10 additions & 1 deletion test/chrono-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@ TEST(chrono_test, format_tm) {
make_tm(2000, 1, 2, 12, 14, 16), // W52
make_tm(2000, 1, 3, 12, 14, 16) // W1
};

#if defined(__MINGW32__) && !defined(_UCRT)
GTEST_SKIP();
#endif

const std::string iso_week_spec = "%Y-%m-%d: %G %g %V";
for (auto ctm : tm_list) {
// Calculate tm_yday, tm_wday, etc.
Expand Down Expand Up @@ -261,12 +266,16 @@ TEST(chrono_test, time_point) {
"%Oe", "%a", "%A", "%w", "%Ow", "%u", "%Ou", "%H", "%OH",
"%I", "%OI", "%M", "%OM", "%S", "%OS", "%x", "%Ex", "%X",
"%EX", "%D", "%F", "%R", "%T", "%p", "%z", "%Z"};
spec_list.push_back("%Y-%m-%d %H:%M:%S");
#ifndef _WIN32
// Disabled on Windows because these formats are not consistent among
// platforms.
spec_list.insert(spec_list.end(), {"%c", "%Ec", "%r"});
#elif defined(__MINGW32__) && !defined(_UCRT)
// Only C89 conversion specifiers when using MSVCRT instead of UCRT
spec_list = {"%%", "%Y", "%y", "%b", "%B", "%m", "%U", "%W", "%j", "%d", "%a",
"%A", "%w", "%H", "%I", "%M", "%S", "%x", "%X", "%p", "%Z"};
#endif
spec_list.push_back("%Y-%m-%d %H:%M:%S");

for (const auto& spec : spec_list) {
auto t = std::chrono::system_clock::to_time_t(t1);
Expand Down
9 changes: 7 additions & 2 deletions test/xchar-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ std::wstring system_wcsftime(const std::wstring& format, const std::tm* timeptr,
#endif
}

TEST(chrono_test, time_point) {
TEST(chrono_test_wchar, time_point) {
auto t1 = std::chrono::system_clock::now();

std::vector<std::wstring> spec_list = {
Expand All @@ -292,12 +292,17 @@ TEST(chrono_test, time_point) {
L"%Oe", L"%a", L"%A", L"%w", L"%Ow", L"%u", L"%Ou", L"%H", L"%OH",
L"%I", L"%OI", L"%M", L"%OM", L"%S", L"%OS", L"%x", L"%Ex", L"%X",
L"%EX", L"%D", L"%F", L"%R", L"%T", L"%p", L"%z", L"%Z"};
spec_list.push_back(L"%Y-%m-%d %H:%M:%S");
#ifndef _WIN32
// Disabled on Windows, because these formats is not consistent among
// platforms.
spec_list.insert(spec_list.end(), {L"%c", L"%Ec", L"%r"});
#elif defined(__MINGW32__) && !defined(_UCRT)
// Only C89 conversion specifiers when using MSVCRT instead of UCRT
spec_list = {L"%%", L"%Y", L"%y", L"%b", L"%B", L"%m", L"%U",
L"%W", L"%j", L"%d", L"%a", L"%A", L"%w", L"%H",
L"%I", L"%M", L"%S", L"%x", L"%X", L"%p", L"%Z"};
#endif
spec_list.push_back(L"%Y-%m-%d %H:%M:%S");

for (const auto& spec : spec_list) {
auto t = std::chrono::system_clock::to_time_t(t1);
Expand Down

0 comments on commit 54715ce

Please sign in to comment.