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