Port layout tests to new API
This commit is contained in:
parent
39b2bf963c
commit
cdd943ded4
@ -17,6 +17,11 @@ WindowOrId = Union[WindowType, int]
|
|||||||
group_id_counter = count(start=1)
|
group_id_counter = count(start=1)
|
||||||
|
|
||||||
|
|
||||||
|
def reset_group_id_counter() -> None:
|
||||||
|
global group_id_counter
|
||||||
|
group_id_counter = count(start=1)
|
||||||
|
|
||||||
|
|
||||||
def wrap_increment(val: int, num: int, delta: int) -> int:
|
def wrap_increment(val: int, num: int, delta: int) -> int:
|
||||||
mult = -1 if delta < 0 else 1
|
mult = -1 if delta < 0 else 1
|
||||||
delta = mult * (abs(delta) % num)
|
delta = mult * (abs(delta) % num)
|
||||||
|
|||||||
@ -4,8 +4,9 @@
|
|||||||
|
|
||||||
from kitty.config import defaults
|
from kitty.config import defaults
|
||||||
from kitty.constants import WindowGeometry
|
from kitty.constants import WindowGeometry
|
||||||
from kitty.layout import Grid, Horizontal, Splits, Stack, Tall, idx_for_id
|
from kitty.layout.interface import Grid, Horizontal, Splits, Stack, Tall
|
||||||
from kitty.window import EdgeWidths
|
from kitty.window import EdgeWidths
|
||||||
|
from kitty.window_list import WindowList, reset_group_id_counter
|
||||||
|
|
||||||
from . import BaseTest
|
from . import BaseTest
|
||||||
|
|
||||||
@ -20,6 +21,10 @@ class Window:
|
|||||||
self.geometry = WindowGeometry(0, 0, 0, 0, 0, 0)
|
self.geometry = WindowGeometry(0, 0, 0, 0, 0, 0)
|
||||||
self.padding = EdgeWidths()
|
self.padding = EdgeWidths()
|
||||||
self.margin = EdgeWidths()
|
self.margin = EdgeWidths()
|
||||||
|
self.focused = False
|
||||||
|
|
||||||
|
def focus_changed(self, focused):
|
||||||
|
self.focused = focused
|
||||||
|
|
||||||
def effective_border(self):
|
def effective_border(self):
|
||||||
return 1
|
return 1
|
||||||
@ -30,10 +35,10 @@ class Window:
|
|||||||
def effective_margin(self, edge, is_single_window=False):
|
def effective_margin(self, edge, is_single_window=False):
|
||||||
return 0 if is_single_window else 1
|
return 0 if is_single_window else 1
|
||||||
|
|
||||||
def set_visible_in_layout(self, idx, val):
|
def set_visible_in_layout(self, val):
|
||||||
self.is_visible_in_layout = bool(val)
|
self.is_visible_in_layout = bool(val)
|
||||||
|
|
||||||
def set_geometry(self, idx, geometry):
|
def set_geometry(self, geometry):
|
||||||
self.geometry = geometry
|
self.geometry = geometry
|
||||||
|
|
||||||
|
|
||||||
@ -46,142 +51,180 @@ def create_layout(cls, opts=None, border_width=2):
|
|||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
|
||||||
def create_windows(num=5):
|
class Tab:
|
||||||
return [Window(i + 1) for i in range(num)]
|
|
||||||
|
def active_window_changed(self):
|
||||||
|
self.current_layout.update_visibility(self.windows)
|
||||||
|
|
||||||
|
|
||||||
|
def create_windows(layout, num=5):
|
||||||
|
t = Tab()
|
||||||
|
t.current_layout = layout
|
||||||
|
t.windows = ans = WindowList(t)
|
||||||
|
ans.tab_mem = t
|
||||||
|
reset_group_id_counter()
|
||||||
|
for i in range(num):
|
||||||
|
ans.add_window(Window(i + 1))
|
||||||
|
ans.set_active_group_idx(0)
|
||||||
|
return ans
|
||||||
|
|
||||||
|
|
||||||
def utils(self, q, windows):
|
def utils(self, q, windows):
|
||||||
def ids():
|
def ids():
|
||||||
return [w.id for w in windows]
|
return [w.id for w in windows.groups]
|
||||||
|
|
||||||
def visible_ids():
|
def visible_ids():
|
||||||
return {w.id for w in windows if w.is_visible_in_layout}
|
return {gr.id for gr in windows.groups if gr.is_visible_in_layout}
|
||||||
|
|
||||||
def expect_ids(*a):
|
def expect_ids(*a):
|
||||||
self.assertEqual(tuple(ids()), a)
|
self.assertEqual(tuple(ids()), a)
|
||||||
|
|
||||||
def check_visible(active_window_idx):
|
def check_visible():
|
||||||
if q.only_active_window_visible:
|
if q.only_active_window_visible:
|
||||||
self.ae(visible_ids(), {windows[active_window_idx].id})
|
self.ae(visible_ids(), {windows.active_group.id})
|
||||||
else:
|
else:
|
||||||
self.ae(visible_ids(), {w.id for w in windows if w.overlay_window_id is None})
|
self.ae(visible_ids(), {gr.id for gr in windows.groups})
|
||||||
return ids, visible_ids, expect_ids, check_visible
|
return ids, visible_ids, expect_ids, check_visible
|
||||||
|
|
||||||
|
|
||||||
class TestLayout(BaseTest):
|
class TestLayout(BaseTest):
|
||||||
|
|
||||||
def do_ops_test(self, q):
|
def do_ops_test(self, q):
|
||||||
windows = create_windows()
|
windows = create_windows(q)
|
||||||
ids, visible_ids, expect_ids, cv = utils(self, q, windows)
|
ids, visible_ids, expect_ids, check_visible = utils(self, q, windows)
|
||||||
|
|
||||||
def check_visible():
|
|
||||||
return cv(active_window_idx)
|
|
||||||
active_window_idx = 0
|
|
||||||
# Test layout
|
# Test layout
|
||||||
self.ae(q(windows, active_window_idx), active_window_idx)
|
q(windows)
|
||||||
|
self.ae(windows.active_group_idx, 0)
|
||||||
expect_ids(*range(1, len(windows)+1))
|
expect_ids(*range(1, len(windows)+1))
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
# Test nth_window
|
# Test nth_window
|
||||||
for i in range(len(windows)):
|
for i in range(windows.num_groups):
|
||||||
active_window_idx = q.activate_nth_window(windows, i)
|
q.activate_nth_window(windows, i)
|
||||||
self.ae(active_window_idx, i)
|
self.ae(windows.active_group_idx, i)
|
||||||
expect_ids(*range(1, len(windows)+1))
|
expect_ids(*range(1, len(windows)+1))
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
# Test next_window
|
# Test next_window
|
||||||
for i in range(2 * len(windows)):
|
for i in range(2 * windows.num_groups):
|
||||||
expected = (active_window_idx + 1) % len(windows)
|
expected = (windows.active_group_idx + 1) % windows.num_groups
|
||||||
active_window_idx = q.next_window(windows, active_window_idx)
|
q.next_window(windows)
|
||||||
self.ae(active_window_idx, expected)
|
self.ae(windows.active_group_idx, expected)
|
||||||
expect_ids(*range(1, len(windows)+1))
|
expect_ids(*range(1, len(windows)+1))
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
# Test move_window
|
# Test move_window
|
||||||
active_window_idx = 0
|
windows.set_active_group_idx(0)
|
||||||
active_window_idx = q.move_window(windows, active_window_idx, 3)
|
expect_ids(1, 2, 3, 4, 5)
|
||||||
self.ae(active_window_idx, 3)
|
q.move_window(windows, 3)
|
||||||
|
self.ae(windows.active_group_idx, 3)
|
||||||
expect_ids(4, 2, 3, 1, 5)
|
expect_ids(4, 2, 3, 1, 5)
|
||||||
check_visible()
|
check_visible()
|
||||||
q.move_window(windows, 0, 3)
|
windows.set_active_group_idx(0)
|
||||||
|
q.move_window(windows, 3)
|
||||||
expect_ids(*range(1, len(windows)+1))
|
expect_ids(*range(1, len(windows)+1))
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
# Test add_window
|
# Test add_window
|
||||||
active_window_idx = q.add_window(windows, Window(6), active_window_idx)
|
windows.set_active_group_idx(4)
|
||||||
self.ae(active_window_idx, 5)
|
q.add_window(windows, Window(6))
|
||||||
expect_ids(*range(1, len(windows)+1))
|
self.ae(windows.num_groups, 6)
|
||||||
|
self.ae(windows.active_group_idx, 5)
|
||||||
|
expect_ids(*range(1, windows.num_groups+1))
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
# Test remove_window
|
# Test remove_window
|
||||||
active_window_idx = 3
|
prev_window = windows.active_window
|
||||||
expected = active_window_idx
|
windows.set_active_group_idx(3)
|
||||||
active_window_idx = q.remove_window(windows, windows[active_window_idx], active_window_idx)
|
self.ae(windows.active_group_idx, 3)
|
||||||
self.ae(active_window_idx, expected)
|
windows.remove_window(windows.active_window)
|
||||||
|
self.ae(windows.active_window, prev_window)
|
||||||
check_visible()
|
check_visible()
|
||||||
expect_ids(1, 2, 3, 5, 6)
|
expect_ids(1, 2, 3, 5, 6)
|
||||||
w = windows[active_window_idx]
|
|
||||||
active_window_idx = q.remove_window(windows, windows[0], active_window_idx)
|
windows.set_active_group_idx(0)
|
||||||
self.ae(active_window_idx, windows.index(w))
|
to_remove = windows.active_window
|
||||||
|
windows.set_active_group_idx(3)
|
||||||
|
windows.remove_window(to_remove)
|
||||||
|
self.ae(windows.active_group_idx, 3)
|
||||||
check_visible()
|
check_visible()
|
||||||
expect_ids(2, 3, 5, 6)
|
expect_ids(2, 3, 5, 6)
|
||||||
|
|
||||||
# Test set_active_window
|
# Test set_active_window
|
||||||
for i in range(len(windows)):
|
for i in range(windows.num_groups):
|
||||||
active_window_idx = q.set_active_window(windows, i)
|
windows.set_active_group_idx(i)
|
||||||
self.ae(i, active_window_idx)
|
self.ae(i, windows.active_group_idx)
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
def do_overlay_test(self, q):
|
def do_overlay_test(self, q):
|
||||||
windows = create_windows()
|
windows = create_windows(q)
|
||||||
ids, visible_ids, expect_ids, cv = utils(self, q, windows)
|
ids, visible_ids, expect_ids, check_visible = utils(self, q, windows)
|
||||||
|
|
||||||
def check_visible():
|
|
||||||
return cv(active_window_idx)
|
|
||||||
|
|
||||||
def aidx(i):
|
|
||||||
return idx_for_id(visible_windows[i].id, windows)
|
|
||||||
|
|
||||||
# Test add_window
|
# Test add_window
|
||||||
w = Window(len(windows) + 1)
|
w = Window(len(windows) + 1)
|
||||||
active_window_idx = 1
|
before = windows.active_group_idx
|
||||||
w.overlay_for = windows[active_window_idx].id
|
overlaid_group = before
|
||||||
windows[active_window_idx].overlay_window_id = w.id
|
overlay_window_id = w.id
|
||||||
active_window_idx = q.add_window(windows, w, active_window_idx)
|
windows.add_window(w, group_of=windows.active_window)
|
||||||
self.ae(active_window_idx, 1)
|
self.ae(before, windows.active_group_idx)
|
||||||
expect_ids(1, 6, 3, 4, 5, 2)
|
self.ae(w, windows.active_window)
|
||||||
|
expect_ids(1, 2, 3, 4, 5)
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
# Test layout
|
# Test layout
|
||||||
self.ae(q(windows, active_window_idx), active_window_idx)
|
q(windows)
|
||||||
expect_ids(1, 6, 3, 4, 5, 2)
|
expect_ids(1, 2, 3, 4, 5)
|
||||||
check_visible()
|
check_visible()
|
||||||
w = Window(len(windows) + 1)
|
w = Window(len(windows) + 1)
|
||||||
active_window_idx = q.add_window(windows, w, active_window_idx)
|
windows.add_window(w)
|
||||||
self.ae(active_window_idx, 6)
|
expect_ids(1, 2, 3, 4, 5, 6)
|
||||||
visible_windows = [w for w in windows if w.overlay_window_id is None]
|
self.ae(windows.active_group_idx, windows.num_groups - 1)
|
||||||
|
|
||||||
# Test nth_window
|
# Test nth_window
|
||||||
for i in range(len(visible_windows)):
|
for i in range(windows.num_groups):
|
||||||
active_window_idx = q.activate_nth_window(windows, i)
|
q.activate_nth_window(windows, i)
|
||||||
self.ae(active_window_idx, aidx(i))
|
self.ae(windows.active_group_idx, i)
|
||||||
expect_ids(1, 6, 3, 4, 5, 2, 7)
|
if i == overlaid_group:
|
||||||
|
self.ae(windows.active_window.id, overlay_window_id)
|
||||||
|
expect_ids(1, 2, 3, 4, 5, 6)
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
# Test next_window
|
# Test next_window
|
||||||
for i in range(len(visible_windows)):
|
for i in range(windows.num_groups):
|
||||||
active_window_idx = q.next_window(windows, aidx(i))
|
expected = (windows.active_group_idx + 1) % windows.num_groups
|
||||||
expected = (i + 1) % len(visible_windows)
|
q.next_window(windows)
|
||||||
self.ae(active_window_idx, aidx(expected))
|
self.ae(windows.active_group_idx, expected)
|
||||||
expect_ids(1, 6, 3, 4, 5, 2, 7)
|
expect_ids(1, 2, 3, 4, 5, 6)
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
# Test move_window
|
# Test move_window
|
||||||
active_window_idx = q.move_window(windows, 4)
|
windows.set_active_group_idx(overlaid_group)
|
||||||
self.ae(active_window_idx, 6)
|
expect_ids(1, 2, 3, 4, 5, 6)
|
||||||
expect_ids(1, 6, 3, 4, 7, 2, 5)
|
q.move_window(windows, 3)
|
||||||
|
self.ae(windows.active_group_idx, 3)
|
||||||
|
self.ae(windows.active_window.id, overlay_window_id)
|
||||||
|
expect_ids(4, 2, 3, 1, 5, 6)
|
||||||
check_visible()
|
check_visible()
|
||||||
|
windows.set_active_group_idx(0)
|
||||||
|
q.move_window(windows, 3)
|
||||||
|
expect_ids(1, 2, 3, 4, 5, 6)
|
||||||
|
check_visible()
|
||||||
|
|
||||||
# Test set_active_window
|
# Test set_active_window
|
||||||
active_window_idx = q.set_active_window(windows, 0)
|
for i in range(windows.num_groups):
|
||||||
self.ae(active_window_idx, 0)
|
windows.set_active_group_idx(i)
|
||||||
check_visible()
|
self.ae(i, windows.active_group_idx)
|
||||||
active_window_idx = q.set_active_window(windows, 5)
|
if i == overlaid_group:
|
||||||
self.ae(active_window_idx, 1)
|
self.ae(windows.active_window.id, overlay_window_id)
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
# Test remove_window
|
# Test remove_window
|
||||||
active_window_idx = q.remove_window(windows, windows[1], 1)
|
expect_ids(1, 2, 3, 4, 5, 6)
|
||||||
expect_ids(1, 2, 3, 4, 7, 5)
|
windows.set_active_group_idx(overlaid_group)
|
||||||
self.ae(active_window_idx, 1)
|
windows.remove_window(overlay_window_id)
|
||||||
|
self.ae(windows.active_group_idx, overlaid_group)
|
||||||
|
self.ae(windows.active_window.id, 1)
|
||||||
|
expect_ids(1, 2, 3, 4, 5, 6)
|
||||||
check_visible()
|
check_visible()
|
||||||
|
|
||||||
def test_layout_operations(self):
|
def test_layout_operations(self):
|
||||||
@ -196,14 +239,18 @@ class TestLayout(BaseTest):
|
|||||||
|
|
||||||
def test_splits(self):
|
def test_splits(self):
|
||||||
q = create_layout(Splits)
|
q = create_layout(Splits)
|
||||||
all_windows = []
|
all_windows = create_windows(q, num=0)
|
||||||
self.ae(0, q.add_window(all_windows, Window(1), -1))
|
q.add_window(all_windows, Window(1))
|
||||||
self.ae(1, q.add_window(all_windows, Window(2), 0, location='vsplit'))
|
self.ae(all_windows.active_group_idx, 0)
|
||||||
|
q.add_window(all_windows, Window(2), location='vsplit')
|
||||||
|
self.ae(all_windows.active_group_idx, 1)
|
||||||
|
q(all_windows)
|
||||||
self.ae(q.pairs_root.pair_for_window(2).horizontal, True)
|
self.ae(q.pairs_root.pair_for_window(2).horizontal, True)
|
||||||
self.ae(2, q.add_window(all_windows, Window(3), 1, location='hsplit'))
|
q.add_window(all_windows, Window(3), location='hsplit')
|
||||||
self.ae(q.pairs_root.pair_for_window(2).horizontal, False)
|
self.ae(q.pairs_root.pair_for_window(2).horizontal, False)
|
||||||
self.ae(3, q.add_window(all_windows, Window(4), 2, location='vsplit'))
|
q.add_window(all_windows, Window(4), location='vsplit')
|
||||||
self.ae(q.neighbors_for_window(all_windows[0], all_windows), {'left': [], 'right': [2, 3], 'top': [], 'bottom': []})
|
windows = list(all_windows)
|
||||||
self.ae(q.neighbors_for_window(all_windows[1], all_windows), {'left': [1], 'right': [], 'top': [], 'bottom': [3, 4]})
|
self.ae(q.neighbors_for_window(windows[0], all_windows), {'left': [], 'right': [2, 3], 'top': [], 'bottom': []})
|
||||||
self.ae(q.neighbors_for_window(all_windows[2], all_windows), {'left': [1], 'right': [4], 'top': [2], 'bottom': []})
|
self.ae(q.neighbors_for_window(windows[1], all_windows), {'left': [1], 'right': [], 'top': [], 'bottom': [3, 4]})
|
||||||
self.ae(q.neighbors_for_window(all_windows[3], all_windows), {'left': [3], 'right': [], 'top': [2], 'bottom': []})
|
self.ae(q.neighbors_for_window(windows[2], all_windows), {'left': [1], 'right': [4], 'top': [2], 'bottom': []})
|
||||||
|
self.ae(q.neighbors_for_window(windows[3], all_windows), {'left': [3], 'right': [], 'top': [2], 'bottom': []})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user