Newer
Older
c-interpreter / modules / libut / include / ut_assert.h
Nomura Kei on 9 Aug 2023 2 KB UPDATE
/**
 * @file ut_asserrt.h
 * @brief テスト用アサーション
 * @copyright 2023  Nomura Kei
 */
#ifndef UT_ASSERT_H
#define UT_ASSERT_H


#include <ut.h>

// #define add(...) UT_OVERLOAD(add_, __VA_ARGS__)
#define UT_OVERLOAD(func, ...) UT_OVERLOAD_SUB(func, UT_ARGS_LENGTH(__VA_ARGS__))(__VA_ARGS__)
#define UT_OVERLOAD_SUB(func, args_length) UT_STRCAT(func, args_length)
#define UT_ARGS_LENGTH(...) UT_ARGS_LENGTH_SUB(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1)
#define UT_ARGS_LENGTH_SUB(v1, v2, v3, v4, v5, v6, v7, v8, v9, LENGTH, ...) LENGTH
#define UT_STRCAT(s1, s2) s1 ## s2


#define _ut_assert_equals_2(expected, actual)		\
	_Generic((expected),							\
			int		: _Generic((actual),			\
				int		: ut_assert_equals_l_l_2,	\
				long	: ut_assert_equals_l_l_2,	\
				float	: ut_assert_equals_d_d_2,	\
				double	: ut_assert_equals_d_d_2	\
			),										\
			long	: _Generic((actual),			\
				int		: ut_assert_equals_l_l_2,	\
				long	: ut_assert_equals_l_l_2,	\
				float	: ut_assert_equals_d_d_2,	\
				double	: ut_assert_equals_d_d_2	\
			),										\
			float	: ut_assert_equals_d_d_2,		\
			double	: ut_assert_equals_d_d_2,		\
			char*	: ut_assert_equals_s_s_2		\
			)(expected, actual)


#define Ut_assert_null(condition)			ut_assert_null(object,		__FILE__, __func__, __LINE__)
#define Ut_assert_not_null(condition)		ut_assert_false(object,		__FILE__, __func__, __LINE__)
#define Ut_assert_false(condition)			ut_assert_false(condition,	__FILE__, __func__, __LINE__)
#define Ut_assert_true(condition)			ut_assert_true( condition,	__FILE__, __func__, __LINE__)
#define Ut_fail()							ut_assert_true(				__FILE__, __func__, __LINE__)

void _ut_assert_equals_double(double expected, double actual);
void _ut_assert_equals_long(long expected, long actual);
void _ut_assert_equals_string(const char* expected, const char* actual);
void _ut_assert_equals_memory(void* expected, void* actual, size_t size);

void ut_assert_null(void* object,		const char* file, const char* func, int line);
void ut_assert_not_null(void* object,	const char* file, const char* func, int line);
void ut_assert_false(bool condition,	const char* file, const char* func, int line);
void ut_assert_true( bool condition,	const char* file, const char* func, int line);
void ut_fail(							const char* file, const char* func, int line);

#endif	// UT_ASSERT_H