diff --git a/test.c b/test.c index 3924f7b..1496acf 100644 --- a/test.c +++ b/test.c @@ -1,14 +1,109 @@ #include "y_test_h.h" -IMPLEMENTATION_TOOLS() +IMPLEMENTATION_FTEST() -int main(){ - - char *a="Heyyy"; - char *b="Hello"; +TEST(true__){ + PRINTF("another test again false\n"); + bool val_bool = false; + ASSERT_TRUE(val_bool); +} - printf(" %s vs %s = %d \n",a,b,COMPARE_N_TYPE_STRING(&a,&b)); - +TEST(test) +{ + PRINTF("test test\n"); + bool val_bool = true; + ASSERT_FALSE(val_bool); + +} + + +TEST(float_equal){ + PRINTF("another test float\n"); + ASSERT_TRUE(true); + float a = 1.00001f; + float b = 1.00001f; + ASSERT_EQ_TYPE_FLOAT(a,b); + b=1.0000101f; + ASSERT_EQ_TYPE_FLOAT(a,b); + ASSERT_EQ_TYPE_FLOAT(1.0000102f,b); +} +TEST(double_equal){ + PRINTF("another test double\n"); + ASSERT_TRUE(true); + double a = 1.00000001; + double b = 1.00000001; + ASSERT_EQ_TYPE_DOUBLE(a,b); + b=1.00000001000000001; + ASSERT_EQ_TYPE_DOUBLE(a,b); + ASSERT_EQ_TYPE_DOUBLE(1.0000000100000002,b); +} + +TEST(unsigned){ + unsigned char c = 'a'; + + LOG("another test, a = %c\n",c); + EXPECT_EQ('a',c); + ASSERT_FALSE(true); + ASSERT_TRUE(true); + ASSERT_TRUE(true); +} + + +TEST(){ +// sleep(3); + int a = 5; + long b = 5; + ASSERT_EQ(a,b); + a=4; + ASSERT_EQ(a,b); + +} + +TEST(expect){ +// sleep(2); + int a = 5; + int b = 6; + EXPECT_EQ(a,b); + // SKIP(); + SKIP("%s\n","on skip eq string"); + EXPECT_EQ_TYPE_STRING("hello","hello"); + float f1 = 1.00019999, f2=1.00019999; + EXPECT_EQ_TYPE_FLOAT(f1,f2); + +} + + +TEST(){ + PRINTF("no test, only print\n"); +} + +TEST(){ + PRINTF("no test, only print\n"); +} + +TEST(){ + PRINTF("no test, only print\n"); +} + + +TEST(lessThan){ + long int a=1,b=2; + EXPECT_LT(a,b); + EXPECT_LT(b,a); + + double da=0.1,db=0.2; + EXPECT_LT_TYPE_DOUBLE(da,db); + EXPECT_LT_TYPE_DOUBLE(db,da); +} + + + +int main(int argc, char **argv){ + + //run_all_tests(); + //run_all_tests_parallel(4); + + run_all_tests_args(argc, argv); return 0; } diff --git a/y_test_h.h b/y_test_h.h index 44fe8e8..7c447a5 100644 --- a/y_test_h.h +++ b/y_test_h.h @@ -196,6 +196,950 @@ void bar_progress_stop(void); +#ifndef __TEST_C_H__ +#define __TEST_C_H__ + +#include +#include +#include +#include +//#include +#include +//#include +#include /* to have size of screen, for progress bar */ + + +#define DEFAULT_K "\033[0m" /*Resets the text to default color*/ +#define GREEN_K "\033[0;32m" +#define RED_K "\033[0;31m" +#define YELLOW_K "\033[0;33m" +#define BLUE_K "\033[0;34m" +#define NOTHING_K "" + +#define COLOR_SZ 6 + +#define Dknothing COLOR_SZ - 1 + +#define SZ_TAB_HK 8 + + +/*#ifdef HK*/ + #define gHK_EQ "[==========]" + #define gHK_TR "[----------]" + #define gHK_RN "[RUN ]" + #define gHK_DN "[ DONE]" + #define gHK_OK "[ OK ]" + #define gHK_FL "[ FAILED ]" + #define gHK_PS "[ PASSED ]" + #define gHK_SK "[ SKIP ]" +/*#else*/ + #define HK_EQ "==========" + #define HK_TR "----------" + #define HK_RN "====== RUN" + #define HK_DN "===== DONE" + #define HK_OK "======= OK" + #define HK_FL "===== FAIL" + #define HK_PS "===== PASS" + #define HK_SK "===== SKIP" +/*#endif*/ /* HK */ + +/* + * compare symbol + */ +#define EQ == +#define LT < +#define GT > +#define LE <= +#define GE >= +#define NE != + +#define NORMAL 0 +#define VERB 1 +#define NOVERB 2 + +extern long int verb; +extern FILE **f_ou_th; +extern bool debug; +extern bool unicolour; +extern bool ordered; +extern bool log_parallel; +extern bool only_usage; +extern char *savelog; + +extern char *colors_f[]; +extern char *tab_hk_f[]; + +extern int k_DEFAULT, k_GREEN, k_RED, k_YELLOW, k_BLUE, k_NOTHING; +extern int hk_EQ, hk_TR, hk_RN, hk_DN, hk_OK, hk_FL, hk_PS, hk_SK; +extern char *varHK_EQ, *varHK_TR, *varHK_RN, *varHK_DN, *varHK_OK, *varHK_FL, *varHK_PS, *varHK_SK; + +/* + * */ + +/* + * to execute once in print functions in the case of log_parallel (printing on screen and recording in file), we have to copy to stream -> string before copy it, + * so I have tried using fopen a file in memory location '/dev/shm' and remove it after use! + * /dev/shm/tmp_PTHREAD_SELF() but it prints twice sometimes, + * here a solution with open_memstream which is better + */ + +#define PRINTF( ...) \ + do{ \ + FILE *stream ;\ + size_t len;\ + char *buf ;\ + stream = open_memstream (&buf, &len);\ + if (stream == NULL) { fprintf(stderr," error open_memstream %s:%d:%s \n",__FILE__,__LINE__,__func__); exit(0); }\ + fprintf(stream, __VA_ARGS__); \ + fflush(stream);\ + if(is_parallel_nb){\ + long int id_thread=id_of_thread_executed(__func__);\ + if(log_parallel){\ + fprintf(F_OUT, "%s",buf);\ + if(id_thread >= 0){\ + fprintf(f_ou_th[id_thread], "%s",buf);\ + fflush(f_ou_th[id_thread]);\ + }else{\ + fprintf(f_ou_th[parallel_nb], "%s",buf);\ + fflush(f_ou_th[parallel_nb]);\ + }\ + }\ + else{\ + if(id_thread >= 0){\ + fprintf(f_ou_th[id_thread], "%s",buf);\ + fflush(f_ou_th[id_thread]);\ + }\ + else {\ + fprintf(F_OUT, "%s",buf);\ + fprintf(f_ou_th[parallel_nb], "%s",buf);\ + fflush(f_ou_th[parallel_nb]);\ + }\ + }\ + } \ + else{\ + if(savelog){\ + FILE *f_savelog = fopen(savelog,"a");\ + fprintf(f_savelog, "%s",buf);\ + fclose(f_savelog);\ + }\ + fprintf(F_OUT, "%s",buf);\ + }\ + fclose(stream);\ + free(buf);\ + }while(0) + + +#define LOG(...) PRINTF(__VA_ARGS__) + +#define PRINT_LOC(fmt, ...) \ + PRINTF( "%s:%d:%s(): " fmt, __FILE__, __LINE__, __func__, __VA_ARGS__) + + +#define PRINT_HK_C(color,hk,fmt,...)\ + PRINTF("%s%s%s" fmt, color,hk,colors_f[k_DEFAULT],__VA_ARGS__) + +#define PRINT_DEBUG(fmt, ...)\ + do{ if(debug) PRINT_LOC(fmt, __VA_ARGS__);} while(0) + + +/* + * to skip the bloc test function + */ +#define SKIP(fmt,...)\ + PRINT_HK_C(colors_f[k_GREEN], tab_hk_f[hk_SK], fmt, ## __VA_ARGS__);\ + PRINT_LOC("%s\n\n" DEFAULT_K," Skiped "); return; + + + +struct func { + char *name; + void (*run)(void); + struct func *next; +}; + + +extern bool is_parallel_nb; +extern size_t parallel_nb ; + +long int id_of_thread_executed(const char *func_call_name); + +void parse_options(int argc, char **argv); + +void run_all_tests(); +void execute_all(struct func *fun); +void append_func(void (*run)(void), char *name); + +char* extract_func_edited_TEST_from_exec_func_name(char* func_name); /* TEST_funcname___NUM -> TEST(funcname) */ + +/* +void run_some_tests(size_t cnt, ... ); +void run_all_tests_exept(size_t cnt, ... ); +void run_some_tests_ordered(size_t cnt, ... ); +*/ + +void run_all_tests_parallel(size_t parallel /*, int max_col*/); + +/* + * to launch test with different parameters without re-compile it + * it can print help if need! + * */ +void run_all_tests_args(int argc, char **argv); + +bool expected_true_f(bool val); +bool expected_false_f(bool val); + +bool expected_true_f_name(bool val, const char *name); +bool expected_false_f_name(bool val, const char *name); + +#define GEN_EXPECTED_OP_TYPE_FUNC(OP,type)\ + bool expected_##OP##_##type(type var1, type var2);\ + bool expected_##OP##_name_##type(type var1, type var2, const char *name);\ +\ + bool expected_array_##OP##_##type(type *var1, long int sz1, type *var2, long int sz2);\ + bool expected_array_##OP##_name_##type(type *var1, long int sz1, type *var2, long int sz2, const char *name); + +/* + * ***** generate signature of expected functions EQ *********** + */ +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_U_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_INT) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_U_INT) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_U_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_SIZE_T) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_FLOAT) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_L_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(EQ, TYPE_STRING) +/* + * ******************** end EQ generation ************************ + */ + + +/* + * ***** generate signature of expected functions LT *********** + */ +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_U_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_INT) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_U_INT) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_U_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_SIZE_T) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_FLOAT) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_L_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(LT, TYPE_STRING) +/* + * ******************** end LT generation ************************ + */ + + +/* + * ***** generate signature of expected functions GT *********** + */ +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_U_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_INT) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_U_INT) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_U_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_SIZE_T) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_FLOAT) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_L_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(GT, TYPE_STRING) +/* + * ******************** end GT generation ************************ + */ + + +/* + * ***** generate signature of expected functions LE *********** + */ +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_U_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_INT) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_U_INT) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_U_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_SIZE_T) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_FLOAT) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_L_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(LE, TYPE_STRING) +/* + * ******************** end LE generation ************************ + */ + + +/* + * ***** generate signature of expected functions GE *********** + */ +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_U_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_INT) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_U_INT) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_U_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_SIZE_T) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_FLOAT) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_L_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(GE, TYPE_STRING) +/* + * ******************** end GE generation ************************ + */ + + +/* + * ***** generate signature of expected functions NE *********** + */ +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_U_CHAR) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_INT) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_U_INT) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_U_L_INT) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_SIZE_T) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_FLOAT) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_L_DOUBLE) +GEN_EXPECTED_OP_TYPE_FUNC(NE, TYPE_STRING) +/* + * ******************** end NE generation ************************ + */ + +/* + * only expect + */ + +#define IFTESTPASS_NAME(OP,type,var1,var2,name_f,msg_call) \ + do{ \ + if(verb==NORMAL){PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 %s passed %s \n\n",name_f,msg_call);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 %s passed %s \n\n",name_f,msg_call);\ + PRINT_LOC("test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + }while(0); + + +#define IFTESTFAIL_NAME(OP,type,var1,var2,name_f,msg_call) \ + do{\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 %s failed %s \n",name_f,msg_call); \ + }while(0); + +#define HANDLE_OP_EXPECT_NAME(OP,type,var1,var2,name_f,msg_call) \ +do{ \ + if(is_parallel_nb == 0){\ + if(expected_##OP##_##type(var1, var2)){ \ + /*IFTESTPASS_NAME(OP,type,var1,var2,name_f,msg_call);*/ \ + if(verb==NORMAL){PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 %s passed %s \n\n",name_f,msg_call);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 %s passed %s \n\n",name_f,msg_call);\ + PRINT_LOC("test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + \ + } \ + else{ \ + /*IFTESTFAIL_NAME(OP,type,var1,var2,name_f,msg_call);*/ \ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 %s failed %s \n",name_f,msg_call); \ + } \ + } else { \ + if(expected_##OP##_name_##type(var1, var2, name_f)){ \ + /*IFTESTPASS_NAME(OP,type,var1,var2,name_f,msg_call);*/ \ + if(verb==NORMAL){PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 %s passed %s \n\n",name_f,msg_call);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 %s passed %s \n\n",name_f,msg_call);\ + PRINT_LOC("test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + } \ + else{ \ + /*IFTESTFAIL_NAME(OP,type,var1,var2,name_f,msg_call);*/ \ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 %s failed %s \n",name_f,msg_call); \ + } \ + }\ +}while(0); + +//#define EXPECT_OP_(OP,type,var1,var2) HANDLE_OP_EXPECT_(OP,type,var1,var2) + + /** + * old combined macros HANDLE_OP_EXPECT_ASSERT for ASSERT and EXPECT + * is_assert : 0 for EXPECT and 1 for ASSERT + */ + +#define IFTESTPASS_ \ + do{\ + if(verb==NORMAL){ PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + PRINT_LOC(" test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + }while(0); + + +#define IFTESTFAIL_ \ + do{\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n",__func__); \ + }while(0); + + + +#define HANDLE_OP_EXPECT_ASSERT(OP,type,var1,var2,is_assert) \ +do{ \ + if(is_parallel_nb == 0){\ + if(expected_##OP##_##type(var1, var2)){ \ + /*IFTESTPASS_(var1,var2);*/ \ + if(verb==NORMAL){ PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + PRINT_LOC(" test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + \ + } \ + else{ \ + /*IFTESTFAIL_(var1,var2) ; */ \ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n",__func__); \ + if(is_assert) return; \ + } \ + }else { \ + if(expected_##OP##_name_##type(var1, var2, __func__)){ \ + /*IFTESTPASS_(var1,var2) ; */ \ + if(verb==NORMAL){ PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + PRINT_LOC(" test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + } \ + else{ \ + /*IFTESTFAIL_(var1,var2) ; */ \ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n",__func__); \ + if(is_assert) return; \ + } \ + }\ +}while(0); + +// ******************************************************************************************************************* + + /** + * new HANDLE_OP_ EXPECT and ASSERT separated + */ +#define HANDLE_OP_EXPECT_(OP,type,var1,var2) \ +do{ \ + if(is_parallel_nb == 0){\ + if(expected_##OP##_##type(var1, var2)){ \ + /*IFTESTPASS_ ;*/ \ + if(verb==NORMAL){ PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + PRINT_LOC(" test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + } \ + else{ \ + /*IFTESTFAIL_ ;*/ \ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n",__func__); \ + } \ + }else { \ + if(expected_##OP##_name_##type(var1, var2, __func__)){ \ + /*IFTESTPASS_(var1,var2) ; */ \ + if(verb==NORMAL){ PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + PRINT_LOC(" test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + } \ + else{ \ + /*IFTESTFAIL_(var1,var2) ; */ \ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n",__func__); \ + } \ + }\ +}while(0); + +#define HANDLE_OP_ASSERT_(OP,type,var1,var2) \ +do{ \ + if(is_parallel_nb == 0){\ + if(expected_##OP##_##type(var1, var2)){ \ + /*IFTESTPASS_(var1,var2) ; */ \ + if(verb==NORMAL){ PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + PRINT_LOC(" test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + } \ + else{ \ + /*IFTESTFAIL_(var1,var2) ; */ \ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n",__func__); \ + return; \ + } \ + }else { \ + if(expected_##OP##_name_##type(var1, var2, __func__)){ \ + /*IFTESTPASS_(var1,var2) ; */ \ + if(verb==NORMAL){ PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__);} \ + else if(verb==VERB){\ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + PRINT_LOC(" test passed : (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + }\ + } \ + else{ \ + /*IFTESTFAIL_(var1,var2) ; */ \ + char *str_var1 = type##_TO_STR(var1) , *str_var2 = type##_TO_STR(var2);\ + PRINT_LOC("Failure\nExpected: (%s) %s (%s) :\n Value of %s: %s \n Value of %s: %s\n\n"\ + ,#var1,STRFY(OP),#var2,#var1, str_var1, #var2, str_var2 ); \ + free(str_var1); free(str_var2);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n",__func__); \ + return; \ + } \ + }\ +}while(0); + + + +// ******************************************************************************************************************** + + +// *********************** begin EQ ************************ +// ============== EXPECT ============================== + +#define EXPECT_EQ_TYPE_CHAR(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_CHAR,var1, var2) +#define EXPECT_EQ_TYPE_U_CHAR(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_U_CHAR,var1, var2) +#define EXPECT_EQ_TYPE_INT(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_INT,var1, var2) +#define EXPECT_EQ_TYPE_U_INT(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_U_INT,var1, var2) +#define EXPECT_EQ_TYPE_L_INT(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_L_INT,var1, var2) +#define EXPECT_EQ_TYPE_U_L_INT(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_U_L_INT,var1, var2) +#define EXPECT_EQ_TYPE_SIZE_T(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_SIZE_T,var1, var2) +#define EXPECT_EQ_TYPE_FLOAT(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_FLOAT,var1, var2) +#define EXPECT_EQ_TYPE_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_DOUBLE,var1, var2) +#define EXPECT_EQ_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_L_DOUBLE,var1, var2) +#define EXPECT_EQ_TYPE_STRING(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_STRING,var1, var2) + +#define EXPECT_EQ(var1, var2) HANDLE_OP_EXPECT_(EQ, TYPE_L_INT,var1, var2) + + + +// ============== ASERT ===================== + +#define ASSERT_EQ_TYPE_CHAR(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_CHAR,var1, var2) +#define ASSERT_EQ_TYPE_U_CHAR(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_U_CHAR,var1, var2) +#define ASSERT_EQ_TYPE_INT(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_INT,var1, var2) +#define ASSERT_EQ_TYPE_U_INT(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_U_INT,var1, var2) +#define ASSERT_EQ_TYPE_L_INT(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_L_INT,var1, var2) +#define ASSERT_EQ_TYPE_U_L_INT(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_U_L_INT,var1, var2) +#define ASSERT_EQ_TYPE_SIZE_T(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_SIZE_T,var1, var2) +#define ASSERT_EQ_TYPE_FLOAT(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_FLOAT,var1, var2) +#define ASSERT_EQ_TYPE_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_DOUBLE,var1, var2) +#define ASSERT_EQ_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_L_DOUBLE,var1, var2) +#define ASSERT_EQ_TYPE_STRING(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_STRING,var1, var2) + +#define ASSERT_EQ(var1, var2) HANDLE_OP_ASSERT_(EQ, TYPE_L_INT,var1, var2) + +// ************************ end EQ ********************** + + +// *********************** begin LT ************************ +// ============== EXPECT ============================== + +#define EXPECT_LT_TYPE_CHAR(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_CHAR,var1, var2) +#define EXPECT_LT_TYPE_U_CHAR(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_U_CHAR,var1, var2) +#define EXPECT_LT_TYPE_INT(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_INT,var1, var2) +#define EXPECT_LT_TYPE_U_INT(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_U_INT,var1, var2) +#define EXPECT_LT_TYPE_L_INT(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_L_INT,var1, var2) +#define EXPECT_LT_TYPE_U_L_INT(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_U_L_INT,var1, var2) +#define EXPECT_LT_TYPE_SIZE_T(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_SIZE_T,var1, var2) +#define EXPECT_LT_TYPE_FLOAT(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_FLOAT,var1, var2) +#define EXPECT_LT_TYPE_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_DOUBLE,var1, var2) +#define EXPECT_LT_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_L_DOUBLE,var1, var2) +#define EXPECT_LT_TYPE_STRING(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_STRING,var1, var2) + +#define EXPECT_LT(var1, var2) HANDLE_OP_EXPECT_(LT, TYPE_L_INT,var1, var2) + + +// ============== ASERT ===================== + +#define ASSERT_LT_TYPE_CHAR(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_CHAR,var1, var2) +#define ASSERT_LT_TYPE_U_CHAR(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_U_CHAR,var1, var2) +#define ASSERT_LT_TYPE_INT(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_INT,var1, var2) +#define ASSERT_LT_TYPE_U_INT(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_U_INT,var1, var2) +#define ASSERT_LT_TYPE_L_INT(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_L_INT,var1, var2) +#define ASSERT_LT_TYPE_U_L_INT(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_U_L_INT,var1, var2) +#define ASSERT_LT_TYPE_SIZE_T(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_SIZE_T,var1, var2) +#define ASSERT_LT_TYPE_FLOAT(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_FLOAT,var1, var2) +#define ASSERT_LT_TYPE_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_DOUBLE,var1, var2) +#define ASSERT_LT_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_L_DOUBLE,var1, var2) +#define ASSERT_LT_TYPE_STRING(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_STRING,var1, var2) + +#define ASSERT_LT(var1, var2) HANDLE_OP_ASSERT_(LT, TYPE_L_INT,var1, var2) + +// ************************ end LT ********************** + + +// *********************** begin GT ************************ +// ============== EXPECT ============================== + +#define EXPECT_GT_TYPE_CHAR(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_CHAR,var1, var2) +#define EXPECT_GT_TYPE_U_CHAR(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_U_CHAR,var1, var2) +#define EXPECT_GT_TYPE_INT(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_INT,var1, var2) +#define EXPECT_GT_TYPE_U_INT(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_U_INT,var1, var2) +#define EXPECT_GT_TYPE_L_INT(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_L_INT,var1, var2) +#define EXPECT_GT_TYPE_U_L_INT(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_U_L_INT,var1, var2) +#define EXPECT_GT_TYPE_SIZE_T(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_SIZE_T,var1, var2) +#define EXPECT_GT_TYPE_FLOAT(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_FLOAT,var1, var2) +#define EXPECT_GT_TYPE_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_DOUBLE,var1, var2) +#define EXPECT_GT_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_L_DOUBLE,var1, var2) +#define EXPECT_GT_TYPE_STRING(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_STRING,var1, var2) + +#define EXPECT_GT(var1, var2) HANDLE_OP_EXPECT_(GT, TYPE_L_INT,var1, var2) + + + +// ============== ASERT ===================== + +#define ASSERT_GT_TYPE_CHAR(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_CHAR,var1, var2) +#define ASSERT_GT_TYPE_U_CHAR(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_U_CHAR,var1, var2) +#define ASSERT_GT_TYPE_INT(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_INT,var1, var2) +#define ASSERT_GT_TYPE_U_INT(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_U_INT,var1, var2) +#define ASSERT_GT_TYPE_L_INT(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_L_INT,var1, var2) +#define ASSERT_GT_TYPE_U_L_INT(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_U_L_INT,var1, var2) +#define ASSERT_GT_TYPE_SIZE_T(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_SIZE_T,var1, var2) +#define ASSERT_GT_TYPE_FLOAT(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_FLOAT,var1, var2) +#define ASSERT_GT_TYPE_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_DOUBLE,var1, var2) +#define ASSERT_GT_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_L_DOUBLE,var1, var2) +#define ASSERT_GT_TYPE_STRING(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_STRING,var1, var2) + +#define ASSERT_GT(var1, var2) HANDLE_OP_ASSERT_(GT, TYPE_L_INT,var1, var2) + +// ************************ end GT ********************** + + +// *********************** begin LE ************************ +// ============== EXPECT ============================== + +#define EXPECT_LE_TYPE_CHAR(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_CHAR,var1, var2) +#define EXPECT_LE_TYPE_U_CHAR(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_U_CHAR,var1, var2) +#define EXPECT_LE_TYPE_INT(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_INT,var1, var2) +#define EXPECT_LE_TYPE_U_INT(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_U_INT,var1, var2) +#define EXPECT_LE_TYPE_L_INT(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_L_INT,var1, var2) +#define EXPECT_LE_TYPE_U_L_INT(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_U_L_INT,var1, var2) +#define EXPECT_LE_TYPE_SIZE_T(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_SIZE_T,var1, var2) +#define EXPECT_LE_TYPE_FLOAT(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_FLOAT,var1, var2) +#define EXPECT_LE_TYPE_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_DOUBLE,var1, var2) +#define EXPECT_LE_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_L_DOUBLE,var1, var2) +#define EXPECT_LE_TYPE_STRING(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_STRING,var1, var2) + +#define EXPECT_LE(var1, var2) HANDLE_OP_EXPECT_(LE, TYPE_L_INT,var1, var2) + + + +// ============== ASERT ===================== + +#define ASSERT_LE_TYPE_CHAR(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_CHAR,var1, var2) +#define ASSERT_LE_TYPE_U_CHAR(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_U_CHAR,var1, var2) +#define ASSERT_LE_TYPE_INT(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_INT,var1, var2) +#define ASSERT_LE_TYPE_U_INT(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_U_INT,var1, var2) +#define ASSERT_LE_TYPE_L_INT(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_L_INT,var1, var2) +#define ASSERT_LE_TYPE_U_L_INT(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_U_L_INT,var1, var2) +#define ASSERT_LE_TYPE_SIZE_T(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_SIZE_T,var1, var2) +#define ASSERT_LE_TYPE_FLOAT(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_FLOAT,var1, var2) +#define ASSERT_LE_TYPE_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_DOUBLE,var1, var2) +#define ASSERT_LE_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_L_DOUBLE,var1, var2) +#define ASSERT_LE_TYPE_STRING(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_STRING,var1, var2) + +#define ASSERT_LE(var1, var2) HANDLE_OP_ASSERT_(LE, TYPE_L_INT,var1, var2) + +// ************************ end LE ********************** + + +// *********************** begin GE ************************ +// ============== EXPECT ============================== + +#define EXPECT_GE_TYPE_CHAR(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_CHAR,var1, var2) +#define EXPECT_GE_TYPE_U_CHAR(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_U_CHAR,var1, var2) +#define EXPECT_GE_TYPE_INT(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_INT,var1, var2) +#define EXPECT_GE_TYPE_U_INT(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_U_INT,var1, var2) +#define EXPECT_GE_TYPE_L_INT(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_L_INT,var1, var2) +#define EXPECT_GE_TYPE_U_L_INT(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_U_L_INT,var1, var2) +#define EXPECT_GE_TYPE_SIZE_T(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_SIZE_T,var1, var2) +#define EXPECT_GE_TYPE_FLOAT(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_FLOAT,var1, var2) +#define EXPECT_GE_TYPE_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_DOUBLE,var1, var2) +#define EXPECT_GE_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_L_DOUBLE,var1, var2) +#define EXPECT_GE_TYPE_STRING(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_STRING,var1, var2) + +#define EXPECT_GE(var1, var2) HANDLE_OP_EXPECT_(GE, TYPE_L_INT,var1, var2) + + + +// ============== ASERT ===================== + +#define ASSERT_GE_TYPE_CHAR(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_CHAR,var1, var2) +#define ASSERT_GE_TYPE_U_CHAR(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_U_CHAR,var1, var2) +#define ASSERT_GE_TYPE_INT(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_INT,var1, var2) +#define ASSERT_GE_TYPE_U_INT(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_U_INT,var1, var2) +#define ASSERT_GE_TYPE_L_INT(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_L_INT,var1, var2) +#define ASSERT_GE_TYPE_U_L_INT(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_U_L_INT,var1, var2) +#define ASSERT_GE_TYPE_SIZE_T(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_SIZE_T,var1, var2) +#define ASSERT_GE_TYPE_FLOAT(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_FLOAT,var1, var2) +#define ASSERT_GE_TYPE_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_DOUBLE,var1, var2) +#define ASSERT_GE_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_L_DOUBLE,var1, var2) +#define ASSERT_GE_TYPE_STRING(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_STRING,var1, var2) + +#define ASSERT_GE(var1, var2) HANDLE_OP_ASSERT_(GE, TYPE_L_INT,var1, var2) + +// ************************ end GE ********************** + + +// *********************** begin NE ************************ +// ============== EXPECT ============================== + +#define EXPECT_NE_TYPE_CHAR(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_CHAR,var1, var2) +#define EXPECT_NE_TYPE_U_CHAR(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_U_CHAR,var1, var2) +#define EXPECT_NE_TYPE_INT(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_INT,var1, var2) +#define EXPECT_NE_TYPE_U_INT(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_U_INT,var1, var2) +#define EXPECT_NE_TYPE_L_INT(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_L_INT,var1, var2) +#define EXPECT_NE_TYPE_U_L_INT(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_U_L_INT,var1, var2) +#define EXPECT_NE_TYPE_SIZE_T(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_SIZE_T,var1, var2) +#define EXPECT_NE_TYPE_FLOAT(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_FLOAT,var1, var2) +#define EXPECT_NE_TYPE_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_DOUBLE,var1, var2) +#define EXPECT_NE_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_L_DOUBLE,var1, var2) +#define EXPECT_NE_TYPE_STRING(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_STRING,var1, var2) + +#define EXPECT_NE(var1, var2) HANDLE_OP_EXPECT_(NE, TYPE_L_INT,var1, var2) + + + +// ============== ASERT ===================== + +#define ASSERT_NE_TYPE_CHAR(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_CHAR,var1, var2) +#define ASSERT_NE_TYPE_U_CHAR(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_U_CHAR,var1, var2) +#define ASSERT_NE_TYPE_INT(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_INT,var1, var2) +#define ASSERT_NE_TYPE_U_INT(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_U_INT,var1, var2) +#define ASSERT_NE_TYPE_L_INT(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_L_INT,var1, var2) +#define ASSERT_NE_TYPE_U_L_INT(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_U_L_INT,var1, var2) +#define ASSERT_NE_TYPE_SIZE_T(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_SIZE_T,var1, var2) +#define ASSERT_NE_TYPE_FLOAT(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_FLOAT,var1, var2) +#define ASSERT_NE_TYPE_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_DOUBLE,var1, var2) +#define ASSERT_NE_TYPE_L_DOUBLE(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_L_DOUBLE,var1, var2) +#define ASSERT_NE_TYPE_STRING(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_STRING,var1, var2) + +#define ASSERT_NE(var1, var2) HANDLE_OP_ASSERT_(NE, TYPE_L_INT,var1, var2) + +// ************************ end NE ********************** + +/* + * ============== bool =================== + * bellow old combined EXPECT and ASSERT macros + */ + +#define HANDLE_EXPECT_NOT_EXPECT_ASSERT(expect,not_expect,var1,is_assert) \ +do{ \ + if(is_parallel_nb==0){\ + if(expected_##expect##_f(var1)){ \ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + } \ + else{ \ + PRINT_LOC("Failure\nValue of: %s\nActual: %s\nExpected: %s\n\n", #var1, #not_expect, #expect);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n",__func__); \ + if(is_assert) return; \ + } \ + }\ + else{\ + if(expected_##expect##_f_name(var1, __func__)){ \ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + } \ + else{ \ + PRINT_LOC("Failure\nValue of: %s\nActual: %s\nExpected: %s\n\n", #var1, #not_expect, #expect);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n",__func__); \ + if(is_assert) return; \ + } \ + }\ +}while(0); + +// ******************************************************************************************************* +/* + * new macro HANDEL ASSERT and EXPECT separated + */ +#define HANDLE_EXPECT_NOT_EXPECT_(expect,not_expect,var1) \ +do{ \ + if(is_parallel_nb==0){ \ + if(expected_##expect##_f(var1)){ \ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + } \ + else{ \ + PRINT_LOC("Failure\nValue of: %s\nActual: %s\nExpected: %s\n", #var1, #not_expect, #expect); \ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n\n",__func__); \ + } \ + } \ + else{ \ + size_t id_thread=id_of_thread_executed(__func__); \ + if(expected_##expect##_f_name(var1, __func__)){ \ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s, on thread[%ld]\n\n",__func__,id_thread); \ + } \ + else{ \ + PRINT_LOC("Failure\nValue of: %s\nActual: %s\nExpected: %s\n", #var1, #not_expect, #expect); \ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s, on thread[%ld]\n\n",__func__,id_thread); \ + } \ + } \ +}while(0); + + +#define HANDLE_ASSERT_EXPECT_NOT_EXPECT_(expect,not_expect,var1) \ +do{ \ + if(is_parallel_nb==0){ \ + if(expected_##expect##_f(var1)){ \ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s \n\n",__func__); \ + } \ + else{ \ + PRINT_LOC("Failure\nValue of: %s\nActual: %s\nExpected: %s\n", #var1, #not_expect, #expect); \ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s \n\n",__func__); \ + return; \ + } \ + }\ + else{\ + size_t id_thread=id_of_thread_executed(__func__); \ + if(expected_##expect##_f_name(var1, __func__)){ \ + PRINT_HK_C(colors_f[k_GREEN],tab_hk_f[hk_TR]," 1 test passed from %s, on thread[%ld]\n\n",__func__,id_thread); \ + } \ + else{ \ + PRINT_LOC("Failure\nValue of: %s\nActual: %s\nExpected: %s\n\n", #var1, #not_expect, #expect);\ + PRINT_HK_C(colors_f[k_RED],tab_hk_f[hk_TR]," 1 test failed from %s, on thread[%ld]\n\n",__func__, id_thread); \ + return; \ + } \ + }\ +}while(0); + + +// ******************************************************************************************************* +#define EXPECT_TRUE(var1) HANDLE_EXPECT_NOT_EXPECT_(true, false, var1) +#define EXPECT_FALSE(var1) HANDLE_EXPECT_NOT_EXPECT_(false, true, var1) + +#define ASSERT_TRUE(var1) HANDLE_ASSERT_EXPECT_NOT_EXPECT_(true, false, var1) +#define ASSERT_FALSE(var1) HANDLE_ASSERT_EXPECT_NOT_EXPECT_(false, true, var1) + + +//******************************************************************************** + +/* +#define EXPECT_TRUE(var1) HANDLE_EXPECT_NOT_EXPECT_ASSERT(true, false, var1, 0) +#define EXPECT_FALSE(var1) HANDLE_EXPECT_NOT_EXPECT_ASSERT(false, true, var1, 0) + +#define ASSERT_TRUE(var1) HANDLE_EXPECT_NOT_EXPECT_ASSERT(true, false, var1, 1) +#define ASSERT_FALSE(var1) HANDLE_EXPECT_NOT_EXPECT_ASSERT(false, true, var1, 1) +*/ + + +#define CONCAT(x,y) x ## y +#define STRFY(x) # x + +//#define test_label test + +#define FTEST_(count, name_f) \ + void CONCAT(test_##name_f##____,count)(void); \ + __attribute__((constructor)) \ + void CONCAT(append_test_##name_f,count)(void){ \ + append_func(CONCAT(test_##name_f##____,count),STRFY(name_f test count)); \ + } \ + void CONCAT(test_##name_f##____,count)(void) + +#define FTEST__(count, name_f) \ + void CONCAT(TEST_##name_f##____,count)(void); \ + __attribute__((constructor)) \ + void CONCAT(append_test_##name_f,count)(void){ \ + append_func(CONCAT(TEST_##name_f##____,count),STRFY (TEST(name_f): test N° count| ) ); \ + } \ + void CONCAT(TEST_##name_f##____,count)(void) + + +/*#define TEST(name_f)\ + FTEST_(__COUNTER__,name_f) +*/ + +#define TEST(name_f) \ + FTEST__(__COUNTER__,name_f) + +// HIDE_TEST +// to not execute test, it helps to manualy avoid test in code, +// instead of comment or #if 0 #endif +#define H__TEST__(count, name_f) \ + void CONCAT(TEST_##name_f##____,count)(void) \ + + +#define HIDE_TEST(name_f)\ + H__TEST__(__COUNTER__,name_f) + +/* +#define ASSERT_TRUE(val)\ + if(expected_true_f(val,#val,__func__) == false) {error_print("%s\n\n","Failure"); return;} + +#define ASSERT_FALSE(val)\ + if(expected_false_f(val,#val,__func__) == false) {error_print("%s\n\n","Failure"); return;} +*/ + +#endif /* __TEST_C_H__ */ @@ -557,5 +1501,1592 @@ void bar_progress_stop()\ set_window_height_for_bar_progress(w.ws_row);\ }\ -; +/* implementation ftest */ + + +//#include "ftest/ftest.h" +//#include + +/* + * by default display in millisecond + */ +/* + +*/ + +#define NANOSECOND (timeunit[0]=='n') +#define SECOND (timeunit[0]=='s') + + #define LOCK(mutex_var) pthread_mutex_lock(&mutex_var); + #define UNLOCK(mutex_var) pthread_mutex_unlock(&mutex_var); + +#define INCREMENT(variable)\ + do{\ + if(is_parallel_nb){\ + LOCK(mut_##variable); \ + ++variable;\ + UNLOCK(mut_##variable);\ + }\ + else ++variable;\ + }while(0); + + +#define default_ordered 0 +#define default_unicolour 0 +#define default_removelog 0 +//#define default_parallel_nb 1 +#define default_parallel_nb_opt 1 +#define default_verb NORMAL + + +#define COMPARE_STR_TO_DEFS(defined,in_str)\ + /*LOG(" ===================== ======== %s vs %s =========== \n",in_str,#defined);*/\ + if(strcmp(in_str, #defined)==0){\ + return defined;\ + } + +#define LOG_WRONG(option,arg,msg)\ + some_thing_wrong=1;\ + help=1;\ + printf("incorrect %s option is interpreted as -%c, %s \n\n",arg,#option[0],msg);\ + break; + +#define IF_OPTION_WITH_ARG_NUM(option)\ + if(argv[i][0]=='-'){\ + j=1;\ + while(argv[i][j]=='-') ++j;\ + if(argv[i][j] == #option[0]){\ + arg=argv[i];\ + long ret_num=extract_num_after_equal_symbole_in_string(argv[i]);\ + PRINT_DEBUG("option=%s, ret_num = %ld, argv[%d]=%s\n",#option,ret_num,i,argv[i]);\ + is_##option = 1;\ + if(ret_num > -1)\ + option = ret_num;\ + else{\ + if(i0)\ + option = ret_num;\ + else{ \ + option = default_##option;\ + LOG_WRONG(option,arg, "wait for args")\ + }\ + }\ + }\ + else{\ + option = default_##option;\ + LOG_WRONG(option,arg, "wait for args")\ + }\ + }\ + PRINT_DEBUG("option %s activated, its value is %ld\n",#option,option);\ + continue;\ + }\ + }\ + +#define IF_OPTION_WITH_ARG_STR(option)\ + if(argv[i][0]=='-'){\ + j=1;\ + while(argv[i][j]=='-') ++j;/* to accept multiple -- */\ + if(argv[i][j] == #option[0]){\ + arg=argv[i];\ + char* ret_str=(char*)extract_string_after_equal_symbole_in_string(argv[i]);\ + PRINT_DEBUG("option=%s, ret_str = %s, argv[%d]=%s\n",#option,ret_str,i,argv[i]);\ + if(ret_str ==NULL || strlen(ret_str)==0){\ + if(iname);\ + failed_lst = failed_lst->next;\ + } + + +#define INCREMENT_EXPECT(expect,name)\ + do{\ + size_t num_test=extract_num__f(name);\ + ++count_## expect ##_test[num_test];\ + PRINT_DEBUG("INCREMENT cout_%s_test[%ld] = %ld\n",#expect, num_test,count_## expect ##_test[num_test]); \ + }while(0); + + +#define EXPECTED_EXPECT_F(expect/*, not_expect*/) \ + \ +bool expected_##expect##_f(bool val){ \ + if(val == expect) { \ + INCREMENT(count_pass_local); /*++count_pass_local*/ \ + return true; \ + }else { \ + INCREMENT(count_fail_local); /*++count_fail_local*/ \ + return false; \ + } \ +} \ +bool expected_##expect##_f_name(bool val, const char * name){ \ + if(val == expect) { \ + INCREMENT_EXPECT(pass,name);\ + return true; \ + }else { \ + INCREMENT_EXPECT(fail,name);\ + return false; \ + } \ +} \ + +#define EXPECTED_OP_TYPE(OP,type) \ + \ +bool expected_##OP##_##type(type var1, type var2){ \ + if(COMPARE_N_##type(&var1, &var2) OP 0){ \ + INCREMENT(count_pass_local); /*++count_pass_local*/ \ + return true; \ + }else { \ + INCREMENT(count_fail_local); /*++count_fail_local*/ \ + return false; \ + } \ +} \ +bool expected_##OP##_name_##type(type var1, type var2,const char * name){ \ + if(COMPARE_N_##type(&var1, &var2) OP 0){ \ + INCREMENT_EXPECT(pass,name);\ + return true; \ + }else { \ + INCREMENT_EXPECT(fail,name);\ + return false; \ + } \ +}\ +bool expected_array_##OP##_##type(type *var1, long int sz1, type *var2, long int sz2){ \ + if(sz1 OP sz2){\ + if(sz1 == sz2){\ + size_t count_ = 0;\ + for(size_t i=0;inext; \ + } \ + tmp_failed_l = malloc(sizeof(struct failed_lists)); \ + tmp_failed_l->name = malloc(strlen(name_failed)+1); \ + strcpy(tmp_failed_l->name, name_failed); \ + tmp_failed_l->next = NULL; \ + rec_tmp->next = tmp_failed_l; \ + \ + } \ + else{ \ + *fn_failed_list = malloc(sizeof(struct failed_lists)); \ + (*fn_failed_list)->name = malloc(strlen(name_failed)+1); \ + strcpy((*fn_failed_list)->name, name_failed); \ + (*fn_failed_list)->next = NULL; \ + } \ + \ +} \ + \ +/* \ + * match the id global (gives by OS) of the thread with the local (the program) id of thread \ + */ \ +long int id_of_thread_executed(const char * func_call_name){ \ + size_t id_from_self = pthread_self(); \ + for(long int i=0; i<= parallel_nb; ++i){ \ + if(id_thread_self[i] == id_from_self) \ + return i; \ + } \ + /*if(id_thread_self){ \ + for(long int i=0; i<= parallel_nb; ++i) \ + PRINT_DEBUG(" id_thread_self[%ld] = %ld \n", i, id_thread_self[i]); \ + }*/ \ + /* no error, when pthread is call in a test, we will not have a match! */ \ + PRINT_DEBUG("\n debug [%s]: called by <%s>, id_from_self: %ld\n",__func__, func_call_name,id_from_self); \ + return -1; \ +} \ + \ + \ +/* \ + * format name of TEST(name_f) is: 'TEST_name_f____NUM|', \ + * and name attribute is 'TEST(name_f): test N° NUM!' (! at the end is random): \ + * we extract NUM here \ + * to have hash_table of the count when parallel test! \ + */ \ +size_t extract_num__f(const char *name_f){ \ + size_t len = strlen(name_f); \ + size_t val = 0, p = 1; \ + for(long i= len-1; i>=0; --i){ \ + PRINT_DEBUG(" name_f(%s)[%ld] = %c\n",name_f,i,name_f[i]); \ + if(name_f[i]=='|') val = 0; \ + if(name_f[i] >= '0' && name_f[i] <= '9'){ \ + val += p * (name_f[i]-'0'); \ + p *= 10; \ + } \ + else if( name_f[i] == ' ' || name_f[i] == '_' || name_f[i] == '=' ) break; \ + } \ + return val; \ +} \ + /* TEST_funcname___NUM -> TEST(funcname) */ \ +char* extract_func_edited_TEST_from_exec_func_name(char* func_name){ \ + size_t len=strlen(func_name); \ + char *ret_name=malloc(len+1); \ + strcpy(ret_name, func_name); \ + char *pad="____"; \ + size_t len_pad=strlen(pad); \ + ret_name[4]='('; \ + for(size_t i=5;i= len_db ){ \ + char *tmp_bp=malloc(len_bp+1); \ + strcpy(tmp_bp,bar_progress); \ + tmp_bp[2]='u'; \ + bar_progress=tmp_bp; \ + bar_progress_has_to_be_freed = 1; \ + } \ + else{ \ + char *tmp_bp=malloc(len_db+1); \ + strcpy(tmp_bp,default_bar_progress); \ + tmp_bp[2]='u'; \ + default_bar_progress=tmp_bp; \ + default_bar_progress_has_to_be_freed = 1; \ + } \ + } \ + \ + if(gtestlike){ \ + for(int i=0; i<=hk_SK; ++i) \ + tab_hk_f[i]=g_tab_hk_f[i]; \ + } \ + \ + parallel_nb = parallel_nb_opt; \ + is_parallel_nb = is_parallel_nb_opt; \ + \ + /*if(savelog){ \ + f_savelog=fopen(savelog, "w+"); \ + }*/ \ +} \ + \ + \ +/* ===================================== begin options handle ======================================================= */\ + \ +void usage(int argc, char **argv){ \ + printf("usage: %s [OPTIONS] [] \n\n" \ + " or : %s [OPTIONS]=[]\n\n",argv[0],argv[0]); \ + printf("OPTIONS\n"); \ + printf( "\t -h, --help \n" \ + "\t\tprint help, options variables\n\n"); \ + printf( "\t -g, --gtestlike \n" \ + "\t\tto have gtest hook like!\n\n"); \ + printf( "\t -p , --parallel , -p=, --parallel=\n" \ + "\t\tby default the program ran in sequantial all test, \n" \ + "\t\tif this option is set, the program run tests on NB threads.\n" \ + "\t\tEach thread pull up one test out the list of all test not yet executed,\n" \ + "\t\tand execute it, until the list is empty \n\n"); \ + printf( "\t -t , --time , -t=, --time= \n" \ + "\t\tby default unit is millisecons ms, the other of unit are choices are second (or s), and nanosecond (or ns)\n" \ + "\t\tex: -t ns or -t=nanosecond or --time=n to set nanosecond unit\n\n"); \ + printf( "\t -u , --unicolour\n" \ + "\t\tby default, the result is colored, if you choice this option, it prints with default color\n\n"); \ + printf( "\t -r , --remove\n" \ + "\t\tif the option parallel is choosen the result on each thread is record in separate files,\n" \ + "\t\tthis option remove the file logs of each thread after all tests.\n\n"); \ + printf( "\t -s , --savelog , -s=file, --savelog=file\n" \ + "\t\tthis option save the global ordered result in 'file',\n" \ + "\t\t \n\n"); \ + \ + printf( "\t -n=, ... ,--numtests=,...\n" \ + "\t\tthis option allow to execute only the selected numbers of tests (in the order in file test)\n" \ + "\t\tex: -n=0,6,3 8 to execute the tests 0,3,6,8 (if the number is less than the count of all tests)\n\n"); \ + printf( "\t -l=, ... ,--listests=,...\n" \ + "\t\tthis option allow to execute only the selected name of tests. It allows empty name by using '-l=,'\n" \ + "\t\tex: -l=name0,,name2 : execute only (if they exist): TEST(name0),TEST(),TEST(name2)\n\n"); \ + printf( "\t -b , --bar_progress , -b=BPRGSS, --bar_progress=BPRGSS. Example: -b=\"#_c\"\n" \ + "\t\tthis option change progression bar if it is active. The first character (\'#\') fills the bar\n" \ + "\t\tthe second char (\'_\') fills the other part of bar. the bar is colored if the 3rd char is \'c\' and not if different.\n" \ + "\t\tby default the progress bar is active and the option is -b=\" c\", if need not colored, we can put -b=\" n\" option.\n\n"); \ + printf( "\t -z=