add tab focus switching test

This commit is contained in:
Akos Horvath 2024-04-12 12:12:04 +02:00
parent 2a8fdab5ce
commit cfccb85b97

View File

@ -1,4 +1,5 @@
#include <X11/X.h>
#include <X11/extensions/Xinerama.h>
#include <stdint.h>
#include <stdarg.h>
#include <stddef.h>
@ -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),