From cfccb85b97f92c0f187834fdceb51dc05b9223ee Mon Sep 17 00:00:00 2001 From: Akos Horvath Date: Fri, 12 Apr 2024 12:12:04 +0200 Subject: [PATCH] add tab focus switching test --- src/tests.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 137 insertions(+), 3 deletions(-) diff --git a/src/tests.c b/src/tests.c index fa28e6c..20f14c4 100644 --- a/src/tests.c +++ b/src/tests.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -51,6 +52,31 @@ static void test_wm_nodearray_push(void **state) wm_treenode_free(node1); } +static void test_wm_nodearray_remove(void **state) +{ + NodeArray *array = wm_nodearray_new(); + assert_false(wm_nodearray_remove(array, 1)); + + wm_nodearray_push(array, (void*)1); + wm_nodearray_push(array, (void*)2); + wm_nodearray_push(array, (void*)3); + wm_nodearray_push(array, (void*)4); + wm_nodearray_push(array, (void*)5); + + assert_int_equal(array->size, 5); + + assert_true(wm_nodearray_remove(array, 2)); + + assert_int_equal(array->size, 4); + assert_ptr_equal(array->nodes[0], 1); + assert_ptr_equal(array->nodes[1], 2); + assert_ptr_equal(array->nodes[2], 4); + assert_ptr_equal(array->nodes[3], 5); + + wm_nodearray_free(array); +} + + static void test_wm_treenode_new(void **state) { TreeNode *node = wm_treenode_new(NODE_VERTICAL, NULL); @@ -437,6 +463,79 @@ static void test_wm_find_client_direction_split(void **state) wm_treenode_free(client3); } +static void test_wm_find_client_direction_tab(void **state) +{ + TreeNode *root = wm_treenode_new(NODE_TAB, NULL); + + TreeNode *client1 = wm_treenode_new(NODE_CLIENT, NULL); + TreeNode *client2 = wm_treenode_new(NODE_CLIENT, NULL); + + wm_treenode_add_child(root, client1); + wm_treenode_add_child(root, client2); + + root->pos = (Rect) {.w = 1600, .h = 900, .x = 0, .y = 0}; + client1->pos = (Rect) {.w = 1600, .h = 900, .x = 0, .y = 0}; + client2->pos = (Rect) {.w = 1600, .h = 900, .x = 0, .y = 0}; + + Workspace *w = calloc(1, sizeof(Workspace)); + w->tree = root; + + client1->client = calloc(1, sizeof(Client)); + client2->client = calloc(1, sizeof(Client)); + + client1->client->name = ""; + client2->client->name = ""; + + client1->client->ws = w; + client2->client->ws = w; + + client1->client->w = client1->pos.w; client1->client->h = client1->pos.h; + client1->client->x = client1->pos.x; client1->client->y = client1->pos.y; + client2->client->w = client2->pos.w; client2->client->h = client2->pos.h; + client2->client->x = client2->pos.x; client2->client->y = client2->pos.y; + + Monitor *m = calloc(1, sizeof(Workspace)); + XineramaScreenInfo info; + info.width = 1600; + info.height = 900; + m->info = info; + + client1->client->m = m; + client2->client->m = m; + + Client *ret = wm_find_client_direction(client1->client, UP); + assert_ptr_equal(ret, NULL); + + ret = wm_find_client_direction(client1->client, DOWN); + assert_ptr_equal(ret, NULL); + + ret = wm_find_client_direction(client1->client, LEFT); + assert_ptr_equal(ret, client2->client); + + ret = wm_find_client_direction(client1->client, RIGHT); + assert_ptr_equal(ret, client2->client); + + ret = wm_find_client_direction(client2->client, UP); + assert_ptr_equal(ret, NULL); + + ret = wm_find_client_direction(client2->client, DOWN); + assert_ptr_equal(ret, NULL); + + ret = wm_find_client_direction(client2->client, LEFT); + assert_ptr_equal(ret, client1->client); + + ret = wm_find_client_direction(client2->client, RIGHT); + assert_ptr_equal(ret, client1->client); + + + free(client1->client); + free(client2->client); + free(m); + free(w); + wm_treenode_free(root); + wm_treenode_free(client1); + wm_treenode_free(client2); +} static void test_wm_ptrarray_2d_index(void **state) { @@ -585,9 +684,17 @@ static void test_wm_read_log(void **state) wm_uintarray_free(entries); } +// todo uint64_t simple_update_cost_function(TreeNode* node1, TreeNode* node2) { - return 10; + if (node1->type != node2->type) return 10; + + if (node1->type != NODE_CLIENT) return 0; + + if (strcmp(node1->client->name, node2->client->name) == 0) + return 0; + else + return 10; } static void test_wm_logentries_calculate_distances(void **state) @@ -598,6 +705,10 @@ static void test_wm_logentries_calculate_distances(void **state) TreeNode *node = wm_treenode_new(NODE_VERTICAL, NULL); TreeNode *child = wm_treenode_new(NODE_CLIENT, NULL); + + child->client = malloc(sizeof(Client)); + child->client->name = "client"; + wm_treenode_add_child(node, child); wm_logentries_calculate_distances(entries, node, &simple_update_cost_function); @@ -607,6 +718,7 @@ static void test_wm_logentries_calculate_distances(void **state) // TODO check node distances wm_logentries_free(entries); + free(child->client); wm_treenode_free(node); wm_treenode_free(child); } @@ -1024,6 +1136,26 @@ static void test_wm_tree_edit_distance(void **state) TreeNode *b_child4 = wm_treenode_new(NODE_VERTICAL, NULL); TreeNode *b_child5 = wm_treenode_new(NODE_VERTICAL, NULL); + /* + a + / \ + a1 a2 + / \ + a3 a4 + | + a5 + */ + + /* + b + / \ + b1 b2 + | + b3 + / \ + b4 b5 + */ + wm_treenode_add_child(a_root, a_child1); wm_treenode_add_child(a_root, a_child2); @@ -1041,11 +1173,11 @@ static void test_wm_tree_edit_distance(void **state) size_t dist = wm_tree_edit_distance(a_root, b_root, (TreeEditDistanceCosts) { .insert_cost = 10, - .remove_cost = 10, + .remove_cost = 20, .update_cost_function = &simple_update_cost_function, }); - assert_int_equal(dist, 70); + assert_int_equal(dist, 30); wm_treenode_free(a_root); wm_treenode_free(a_child1); @@ -1276,6 +1408,7 @@ int main(void) { const struct CMUnitTest test_group1[] = { cmocka_unit_test(test_wm_nodearray_push), + cmocka_unit_test(test_wm_nodearray_remove), cmocka_unit_test(test_wm_treenode_new), cmocka_unit_test(test_wm_treenode_split_space), cmocka_unit_test(test_wm_all_nodes_to_array), @@ -1283,6 +1416,7 @@ int main(void) cmocka_unit_test(test_wm_treenode_remove_client1), cmocka_unit_test(test_wm_treenode_remove_client2), cmocka_unit_test(test_wm_find_client_direction_split), + cmocka_unit_test(test_wm_find_client_direction_tab), cmocka_unit_test(test_wm_ptrarray_2d_index), cmocka_unit_test(test_wm_treenode_to_str), cmocka_unit_test(test_wm_json_obj_to_treenode),