diff --git a/test/filesystem_test.cpp b/test/filesystem_test.cpp index 06289b3..5892d83 100644 --- a/test/filesystem_test.cpp +++ b/test/filesystem_test.cpp @@ -95,8 +95,21 @@ template std::time_t to_time_t(TP tp) { // Based on trick from: Nico Josuttis, C++17 - The Complete Guide - std::chrono::system_clock::duration dt = std::chrono::duration_cast(tp - TP::clock::now()); - return std::chrono::system_clock::to_time_t(std::chrono::system_clock::now() + dt); + using namespace std::chrono; + auto sctp = time_point_cast(tp - TP::clock::now() + system_clock::now()); + //system_clock::duration dt = duration_cast(tp - TP::clock::now()); + return system_clock::to_time_t(sctp); +} + +template +TP from_time_t(std::time_t t) +{ + // Based on trick from: Nico Josuttis, C++17 - The Complete Guide + using namespace std::chrono; + auto sctp = system_clock::from_time_t(t); + auto tp = time_point_cast(sctp - system_clock::now() + TP::clock::now()); + // system_clock::duration dt = duration_cast(tp - TP::clock::now()); + return tp; } namespace Catch { @@ -118,9 +131,15 @@ struct StringMaker static std::string convert(fs::file_time_type const& value) { std::time_t t = to_time_t(value); - std::tm ttm = *std::localtime(&t); + std::tm* ptm = std::localtime(&t); std::ostringstream os; - os << std::put_time(&ttm, "%Y-%m-%d %H:%M:%S"); + if (ptm) { + std::tm ttm = *ptm; + os << std::put_time(&ttm, "%Y-%m-%d %H:%M:%S"); + } + else { + os << "(invalid-time)"; + } return os.str(); } }; @@ -1981,7 +2000,7 @@ static fs::file_time_type timeFromString(const std::string& str) throw std::exception(); } #ifdef IS_WCHAR_PATH - return fs::file_time_type::min(); + return from_time_t(std::mktime(&tm)); #else return fs::file_time_type::clock::from_time_t(std::mktime(&tm)); #endif @@ -2314,7 +2333,7 @@ TEST_CASE("Windows: Long filename support", "[filesystem][path][fs.path.win.long { TemporaryDirectory t(TempOpt::change_path); char c = 'A'; - fs::path dir = fs::current_path(); + fs::path dir = "\\\\?\\" + fs::current_path().u8string(); for (; c <= 'Z'; ++c) { std::string part = std::string(16, c); dir /= part;