1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 
4 #include "unity/unity.h"
5 
6 #define MY_CLASS    &lv_test_tree_class
7 
8 typedef struct {
9     lv_tree_node_t base;
10     int data1;
11     float data2;
12 } lv_test_node_t;
13 
lv_test_constructor(const lv_tree_class_t * class_p,lv_tree_node_t * node)14 static void lv_test_constructor(const lv_tree_class_t * class_p, lv_tree_node_t * node)
15 {
16     LV_UNUSED(class_p);
17     lv_test_node_t * t = (lv_test_node_t *)node;
18     t->data1 = 100;
19     t->data2 = 100.0f;
20 }
21 
lv_test_destructor(const lv_tree_class_t * class_p,lv_tree_node_t * node)22 static void lv_test_destructor(const lv_tree_class_t * class_p, lv_tree_node_t * node)
23 {
24     LV_UNUSED(class_p);
25     lv_test_node_t * t = (lv_test_node_t *)node;
26     t->data1 = 0;
27     t->data2 = 0.0f;
28 }
29 
30 const lv_tree_class_t lv_test_tree_class = {
31     .base_class = &lv_tree_node_class,
32     .instance_size = sizeof(lv_test_node_t),
33     .constructor_cb = lv_test_constructor,
34     .destructor_cb = lv_test_destructor,
35 };
36 
lv_test_create(lv_test_node_t * parent)37 static lv_test_node_t * lv_test_create(lv_test_node_t * parent)
38 {
39     lv_tree_node_t * node = lv_tree_node_create(MY_CLASS, (lv_tree_node_t *)parent);
40     return (lv_test_node_t *)node;
41 }
42 
lv_test_delete(lv_test_node_t * node)43 static void lv_test_delete(lv_test_node_t * node)
44 {
45     lv_tree_node_delete((lv_tree_node_t *)node);
46 }
47 
48 static lv_test_node_t * test;
49 
setUp(void)50 void setUp(void)
51 {
52     test = lv_test_create(NULL);
53 }
54 
tearDown(void)55 void tearDown(void)
56 {
57     lv_test_delete(test);
58 }
59 
testCreateAndDelete(void)60 void testCreateAndDelete(void)
61 {
62     lv_test_node_t * node = lv_test_create(test);
63     TEST_ASSERT_EQUAL_UINT32(1, test->base.child_cnt);
64     TEST_ASSERT_EQUAL_UINT32(0, node->base.child_cnt);
65     TEST_ASSERT_EQUAL(test, node->base.parent);
66     TEST_ASSERT_EQUAL(NULL, test->base.parent);
67 
68     TEST_ASSERT_EQUAL_INT32(100, node->data1);
69     TEST_ASSERT_EQUAL_FLOAT(100.0f, node->data2);
70 
71     lv_test_delete(node);
72     TEST_ASSERT_EQUAL(NULL, test->base.children[0]);
73 }
74 
75 struct _result {
76     int32_t result[8];
77     int32_t num;
78 };
79 
test_walk_cb(const lv_tree_node_t * node,void * data)80 static bool test_walk_cb(const lv_tree_node_t * node, void * data)
81 {
82     lv_test_node_t * n = (lv_test_node_t *)node;
83     struct _result * ret = (struct _result *)data;
84 
85     ret->result[ret->num++] = n->data1;
86     return true;
87 }
88 
testBuildTree(void)89 void testBuildTree(void)
90 {
91     lv_test_node_t * node = lv_test_create(test);
92     node->data1 = 0;
93 
94     for(int i = 0; i < 16; i++) {
95         lv_test_node_t * snode = lv_test_create(node);
96         snode->data1 = i;
97         TEST_ASSERT_NOT_EQUAL(NULL, snode);
98     }
99     TEST_ASSERT_EQUAL(16, node->base.child_cnt);
100     lv_test_delete(node);
101 }
102 
testWalkTree(void)103 void testWalkTree(void)
104 {
105     lv_test_node_t * node = lv_test_create(test);
106     node->data1 = 1;
107 
108     lv_test_node_t * node1 = lv_test_create(node);
109     node1->data1 = 2;
110     lv_test_node_t * node2 = lv_test_create(node);
111     node2->data1 = 3;
112 
113     lv_test_node_t * node11 = lv_test_create(node1);
114     node11->data1 = 4;
115 
116     lv_test_node_t * node12 = lv_test_create(node1);
117     node12->data1 = 5;
118 
119     lv_test_node_t * node21 = lv_test_create(node2);
120     node21->data1 = 6;
121 
122     lv_test_node_t * node111 = lv_test_create(node11);
123     node111->data1 = 7;
124 
125     struct _result result = {.num = 0};
126 
127     lv_tree_walk((lv_tree_node_t *)node, LV_TREE_WALK_POST_ORDER, test_walk_cb, NULL, NULL, &result);
128 
129     int32_t ret[8] = {7, 4, 5, 2, 6, 3, 1};
130 
131     TEST_ASSERT_EQUAL_INT32_ARRAY(ret, result.result, 8);
132 
133     result.num = 0;
134     lv_memset(&result, 0, sizeof(struct _result));
135     lv_tree_walk((lv_tree_node_t *)node, LV_TREE_WALK_PRE_ORDER, test_walk_cb, NULL, NULL, &result);
136 
137     int32_t ret2[8] = {1, 2, 4, 7, 5, 3, 6};
138 
139     TEST_ASSERT_EQUAL_INT32_ARRAY(ret2, result.result, 8);
140 
141     lv_test_delete(node111);
142 
143     result.num = 0;
144     lv_memset(&result, 0, sizeof(struct _result));
145     lv_tree_walk((lv_tree_node_t *)node, LV_TREE_WALK_PRE_ORDER, test_walk_cb, NULL, NULL, &result);
146 
147     int32_t ret3[8] = {1, 2, 4, 5, 3, 6};
148 
149     TEST_ASSERT_EQUAL_INT32_ARRAY(ret3, result.result, 8);
150 
151     lv_test_delete(node);
152 }
153 
test_search_cb(const lv_tree_node_t * node,void * data)154 static bool test_search_cb(const lv_tree_node_t * node, void * data)
155 {
156     lv_test_node_t * n = (lv_test_node_t *)node;
157     struct _result * ret = (struct _result *)data;
158 
159     if(n->data1 == 3) {
160         return false;
161     }
162 
163     ret->result[ret->num++] = n->data1;
164     return true;
165 }
166 
test_before_search_cb(const lv_tree_node_t * node,void * data)167 static bool test_before_search_cb(const lv_tree_node_t * node, void * data)
168 {
169     LV_UNUSED(node);
170     LV_UNUSED(data);
171     return true;
172 }
173 
test_after_search_cb(const lv_tree_node_t * node,void * data)174 static void test_after_search_cb(const lv_tree_node_t * node, void * data)
175 {
176     LV_UNUSED(node);
177     LV_UNUSED(data);
178 }
179 
testTreeSearch(void)180 void testTreeSearch(void)
181 {
182     lv_test_node_t * node = lv_test_create(test);
183     node->data1 = 1;
184 
185     lv_test_node_t * node1 = lv_test_create(node);
186     node1->data1 = 2;
187     lv_test_node_t * node2 = lv_test_create(node);
188     node2->data1 = 3;
189 
190     lv_test_node_t * node11 = lv_test_create(node1);
191     node11->data1 = 4;
192 
193     struct _result result = {.num = 0};
194 
195     lv_tree_walk((lv_tree_node_t *)node, LV_TREE_WALK_PRE_ORDER, test_search_cb, test_before_search_cb,
196                  test_after_search_cb, &result);
197 
198     int32_t ret2[4] = {1, 2};
199 
200     TEST_ASSERT_EQUAL_INT32_ARRAY(ret2, result.result, 2);
201 
202     result.num = 0;
203     lv_memset(&result, 0, sizeof(struct _result));
204     lv_tree_walk((lv_tree_node_t *)node, LV_TREE_WALK_POST_ORDER, test_search_cb, test_before_search_cb,
205                  test_after_search_cb, &result);
206 
207     int32_t ret3[4] = {4, 2};
208 
209     TEST_ASSERT_EQUAL_INT32_ARRAY(ret3, result.result, 2);
210     lv_test_delete(node);
211 }
212 
213 #endif
214