gri3-wm/testcases/t/274-move-branch-position.t

377 lines
12 KiB
Perl

#!perl
# vim:ts=4:sw=4:expandtab
#
# Please read the following documents before working on tests:
# • https://build.i3wm.org/docs/testsuite.html
# (or docs/testsuite)
#
# • https://build.i3wm.org/docs/lib-i3test.html
# (alternatively: perldoc ./testcases/lib/i3test.pm)
#
# • https://build.i3wm.org/docs/ipc.html
# (or docs/ipc)
#
# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
# (unless you are already familiar with Perl)
#
# Test that movement of a con into a branch will place the moving con at the
# correct position within the branch.
#
# If the direction of movement is the same as the orientation of the branch
# container, append or prepend the container to the branch in the obvious way.
# If the movement is to the right or downward, insert the moving container in
# the first position (i.e., the leftmost or top position resp.) If the movement
# is to the left or upward, insert the moving container in the last position
# (i.e., the rightmost or bottom position resp.)
#
# If the direction of movement is different from the orientation of the branch
# container, insert the container into the branch after the focused-inactive
# container.
#
# For testing purposes, we will demonstrate the behavior for tabbed containers
# to represent the case of split-horizontal branches and stacked containers to
# represent the case of split-vertical branches.
#
# Ticket: #1060
# Bug still in: 4.6-109-g18cfc36
use i3test;
# Opens tabs on the presently focused branch and adds several additional
# windows. Shifts focus to somewhere in the middle of the tabs so the most
# general case can be assumed.
sub open_tabs {
cmd 'layout tabbed';
open_window;
open_window;
open_window;
open_window;
cmd 'focus left; focus left'
}
# Likewise for a stack
sub open_stack {
cmd 'layout stacking';
open_window;
open_window;
open_window;
open_window;
cmd 'focus up; focus up'
}
# Gets the position of the given leaf within the given branch. The first
# position is one (1). Returns negative one (-1) if the leaf cannot be found
# within the branch.
sub get_leaf_position {
my ($branch, $leaf) = @_;
my $position = -1;
for my $i (0 .. @{$branch->{nodes}}) {
if ($branch->{nodes}[$i]->{id} == $leaf) {
$position = $i + 1;
last;
};
}
return $position;
}
# convenience function to focus a con by id to avoid having to type an ugly
# command each time
sub focus_con {
my $con_id = shift @_;
cmd "[con_id=\"$con_id\"] focus";
}
# Places a leaf into a branch and focuses the leaf. The newly created branch
# will have orientation specified by the second parameter.
sub branchify {
my ($con_id, $orientation) = @_;
focus_con($con_id);
$orientation eq 'horizontal' ? cmd 'splith' : cmd 'splitv';
open_window;
focus_con($con_id);
}
##############################################################################
# When moving a con right into tabs, the moving con should be placed as the
# first tab in the branch
##############################################################################
my $ws = fresh_workspace;
# create the target leaf
open_window;
my $target_leaf = get_focused($ws);
# create the tabbed branch container
open_window;
cmd 'splith';
open_tabs;
# move the target leaf into the tabbed branch
focus_con($target_leaf);
cmd 'move right';
# the target leaf should be the first in the branch
my $branch = shift @{get_ws_content($ws)};
is($branch->{nodes}[0]->{id}, $target_leaf, 'moving con right into tabs placed it as the first tab in the branch');
# repeat the test when the target is in a branch
cmd 'move up; move left';
branchify($target_leaf, 'vertical');
cmd 'move right';
$branch = pop @{get_ws_content($ws)};
is($branch->{nodes}[0]->{id}, $target_leaf, 'moving con right into tabs from a branch placed it as the first tab in the branch');
##############################################################################
# When moving a con right into a stack, the moving con should be placed
# below the focused-inactive leaf
##############################################################################
$ws = fresh_workspace;
# create the target leaf
open_window;
$target_leaf = get_focused($ws);
# create the stacked branch container and find the focused leaf
open_window;
cmd 'splith';
open_stack;
my $secondary_leaf = get_focused($ws);
# move the target leaf into the stacked branch
focus_con($target_leaf);
cmd 'move right';
# the secondary focus leaf should be below the target
$branch = shift @{get_ws_content($ws)};
my $target_leaf_position = get_leaf_position($branch, $target_leaf);
my $secondary_leaf_position = get_leaf_position($branch, $secondary_leaf);
is($target_leaf_position, $secondary_leaf_position + 1, 'moving con right into a stack placed it below the focused-inactive leaf');
# repeat the test when the target is in a branch
cmd 'move up; move left';
branchify($target_leaf, 'vertical');
cmd 'move right';
$branch = pop @{get_ws_content($ws)};
$target_leaf_position = get_leaf_position($branch, $target_leaf);
$secondary_leaf_position = get_leaf_position($branch, $secondary_leaf);
is($target_leaf_position, $secondary_leaf_position + 1, 'moving con right into a stack from a branch placed it below the focused-inactive leaf');
##############################################################################
# When moving a con down into a stack, the moving con should be placed at the
# top of the stack
##############################################################################
$ws = fresh_workspace;
cmd 'layout splitv';
# create the target leaf
open_window;
$target_leaf = get_focused($ws);
# create the stacked branch container
open_window;
cmd 'splitv';
open_stack;
# move the target leaf into the stacked branch
focus_con($target_leaf);
cmd 'move down';
# the target leaf should be on the top of the stack
$branch = shift @{get_ws_content($ws)};
is($branch->{nodes}[0]->{id}, $target_leaf, 'moving con down into a stack placed it on the top of the stack');
# repeat the test when the target is in a branch
cmd 'move right; move up';
branchify($target_leaf, 'horizontal');
cmd 'move down';
$branch = pop @{get_ws_content($ws)};
is($branch->{nodes}[0]->{id}, $target_leaf, 'moving con down into a stack from a branch placed it on the top of the stack');
##############################################################################
# When moving a con down into tabs, the moving con should be placed after the
# focused-inactive tab
##############################################################################
$ws = fresh_workspace;
cmd 'layout splitv';
# create the target leaf
open_window;
$target_leaf = get_focused($ws);
# create the tabbed branch container and find the focused tab
open_window;
cmd 'splitv';
open_tabs;
$secondary_leaf = get_focused($ws);
# move the target leaf into the tabbed branch
focus_con($target_leaf);
cmd 'move down';
# the secondary focus tab should be to the right
$branch = shift @{get_ws_content($ws)};
$target_leaf_position = get_leaf_position($branch, $target_leaf);
$secondary_leaf_position = get_leaf_position($branch, $secondary_leaf);
is($target_leaf_position, $secondary_leaf_position + 1, 'moving con down into tabs placed it after the focused-inactive tab');
# repeat the test when the target is in a branch
cmd 'move right; move up';
branchify($target_leaf, 'horizontal');
cmd 'move down';
$branch = pop @{get_ws_content($ws)};
$target_leaf_position = get_leaf_position($branch, $target_leaf);
$secondary_leaf_position = get_leaf_position($branch, $secondary_leaf);
is($target_leaf_position, $secondary_leaf_position + 1, 'moving con down into tabs from a branch placed it after the focused-inactive tab');
##############################################################################
# When moving a con left into tabs, the moving con should be placed as the last
# tab in the branch
##############################################################################
$ws = fresh_workspace;
# create the tabbed branch container
open_window;
cmd 'splith';
open_tabs;
# create the target leaf
cmd 'focus parent';
open_window;
$target_leaf = get_focused($ws);
# move the target leaf into the tabbed branch
cmd 'move left';
# the target leaf should be last in the branch
$branch = shift @{get_ws_content($ws)};
is($branch->{nodes}->[-1]->{id}, $target_leaf, 'moving con left into tabs placed it as the last tab in the branch');
# repeat the test when the target leaf is in a branch
cmd 'move up; move right';
branchify($target_leaf, 'vertical');
cmd 'move left';
$branch = shift @{get_ws_content($ws)};
is($branch->{nodes}->[-1]->{id}, $target_leaf, 'moving con left into tabs from a branch placed it as the last tab in the branch');
##############################################################################
# When moving a con left into a stack, the moving con should be placed below
# the focused-inactive leaf
##############################################################################
$ws = fresh_workspace;
# create the stacked branch container and find the focused leaf
open_window;
open_stack;
$secondary_leaf = get_focused($ws);
# create the target leaf to the right
cmd 'focus parent';
open_window;
$target_leaf = get_focused($ws);
# move the target leaf into the stacked branch
cmd 'move left';
# the secondary focus leaf should be below
$branch = shift @{get_ws_content($ws)};
$target_leaf_position = get_leaf_position($branch, $target_leaf);
$secondary_leaf_position = get_leaf_position($branch, $secondary_leaf);
is($target_leaf_position, $secondary_leaf_position + 1, 'moving con left into a stack placed it below the focused-inactive leaf');
# repeat the test when the target leaf is in a branch
cmd 'move up; move right';
branchify($target_leaf, 'vertical');
cmd 'move left';
$branch = shift @{get_ws_content($ws)};
$target_leaf_position = get_leaf_position($branch, $target_leaf);
$secondary_leaf_position = get_leaf_position($branch, $secondary_leaf);
is($target_leaf_position, $secondary_leaf_position + 1, 'moving con left into a stack from a branch placed it below the focused-inactive leaf');
##############################################################################
# When moving a con up into a stack, the moving con should be placed last in
# the stack
##############################################################################
$ws = fresh_workspace;
cmd 'layout splitv';
# create the stacked branch container
open_window;
cmd 'splitv';
open_stack;
# create the target leaf
cmd 'focus parent';
open_window;
$target_leaf = get_focused($ws);
# move the target leaf into the stacked branch
cmd 'move up';
# the target leaf should be on the bottom of the stack
$branch = shift @{get_ws_content($ws)};
is($branch->{nodes}->[-1]->{id}, $target_leaf, 'moving con up into stack placed it on the bottom of the stack');
# repeat the test when the target leaf is in a branch
cmd 'move right; move down';
branchify($target_leaf, 'horizontal');
cmd 'move up';
$branch = shift @{get_ws_content($ws)};
is($branch->{nodes}->[-1]->{id}, $target_leaf, 'moving con up into stack from a branch placed it on the bottom of the stack');
##############################################################################
# When moving a con up into tabs, the moving con should be placed after the
# focused-inactive tab
##############################################################################
$ws = fresh_workspace;
cmd 'layout splitv';
# create the tabbed branch container and find the focused leaf
open_window;
cmd 'splitv';
open_tabs;
$secondary_leaf = get_focused($ws);
# create the target leaf below
cmd 'focus parent';
open_window;
$target_leaf = get_focused($ws);
# move the target leaf into the tabbed branch
cmd 'move up';
# the secondary focus tab should be to the right
$branch = shift @{get_ws_content($ws)};
$target_leaf_position = get_leaf_position($branch, $target_leaf);
$secondary_leaf_position = get_leaf_position($branch, $secondary_leaf);
is($target_leaf_position, $secondary_leaf_position + 1, 'moving con up into tabs placed it after the focused-inactive tab');
# repeat the test when the target leaf is in a branch
cmd 'move right; move down';
branchify($target_leaf, 'horizontal');
cmd 'move up';
$branch = shift @{get_ws_content($ws)};
$target_leaf_position = get_leaf_position($branch, $target_leaf);
$secondary_leaf_position = get_leaf_position($branch, $secondary_leaf);
is($target_leaf_position, $secondary_leaf_position + 1, 'moving con up into tabs from a branch placed it after the focused-inactive tab');
done_testing;