1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 #include "../lv_test_indev.h"
4 #include "unity/unity.h"
5 
6 #define TEST_HOVER_COUNTS   20
7 
8 typedef struct _test_hover_t {
9     /* data */
10     char id[32];
11     uint32_t counts;
12 } test_hover_t;
13 
14 static test_hover_t label_hovered;
15 static test_hover_t btn_hovered;
16 
17 static const lv_point_t pointer1[] = {
18     {0, 0}, {110, 20}, {150, 26}, {120, 19}, {0, 0},
19 };
20 
21 static const lv_point_t pointer2[] = {
22     {0, 0}, {60, 100}, {80, 100}, {120, 120}, {0, 0},
23 };
24 
setUp(void)25 void setUp(void)
26 {
27     /* Function run before every test */
28 }
29 
tearDown(void)30 void tearDown(void)
31 {
32     /* Function run after every test */
33     lv_obj_clean(lv_screen_active());
34 }
35 
hovered_event_cb(lv_event_t * e)36 static void hovered_event_cb(lv_event_t * e)
37 {
38     test_hover_t * hover = lv_event_get_user_data(e);
39     lv_log("Object(ID:%s) hovered %u/%d times.\n", hover->id, hover->counts, TEST_HOVER_COUNTS);
40 }
41 
test_move_mouse(lv_point_t * point,uint8_t size)42 static void test_move_mouse(lv_point_t * point, uint8_t size)
43 {
44     lv_point_t * p = point;
45 
46     for(uint8_t j = 0; j < TEST_HOVER_COUNTS; j++) {
47         for(uint8_t i = 0; i < size; i++) {
48             lv_test_mouse_move_to(p[i].x, p[i].y);
49             lv_test_indev_wait(50);
50         }
51     }
52 }
53 
test_hover_basic(void)54 void test_hover_basic(void)
55 {
56     lv_obj_t * label = lv_label_create(lv_screen_active());
57     lv_obj_set_size(label, 200, 20);
58     lv_label_set_text(label, "Clickable text can be hovered!");
59     lv_obj_set_pos(label, 100, 20);
60     lv_obj_add_flag(label, LV_OBJ_FLAG_CLICKABLE);
61     lv_obj_set_style_text_color(label, lv_color_hex(0x5be1b6), LV_PART_MAIN | LV_STATE_HOVERED);
62 
63     /*Set hover callback*/
64     lv_obj_stringify_id(label, label_hovered.id, sizeof(label_hovered.id));
65     label_hovered.counts = 0;
66     lv_obj_add_event_cb(label, hovered_event_cb, LV_EVENT_HOVER_OVER, &label_hovered);
67 
68     lv_obj_t * btn = lv_button_create(lv_screen_active());
69     lv_obj_set_pos(btn, 64, 100);
70     lv_obj_set_size(btn, 128, 48);
71     lv_obj_set_style_bg_opa(btn, 128, LV_PART_MAIN | LV_STATE_HOVERED);
72 
73     /*Set hover callback*/
74     lv_obj_stringify_id(btn, btn_hovered.id, sizeof(btn_hovered.id));
75     btn_hovered.counts = 0;
76     lv_obj_add_event_cb(btn, hovered_event_cb, LV_EVENT_HOVER_OVER, &btn_hovered);
77 
78     test_move_mouse((lv_point_t *)pointer1, 5);
79     test_move_mouse((lv_point_t *)pointer2, 5);
80 }
81 
test_hover_delete(void)82 void test_hover_delete(void)
83 {
84     for(int i = 0; i < 4; i++) {
85         lv_obj_t * btn = lv_button_create(lv_screen_active());
86         lv_obj_set_size(btn, 200, 100);
87 
88         lv_test_mouse_move_to(i * 10, 50);
89         lv_test_indev_wait(50);
90 
91         lv_obj_delete(btn);  /*No crash while deleting the hovered button*/
92         lv_test_indev_wait(50);
93     }
94 }
95 
96 
97 #endif
98