05e8caab17
fixes #1643
274 lines
9.1 KiB
Perl
274 lines
9.1 KiB
Perl
#!perl
|
|
# vim:ts=4:sw=4:expandtab
|
|
#
|
|
# Please read the following documents before working on tests:
|
|
# • http://build.i3wm.org/docs/testsuite.html
|
|
# (or docs/testsuite)
|
|
#
|
|
# • http://build.i3wm.org/docs/lib-i3test.html
|
|
# (alternatively: perldoc ./testcases/lib/i3test.pm)
|
|
#
|
|
# • http://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)
|
|
#
|
|
# Tests for the 'move [window|container] to mark' command
|
|
# Ticket: #1643
|
|
use i3test;
|
|
|
|
# In the following tests descriptions, we will always use the following names:
|
|
# * 'S' for the source container which is going to be moved,
|
|
# * 'M' for the marked target container to which 'S' will be moved.
|
|
|
|
my ($A, $B, $S, $M, $F, $source_ws, $target_ws, $ws);
|
|
my ($nodes, $focus);
|
|
my $cmd_result;
|
|
|
|
###############################################################################
|
|
# Given 'M' and 'S' in a horizontal split, when 'S' is moved to 'M', then
|
|
# verify that nothing changed.
|
|
###############################################################################
|
|
|
|
$ws = fresh_workspace;
|
|
$M = open_window;
|
|
cmd 'mark target';
|
|
$S = open_window;
|
|
|
|
cmd 'move container to mark target';
|
|
sync_with_i3;
|
|
|
|
($nodes, $focus) = get_ws_content($ws);
|
|
is(@{$nodes}, 2, 'there are two containers');
|
|
is($nodes->[0]->{window}, $M->{id}, 'M is left of S');
|
|
is($nodes->[1]->{window}, $S->{id}, 'S is right of M');
|
|
|
|
###############################################################################
|
|
# Given 'S' and 'M' in a horizontal split, when 'S' is moved to 'M', then
|
|
# both containers switch places.
|
|
###############################################################################
|
|
|
|
$ws = fresh_workspace;
|
|
$S = open_window;
|
|
$M = open_window;
|
|
cmd 'mark target';
|
|
cmd 'focus left';
|
|
|
|
cmd 'move container to mark target';
|
|
sync_with_i3;
|
|
|
|
($nodes, $focus) = get_ws_content($ws);
|
|
is(@{$nodes}, 2, 'there are two containers');
|
|
is($nodes->[0]->{window}, $M->{id}, 'M is left of S');
|
|
is($nodes->[1]->{window}, $S->{id}, 'S is right of M');
|
|
|
|
###############################################################################
|
|
# Given 'S' and no container 'M' exists, when 'S' is moved to 'M', then
|
|
# the command is unsuccessful.
|
|
###############################################################################
|
|
|
|
$ws = fresh_workspace;
|
|
$S = open_window;
|
|
|
|
$cmd_result = cmd 'move container to mark absent';
|
|
|
|
is($cmd_result->[0]->{success}, 0, 'command was unsuccessful');
|
|
|
|
###############################################################################
|
|
# Given 'S' and 'M' on different workspaces, when 'S' is moved to 'M', then
|
|
# 'S' ends up on the same workspace as 'M'.
|
|
###############################################################################
|
|
|
|
$source_ws = fresh_workspace;
|
|
$S = open_window;
|
|
$target_ws = fresh_workspace;
|
|
$M = open_window;
|
|
cmd 'mark target';
|
|
|
|
cmd '[id="' . $S->{id} . '"] move container to mark target';
|
|
sync_with_i3;
|
|
|
|
($nodes, $focus) = get_ws_content($source_ws);
|
|
is(@{$nodes}, 0, 'source workspace is empty');
|
|
|
|
($nodes, $focus) = get_ws_content($target_ws);
|
|
is(@{$nodes}, 2, 'both containers are on the target workspace');
|
|
is($nodes->[0]->{window}, $M->{id}, 'M is left of S');
|
|
is($nodes->[1]->{window}, $S->{id}, 'S is right of M');
|
|
|
|
###############################################################################
|
|
# Given 'S' and 'M' on different workspaces and 'S' is urgent, when 'S' is
|
|
# moved to 'M', then the urgency flag is transferred to the target workspace.
|
|
###############################################################################
|
|
|
|
# TODO
|
|
|
|
###############################################################################
|
|
# Given 'S' and 'M' where 'M' is inside a tabbed container, when 'S' is moved
|
|
# to 'M', then 'S' ends up as a new tab.
|
|
###############################################################################
|
|
|
|
$source_ws = fresh_workspace;
|
|
$S = open_window;
|
|
|
|
# open tabbed container ['A' 'M' 'B']
|
|
$target_ws = fresh_workspace;
|
|
cmd 'layout tabbed';
|
|
$A = open_window;
|
|
$M = open_window;
|
|
cmd 'mark target';
|
|
$B = open_window;
|
|
|
|
cmd '[id="' . $S->{id} . '"] move container to mark target';
|
|
sync_with_i3;
|
|
|
|
($nodes, $focus) = get_ws_content($target_ws);
|
|
is(@{$nodes}, 1, 'there is a tabbed container');
|
|
|
|
$nodes = $nodes->[0]->{nodes};
|
|
is(@{$nodes}, 4, 'all four containers are on the target workspace');
|
|
is($nodes->[0]->{window}, $A->{id}, 'A is the first tab');
|
|
is($nodes->[1]->{window}, $M->{id}, 'M is the second tab');
|
|
is($nodes->[2]->{window}, $S->{id}, 'S is the third tab');
|
|
is($nodes->[3]->{window}, $B->{id}, 'B is the fourth tab');
|
|
|
|
###############################################################################
|
|
# Given 'S' and 'M' where 'M' is a tabbed container where the currently focused
|
|
# tab is a nested layout, when 'S' is moved to 'M', then 'S' is a new tab
|
|
# within 'M'.
|
|
###############################################################################
|
|
|
|
$source_ws = fresh_workspace;
|
|
$S = open_window;
|
|
|
|
$target_ws = fresh_workspace;
|
|
cmd 'layout tabbed';
|
|
$A = open_window;
|
|
cmd 'focus parent';
|
|
cmd 'mark target';
|
|
cmd 'focus child';
|
|
$B = open_window;
|
|
cmd 'split h';
|
|
$F = open_window;
|
|
|
|
cmd '[id="' . $S->{id} . '"] move container to mark target';
|
|
sync_with_i3;
|
|
|
|
($nodes, $focus) = get_ws_content($target_ws);
|
|
is(@{$nodes}, 1, 'there is a tabbed container');
|
|
|
|
$nodes = $nodes->[0]->{nodes};
|
|
is(@{$nodes}, 3, 'there are three tabs');
|
|
|
|
is($nodes->[0]->{window}, $A->{id}, 'A is the first tab');
|
|
is($nodes->[2]->{window}, $S->{id}, 'S is the third tab');
|
|
|
|
###############################################################################
|
|
# Given 'S' and 'M' where 'M' is inside a split container inside a tabbed
|
|
# container, when 'S' is moved to 'M', then 'S' ends up as a container
|
|
# within the same tab as 'M'.
|
|
###############################################################################
|
|
|
|
$source_ws = fresh_workspace;
|
|
$S = open_window;
|
|
|
|
# open tabbed container ['A'['B' 'M']]
|
|
$target_ws = fresh_workspace;
|
|
cmd 'layout tabbed';
|
|
$A = open_window;
|
|
$B = open_window;
|
|
cmd 'split h';
|
|
$M = open_window;
|
|
cmd 'mark target';
|
|
|
|
cmd '[id="' . $S->{id} . '"] move container to mark target';
|
|
sync_with_i3;
|
|
|
|
($nodes, $focus) = get_ws_content($target_ws);
|
|
is(@{$nodes}, 1, 'there is a tabbed container');
|
|
|
|
$nodes = $nodes->[0]->{nodes};
|
|
is(@{$nodes}, 2, 'there are two tabs');
|
|
|
|
$nodes = $nodes->[1]->{nodes};
|
|
is(@{$nodes}, 3, 'the tab with the marked children has three children');
|
|
is($nodes->[0]->{window}, $B->{id}, 'B is the first tab');
|
|
is($nodes->[1]->{window}, $M->{id}, 'M is the second tab');
|
|
is($nodes->[2]->{window}, $S->{id}, 'S is the third tab');
|
|
|
|
###############################################################################
|
|
# Given 'S', 'A' and 'B' where 'A' and 'B' are inside the tabbed container 'M',
|
|
# when 'S' is moved to 'M', then 'S' ends up as a new tab in 'M'.
|
|
###############################################################################
|
|
|
|
$source_ws = fresh_workspace;
|
|
$S = open_window;
|
|
$target_ws = fresh_workspace;
|
|
cmd 'layout tabbed';
|
|
$A = open_window;
|
|
$B = open_window;
|
|
cmd 'focus parent';
|
|
cmd 'mark target';
|
|
cmd 'focus child';
|
|
|
|
cmd '[id="' . $S->{id} . '"] move container to mark target';
|
|
sync_with_i3;
|
|
|
|
($nodes, $focus) = get_ws_content($target_ws);
|
|
is(@{$nodes}, 1, 'there is a tabbed container');
|
|
|
|
$nodes = $nodes->[0]->{nodes};
|
|
is(@{$nodes}, 3, 'there are three tabs');
|
|
|
|
is($nodes->[0]->{window}, $A->{id}, 'A is the first tab');
|
|
is($nodes->[1]->{window}, $B->{id}, 'B is the second tab');
|
|
is($nodes->[2]->{window}, $S->{id}, 'S is the third tab');
|
|
|
|
###############################################################################
|
|
# Given 'S', 'F' and 'M' where 'F' and 'M' are containers inside the same
|
|
# tabbed container and where 'F' has the focus within that container, when
|
|
# 'S' is moved to 'M', then 'S' ends up behind 'F'.
|
|
###############################################################################
|
|
|
|
# TODO needs to be clarified whether this is the behavior we want
|
|
|
|
###############################################################################
|
|
# Given 'S' and 'M' where 'S' is floating and 'M' on a different workspace,
|
|
# when 'S' is moved to 'M', then 'S' is a floating container on the same
|
|
# workspaces as 'M'.
|
|
###############################################################################
|
|
|
|
$source_ws = fresh_workspace;
|
|
$S = open_floating_window;
|
|
$target_ws = fresh_workspace;
|
|
$M = open_window;
|
|
cmd 'mark target';
|
|
|
|
cmd '[id="' . $S->{id} . '"] move container to mark target';
|
|
sync_with_i3;
|
|
|
|
is(@{get_ws($target_ws)->{floating_nodes}}, 1, 'target workspace has the container now');
|
|
|
|
###############################################################################
|
|
# Given 'S' and 'M' where 'M' is floating and on a different workspace,
|
|
# when 'S' is moved to 'M', then 'S' ends up as a tiling container on the
|
|
# same workspace as 'M'.
|
|
###############################################################################
|
|
|
|
$source_ws = fresh_workspace;
|
|
$S = open_window;
|
|
$target_ws = fresh_workspace;
|
|
$M = open_floating_window;
|
|
cmd 'mark target';
|
|
|
|
cmd '[id="' . $S->{id} . '"] move container to mark target';
|
|
sync_with_i3;
|
|
|
|
($nodes, $focus) = get_ws_content($target_ws);
|
|
is(@{$nodes}, 1, 'tiling container moved to the target workspace');
|
|
|
|
###############################################################################
|
|
|
|
done_testing;
|