aboutsummaryrefslogtreecommitdiff
path: root/testcases/t/176-workspace-baf.t
blob: 167384291f7b2851240affce9041c92e68942eb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#!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)
#
# Checks if the 'workspace back_and_forth' command and the
# 'workspace_auto_back_and_forth' config directive work correctly.
#

use i3test i3_autostart => 0;

my $config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
EOT

my $pid = launch_with_config($config);

my $first_ws = fresh_workspace;
ok(get_ws($first_ws)->{focused}, 'first workspace focused');

my $second_ws = fresh_workspace;
ok(get_ws($second_ws)->{focused}, 'second workspace focused');

my $third_ws = fresh_workspace;
ok(get_ws($third_ws)->{focused}, 'third workspace focused');

cmd 'workspace back_and_forth';
ok(get_ws($second_ws)->{focused}, 'second workspace focused');

#####################################################################
# test that without workspace_auto_back_and_forth switching to the same
# workspace that is currently focused is a no-op
#####################################################################

cmd qq|workspace "$second_ws"|;
ok(get_ws($second_ws)->{focused}, 'second workspace still focused');

################################################################################
# verify that 'move workspace back_and_forth' works as expected
################################################################################

cmd qq|workspace "$first_ws"|;
my $first_win = open_window;

cmd qq|workspace "$second_ws"|;
my $second_win = open_window;

is(@{get_ws_content($first_ws)}, 1, 'one container on ws 1 before moving');
cmd 'move workspace back_and_forth';
is(@{get_ws_content($first_ws)}, 2, 'two containers on ws 1 before moving');

my $third_win = open_window;

################################################################################
# verify that moving to the current ws is a no-op without
# workspace_auto_back_and_forth.
################################################################################

cmd qq|workspace "$first_ws"|;

is(@{get_ws_content($second_ws)}, 1, 'one container on ws 2 before moving');
cmd qq|move workspace "$first_ws"|;
is(@{get_ws_content($second_ws)}, 1, 'still one container');

exit_gracefully($pid);

#####################################################################
# the same test, but with workspace_auto_back_and_forth
#####################################################################

$config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
workspace_auto_back_and_forth yes
EOT

$pid = launch_with_config($config);

$first_ws = fresh_workspace;
ok(get_ws($first_ws)->{focused}, 'first workspace focused');

$second_ws = fresh_workspace;
ok(get_ws($second_ws)->{focused}, 'second workspace focused');

$third_ws = fresh_workspace;
ok(get_ws($third_ws)->{focused}, 'third workspace focused');

cmd qq|workspace "$third_ws"|;
ok(get_ws($second_ws)->{focused}, 'second workspace focused');
$first_win = open_window;

################################################################################
# verify that moving to the current ws moves to the previous one with
# workspace_auto_back_and_forth.
################################################################################

cmd qq|workspace "$first_ws"|;
$second_win = open_window;

is(@{get_ws_content($second_ws)}, 1, 'one container on ws 2 before moving');
cmd qq|move workspace "$first_ws"|;
is(@{get_ws_content($second_ws)}, 2, 'two containers on ws 2');

################################################################################
# Now see if "workspace number <number>" also works as expected with
# workspace_auto_back_and_forth enabled.
################################################################################

cmd 'workspace number 5';
ok(get_ws('5')->{focused}, 'workspace 5 focused');
# ensure it stays open
cmd 'open';

cmd 'workspace number 6';
ok(get_ws('6')->{focused}, 'workspace 6 focused');
# ensure it stays open
cmd 'open';

cmd 'workspace number 6';
is(focused_ws, '5', 'workspace 5 focused again');

################################################################################
# Rename the workspaces and see if workspace number still works with BAF.
################################################################################

cmd 'rename workspace 5 to 5: foo';
cmd 'rename workspace 6 to 6: baz';

is(focused_ws, '5: foo', 'workspace 5 still focused');

cmd 'workspace number 6';
is(focused_ws, '6: baz', 'workspace 6 now focused');

cmd 'workspace number 6';
is(focused_ws, '5: foo', 'workspace 5 focused again');

################################################################################
# Place a window in the scratchpad, see if BAF works after showing the
# scratchpad window.
################################################################################

my $scratchwin = open_window;
cmd 'move scratchpad';

# show scratchpad window
cmd 'scratchpad show';

# hide scratchpad window
cmd 'scratchpad show';

cmd 'workspace back_and_forth';
is(focused_ws, '6: baz', 'workspace 6 now focused');

################################################################################
# See if BAF is preserved after restart
################################################################################

cmd 'restart';
cmd 'workspace back_and_forth';
is(focused_ws, '5: foo', 'workspace 5 focused after restart');

################################################################################
# Check BAF switching to renamed workspace.
# Issue: #3694
################################################################################

kill_all_windows;
cmd 'workspace --no-auto-back-and-forth 1';
open_window;
cmd 'workspace --no-auto-back-and-forth 2';

cmd 'rename workspace 1 to 3';
cmd 'workspace back_and_forth';
is(focused_ws, '3', 'workspace 3 focused after rename');

################################################################################
# Check BAF switching to renamed and then closed workspace.
# Issue: #3694
################################################################################

kill_all_windows;
cmd 'workspace --no-auto-back-and-forth 1';
$first_win = open_window;
cmd 'workspace --no-auto-back-and-forth 2';

cmd 'rename workspace 1 to 3';
cmd '[id="' . $first_win->id . '"] kill';

cmd 'workspace back_and_forth';
is(focused_ws, '3', 'workspace 3 focused after renaming and destroying');

################################################################################
# See if renaming current workspace doesn't affect BAF switching to another
# renamed workspace.
# Issue: #3694
################################################################################

kill_all_windows;
cmd 'workspace --no-auto-back-and-forth 1';
$first_win = open_window;
cmd 'workspace --no-auto-back-and-forth 2';

cmd 'rename workspace 1 to 3';
cmd 'rename workspace 2 to 4';

cmd 'workspace back_and_forth';
is(focused_ws, '3', 'workspace 3 focused after renaming');

exit_gracefully($pid);

done_testing;