#include "../shared.hpp" #include "../../shared.hpp" #include "../../hyprctlCompat.hpp" #include "tests.hpp" TEST_CASE(scrollFocusCycling) { OK(getFromSocket("r/eval hl.config({ general = { layout = 'scrolling' } })")); for (auto const& win : {"a", "b", "c", "d"}) { if (!Tests::spawnKitty(win)) { FAIL_TEST("Could not spawn kitty with win class `{}`", win); } } OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:a' })")); OK(getFromSocket("/dispatch hl.dsp.focus({ direction = 'right' })")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: b"); } OK(getFromSocket("/dispatch hl.dsp.focus({ direction = 'right' })")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: c"); } OK(getFromSocket("/dispatch hl.dsp.focus({ direction = 'right' })")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: d"); } OK(getFromSocket("/dispatch hl.dsp.window.move({ direction = 'left' })")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: d"); } OK(getFromSocket("/dispatch hl.dsp.focus({ direction = 'up' })")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: c"); } } TEST_CASE(scrollFocusWrapping) { OK(getFromSocket("r/eval hl.config({ general = { layout = 'scrolling' } })")); for (auto const& win : {"a", "b", "c", "d"}) { if (!Tests::spawnKitty(win)) { FAIL_TEST("Could not spawn kitty with win class `{}`", win); } } // set wrap_focus to true OK(getFromSocket("/eval hl.config({ scrolling = { wrap_focus = true } })")); OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:a' })")); OK(getFromSocket("/dispatch hl.dsp.layout('focus l')")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: d"); } OK(getFromSocket("/dispatch hl.dsp.layout('focus r')")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: a"); } // set wrap_focus to false OK(getFromSocket("/eval hl.config({ scrolling = { wrap_focus = false } })")); OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:a' })")); OK(getFromSocket("/dispatch hl.dsp.layout('focus l')")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: a"); } OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:d' })")); OK(getFromSocket("/dispatch hl.dsp.layout('focus r')")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: d"); } } TEST_CASE(scrollSwapcolWrapping) { OK(getFromSocket("r/eval hl.config({ general = { layout = 'scrolling' } })")); for (auto const& win : {"a", "b", "c", "d"}) { if (!Tests::spawnKitty(win)) { FAIL_TEST("Could not spawn kitty with win class `{}`", win); } } // set wrap_swapcol to true OK(getFromSocket("/eval hl.config({ scrolling = { wrap_swapcol = true } })")); OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:a' })")); OK(getFromSocket("/dispatch hl.dsp.layout('swapcol l')")); OK(getFromSocket("/dispatch hl.dsp.layout('focus l')")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: c"); } // clean up NLog::log("{}Killing all windows", Colors::YELLOW); Tests::killAllWindows(); for (auto const& win : {"a", "b", "c", "d"}) { if (!Tests::spawnKitty(win)) { FAIL_TEST("Could not spawn kitty with win class `{}`", win); } } OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:d' })")); OK(getFromSocket("/dispatch hl.dsp.layout('swapcol r')")); OK(getFromSocket("/dispatch hl.dsp.layout('focus r')")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: b"); } // clean up NLog::log("{}Killing all windows", Colors::YELLOW); Tests::killAllWindows(); for (auto const& win : {"a", "b", "c", "d"}) { if (!Tests::spawnKitty(win)) { FAIL_TEST("Could not spawn kitty with win class `{}`", win); } } // set wrap_swapcol to false OK(getFromSocket("/eval hl.config({ scrolling = { wrap_swapcol = false } })")); OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:a' })")); OK(getFromSocket("/dispatch hl.dsp.layout('swapcol l')")); OK(getFromSocket("/dispatch hl.dsp.layout('focus r')")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: b"); } OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:d' })")); OK(getFromSocket("/dispatch hl.dsp.layout('swapcol r')")); OK(getFromSocket("/dispatch hl.dsp.layout('focus l')")); { auto str = getFromSocket("/activewindow"); ASSERT_CONTAINS(str, "class: c"); } } TEST_CASE(scrollWindowRule) { OK(getFromSocket("r/eval hl.config({ general = { layout = 'scrolling' } })")); NLog::log("{}Testing Scrolling Width", Colors::GREEN); // inject a new rule. OK(getFromSocket("/eval hl.window_rule({ name = 'scrolling-width', match = { class = 'kitty_scroll' } })")); OK(getFromSocket("/eval hl.window_rule({ name = 'scrolling-width', scrolling_width = 0.1 })")); if (!Tests::spawnKitty("kitty_scroll")) { FAIL_TEST("Could not spawn kitty with win class `kitty_scroll`"); } if (!Tests::spawnKitty("kitty_scroll")) { FAIL_TEST("Could not spawn kitty with win class `kitty_scroll`"); } ASSERT(Tests::windowCount(), 2); // not the greatest test, but as long as res and gaps don't change, we good. EXPECT_CONTAINS(getFromSocket("/activewindow"), "size: 174,1036"); }