]> git.sur5r.net Git - i3/i3/blobdiff - testcases/t/243-move-to-mark.t
Merge branch 'next' into master
[i3/i3] / testcases / t / 243-move-to-mark.t
index abc2b4c6ce270ca6b4501175146678903b62c0a7..5e806cd4653f37c7003e54b2d5309c99b4749b30 100644 (file)
@@ -31,7 +31,7 @@ my $_NET_WM_STATE_ADD = 1;
 my $_NET_WM_STATE_TOGGLE = 2;
 
 sub set_urgency {
-    my ($win, $urgent_flag) = @_; 
+    my ($win, $urgent_flag) = @_;
     my $msg = pack "CCSLLLLLL",
         X11::XCB::CLIENT_MESSAGE, # response_type
         32, # format
@@ -119,7 +119,7 @@ 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 
+# 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.
 ###############################################################################
 
@@ -321,6 +321,27 @@ sync_with_i3;
 ($nodes, $focus) = get_ws_content($target_ws);
 is(@{$nodes}, 1, 'tiling container moved to the target workspace');
 
+###############################################################################
+# Given 'S' and 'M' where 'M' is inside a floating container but not its direct
+# child, when 'S' is moved to 'M', i3 should not crash.
+# See issue: #3402
+###############################################################################
+
+$target_ws = fresh_workspace;
+$S = open_window;
+open_window;
+cmd 'splitv';
+$M = open_window;
+cmd 'mark target';
+cmd 'focus parent, floating enable, focus child';
+
+cmd '[id="' . $S->{id} . '"] move container to mark target';
+does_i3_live;
+
+# Note: this is not actively supported behavior.
+$nodes = get_ws($target_ws)->{floating_nodes}->[0]->{nodes}->[0]->{nodes};
+is(1, (grep { $_->{window} == $S->{id} } @{$nodes}), 'tiling container moved inside floating container');
+
 ###############################################################################
 # Given 'S' and 'M' are the same container, when 'S' is moved to 'M', then
 # the command is ignored.
@@ -336,6 +357,50 @@ sync_with_i3;
 
 does_i3_live;
 
+###############################################################################
+# Given 'S' and 'M' where 'M' is a workspace and 'S' is on a different
+# workspace, then 'S' ends up as a tiling container on 'M'.
+###############################################################################
+
+fresh_workspace;
+$S = open_window;
+$target_ws = fresh_workspace;
+$M = $target_ws;
+cmd 'mark target';
+
+cmd '[id="' . $S->{id} . '"] move container to mark target';
+sync_with_i3;
+
+does_i3_live;
+
+($nodes, $focus) = get_ws_content($target_ws);
+is(@{$nodes}, 1, 'tiling container moved to the target workspace');
+
+###############################################################################
+# Given 'S' and 'M' where 'S' is a workspace and 'M' is a container on a
+# different workspace, then all the contents of workspace 'S' end up in 'M's
+# workspace.
+###############################################################################
+
+$S = fresh_workspace;
+cmd 'mark S';
+open_window;
+open_window;
+cmd 'splitv';
+open_window;
+open_floating_window;
+$target_ws = fresh_workspace;
+$M = open_window;
+cmd 'mark target';
+
+cmd '[con_mark=S] move container to mark target';
+sync_with_i3;
+
+($nodes, $focus) = get_ws_content($target_ws);
+is(@{$nodes}, 2, 'there is a window and a container with the contents of the original workspace');
+is($nodes->[0]->{window}, $M->{id}, 'M remains the first window');
+is(@{get_ws($target_ws)->{floating_nodes}}, 1, 'target workspace has the floating container');
+
 ###############################################################################
 
 done_testing;