7# if __has_include(<version>)
10#elif defined(_MSC_VER) && \
11 ((defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L))
21#include <unordered_map>
22#include <unordered_set>
26#ifdef __cpp_impl_three_way_comparison
30#ifdef __cpp_lib_string_view
31# include <string_view>
38#if (defined(__cplusplus) && __cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1600)
40# define UTILS_TEST_ENV_AUTO_MAP(...) std::unordered_map<__VA_ARGS__>
41# define UTILS_TEST_ENV_AUTO_SET(...) std::unordered_set<__VA_ARGS__>
42# define UTILS_TEST_ENV_AUTO_UNORDERED 1
47# define UTILS_TEST_ENV_AUTO_MAP(...) std::map<__VA_ARGS__>
48# define UTILS_TEST_ENV_AUTO_SET(...) std::set<__VA_ARGS__>
60 using test_type = std::vector<std::pair<std::string, case_ptr_type> >;
77 void set_cases(
const std::vector<std::string> &case_names);
83#ifdef UTILS_TEST_MACRO_TEST_ENABLE_BOOST_TEST
84 static boost::unit_test::test_suite *&test_suit();
88 struct is_numberic : std::conditional<std::is_arithmetic<T>::value || std::is_enum<T>::value, std::true_type,
89 std::false_type>::type {};
88 struct is_numberic : std::conditional<std::is_arithmetic<T>::value || std::is_enum<T>::value, std::true_type, {
…};
91 template <
class TL,
class TR,
92 bool has_pointer = std::is_pointer<typename std::decay<TL>::type>::value ||
93 std::is_pointer<typename std::decay<TR>::type>::value,
101 template <
class TL,
class TR>
112 template <
class TL,
class TR>
115 typename std::conditional<std::is_floating_point<typename std::decay<TL>::type>::value ||
116 std::is_floating_point<typename std::decay<TR>::type>::value,
118 typename std::conditional<std::is_unsigned<typename std::decay<TL>::type>::value &&
119 std::is_unsigned<typename std::decay<TR>::type>::value,
120 uint64_t, int64_t>::type>::type;
124 return static_cast<value_type>(std::forward<T>(t));
128 template <
class TVAL,
bool>
131#ifdef __cpp_lib_string_view
137 template <
class TVAL>
139 using value_type =
typename std::conditional<std::is_same<std::nullptr_t, typename std::decay<TVAL>::type>::value,
144 template <
bool CONVERTABLE_TO_SV>
150 template <
class TVAL>
156 template <
class TL,
class TR,
bool has_po
inter,
bool has_
integer,
bool all_
integer>
165 template <class TL, bool CONVERT_TO_VOID_P = std::is_pointer<typename std::decay<TL>::type>::value ||
166 std::is_function<typename std::decay<TL>::type>::value>
173 template <
class TINPUT>
174 static inline const void *
pick(TINPUT &&v) {
175 return reinterpret_cast<const void *
>(v);
174 static inline const void *
pick(TINPUT &&v) {
…}
183 template <
class TINPUT>
195 template <
class TL,
class TR>
196 bool expect_eq(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
198 if (pp(l) == pp(r)) {
205 <<
"Expected: " << lexpr <<
" == " << rexpr << std::endl
196 bool expect_eq(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
…}
213 template <
class TL,
class TR>
214 bool expect_ne(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
217 if (pp(l) != pp(r)) {
224 <<
"Expected: " << lexpr <<
" != " << rexpr << std::endl
214 bool expect_ne(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
…}
232 template <
class TL,
class TR>
233 bool expect_lt(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
243 <<
"Expected: " << lexpr <<
" < " << rexpr << std::endl
233 bool expect_lt(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
…}
251 template <
class TL,
class TR>
252 bool expect_le(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
255 if (pp(l) <= pp(r)) {
262 <<
"Expected: " << lexpr <<
" <= " << rexpr << std::endl
252 bool expect_le(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
…}
270 template <
class TL,
class TR>
271 bool expect_gt(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
281 <<
"Expected: " << lexpr <<
" > " << rexpr << std::endl
271 bool expect_gt(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
…}
289 template <
class TL,
class TR>
290 bool expect_ge(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
293 if (pp(l) >= pp(r)) {
300 <<
"Expected: " << lexpr <<
" >= " << rexpr << std::endl
290 bool expect_ge(TL &&l, TR &&r,
const char *lexpr,
const char *rexpr,
const char *file,
size_t line) {
…}
309 bool expect_true(TL &&l,
const char *expr,
const char *file,
size_t line) {
317 <<
"Expected true: " << expr << std::endl
309 bool expect_true(TL &&l,
const char *expr,
const char *file,
size_t line) {
…}
325 bool expect_false(TL &&l,
const char *expr,
const char *file,
size_t line) {
333 <<
"Expected false: " << expr << std::endl
325 bool expect_false(TL &&l,
const char *expr,
const char *file,
size_t line) {
…}
340 static void set_counter_ptr(
int *success_counter_ptr,
int *failed_counter_ptr);
static std::string get_expire_time(clock_t begin, clock_t end)
void set_cases(const std::vector< std::string > &case_names)
static test_manager & me()
void append_event_on_start(const std::string &event_name, on_start_ptr_type)
event_on_exit_type evt_on_exits_
std::vector< std::pair< std::string, case_ptr_type > > test_type
std::unordered_map< std::string, test_type > test_data_type
static void set_counter_ptr(int *success_counter_ptr, int *failed_counter_ptr)
event_on_start_type evt_on_starts_
bool expect_false(TL &&l, const char *expr, const char *file, size_t line)
void append_event_on_exit(const std::string &event_name, on_exit_ptr_type)
bool expect_lt(TL &&l, TR &&r, const char *lexpr, const char *rexpr, const char *file, size_t line)
std::unordered_set< std::string > run_groups_
bool expect_eq(TL &&l, TR &&r, const char *lexpr, const char *rexpr, const char *file, size_t line)
static void inc_failed_counter()
bool expect_ge(TL &&l, TR &&r, const char *lexpr, const char *rexpr, const char *file, size_t line)
bool expect_true(TL &&l, const char *expr, const char *file, size_t line)
::std::string string_view_type
static void inc_success_counter()
std::vector< std::pair< std::string, on_start_ptr_type > > event_on_start_type
bool expect_le(TL &&l, TR &&r, const char *lexpr, const char *rexpr, const char *file, size_t line)
std::unordered_set< std::string > run_cases_
void append_test_case(const std::string &test_name, const std::string &case_name, case_ptr_type)
convert_param< TL >::type pick_convert_value(TL &&v)
bool expect_ne(TL &&l, TR &&r, const char *lexpr, const char *rexpr, const char *file, size_t line)
bool expect_gt(TL &&l, TR &&r, const char *lexpr, const char *rexpr, const char *file, size_t line)
std::vector< std::pair< std::string, on_exit_ptr_type > > event_on_exit_type
static const value_type & pick(TINPUT &&v)
typename std::decay< TL >::type value_type
static const void * pick(TINPUT &&v)
value_type operator()(T &&t)
typename std::conditional< std::is_floating_point< typename std::decay< TL >::type >::value||std::is_floating_point< typename std::decay< TR >::type >::value, double, typename std::conditional< std::is_unsigned< typename std::decay< TL >::type >::value &&std::is_unsigned< typename std::decay< TR >::type >::value, uint64_t, int64_t >::type >::type value_type
value_type operator()(T &&t)
try_convert_to_string_view< T, std::is_convertible< T, string_view_type >::value >::value_type operator()(T &&t)
static value_type pick(TVAL v)
typename std::conditional< std::is_same< std::nullptr_t, typename std::decay< TVAL >::type >::value, std::nullptr_t, string_view_type >::type value_type
static value_type pick(TVAL v)
static value_type pick(const char *v)
int run_tests(int argc, char *argv[])