exactness: Initial version of recording lib.
TODO: Need to refine, clean code. TODO: Later fix tests issues. Signed-off-by: Aharon Hillel <a.hillel@partner.samsung.com> SVN revision: 67921
This commit is contained in:
parent
9c25a64c18
commit
034738063c
337
src/bin/tsuite.c
337
src/bin/tsuite.c
|
@ -4,7 +4,6 @@
|
|||
#include <Elementary.h>
|
||||
#include "tsuite.h"
|
||||
|
||||
#define IMAGE_FILENAME_EXT ".png"
|
||||
#include <dlfcn.h>
|
||||
#include "tsuite_file_data.h"
|
||||
#include <Ecore.h>
|
||||
|
@ -105,24 +104,6 @@ void test_tooltip2(void);
|
|||
static Lists_st *vr_list = NULL;
|
||||
/* END - Some globals - may want to move these to Timer_Data struct later */
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @struct _Tsuite_Data
|
||||
* Struct holds test-suite data-properties
|
||||
*
|
||||
* @ingroup Tsuite
|
||||
*/
|
||||
struct _Tsuite_Data
|
||||
{
|
||||
char *name; /**< Test Name */
|
||||
int serial; /**< Serial number of currnen-file */
|
||||
api_data *api;
|
||||
Evas *e;
|
||||
Evas_Object *win;
|
||||
};
|
||||
typedef struct _Tsuite_Data Tsuite_Data;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
|
@ -139,9 +120,14 @@ struct _Test_Item
|
|||
};
|
||||
typedef struct _Test_Item Test_Item;
|
||||
|
||||
static Tsuite_Data ts;
|
||||
/* static Tsuite_Data ts; moved to tsuite_evas_hook */
|
||||
static int recording = 0;
|
||||
static char *dest_dir = NULL;
|
||||
|
||||
void
|
||||
tsuite_init(Evas_Object *win, char *name, api_data *d)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Eina_List *
|
||||
_add_test(Eina_List *list, char *n, void (* f) (void), Eina_Bool t)
|
||||
|
@ -179,7 +165,7 @@ _init_recording_funcs(void)
|
|||
_tsuite_evas_hook_init = dlsym(RTLD_DEFAULT, "tsuite_evas_hook_init");
|
||||
_tsuite_evas_hook_reset = dlsym(RTLD_DEFAULT, "tsuite_evas_hook_reset");
|
||||
}
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
|
@ -234,12 +220,12 @@ tsuite_cleanup(void)
|
|||
|
||||
memset(&ts, 0, sizeof(ts));
|
||||
}
|
||||
|
||||
char *tsuite_test_name_get()
|
||||
{
|
||||
return ts.name;
|
||||
}
|
||||
|
||||
#endif
|
||||
#if 0 /* moved to tsuite_evas_hook */
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
|
@ -305,274 +291,15 @@ tsuite_shot_do(Evas_Object *obj, char *name)
|
|||
ecore_evas_free(ee);
|
||||
free(filename);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
evt_time_get(unsigned int tm, Variant_st *v)
|
||||
{
|
||||
switch(tsuite_event_mapping_type_get(v->t.type))
|
||||
{
|
||||
case TSUITE_EVENT_MOUSE_IN:
|
||||
{
|
||||
mouse_in_mouse_out *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_OUT:
|
||||
{
|
||||
mouse_in_mouse_out *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_DOWN:
|
||||
{
|
||||
mouse_down_mouse_up *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_UP:
|
||||
{
|
||||
mouse_down_mouse_up *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_MOVE:
|
||||
{
|
||||
mouse_move *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_WHEEL:
|
||||
{
|
||||
mouse_wheel *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_DOWN:
|
||||
{
|
||||
multi_event *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_UP:
|
||||
{
|
||||
multi_event *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_MOVE:
|
||||
{
|
||||
multi_move *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_KEY_DOWN:
|
||||
{
|
||||
key_down_key_up *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_KEY_UP:
|
||||
{
|
||||
key_down_key_up *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_TAKE_SHOT:
|
||||
{
|
||||
take_screenshot *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
default: /* All non-input events are not handeled */
|
||||
return tm;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
tsuite_feed_event(void *data)
|
||||
{
|
||||
static Ecore_Timer *tmr = NULL;
|
||||
Timer_Data *td = data;
|
||||
time_t evt_time;
|
||||
if (!td)
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
|
||||
Variant_st *v = eina_list_data_get(td->current_event);
|
||||
switch(tsuite_event_mapping_type_get(v->t.type))
|
||||
{
|
||||
case TSUITE_EVENT_MOUSE_IN:
|
||||
{
|
||||
mouse_in_mouse_out *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_in timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_in(td->e, time(NULL), NULL);
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_OUT:
|
||||
{
|
||||
mouse_in_mouse_out *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_out timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_out(td->e, time(NULL), NULL);
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_DOWN:
|
||||
{
|
||||
mouse_down_mouse_up *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_down timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_down(td->e, t->b, t->flags, time(NULL),
|
||||
NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_UP:
|
||||
{
|
||||
mouse_down_mouse_up *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_up timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_up(td->e, t->b, t->flags, time(NULL),
|
||||
NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_MOVE:
|
||||
{
|
||||
mouse_move *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_move (x,y)=(%d,%d) timestamp=<%u>\n", __func__, t->x, t->y, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_move(td->e, t->x, t->y, time(NULL), NULL);
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_WHEEL:
|
||||
{
|
||||
mouse_wheel *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_wheel timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_wheel(td->e, t->direction, t->z,
|
||||
time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_DOWN:
|
||||
{
|
||||
multi_event *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_multi_down timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_multi_down(td->e, t->d, t->x, t->y, t->rad,
|
||||
t->radx, t->rady, t->pres, t->ang, t->fx, t->fy,
|
||||
t->flags, time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_UP:
|
||||
{
|
||||
multi_event *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_multi_up timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_multi_up(td->e, t->d, t->x, t->y, t->rad,
|
||||
t->radx, t->rady, t->pres, t->ang, t->fx, t->fy,
|
||||
t->flags, time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_MOVE:
|
||||
{
|
||||
multi_move *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_multi_move timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_multi_move(td->e, t->d, t->x, t->y, t->rad,
|
||||
t->radx, t->rady, t->pres, t->ang, t->fx, t->fy,
|
||||
time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_KEY_DOWN:
|
||||
{
|
||||
key_down_key_up *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_key_down timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_key_down(td->e, t->keyname, t->key, t->string,
|
||||
t->compose, time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_KEY_UP:
|
||||
{
|
||||
key_down_key_up *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_key_up timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_key_up(td->e, t->keyname, t->key, t->string,
|
||||
t->compose, time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_TAKE_SHOT:
|
||||
{
|
||||
take_screenshot *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s take shot timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
tsuite_shot_do(ts.win, NULL); /* Serial name based on test-name */
|
||||
break;
|
||||
}
|
||||
default: /* All non-input events are not handeled */
|
||||
evt_time = td->recent_event_time;
|
||||
break;
|
||||
}
|
||||
|
||||
double timer_time;
|
||||
td->current_event = eina_list_next(td->current_event);
|
||||
|
||||
if (!td->current_event)
|
||||
{ /* Finished reading all events */
|
||||
elm_exit();
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
}
|
||||
|
||||
td->recent_event_time = evt_time;
|
||||
|
||||
unsigned int current_event_time = evt_time_get(evt_time, eina_list_data_get(td->current_event));
|
||||
|
||||
if (current_event_time < td->recent_event_time) /* Could happen with refeed event */
|
||||
current_event_time = td->recent_event_time;
|
||||
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s td->recent_event_time=<%u> current_event_time=<%u>\n", __func__, td->recent_event_time, current_event_time);
|
||||
#endif
|
||||
timer_time = (current_event_time - td->recent_event_time) / 1000.0;
|
||||
|
||||
if (!td->recent_event_time)
|
||||
timer_time = 0.0;
|
||||
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s timer_time=<%f>\n", __func__, timer_time);
|
||||
#endif
|
||||
tmr = ecore_timer_add(timer_time, tsuite_feed_event, td);
|
||||
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
}
|
||||
|
||||
void
|
||||
_test_close_win(void *data __UNUSED__, Evas_Object *obj __UNUSED__,
|
||||
void *event_info __UNUSED__)
|
||||
{
|
||||
ts.win = NULL;
|
||||
// ts.win = NULL;
|
||||
elm_exit();
|
||||
}
|
||||
|
||||
#if 0 /* Moved to tsuite_file_data */
|
||||
static Lists_st *
|
||||
free_events(Lists_st *st)
|
||||
{
|
||||
|
@ -599,26 +326,26 @@ free_events(Lists_st *st)
|
|||
free(st); /* Allocated when reading data from EET file */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
void
|
||||
do_test(char *rec_dir, void (* func) (void))
|
||||
{
|
||||
char buf[1024];
|
||||
char appname[1024];
|
||||
|
||||
vr_list = calloc(1, sizeof(*vr_list));
|
||||
if (recording)
|
||||
_tsuite_evas_hook_init(vr_list);
|
||||
// vr_list = calloc(1, sizeof(*vr_list));
|
||||
/* if (recording) done now in ecore_init() hook
|
||||
_tsuite_evas_hook_init(vr_list); */
|
||||
|
||||
if (func)
|
||||
{ /* Regular test with access func */
|
||||
func();
|
||||
sprintf(buf, "%s/%s.rec", rec_dir, ts.name);
|
||||
sprintf(buf, "%s/%s.rec", rec_dir, "ts.name");
|
||||
}
|
||||
else
|
||||
{ /* Application, compose rec-file path and fulll appname */
|
||||
sprintf(buf, "%s/%s.rec", rec_dir, basename(ts.name));
|
||||
|
||||
sprintf(buf, "%s/%s.rec", rec_dir, "basename(ts.name)");
|
||||
#if 0
|
||||
if (basename(ts.name) == ts.name)
|
||||
{ /* No PATH given, use cwd */
|
||||
getcwd(appname, 1024);
|
||||
|
@ -626,7 +353,8 @@ do_test(char *rec_dir, void (* func) (void))
|
|||
strcat(appname, ts.name);
|
||||
}
|
||||
else
|
||||
strcpy(appname, ts.name); /* PATH incuded in ts.name */
|
||||
#endif
|
||||
strcpy(appname, "ts.name"); /* PATH incuded in ts.name */
|
||||
}
|
||||
|
||||
if (recording)
|
||||
|
@ -641,13 +369,15 @@ do_test(char *rec_dir, void (* func) (void))
|
|||
system(appname);
|
||||
}
|
||||
|
||||
if (vr_list)
|
||||
write_events(buf, vr_list);
|
||||
/* if (vr_list)
|
||||
write_events(buf, vr_list); */
|
||||
}
|
||||
else
|
||||
{
|
||||
Timer_Data *td = NULL;
|
||||
|
||||
if (func)
|
||||
elm_run(); /* run the program now and handle all events etc */
|
||||
#if 0
|
||||
td = calloc(1, sizeof(Timer_Data));
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("rec file is <%s>\n", buf);
|
||||
|
@ -667,16 +397,17 @@ do_test(char *rec_dir, void (* func) (void))
|
|||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
if (td)
|
||||
free(td);
|
||||
}
|
||||
|
||||
|
||||
if (recording)
|
||||
_tsuite_evas_hook_reset();
|
||||
/* if (recording) done in ecore_shutdown() hook now
|
||||
_tsuite_evas_hook_reset(); */
|
||||
|
||||
if (vr_list)
|
||||
vr_list = free_events(vr_list);
|
||||
/* if (vr_list) will be done in tsuite_evas_hook_reset()
|
||||
vr_list = free_events(vr_list); */
|
||||
}
|
||||
|
||||
EAPI int
|
||||
|
@ -767,9 +498,9 @@ elm_main(int argc, char **argv)
|
|||
elm_app_compile_data_dir_set(PACKAGE_DATA_DIR);
|
||||
elm_app_info_set(elm_main, "elementary", "images/logo.png");
|
||||
|
||||
if (opt_destdir)
|
||||
/* if (opt_destdir)
|
||||
dest_dir = opt_destdir->data;
|
||||
|
||||
*/
|
||||
if (opt_basedir)
|
||||
rec_dir = opt_basedir->data;
|
||||
|
||||
|
@ -954,7 +685,7 @@ elm_main(int argc, char **argv)
|
|||
EINA_LIST_FREE(tests, data)
|
||||
free(data);
|
||||
|
||||
tsuite_cleanup();
|
||||
// tsuite_cleanup();
|
||||
/* if the mainloop that elm_run() runs exist - we exit the app */
|
||||
elm_shutdown(); /* clean up and shut down */
|
||||
|
||||
|
|
|
@ -48,11 +48,11 @@ _test_close_win(void *data, Evas_Object *obj, void *event_info);
|
|||
}
|
||||
|
||||
#define TEST_SHOT(x) \
|
||||
tsuite_shot_do(win, x)
|
||||
tsuite_shot_do(x)
|
||||
|
||||
void tsuite_init(Evas_Object *win, char *name, api_data *d);
|
||||
void tsuite_cleanup(void);
|
||||
void tsuite_shot_do(Evas_Object *obj, char *name);
|
||||
void tsuite_shot_do(char *name);
|
||||
char *tsuite_test_name_get();
|
||||
Eina_Bool write_events_get(void);
|
||||
void write_events_set(Eina_Bool val);
|
||||
|
@ -99,7 +99,7 @@ struct _Variant_st
|
|||
* for the field*/
|
||||
};
|
||||
typedef struct _Variant_st Variant_st;
|
||||
|
||||
/* Moved to tsuite_file_data.h
|
||||
struct _Timer_Data
|
||||
{
|
||||
Eet_File *fp;
|
||||
|
@ -108,6 +108,6 @@ struct _Timer_Data
|
|||
Eina_List *current_event;
|
||||
};
|
||||
typedef struct _Timer_Data Timer_Data;
|
||||
|
||||
*/
|
||||
void variant_list_append(Variant_st *v);
|
||||
#endif
|
||||
|
|
|
@ -10,7 +10,10 @@
|
|||
#include "tsuite_file_data.h"
|
||||
#include "tsuite.h"
|
||||
|
||||
#define TSUITE_MAX_PATH 1024
|
||||
#define SHOT_KEY_STR "F2"
|
||||
#define IMAGE_FILENAME_EXT ".png"
|
||||
#define DEBUG_TSUITE 1
|
||||
/* START - EET Handling code */
|
||||
struct _Eet_Event_Type
|
||||
{
|
||||
|
@ -25,13 +28,230 @@ struct _evas_hook_setting
|
|||
char *base_dir;
|
||||
char *dest_dir;
|
||||
char *test_name;
|
||||
/* TODO: What about api-data? currently freed in tsuite_cleanup() */
|
||||
char *file_name;
|
||||
};
|
||||
typedef struct _evas_hook_setting evas_hook_setting;
|
||||
|
||||
static char *shot_key = SHOT_KEY_STR;
|
||||
static Lists_st *vr_list = NULL;
|
||||
static evas_hook_setting *_hook_setting = NULL;
|
||||
static Tsuite_Data ts;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* This function initiates Tsuite_Data
|
||||
* @param name defines test-name
|
||||
* @param Pointer_Event Pointer to PE.
|
||||
*
|
||||
* @ingroup Tsuite
|
||||
*/
|
||||
|
||||
static unsigned int
|
||||
evt_time_get(unsigned int tm, Variant_st *v)
|
||||
{
|
||||
switch(tsuite_event_mapping_type_get(v->t.type))
|
||||
{
|
||||
case TSUITE_EVENT_MOUSE_IN:
|
||||
{
|
||||
mouse_in_mouse_out *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_OUT:
|
||||
{
|
||||
mouse_in_mouse_out *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_DOWN:
|
||||
{
|
||||
mouse_down_mouse_up *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_UP:
|
||||
{
|
||||
mouse_down_mouse_up *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_MOVE:
|
||||
{
|
||||
mouse_move *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_WHEEL:
|
||||
{
|
||||
mouse_wheel *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_DOWN:
|
||||
{
|
||||
multi_event *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_UP:
|
||||
{
|
||||
multi_event *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_MOVE:
|
||||
{
|
||||
multi_move *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_KEY_DOWN:
|
||||
{
|
||||
key_down_key_up *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_KEY_UP:
|
||||
{
|
||||
key_down_key_up *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
case TSUITE_EVENT_TAKE_SHOT:
|
||||
{
|
||||
take_screenshot *t = v->data;
|
||||
return t->timestamp;
|
||||
}
|
||||
default: /* All non-input events are not handeled */
|
||||
return tm;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
tsuite_init(Evas_Object *win, char *name, api_data *d)
|
||||
{
|
||||
tsuite_cleanup();
|
||||
if (!name)
|
||||
return;
|
||||
|
||||
ts.name = strdup(name); /* Freed by tsuite_cleanup */
|
||||
ts.win = win;
|
||||
if (d)
|
||||
{ /* This field is not used when testing APPs */
|
||||
ts.api = d;
|
||||
ts.api->win = win;
|
||||
}
|
||||
|
||||
ts.e = evas_object_evas_get(ts.win);
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* This function do cleanup for Tsuite
|
||||
* @param Tsuite_Data * data for cleanup.
|
||||
*
|
||||
* @ingroup Tsuite
|
||||
*/
|
||||
void
|
||||
tsuite_cleanup(void)
|
||||
{
|
||||
if (ts.name)
|
||||
free(ts.name);
|
||||
|
||||
if (ts.api)
|
||||
{
|
||||
if (ts.api->data && ts.api->free_data)
|
||||
free(ts.api->data);
|
||||
|
||||
free(ts.api);
|
||||
}
|
||||
|
||||
/* if (ts.win)
|
||||
evas_object_del(ts.win);
|
||||
*/
|
||||
memset(&ts, 0, sizeof(ts));
|
||||
}
|
||||
|
||||
EAPI void
|
||||
tsuite_evas_hook_init(void)
|
||||
{ /* Pointer taken from tsuite.c */
|
||||
shot_key = getenv("TSUITE_SHOT_KEY");
|
||||
if (!shot_key) shot_key = SHOT_KEY_STR;
|
||||
|
||||
if (!vr_list)
|
||||
vr_list = calloc(1, sizeof(*vr_list));
|
||||
}
|
||||
|
||||
EAPI void
|
||||
tsuite_evas_hook_reset(void)
|
||||
{ /* tsuite.c informs us that vr_list is no longer valid */
|
||||
if (vr_list)
|
||||
vr_list = free_events(vr_list, _hook_setting->recording);
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* This function takes actual shot and saves it in PNG
|
||||
* @param data Tsuite_Data pointer initiated by user
|
||||
* @param obj Window pointer
|
||||
* @param obj name file name. Will use name_+serial if NULL
|
||||
*
|
||||
* @ingroup Tsuite
|
||||
*/
|
||||
void
|
||||
tsuite_shot_do(char *name)
|
||||
{
|
||||
printf("<%s> --- 1 ---\n", __func__);
|
||||
if (!ts.e)
|
||||
return;
|
||||
|
||||
printf("<%s> --- 2 ---\n", __func__);
|
||||
Ecore_Evas *ee, *ee_orig;
|
||||
Evas_Object *o;
|
||||
unsigned int *pixels;
|
||||
int w, h,dir_name_len = 0;
|
||||
char *filename;
|
||||
if (_hook_setting->dest_dir)
|
||||
dir_name_len = strlen(_hook_setting->dest_dir) + 1; /* includes space of a '/' */
|
||||
|
||||
if (name)
|
||||
{
|
||||
filename = malloc(strlen(name) + strlen(IMAGE_FILENAME_EXT) +
|
||||
dir_name_len + 4);
|
||||
|
||||
if (_hook_setting->dest_dir)
|
||||
sprintf(filename, "%s/", _hook_setting->dest_dir);
|
||||
|
||||
sprintf(filename + dir_name_len, "%s%s", name, IMAGE_FILENAME_EXT);
|
||||
}
|
||||
else
|
||||
{
|
||||
filename = malloc(strlen(ts.name) + strlen(IMAGE_FILENAME_EXT) +
|
||||
dir_name_len + 8); /* also space for serial */
|
||||
|
||||
ts.serial++;
|
||||
if (_hook_setting->dest_dir)
|
||||
sprintf(filename, "%s/", _hook_setting->dest_dir);
|
||||
|
||||
sprintf(filename + dir_name_len, "%s_%d%s", ts.name ,ts.serial,
|
||||
IMAGE_FILENAME_EXT);
|
||||
}
|
||||
|
||||
printf("<%s> file=<%s>--- 3 ---\n", __func__, filename);
|
||||
/* A bit hackish, get the ecore_evas from the Evas canvas */
|
||||
ee_orig = evas_data_attach_get(ts.e);
|
||||
|
||||
ecore_evas_manual_render(ee_orig);
|
||||
pixels = (void *)ecore_evas_buffer_pixels_get(ee_orig);
|
||||
if (!pixels) return;
|
||||
ecore_evas_geometry_get(ee_orig, NULL, NULL, &w, &h);
|
||||
if ((w < 1) || (h < 1)) return;
|
||||
ee = ecore_evas_buffer_new(1, 1);
|
||||
o = evas_object_image_add(ecore_evas_get(ee));
|
||||
evas_object_image_alpha_set(o, ecore_evas_alpha_get(ee_orig));
|
||||
evas_object_image_size_set(o, w, h);
|
||||
evas_object_image_data_set(o, pixels);
|
||||
|
||||
if (!evas_object_image_save(o, filename, NULL, NULL))
|
||||
{
|
||||
printf("Cannot save widget to <%s>\n", filename);
|
||||
}
|
||||
ecore_evas_free(ee);
|
||||
free(filename);
|
||||
}
|
||||
|
||||
EAPI int
|
||||
ecore_init(void)
|
||||
|
@ -42,12 +262,23 @@ ecore_init(void)
|
|||
printf("<%s> Calling %s\n", __FILE__, __func__);
|
||||
if (!_hook_setting)
|
||||
{
|
||||
printf("<%s> TSUITE_INI! %s\n", __FILE__, __func__);
|
||||
_hook_setting = calloc(1, sizeof(evas_hook_setting));
|
||||
_hook_setting->recording = getenv("TSUITE_RECORDING");
|
||||
_hook_setting->base_dir = getenv("TSUITE_BASE_DIR");
|
||||
_hook_setting->dest_dir = getenv("TSUITE_DEST_DIR");
|
||||
_hook_setting->test_name = getenv("TSUITE_TEST_NAME");
|
||||
_hook_setting->file_name = getenv("TSUITE_FILE_NAME");
|
||||
|
||||
printf("<%s> test_name=<%s>\n", __func__, _hook_setting->test_name);
|
||||
printf("<%s> base_dir=<%s>\n", __func__, _hook_setting->base_dir);
|
||||
printf("<%s> dest_dir=<%s>\n", __func__, _hook_setting->dest_dir);
|
||||
printf("<%s> recording=<%s>\n", __func__, _hook_setting->recording);
|
||||
printf("<%s> rec file is <%s>\n", __func__, _hook_setting->file_name);
|
||||
|
||||
if (_hook_setting->recording)
|
||||
tsuite_evas_hook_init();
|
||||
|
||||
printf("<%s> TSUITE_INI! %s\n", __FILE__, __func__);
|
||||
}
|
||||
|
||||
return _ecore_init();
|
||||
|
@ -62,11 +293,20 @@ ecore_shutdown(void)
|
|||
printf("<%s> Calling %s\n", __FILE__, __func__);
|
||||
if (_hook_setting)
|
||||
{
|
||||
printf("<%s> TSUITE_SHUTDOWN! %s\n", __FILE__, __func__);
|
||||
if (vr_list && _hook_setting->recording)
|
||||
write_events(_hook_setting->file_name, vr_list);
|
||||
|
||||
tsuite_evas_hook_reset();
|
||||
|
||||
free(_hook_setting);
|
||||
_hook_setting = NULL;
|
||||
printf("<%s> TSUITE_SHUTDOWN! %s\n", __FILE__, __func__);
|
||||
}
|
||||
|
||||
if (ts.td)
|
||||
free(ts.td);
|
||||
|
||||
tsuite_cleanup();
|
||||
return _ecore_shutdown();
|
||||
}
|
||||
|
||||
|
@ -76,8 +316,213 @@ evas_new(void)
|
|||
Evas * (*_evas_new)(void) =
|
||||
dlsym(RTLD_NEXT, "evas_new");
|
||||
|
||||
ts.e = _evas_new();
|
||||
printf("<%s> Calling %s\n", __FILE__, __func__);
|
||||
return _evas_new();
|
||||
return ts.e;
|
||||
}
|
||||
|
||||
Evas_Object *
|
||||
elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type)
|
||||
{
|
||||
printf("<%s> Calling %s\n", __FILE__, __func__);
|
||||
Evas_Object * (*_elm_win_add)(Evas_Object *, const char*, Elm_Win_Type) =
|
||||
dlsym(RTLD_NEXT, "elm_win_add");
|
||||
|
||||
Evas_Object *win = _elm_win_add(parent, name, type);
|
||||
|
||||
ts.name = strdup(name); /* Freed by tsuite_cleanup */
|
||||
ts.win = win;
|
||||
// ts.e = evas_object_evas_get(ts.win);
|
||||
|
||||
return win;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
tsuite_feed_event(void *data)
|
||||
{
|
||||
static Ecore_Timer *tmr = NULL;
|
||||
Timer_Data *td = data;
|
||||
time_t evt_time;
|
||||
if (!td)
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
|
||||
Variant_st *v = eina_list_data_get(td->current_event);
|
||||
switch(tsuite_event_mapping_type_get(v->t.type))
|
||||
{
|
||||
case TSUITE_EVENT_MOUSE_IN:
|
||||
{
|
||||
mouse_in_mouse_out *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_in timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_in(td->e, time(NULL), NULL);
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_OUT:
|
||||
{
|
||||
mouse_in_mouse_out *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_out timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_out(td->e, time(NULL), NULL);
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_DOWN:
|
||||
{
|
||||
mouse_down_mouse_up *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_down timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_down(td->e, t->b, t->flags, time(NULL),
|
||||
NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_UP:
|
||||
{
|
||||
mouse_down_mouse_up *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_up timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_up(td->e, t->b, t->flags, time(NULL),
|
||||
NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_MOVE:
|
||||
{
|
||||
mouse_move *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_move (x,y)=(%d,%d) timestamp=<%u>\n", __func__, t->x, t->y, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_move(td->e, t->x, t->y, time(NULL), NULL);
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MOUSE_WHEEL:
|
||||
{
|
||||
mouse_wheel *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_mouse_wheel timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_mouse_wheel(td->e, t->direction, t->z,
|
||||
time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_DOWN:
|
||||
{
|
||||
multi_event *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_multi_down timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_multi_down(td->e, t->d, t->x, t->y, t->rad,
|
||||
t->radx, t->rady, t->pres, t->ang, t->fx, t->fy,
|
||||
t->flags, time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_UP:
|
||||
{
|
||||
multi_event *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_multi_up timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_multi_up(td->e, t->d, t->x, t->y, t->rad,
|
||||
t->radx, t->rady, t->pres, t->ang, t->fx, t->fy,
|
||||
t->flags, time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_MULTI_MOVE:
|
||||
{
|
||||
multi_move *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_multi_move timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_multi_move(td->e, t->d, t->x, t->y, t->rad,
|
||||
t->radx, t->rady, t->pres, t->ang, t->fx, t->fy,
|
||||
time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_KEY_DOWN:
|
||||
{
|
||||
key_down_key_up *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_key_down timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_key_down(td->e, t->keyname, t->key, t->string,
|
||||
t->compose, time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_KEY_UP:
|
||||
{
|
||||
key_down_key_up *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s evas_event_feed_key_up timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
evas_event_feed_key_up(td->e, t->keyname, t->key, t->string,
|
||||
t->compose, time(NULL), NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
case TSUITE_EVENT_TAKE_SHOT:
|
||||
{
|
||||
take_screenshot *t = v->data;
|
||||
evt_time = t->timestamp;
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s take shot timestamp=<%u>\n", __func__, t->timestamp);
|
||||
#endif
|
||||
tsuite_shot_do(NULL); /* Serial name based on test-name */
|
||||
break;
|
||||
}
|
||||
default: /* All non-input events are not handeled */
|
||||
evt_time = td->recent_event_time;
|
||||
break;
|
||||
}
|
||||
|
||||
double timer_time;
|
||||
td->current_event = eina_list_next(td->current_event);
|
||||
|
||||
if (!td->current_event)
|
||||
{ /* Finished reading all events */
|
||||
elm_exit();
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
}
|
||||
|
||||
td->recent_event_time = evt_time;
|
||||
|
||||
unsigned int current_event_time = evt_time_get(evt_time, eina_list_data_get(td->current_event));
|
||||
|
||||
if (current_event_time < td->recent_event_time) /* Could happen with refeed event */
|
||||
current_event_time = td->recent_event_time;
|
||||
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s td->recent_event_time=<%u> current_event_time=<%u>\n", __func__, td->recent_event_time, current_event_time);
|
||||
#endif
|
||||
timer_time = (current_event_time - td->recent_event_time) / 1000.0;
|
||||
|
||||
if (!td->recent_event_time)
|
||||
timer_time = 0.0;
|
||||
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("%s timer_time=<%f>\n", __func__, timer_time);
|
||||
#endif
|
||||
tmr = ecore_timer_add(timer_time, tsuite_feed_event, td);
|
||||
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -86,31 +531,28 @@ ecore_main_loop_begin(void)
|
|||
void (*_ecore_main_loop_begin)(void) =
|
||||
dlsym(RTLD_NEXT, "ecore_main_loop_begin");
|
||||
|
||||
|
||||
if (!_hook_setting->recording && _hook_setting->file_name)
|
||||
{
|
||||
ts.td = calloc(1, sizeof(Timer_Data));
|
||||
#ifdef DEBUG_TSUITE
|
||||
printf("<%s> rec file is <%s>\n", _hook_setting->file_name);
|
||||
#endif
|
||||
vr_list = read_events(_hook_setting->file_name, ts.e, ts.td);
|
||||
if (ts.td->current_event)
|
||||
{ /* Got first event in list, run test */
|
||||
tsuite_feed_event(ts.td);
|
||||
}
|
||||
}
|
||||
|
||||
printf("<%s> Calling %s\n", __FILE__, __func__);
|
||||
return _ecore_main_loop_begin();
|
||||
}
|
||||
|
||||
EAPI void
|
||||
tsuite_evas_hook_init(void)
|
||||
{ /* Pointer taken from tsuite.c */
|
||||
vr_list = calloc(1, sizeof(*vr_list));
|
||||
shot_key = getenv("TSUITE_SHOT_KEY");
|
||||
if (!shot_key) shot_key = SHOT_KEY_STR;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
tsuite_evas_hook_reset(void)
|
||||
{ /* tsuite.c informs us that vr_list is no longer valid */
|
||||
if (vr_list)
|
||||
free(vr_list);
|
||||
|
||||
vr_list = NULL;
|
||||
}
|
||||
|
||||
/* Adding variant to list, this list is later written to EET file */
|
||||
#define ADD_TO_LIST(EVT_TYPE, EVT_STRUCT_NAME, INFO) \
|
||||
do { /* This macro will add event to EET data list */ \
|
||||
if (vr_list) \
|
||||
if (vr_list && _hook_setting->recording) \
|
||||
{ \
|
||||
Variant_st *v = malloc(sizeof(Variant_st)); \
|
||||
v->data = malloc(sizeof(EVT_STRUCT_NAME)); \
|
||||
|
|
|
@ -48,6 +48,33 @@ tsuite_event_mapping_type_str_get(Tsuite_Event_Type t)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
Lists_st *
|
||||
free_events(Lists_st *st, char *recording)
|
||||
{
|
||||
Variant_st *v;
|
||||
EINA_LIST_FREE(st->variant_list, v)
|
||||
{
|
||||
if (recording)
|
||||
{
|
||||
Tsuite_Event_Type e = tsuite_event_mapping_type_get(v->t.type);
|
||||
if ((e == TSUITE_EVENT_KEY_DOWN) || (e == TSUITE_EVENT_KEY_UP))
|
||||
{ /* Allocated in tsuite_evas_hook.c */
|
||||
key_down_key_up *t = v->data;
|
||||
eina_stringshare_del(t->keyname);
|
||||
eina_stringshare_del(t->key);
|
||||
eina_stringshare_del(t->string);
|
||||
eina_stringshare_del(t->compose);
|
||||
}
|
||||
}
|
||||
|
||||
free(v->data);
|
||||
free(v);
|
||||
}
|
||||
|
||||
free(st); /* Allocated when reading data from EET file */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
write_events(const char *filename, Lists_st *vr_list)
|
||||
{
|
||||
|
|
|
@ -5,6 +5,34 @@
|
|||
|
||||
#define CACHE_FILE_ENTRY "cache"
|
||||
|
||||
struct _Timer_Data
|
||||
{
|
||||
Eet_File *fp;
|
||||
unsigned int recent_event_time;
|
||||
Evas *e;
|
||||
Eina_List *current_event;
|
||||
};
|
||||
typedef struct _Timer_Data Timer_Data;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @struct _Tsuite_Data
|
||||
* Struct holds test-suite data-properties
|
||||
*
|
||||
* @ingroup Tsuite
|
||||
*/
|
||||
struct _Tsuite_Data
|
||||
{
|
||||
char *name; /**< Test Name */
|
||||
int serial; /**< Serial number of currnen-file */
|
||||
api_data *api;
|
||||
Evas *e;
|
||||
Evas_Object *win;
|
||||
Timer_Data *td;
|
||||
};
|
||||
typedef struct _Tsuite_Data Tsuite_Data;
|
||||
|
||||
struct _mouse_in_mouse_out
|
||||
{
|
||||
unsigned int timestamp;
|
||||
|
@ -94,7 +122,6 @@ typedef struct _mouse_in_mouse_out take_screenshot;
|
|||
#define TSUITE_EVENT_KEY_UP_STR "tsuite_event_key_up"
|
||||
#define TSUITE_EVENT_TAKE_SHOT_STR "tsuite_event_take_shot"
|
||||
|
||||
|
||||
struct _Lists_st
|
||||
{
|
||||
Eina_List *variant_list;
|
||||
|
@ -138,6 +165,7 @@ const char * tsuite_event_mapping_type_str_get(Tsuite_Event_Type t);
|
|||
const char * _variant_type_get(const void *data, Eina_Bool *unknow);
|
||||
Eina_Bool _variant_type_set(const char *type, void *data, Eina_Bool unknow);
|
||||
|
||||
Lists_st * free_events(Lists_st *st, char *recording);
|
||||
void write_events(const char *filename, Lists_st *vr_list);
|
||||
Lists_st *read_events(char *filename, Evas *e, Timer_Data *td);
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue