#ifndef _AL_TEST_H #define _AL_TEST_H #include "lib.h" #include "macros.h" #define AL_TEST_START_GROUP(name) \ al_printf("Group \""name"\":\n") #define AL_TEST_END_GROUP() \ return true #define AL_TEST_RUN(test) \ if (!test()) return false; #define AL_TEST_START(name) \ do { \ al_printf(" "name"..."); \ al_fflush(stdout); \ } while (0) #define AL_TEST_END() \ al_printf("OK\n"); \ return true #define AL_TEST_DEF(a, b, T, cmp, explain) \ do { \ AL_TEST_TYPE_##T ac = a; \ AL_TEST_TYPE_##T bc = b; \ if (cmp) { \ al_printf("FAIL "#a"("AL_TEST_FMT_##T") "explain" "#b"("AL_TEST_FMT_##T")\n", \ AL_TEST_PRINTF_##T(ac), AL_TEST_PRINTF_##T(bc)); \ return false; \ } \ } while (0) #define AL_TEST_EQ(a, b, T) \ AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != 0), \ "is not equal to") #define AL_TEST_NEQ(a, b, T) \ AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) == 0), \ "is equal to") #define AL_TEST_GT(a, b, T) \ AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != 1), \ "is less than or equal to") #define AL_TEST_GTE(a, b, T) \ AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != 0 && AL_TEST_CMP_##T(ac, bc) != 1), \ "is less than") #define AL_TEST_LT(a, b, T) \ AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != -1), \ "is greater than or equal to") #define AL_TEST_LTE(a, b, T) \ AL_TEST_DEF(a, b, T, (AL_TEST_CMP_##T(ac, bc) != 0 && AL_TEST_CMP_##T(ac, bc) != -1), \ "is greater than") #define AL_TEST_TRUE(a) \ AL_TEST_DEF(a, true, bool, (AL_TEST_CMP_bool(ac, bc) != 0), \ "is not") #define AL_TEST_FALSE(a) \ AL_TEST_DEF(a, false, bool, (AL_TEST_CMP_bool(ac, bc) != 0), \ "is not") // bool static inline s32 al_test_bool_cmp(bool a, bool b) { return (a == b) ? 0 : 1; } #define AL_TEST_CMP_bool al_test_bool_cmp #define AL_TEST_TYPE_bool bool #define AL_TEST_FMT_bool "%s" #define AL_TEST_PRINTF_bool(b) BOOLSTR(b) // u8 static inline s32 al_test_u8_cmp(u8 a, u8 b) { if (a == b) return 0; else if (a < b) return -1; else return 1; } #define AL_TEST_CMP_u8 al_test_u8_cmp #define AL_TEST_TYPE_u8 u8 #define AL_TEST_FMT_u8 "%hhu" #define AL_TEST_PRINTF_u8(i) i // u16 static inline s32 al_test_u16_cmp(u16 a, u16 b) { if (a == b) return 0; else if (a < b) return -1; else return 1; } #define AL_TEST_CMP_u16 al_test_u16_cmp #define AL_TEST_TYPE_u16 u16 #define AL_TEST_FMT_u16 "%hu" #define AL_TEST_PRINTF_u16(i) i // u32 static inline s32 al_test_u32_cmp(u32 a, u32 b) { if (a == b) return 0; else if (a < b) return -1; else return 1; } #define AL_TEST_CMP_u32 al_test_u32_cmp #define AL_TEST_TYPE_u32 u32 #define AL_TEST_FMT_u32 "%u" #define AL_TEST_PRINTF_u32(i) i // s32 static inline s32 al_test_s32_cmp(s32 a, s32 b) { if (a == b) return 0; else if (a < b) return -1; else return 1; } #define AL_TEST_CMP_s32 al_test_s32_cmp #define AL_TEST_TYPE_s32 s32 #define AL_TEST_FMT_s32 "%d" #define AL_TEST_PRINTF_s32(i) i // s64 static inline s32 al_test_s64_cmp(s64 a, s64 b) { if (a == b) return 0; else if (a < b) return -1; else return 1; } #define AL_TEST_CMP_s64 al_test_s64_cmp #define AL_TEST_TYPE_s64 s64 #define AL_TEST_FMT_s64 "%ld" #define AL_TEST_PRINTF_s64(i) i // size_t static inline s32 al_test_size_t_cmp(size_t a, size_t b) { if (a == b) return 0; else if (a < b) return -1; else return 1; } #define AL_TEST_CMP_size_t al_test_size_t_cmp #define AL_TEST_TYPE_size_t size_t #define AL_TEST_FMT_size_t "%zu" #define AL_TEST_PRINTF_size_t(i) i // ptrdiff_t static inline s32 al_test_ptrdiff_t_cmp(ptrdiff_t a, ptrdiff_t b) { if (a == b) return 0; else if (a < b) return -1; else return 1; } #define AL_TEST_CMP_ptrdiff_t al_test_ptrdiff_t_cmp #define AL_TEST_TYPE_ptrdiff_t ptrdiff_t #define AL_TEST_FMT_ptrdiff_t "%zd" #define AL_TEST_PRINTF_ptrdiff_t(i) i // pointer static inline s32 al_test_ptr_cmp(void *a, void *b) { if (a == b) return 0; else if (a < b) return -1; else return 1; } #define AL_TEST_CMP_ptr al_test_ptr_cmp #define AL_TEST_TYPE_ptr void * #define AL_TEST_FMT_ptr "%p" #define AL_TEST_PRINTF_ptr(i) i #endif // _AL_TEST_H