mirror of
https://github.com/catchorg/Catch2.git
synced 2025-10-07 12:31:07 +02:00
Compare commits
3 Commits
devel-more
...
devel
Author | SHA1 | Date | |
---|---|---|---|
|
33e6fd217a | ||
|
a58df2d7c5 | ||
|
a9223b2bb3 |
@@ -57,6 +57,36 @@ namespace Detail {
|
|||||||
}
|
}
|
||||||
} // end unnamed namespace
|
} // end unnamed namespace
|
||||||
|
|
||||||
|
std::size_t catch_strnlen( const char* str, std::size_t n ) {
|
||||||
|
auto ret = std::char_traits<char>::find( str, n, '\0' );
|
||||||
|
if ( ret != nullptr ) { return static_cast<std::size_t>( ret - str ); }
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string formatTimeT(std::time_t time) {
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
std::tm timeInfo = {};
|
||||||
|
const auto err = gmtime_s( &timeInfo, &time );
|
||||||
|
if ( err ) {
|
||||||
|
return "gmtime from provided timepoint has failed. This "
|
||||||
|
"happens e.g. with pre-1970 dates using Microsoft libc";
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
std::tm* timeInfo = std::gmtime( &time );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
auto const timeStampSize = sizeof( "2017-01-16T17:06:45Z" );
|
||||||
|
char timeStamp[timeStampSize];
|
||||||
|
const char* const fmt = "%Y-%m-%dT%H:%M:%SZ";
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
std::strftime( timeStamp, timeStampSize, fmt, &timeInfo );
|
||||||
|
#else
|
||||||
|
std::strftime( timeStamp, timeStampSize, fmt, timeInfo );
|
||||||
|
#endif
|
||||||
|
return std::string( timeStamp, timeStampSize - 1 );
|
||||||
|
}
|
||||||
|
|
||||||
std::string convertIntoString(StringRef string, bool escapeInvisibles) {
|
std::string convertIntoString(StringRef string, bool escapeInvisibles) {
|
||||||
std::string ret;
|
std::string ret;
|
||||||
// This is enough for the "don't escape invisibles" case, and a good
|
// This is enough for the "don't escape invisibles" case, and a good
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
#ifndef CATCH_TOSTRING_HPP_INCLUDED
|
#ifndef CATCH_TOSTRING_HPP_INCLUDED
|
||||||
#define CATCH_TOSTRING_HPP_INCLUDED
|
#define CATCH_TOSTRING_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <ctime>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
@@ -40,13 +40,9 @@ namespace Catch {
|
|||||||
|
|
||||||
namespace Detail {
|
namespace Detail {
|
||||||
|
|
||||||
inline std::size_t catch_strnlen(const char *str, std::size_t n) {
|
std::size_t catch_strnlen(const char *str, std::size_t n);
|
||||||
auto ret = std::char_traits<char>::find(str, n, '\0');
|
|
||||||
if (ret != nullptr) {
|
std::string formatTimeT( std::time_t time );
|
||||||
return static_cast<std::size_t>(ret - str);
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr StringRef unprintableString = "{?}"_sr;
|
constexpr StringRef unprintableString = "{?}"_sr;
|
||||||
|
|
||||||
@@ -411,44 +407,38 @@ namespace Catch {
|
|||||||
|
|
||||||
// Separate std::tuple specialization
|
// Separate std::tuple specialization
|
||||||
#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER)
|
#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER)
|
||||||
#include <tuple>
|
# include <tuple>
|
||||||
|
# include <utility>
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
namespace Detail {
|
namespace Detail {
|
||||||
template<
|
template <typename Tuple, std::size_t... Is>
|
||||||
typename Tuple,
|
void PrintTuple( const Tuple& tuple,
|
||||||
std::size_t N = 0,
|
std::ostream& os,
|
||||||
bool = (N < std::tuple_size<Tuple>::value)
|
std::index_sequence<Is...> ) {
|
||||||
>
|
// 1 + Account for when the tuple is empty
|
||||||
struct TupleElementPrinter {
|
char a[1 + sizeof...( Is )] = {
|
||||||
static void print(const Tuple& tuple, std::ostream& os) {
|
( ( os << ( Is ? ", " : " " )
|
||||||
os << (N ? ", " : " ")
|
<< ::Catch::Detail::stringify( std::get<Is>( tuple ) ) ),
|
||||||
<< ::Catch::Detail::stringify(std::get<N>(tuple));
|
'\0' )... };
|
||||||
TupleElementPrinter<Tuple, N + 1>::print(tuple, os);
|
(void)a;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
template<
|
} // namespace Detail
|
||||||
typename Tuple,
|
|
||||||
std::size_t N
|
|
||||||
>
|
|
||||||
struct TupleElementPrinter<Tuple, N, false> {
|
|
||||||
static void print(const Tuple&, std::ostream&) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
template <typename... Types>
|
||||||
|
|
||||||
|
|
||||||
template<typename ...Types>
|
|
||||||
struct StringMaker<std::tuple<Types...>> {
|
struct StringMaker<std::tuple<Types...>> {
|
||||||
static std::string convert(const std::tuple<Types...>& tuple) {
|
static std::string convert( const std::tuple<Types...>& tuple ) {
|
||||||
ReusableStringStream rss;
|
ReusableStringStream rss;
|
||||||
rss << '{';
|
rss << '{';
|
||||||
Detail::TupleElementPrinter<std::tuple<Types...>>::print(tuple, rss.get());
|
Detail::PrintTuple(
|
||||||
|
tuple,
|
||||||
|
rss.get(),
|
||||||
|
std::make_index_sequence<sizeof...( Types )>{} );
|
||||||
rss << " }";
|
rss << " }";
|
||||||
return rss.str();
|
return rss.str();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
} // namespace Catch
|
||||||
#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER
|
#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER
|
||||||
|
|
||||||
#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT)
|
#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT)
|
||||||
@@ -635,28 +625,7 @@ struct ratio_string<std::milli> {
|
|||||||
const auto systemish = std::chrono::time_point_cast<
|
const auto systemish = std::chrono::time_point_cast<
|
||||||
std::chrono::system_clock::duration>( time_point );
|
std::chrono::system_clock::duration>( time_point );
|
||||||
const auto as_time_t = std::chrono::system_clock::to_time_t( systemish );
|
const auto as_time_t = std::chrono::system_clock::to_time_t( systemish );
|
||||||
|
return ::Catch::Detail::formatTimeT( as_time_t );
|
||||||
#ifdef _MSC_VER
|
|
||||||
std::tm timeInfo = {};
|
|
||||||
const auto err = gmtime_s( &timeInfo, &as_time_t );
|
|
||||||
if ( err ) {
|
|
||||||
return "gmtime from provided timepoint has failed. This "
|
|
||||||
"happens e.g. with pre-1970 dates using Microsoft libc";
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
std::tm* timeInfo = std::gmtime( &as_time_t );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");
|
|
||||||
char timeStamp[timeStampSize];
|
|
||||||
const char * const fmt = "%Y-%m-%dT%H:%M:%SZ";
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
|
|
||||||
#else
|
|
||||||
std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
|
|
||||||
#endif
|
|
||||||
return std::string(timeStamp, timeStampSize - 1);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user