Compare commits

...

2 Commits

Author SHA1 Message Date
653b5112ba add tests for wm_treenode_remove_client 2023-12-29 20:38:00 +01:00
3742a49f32 fix wm_treenode_remove_client 2023-12-29 20:34:04 +01:00
2 changed files with 122 additions and 1 deletions

View File

@ -1,4 +1,6 @@
#include "util.h"
#include "client.h"
#include "wm.h"
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
@ -173,6 +175,114 @@ static void test_wm_find_client_nodes(void **state)
wm_nodearray_free(client_nodes);
}
static void test_wm_treenode_remove_client1(void **state)
{
TreeNode *root = wm_treenode_new(NODE_VERTICAL, NULL);
TreeNode *parent_node1 = wm_treenode_new(NODE_VERTICAL, root);
TreeNode *parent_node2 = wm_treenode_new(NODE_HORIZONTAL, root);
TreeNode *client_node1 = wm_treenode_new(NODE_CLIENT, parent_node1);
TreeNode *client_node2 = wm_treenode_new(NODE_CLIENT, parent_node1);
TreeNode *client_node3 = wm_treenode_new(NODE_CLIENT, parent_node2);
TreeNode *client_node4 = wm_treenode_new(NODE_CLIENT, parent_node2);
wm_nodearray_push(root->children, parent_node1);
wm_nodearray_push(root->children, parent_node2);
wm_nodearray_push(parent_node1->children, client_node1);
wm_nodearray_push(parent_node1->children, client_node2);
wm_nodearray_push(parent_node2->children, client_node3);
wm_nodearray_push(parent_node2->children, client_node4);
Workspace ws = (Workspace) {
.tree = root,
.monitor = &(Monitor) {0},
};
Client client1 = (Client) {.ws = &ws, .name = ""};
Client client2 = (Client) {.ws = &ws, .name = ""};
Client client3 = (Client) {.ws = &ws, .name = ""};
Client client4 = (Client) {.ws = &ws, .name = ""};
client_node1->client = &client1;
client_node2->client = &client2;
client_node3->client = &client3;
client_node4->client = &client4;
root->pos.x = 0;
root->pos.y = 0;
root->pos.w = 1000;
root->pos.w = 1000;
wm_treenode_split_space(root, &parent_node1->pos, &parent_node2->pos);
wm_treenode_split_space(parent_node1, &client_node1->pos, &client_node2->pos);
wm_treenode_split_space(parent_node2, &client_node3->pos, &client_node4->pos);
TreeNode *new_client_node = wm_treenode_remove_client(&(Wm) {0}, root, &client4);
assert_ptr_equal(new_client_node, parent_node2);
assert_int_equal(parent_node2->type, NODE_CLIENT);
assert_ptr_equal(parent_node2->client, &client3);
assert_int_equal(parent_node2->children->size, 0);
wm_treenode_free(root);
wm_treenode_free(parent_node1);
wm_treenode_free(parent_node2);
wm_treenode_free(client_node1);
wm_treenode_free(client_node2);
}
static void test_wm_treenode_remove_client2(void **state)
{
TreeNode *root = wm_treenode_new(NODE_VERTICAL, NULL);
TreeNode *parent_node1 = wm_treenode_new(NODE_VERTICAL, root);
TreeNode *client_node1 = wm_treenode_new(NODE_CLIENT, root);
TreeNode *client_node2 = wm_treenode_new(NODE_CLIENT, parent_node1);
TreeNode *client_node3 = wm_treenode_new(NODE_CLIENT, parent_node1);
TreeNode parent_node1_val = *parent_node1;
wm_nodearray_push(root->children, parent_node1);
wm_nodearray_push(root->children, client_node1);
wm_nodearray_push(parent_node1->children, client_node2);
wm_nodearray_push(parent_node1->children, client_node3);
Workspace ws = (Workspace) {
.tree = root,
.monitor = &(Monitor) {0},
};
Client client1 = (Client) {.ws = &ws, .name = ""};
Client client2 = (Client) {.ws = &ws, .name = ""};
Client client3 = (Client) {.ws = &ws, .name = ""};
client_node1->client = &client1;
client_node2->client = &client2;
client_node3->client = &client3;
root->pos.x = 0;
root->pos.y = 0;
root->pos.w = 1000;
root->pos.w = 1000;
wm_treenode_split_space(root, &parent_node1->pos, &client_node1->pos);
wm_treenode_split_space(parent_node1, &client_node2->pos, &client_node3->pos);
TreeNode *new_client_node = wm_treenode_remove_client(&(Wm) {0}, root, &client1);
assert_ptr_equal(new_client_node, client_node2);
assert_int_equal(root->id, parent_node1_val.id);
assert_ptr_equal(root->children, parent_node1_val.children);
assert_int_equal(root->children->size, 2);
assert_ptr_equal(root->children->nodes[0], client_node2);
assert_ptr_equal(root->children->nodes[1], client_node3);
assert_ptr_equal(client_node2->parent, root);
assert_ptr_equal(client_node3->parent, root);
wm_treenode_free(root);
wm_treenode_free(client_node2);
wm_treenode_free(client_node3);
}
static void test_wm_postorder_traversal(void **state)
{
TreeNode *node1 = (TreeNode*)*state;
@ -372,6 +482,8 @@ int main(void)
cmocka_unit_test(test_wm_treenode_split_space),
cmocka_unit_test(test_wm_all_nodes_to_array),
cmocka_unit_test(test_wm_find_client_nodes),
cmocka_unit_test(test_wm_treenode_remove_client1),
cmocka_unit_test(test_wm_treenode_remove_client2),
};
const struct CMUnitTest test_group2[] = {

View File

@ -518,8 +518,14 @@ TreeNode* wm_treenode_remove_client(Wm *wm, TreeNode *root, Client *client)
if (node->parent == NULL) {
// parent is root node
DEBUG_PRINT("parent is root node!\n");
TreeNode old_root = *client->ws->tree;
sibling_node->parent = NULL;
client->ws->tree = sibling_node;
*client->ws->tree = *sibling_node;
wm_nodearray_free(old_root.children);
free(sibling_node);
client->ws->tree->pos = (Rect) {
.x = wm->config.border_width, .y = wm->config.border_width + dock_y ,
@ -528,6 +534,9 @@ TreeNode* wm_treenode_remove_client(Wm *wm, TreeNode *root, Client *client)
};
assert(client->ws->tree->children->size == 2);
client->ws->tree->children->nodes[0]->parent = client->ws->tree;
client->ws->tree->children->nodes[1]->parent = client->ws->tree;
wm_treenode_split_space(client->ws->tree, &client->ws->tree->children->nodes[0]->pos,
&client->ws->tree->children->nodes[1]->pos);
} else {