add options wich allow to execute only some tests selected with nametest or numtest

This commit is contained in:
2023-08-29 15:40:22 +02:00
parent ef59339df8
commit 2c1e4f0487
7 changed files with 253 additions and 35 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
**.swp
**.sw*
log*
**.o
*.o
+1 -1
View File
@@ -1,7 +1,7 @@
NAME_TEST=is_good
CC=gcc
LDFLAGS=-lpthread
LDFLAGS=-lpthread -D DEBUG=1
ROOT_DIR=$(shell pwd)
INCLUDE_DIR=$(ROOT_DIR)/src
CFLAGS=-I$(INCLUDE_DIR)
+1 -1
View File
@@ -1,4 +1,4 @@
#!/bin/bash
gcc test/is_good.c src/ftest/ftest.c src/tools_t/tools_t.c \
src/permutation_t/permutation_t.c src/set_theoric_t/set_theoric_t.c \
-I./src -o launch_is_good_c && ./launch_is_good_c -h -p
-I./src $1 -o launch_is_good_c #&& ./launch_is_good_c -h -p
+233 -22
View File
@@ -102,10 +102,19 @@ bool unicolour = 0;
bool removelog = 0;
char *timeunit="ms";
char *savelog=NULL;
char *default_timeunit="ms";
char *defiault_timeunit="ms";
char *default_savelog="log_all_tests";
size_t width = 80;
bool some_tests_selected=0;
size_t *array_TYPE_SIZE_T=NULL; /* if active, size = count_tests */
char **array_TYPE_STRING=NULL;
size_t cur_array_TYPE_SIZE_T=0; /* < count_tests */
size_t cur_array_TYPE_STRING=0;
/*
* number of threads
*/
@@ -250,6 +259,8 @@ size_t extract_num__f(const char *name_f){
return val;
}
// ===================================== begin options handle =======================================================
void usage(int argc, char **argv){
printf("usage: %s [OPTIONS] [<ARGS>] \n\n or : %s [OPTIONS]=[<ARGS>]\n\n",argv[0],argv[0]);
printf("OPTIONS\n");
@@ -262,6 +273,19 @@ void usage(int argc, char **argv){
printf("\t -s <file>, --savelog <file>, -s=file, --savelog=file\n\t\tthis option save the global ordered result in 'file',\n\t\tthis option active the option -o or --ordered. \n\n");
printf("\t -w <WID>, --width <WID>, -w=WID, --savelog=WID\n\t\tthis option change the width of the progress bar to WID, by default, WID=80,\n\t\tex: -w100, or --width=100 or -wi 100\n\n");
printf("\t -n=<NUM1>,<NUM2> <NUM3>... ,--numtests=<NUM1>,<NUM2>...\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=<NAME1>,<NAME2> <NAME3>... ,--listests=<NAME1>,<NAME2>...<NAMEn>\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");
if(array_TYPE_SIZE_T){
for(int i=0; i< cur_array_TYPE_SIZE_T; ++i){
PRINT_DEBUG("array_TYPE_SIZE_T[%d]=%ld\n",i,array_TYPE_SIZE_T[i]);
}
}
if(array_TYPE_STRING) {
for(int i=0; i< cur_array_TYPE_STRING; ++i){
PRINT_DEBUG("array_TYPE_STRING[%d]=%s\n",i,array_TYPE_STRING[i]);
}
}
if(some_thing_wrong){
printf("invalid argument\n");
exit(0);
@@ -294,11 +318,18 @@ long int extract_num_after_equal_symbole_in_string(char * in_str){
return -1;
}
#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;\
if(argv[i][j]=='-') ++j;\
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;\
@@ -307,25 +338,22 @@ long int extract_num_after_equal_symbole_in_string(char * in_str){
else{\
if(i<argc-1){\
if(argv[i+1][0]=='-'){\
help=1;\
option = default_##option;\
some_thing_wrong = 1;\
LOG_WRONG(option,arg, "wait for args")\
}\
else{\
ret_num=extract_num_after_equal_symbole_in_string(argv[++i]);\
if(ret_num>0)\
option = ret_num;\
else{ \
help=1;\
option = default_##option;\
some_thing_wrong = 1;\
LOG_WRONG(option,arg, "wait for args")\
}\
}\
}\
else{\
help=1;\
option = default_##option;\
some_thing_wrong = 1;\
LOG_WRONG(option,arg, "wait for args")\
}\
}\
PRINT_DEBUG("option %s activated, its value is %ld\n",#option,option);\
@@ -336,8 +364,9 @@ long int extract_num_after_equal_symbole_in_string(char * in_str){
#define IF_OPTION_WITH_ARG_STR(option)\
if(argv[i][0]=='-'){\
j=1;\
if(argv[i][j]=='-') ++j;\
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){\
@@ -363,16 +392,109 @@ long int extract_num_after_equal_symbole_in_string(char * in_str){
#define IF_OPTION_NO_ARG(option)\
if(argv[i][0]=='-'){\
j=1;\
if(argv[i][j]=='-') ++j;\
while(argv[i][j]=='-') ++j;\
if(argv[i][j] == #option[0]){\
option=1;\
continue;\
}\
}\
void extract_to_array_TYPE_SIZE_T(char * in_str){
size_t len=strlen(in_str);
long int val=0, p=10;
for(long i=0; i<len; ++i){
PRINT_DEBUG("(%s)[%ld]=%c\n",in_str,i,in_str[i]);
if(in_str[i]=='-'){/*we don't need the option name */
while((in_str[i] >= '0' && in_str[i] <= '9' ) || (in_str[i] >= 'A' && in_str[i] <= 'z' ) || (in_str[i]=='_')|| (in_str[i]=='-')){
++i;
}
}
else if(in_str[i] >= '0' && in_str[i] <= '9' ){
val = (p * val) + (in_str[i]-'0');
}
else{
/* rec val in array */
PRINT_DEBUG("val=(%ld) \n",val);
array_TYPE_SIZE_T[cur_array_TYPE_SIZE_T++]=val;
val=0;
}
}
PRINT_DEBUG("end val=(%ld) \n",val);
if(val)
array_TYPE_SIZE_T[cur_array_TYPE_SIZE_T++]=val;
}
void extract_to_array_TYPE_STRING(char * in_str){
size_t len=strlen(in_str);
char *val=malloc(len);
size_t cur_val=0;
for(long i=0; i<len; ++i){
if(in_str[i]=='-'){/*we don't need the option name */
while((in_str[i] >= '0' && in_str[i] <= '9' ) || (in_str[i] >= 'A' && in_str[i] <= 'z' ) || (in_str[i]=='_')|| (in_str[i]=='-')){
++i;
}
}
else if((in_str[i] >= '0' && in_str[i] <= '9' ) || (in_str[i] >= 'A' && in_str[i] <= 'z' ) || (in_str[i]=='_')){
val[cur_val++] = in_str[i];
}
else{
/* rec val in array */
val[cur_val++]='\0';
PRINT_DEBUG("val_str=(((%s) cur_val=[%ld]\n",val,cur_val);
array_TYPE_STRING[cur_array_TYPE_STRING]=malloc(strlen(val));
strcpy(array_TYPE_STRING[cur_array_TYPE_STRING++],val);
cur_val=0;
}
}
if(cur_val){
val[cur_val++]='\0';
PRINT_DEBUG("val_str=(%s) cur_val=[%ld]\n",val,cur_val);
array_TYPE_STRING[cur_array_TYPE_STRING]=malloc(strlen(val));
strcpy(array_TYPE_STRING[cur_array_TYPE_STRING++],val);
}
}
#define IF_OPTION_WITH_MULTIPLE_ARG(option,type)\
if(argv[i][0]=='-'){\
j=1;\
while(argv[i][j]=='-') ++j;\
if(argv[i][j] == #option[0]){\
arg=argv[i];\
array_##type=malloc(sizeof(type)*count_tests);\
some_tests_selected= 1;\
do{\
extract_to_array_##type(argv[i]);\
PRINT_DEBUG("option=%s, cur = %ld, argv[%d]=%s\n",#option,cur_array_##type,i,argv[i]);\
}while(i<argc-1 && argv[++i][0] != '-');\
PRINT_DEBUG("after while option=%s, cur = %ld, argv[%d]=%s\n",#option,cur_array_##type,i,argv[i]);\
if(argv[i][0]=='-'){/* handle to allow next option */\
j=1;while(argv[i][j]=='-') ++j;\
if (argv[i][j] != #option[0]) --i;\
}\
PRINT_DEBUG("after if arc-1 option=%s, cur = %ld, i=%d, et argv[i+1]=%s\n",#option,cur_array_##type,i,argv[i+1]);\
continue;\
}\
}\
/*
* if no continue call, it means no match option!
*/
#define IF_NO_MATCH_DO_WRONG \
printf("option %s inconnu\n",argv[i]);\
help=1; some_thing_wrong=1; break;
void parse_options(int argc, char **argv){
int j;
char *arg;
for(int i=1; i<argc; ++i){
PRINT_DEBUG("argc=%d, argv[%d]=%s\n",argc,i,argv[i]);
IF_OPTION_NO_ARG(help)
@@ -383,11 +505,14 @@ void parse_options(int argc, char **argv){
IF_OPTION_NO_ARG(ordered)
IF_OPTION_NO_ARG(removelog)
IF_OPTION_NO_ARG(unicolour)
IF_OPTION_WITH_MULTIPLE_ARG(numsuit,TYPE_SIZE_T)
IF_OPTION_WITH_MULTIPLE_ARG(listsuite,TYPE_STRING)
IF_NO_MATCH_DO_WRONG
}
}
// ==================================================== end handle option ================================
/*
* print all TESTs failed
@@ -604,7 +729,8 @@ void end_execute_func(char *fun_ame, struct timespec start_t){
*/
void head_run(size_t nbtest, struct timespec *start_t){
clock_gettime(CLOCK_REALTIME, start_t);
PRINT_HK_C(GREEN_K, HK_EQ," Running %lu tests.\n",nbtest);
if(cur_array_TYPE_SIZE_T || cur_array_TYPE_STRING) PRINT_HK_C(GREEN_K, HK_EQ," Running tests.\n");
else PRINT_HK_C(GREEN_K, HK_EQ," Running %lu tests.\n",nbtest);
}
/*
@@ -625,29 +751,105 @@ stat_end_run(size_t ntst, struct timespec start_t){
PRINT_HK_C("","","\n%ld FAILED TESTS \n",count_fail_global);
}
}
bool is_in_array(size_t *array, size_t sz, size_t num){
bool found = false;
for(size_t i = 0; i < sz; ++i){
if(array[i] == num){
found = true;
/*
* need to separate num type and ptr type because of (void*)
* in the 2 below macros
*/
#define GEN_IS_IN_ARRAY_PTR(type)\
bool is_in_array_##type(type *array, type val){\
bool found = false;\
for(size_t i = 0; i < cur_array_##type; ++i){\
PRINT_DEBUG("compare |%s| in array and val: |%s|\n",type##_TO_STR(array[i]), type##_TO_STR(val));\
if(COMPARE_N_##type((void*)(array[i]),(void*)val ) == 0 ){\
found = true;\
break;\
}\
}\
PRINT_DEBUG(" val return = %d \n",found);\
return found;\
}\
#define GEN_IS_IN_ARRAY_NUM(type)\
bool is_in_array_##type(type *array, type val){\
bool found = false;\
for(size_t i = 0; i < cur_array_##type; ++i){\
PRINT_DEBUG("compare |%s| in array and val: |%s|\n",type##_TO_STR(array[i]), type##_TO_STR(val));\
if(COMPARE_N_##type((void*)(&array[i]),(void*)&val ) == 0 ){\
found = true;\
break;\
}\
}\
PRINT_DEBUG(" val return = %d \n",found);\
return found;\
}\
GEN_IS_IN_ARRAY_PTR(TYPE_STRING)
GEN_IS_IN_ARRAY_NUM(TYPE_SIZE_T)
/*
* extract name test between () beacuse the syntax is TEST(name_test)
*/
void extract_name_test_from_name(char *name_org, char **name_f){
size_t len=strlen(name_org);
long cur=-1;
char *name_test=malloc(len);
for(size_t i=0; i<len; ++i){
if(cur == -1 && name_org[i]=='(')
cur=0;
else if(cur >=0){
if(name_org[i] == ')')
break;
else
name_test[cur++]=name_org[i];
}
}
return found;
name_test[cur]='\0';
PRINT_DEBUG("name_test =%s\n",name_test);
*name_f = name_test;
}
#define CHECK_IF_SELECTED_TEST(name_f)\
exec_test=0;\
if(some_tests_selected == 0){\
exec_test=1; \
}\
else{\
if(cur_array_TYPE_SIZE_T){\
num_f=extract_num__f(name_f) ;\
exec_test = is_in_array_TYPE_SIZE_T(array_TYPE_SIZE_T, num_f);\
}\
if(exec_test == 0 && cur_array_TYPE_STRING){\
extract_name_test_from_name(name_f, &name_test);\
exec_test = is_in_array_TYPE_STRING(array_TYPE_STRING, name_test );\
free(name_test);\
}\
}\
void execute_all(struct func *fun){
struct func *tmp = fun;
struct timespec start_t;
size_t num_f;
char *name_test=NULL;
bool exec_test=0;
//PRINT_HK_C(GREEN_K, HK_EQ," Running %lu tests.\n",count_tests);
while(tmp){
CHECK_IF_SELECTED_TEST(tmp->name)
if(exec_test){
begin_execute_func(tmp->name, &start_t);
tmp->run();
end_execute_func(tmp->name, start_t);
}
tmp = tmp->next;
}
}
/*
void execute_one_test(struct func *fun, size_t num){
size_t cur = 0;
struct timespec start_t;
@@ -747,7 +949,7 @@ run_all_tests_exept(size_t cnt, ... )
if(count_tests >= cnt)
stat_end_run(count_tests - cnt, start_t);
}
*/
void
run_all_tests()
@@ -755,7 +957,8 @@ run_all_tests()
struct timespec start_t;
head_run(count_tests, &start_t);
execute_all(f_beging);
stat_end_run(count_tests, start_t);
//stat_end_run(count_tests, start_t);
stat_end_run(count_pass_global + count_fail_global, start_t);
}
#if 0
@@ -796,7 +999,8 @@ run_all_div_tests(void *id)
*/
void head_all_parallel_run(struct timespec *start_t){
clock_gettime(CLOCK_REALTIME, start_t);
PRINT_HK_C(GREEN_K, HK_EQ," Running tests on %ld threads\n", parallel_nb);
if (cur_array_TYPE_SIZE_T || cur_array_TYPE_STRING) PRINT_HK_C(GREEN_K, HK_EQ," Running tests on %ld threads\n", parallel_nb);
else PRINT_HK_C(GREEN_K, HK_EQ," Running %ld tests on %ld threads\n",count_tests, parallel_nb);
}
/*
@@ -936,6 +1140,9 @@ void execute_test_parallel(size_t id_thrd){
struct timespec start_t;
struct func *tmp;
size_t num_f;
char *name_test=NULL;
bool exec_test=0;
do{
LOCK(mut_current_test);
@@ -943,11 +1150,14 @@ void execute_test_parallel(size_t id_thrd){
if(tmp){
current_fn = tmp->next;
UNLOCK(mut_current_test);
CHECK_IF_SELECTED_TEST(tmp->name)
if(exec_test){
PRINT_DEBUG(" *** thread[%ld], func_name = %s *** \n", id_thrd, tmp->name);
begin_execute_func_parallel(tmp->name, &start_t, id_thrd);
tmp->run();
end_execute_func_parallel(tmp->name, start_t, id_thrd);
}
}
else{
UNLOCK(mut_current_test);
}
@@ -1104,7 +1314,8 @@ if(progress) pthread_create(&thrd_progress, NULL, run_progress_tests, NULL);
if(progress) pthread_join(thrd_progress, NULL);
stat_end_all_parallel_run(count_tests, start_t );
//stat_end_all_parallel_run(count_tests, start_t );
stat_end_all_parallel_run(count_pass_global + count_fail_global, start_t );
free(id_th);
free(thrd);
+2
View File
@@ -169,9 +169,11 @@ 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);
/*
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*/);
+1
View File
@@ -102,6 +102,7 @@ TYPE_STRING TYPE_STRING_TO_STR(TYPE_STRING var){
int
COMPARE_N_TYPE_STRING(const void *a,const void* b)
{
PRINT_DEBUG("a=%s, b=%s\n",(char*)a, (char*)b);
return strcmp(( char*)a,( char*)b);
}
+4
View File
@@ -26,6 +26,8 @@ TEST(size_permutation)
EXPECT_EQ(p->size, 3);
PRINTF("test size_permutation2\n");
}
#if 1
TEST(size_permutation2){
PRINTF("another size_permutation2 again false\n");
bool val_bool = false;
@@ -141,6 +143,8 @@ TEST(sleep){sleep(2);}
TEST(sleep){sleep(2);}
TEST(sleep){sleep(2);}
#endif
int main(int argc, char **argv){
//run_all_tests();