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
|
#include "../shared.hpp"
#include "../../shared.hpp"
#include "../../hyprctlCompat.hpp"
#include "tests.hpp"
TEST_CASE(single_window_aspect_ratio) {
OK(getFromSocket("/eval hl.config({ layout = { single_window_aspect_ratio = '1 1' } })"));
Tests::spawnKitty();
{
auto str = getFromSocket("/activewindow");
EXPECT_CONTAINS(str, "at: 442,22");
EXPECT_CONTAINS(str, "size: 1036,1036");
}
Tests::spawnKitty();
OK(getFromSocket("/dispatch hl.dsp.window.kill({ window = 'activewindow' })"));
Tests::waitUntilWindowsN(1);
{
auto str = getFromSocket("/activewindow");
EXPECT_CONTAINS(str, "at: 442,22");
EXPECT_CONTAINS(str, "size: 1036,1036");
}
// don't use swar on maximized
OK(getFromSocket("/dispatch hl.dsp.window.fullscreen({ mode = 'maximized' })"));
{
auto str = getFromSocket("/activewindow");
EXPECT_CONTAINS(str, "at: 22,22");
EXPECT_CONTAINS(str, "size: 1876,1036");
}
}
// Don't crash when focus after global geometry changes
TEST_CASE(crashOnGeomUpdate) {
Tests::spawnKitty();
Tests::spawnKitty();
Tests::spawnKitty();
// move the layout
OK(getFromSocket("/eval hl.monitor({ output = 'HEADLESS-2', mode = '1920x1080@60', position = '1000x0', scale = '1' })"));
// shouldnt crash
OK(getFromSocket("/dispatch hl.dsp.focus({ direction = 'right' })"));
}
// Test if size + pos is preserved after fs cycle
TEST_CASE(posPreserve) {
Tests::spawnKitty();
OK(getFromSocket("/dispatch hl.dsp.window.float({ action = 'set', window = 'class:kitty' })"));
OK(getFromSocket("/dispatch hl.dsp.window.resize({ x = 1337, y = 69, window = 'class:kitty' })"));
OK(getFromSocket("/dispatch hl.dsp.window.move({ x = 420, y = 420, window = 'class:kitty' })"));
{
auto str = getFromSocket("/activewindow");
EXPECT_CONTAINS(str, "at: 420,420");
EXPECT_CONTAINS(str, "size: 1337,69");
}
OK(getFromSocket("/dispatch hl.dsp.window.fullscreen()"));
OK(getFromSocket("/dispatch hl.dsp.window.fullscreen()"));
{
auto str = getFromSocket("/activewindow");
EXPECT_CONTAINS(str, "size: 1337,69");
}
OK(getFromSocket("/dispatch hl.dsp.window.move({ direction = 'right' })"));
{
auto str = getFromSocket("/activewindow");
EXPECT_CONTAINS(str, "at: 581,420");
EXPECT_CONTAINS(str, "size: 1337,69");
}
OK(getFromSocket("/dispatch hl.dsp.window.fullscreen()"));
OK(getFromSocket("/dispatch hl.dsp.window.fullscreen()"));
{
auto str = getFromSocket("/activewindow");
EXPECT_CONTAINS(str, "at: 581,420");
EXPECT_CONTAINS(str, "size: 1337,69");
}
}
TEST_CASE(focusMRUAfterClose) {
NLog::log("{}Testing focus after close (MRU order)", Colors::GREEN);
OK(getFromSocket("/reload"));
OK(getFromSocket("/eval hl.config({ dwindle = { default_split_ratio = 1.25 } })"));
OK(getFromSocket("/eval hl.config({ input = { focus_on_close = 2 } })"));
ASSERT(!!Tests::spawnKitty("kitty_A"), true);
ASSERT(!!Tests::spawnKitty("kitty_B"), true);
ASSERT(!!Tests::spawnKitty("kitty_C"), true);
OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:kitty_A' })"));
OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:kitty_B' })"));
OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:kitty_C' })"));
OK(getFromSocket("/dispatch hl.dsp.window.kill()"));
Tests::waitUntilWindowsN(2);
{
auto str = getFromSocket("/activewindow");
EXPECT(str.contains("class: kitty_B"), true);
}
OK(getFromSocket("/dispatch hl.dsp.window.kill()"));
Tests::waitUntilWindowsN(1);
{
auto str = getFromSocket("/activewindow");
EXPECT(str.contains("class: kitty_A"), true);
}
}
TEST_CASE(focusPreservedLayoutChange) {
OK(getFromSocket("r/eval hl.config({ general = { layout = 'master' } })"));
ASSERT(!!Tests::spawnKitty("kitty_A"), true);
ASSERT(!!Tests::spawnKitty("kitty_B"), true);
ASSERT(!!Tests::spawnKitty("kitty_C"), true);
ASSERT(!!Tests::spawnKitty("kitty_D"), true);
OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:kitty_C' })"));
OK(getFromSocket("r/eval hl.config({ general = { layout = 'monocle' } })"));
{
auto str = getFromSocket("/activewindow");
EXPECT(str.contains("class: kitty_C"), true);
}
}
|