def test_automatic_rename_option(session): """With option automatic-rename: on.""" yaml_config = loadfixture("workspacebuilder/window_automatic_rename.yaml") s = session sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig) window_count = len(session._windows) # current window count assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): w.select_layout('tiled') # fix glitch with pane size p = p assert len(s._windows), window_count assert isinstance(w, Window) assert w.show_window_option('automatic-rename') == 'on' assert len(s._windows) == window_count window_count += 1 w.select_layout(wconf['layout']) assert s.name != 'tmuxp' w = s.windows[0] while retry(): session.server._update_windows() if w.name != 'sh': break assert w.name != 'sh' pane_base_index = w.show_window_option('pane-base-index', g=True) w.select_pane(pane_base_index) while retry(): session.server._update_windows() if w.name == 'sh': break assert w.name == text_type('sh') w.select_pane('-D') while retry(): session.server._update_windows() if w['window_name'] != 'sh': break assert w.name != text_type('sh')
def test_automatic_rename_option(session): """With option automatic-rename: on.""" yaml_config = loadfixture("workspacebuilder/window_automatic_rename.yaml") s = session sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig) window_count = len(session._windows) # current window count assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): w.select_layout('tiled') # fix glitch with pane size p = p assert len(s._windows), window_count assert isinstance(w, Window) assert w.show_window_option('automatic-rename') == 'on' assert len(s._windows) == window_count window_count += 1 w.select_layout(wconf['layout']) assert s.name != 'tmuxp' w = s.windows[0] while retry(): session.server._update_windows() if w.name != 'sh': break assert w.name != 'sh' pane_base_index = w.show_window_option('pane-base-index', g=True) w.select_pane(pane_base_index) while retry(): session.server._update_windows() if w.name == 'sh': break assert w.name == text_type('sh') w.select_pane('-D') while retry(): session.server._update_windows() if w['window_name'] != 'sh': break assert w.name != text_type('sh')
def test_start_directory(session, tmpdir): yaml_config = loadfixture("workspacebuilder/start_directory.yaml") test_dir = str(tmpdir.mkdir('foo bar')) test_config = yaml_config.format(TMP_DIR=str(tmpdir), TEST_DIR=test_dir) sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(test_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) assert session == builder.session dirs = ['/usr/bin', '/dev', test_dir, '/usr', '/usr'] for path, window in zip(dirs, session.windows): for p in window.panes: while retry(): p.server._update_panes() pane_path = p.current_path if pane_path is None: pass elif path in pane_path or pane_path == path: result = path == pane_path or path in pane_path break # handle case with OS X adding /private/ to /tmp/ paths assert result
def test_start_directory(session, tmpdir): yaml_config = loadfixture("workspacebuilder/start_directory.yaml") test_dir = str(tmpdir.mkdir('foo bar')) test_config = yaml_config.format(TMP_DIR=str(tmpdir), TEST_DIR=test_dir) sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(test_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) assert session == builder.session dirs = ['/usr/bin', '/dev', test_dir, '/usr', '/usr'] for path, window in zip(dirs, session.windows): for p in window.panes: while retry(): p.server._update_panes() pane_path = p.current_path if pane_path is None: pass elif path in pane_path or pane_path == path: result = path == pane_path or path in pane_path break # handle case with OS X adding /private/ to /tmp/ paths assert result
def test_suppress_history(session): yaml_config = loadfixture("workspacebuilder/suppress_history.yaml") sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) inHistoryWindow = session.find_where({'window_name': 'inHistory'}) isMissingWindow = session.find_where({'window_name': 'isMissing'}) def assertHistory(cmd, hist): return 'inHistory' in cmd and cmd.endswith(hist) def assertIsMissing(cmd, hist): return 'isMissing' in cmd and not cmd.endswith(hist) for w, window_name, assertCase in [( inHistoryWindow, 'inHistory', assertHistory, ), ( isMissingWindow, 'isMissing', assertIsMissing, )]: assert w.name == window_name correct = False w.select_window() p = w.attached_pane p.select_pane() # Print the last-in-history command in the pane p.cmd('send-keys', ' fc -ln -1') p.cmd('send-keys', 'Enter') buffer_name = 'test' while retry(): # from v0.7.4 libtmux session.cmd adds target -t self.id by default # show-buffer doesn't accept -t, use global cmd. # Get the contents of the pane p.cmd('capture-pane', '-b', buffer_name) captured_pane = session.server.cmd('show-buffer', '-b', buffer_name) session.server.cmd('delete-buffer', '-b', buffer_name) # Parse the sent and last-in-history commands sent_cmd = captured_pane.stdout[0].strip() history_cmd = captured_pane.stdout[-2].strip() if assertCase(sent_cmd, history_cmd): correct = True break assert correct, "Unknown sent command: [%s] in %s" % (sent_cmd, assertCase)
def test_pane_order(session): """Pane ordering based on position in config and ``pane_index``. Regression test for https://github.com/tmux-python/tmuxp/issues/15. """ yaml_config = loadfixture("workspacebuilder/pane_ordering.yaml").format( HOME=os.path.realpath(os.path.expanduser('~')) ) # test order of `panes` (and pane_index) above aganist pane_dirs pane_paths = [ '/usr/bin', '/usr', '/usr/sbin', os.path.realpath(os.path.expanduser('~')), ] s = session sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) builder = WorkspaceBuilder(sconf=sconfig) window_count = len(session._windows) # current window count assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): w.select_layout('tiled') # fix glitch with pane size p = p assert len(s._windows) == window_count assert isinstance(w, Window) assert len(s._windows) == window_count window_count += 1 for w in session.windows: pane_base_index = w.show_window_option('pane-base-index', g=True) for p_index, p in enumerate(w.list_panes(), start=pane_base_index): assert int(p_index) == int(p.index) # pane-base-index start at base-index, pane_paths always start # at 0 since python list. pane_path = pane_paths[p_index - pane_base_index] while retry(): p.server._update_panes() if p.current_path == pane_path: break assert p.current_path, pane_path
def test_start_directory_relative(session, tmpdir): """Same as above test, but with relative start directory, mimicing loading it from a location of project file. Like:: $ tmuxp load ~/workspace/myproject/.tmuxp.yaml instead of:: $ cd ~/workspace/myproject/.tmuxp.yaml $ tmuxp load . """ yaml_config = \ loadfixture("workspacebuilder/start_directory_relative.yaml") test_dir = str(tmpdir.mkdir('foo bar')) config_dir = str(tmpdir.mkdir('testRelConfigDir')) test_config = yaml_config.format(TEST_DIR=test_dir, ) sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(test_config).get() # the second argument of os.getcwd() mimics the behavior # the CLI loader will do, but it passes in the config file's location. sconfig = config.expand(sconfig, config_dir) sconfig = config.trickle(sconfig) assert os.path.exists(config_dir) assert os.path.exists(test_dir) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) assert session == builder.session dirs = [ '/usr/bin', '/dev', test_dir, config_dir, config_dir, ] for path, window in zip(dirs, session.windows): for p in window.panes: while retry(): p.server._update_panes() # Handle case where directories resolve to /private/ in OSX pane_path = p.current_path if pane_path is None: pass elif (path in pane_path or pane_path == path): result = (path == pane_path or path in pane_path) break assert result
def test_pane_order(session): """Pane ordering based on position in config and ``pane_index``. Regression test for https://github.com/tmux-python/tmuxp/issues/15. """ yaml_config = loadfixture("workspacebuilder/pane_ordering.yaml").format( HOME=os.path.realpath(os.path.expanduser('~')) ) # test order of `panes` (and pane_index) above aganist pane_dirs pane_paths = [ '/usr/bin', '/usr', '/usr/sbin', os.path.realpath(os.path.expanduser('~')), ] s = session sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) builder = WorkspaceBuilder(sconf=sconfig) window_count = len(session._windows) # current window count assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): w.select_layout('tiled') # fix glitch with pane size p = p assert len(s._windows) == window_count assert isinstance(w, Window) assert len(s._windows) == window_count window_count += 1 for w in session.windows: pane_base_index = w.show_window_option('pane-base-index', g=True) for p_index, p in enumerate(w.list_panes(), start=pane_base_index): assert int(p_index) == int(p.index) # pane-base-index start at base-index, pane_paths always start # at 0 since python list. pane_path = pane_paths[p_index - pane_base_index] while retry(): p.server._update_panes() if p.current_path == pane_path: break assert p.current_path, pane_path
def test_suppress_history(session): yaml_config = loadfixture("workspacebuilder/suppress_history.yaml") sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) inHistoryWindow = session.find_where({'window_name': 'inHistory'}) isMissingWindow = session.find_where({'window_name': 'isMissing'}) def assertHistory(cmd, hist): return 'inHistory' in cmd and cmd.endswith(hist) def assertIsMissing(cmd, hist): return 'isMissing' in cmd and not cmd.endswith(hist) for w, window_name, assertCase in [ (inHistoryWindow, 'inHistory', assertHistory), (isMissingWindow, 'isMissing', assertIsMissing), ]: assert w.name == window_name correct = False w.select_window() p = w.attached_pane p.select_pane() # Print the last-in-history command in the pane p.cmd('send-keys', ' fc -ln -1') p.cmd('send-keys', 'Enter') buffer_name = 'test' while retry(): # from v0.7.4 libtmux session.cmd adds target -t self.id by default # show-buffer doesn't accept -t, use global cmd. # Get the contents of the pane p.cmd('capture-pane', '-b', buffer_name) captured_pane = session.server.cmd('show-buffer', '-b', buffer_name) session.server.cmd('delete-buffer', '-b', buffer_name) # Parse the sent and last-in-history commands sent_cmd = captured_pane.stdout[0].strip() history_cmd = captured_pane.stdout[-2].strip() if assertCase(sent_cmd, history_cmd): correct = True break assert correct, "Unknown sent command: [%s] in %s" % (sent_cmd, assertCase)
def test_start_directory_relative(session, tmpdir): """Same as above test, but with relative start directory, mimicing loading it from a location of project file. Like:: $ tmuxp load ~/workspace/myproject/.tmuxp.yaml instead of:: $ cd ~/workspace/myproject/.tmuxp.yaml $ tmuxp load . """ yaml_config = loadfixture("workspacebuilder/start_directory_relative.yaml") test_dir = str(tmpdir.mkdir('foo bar')) config_dir = str(tmpdir.mkdir('testRelConfigDir')) test_config = yaml_config.format(TEST_DIR=test_dir) sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(test_config).get() # the second argument of os.getcwd() mimics the behavior # the CLI loader will do, but it passes in the config file's location. sconfig = config.expand(sconfig, config_dir) sconfig = config.trickle(sconfig) assert os.path.exists(config_dir) assert os.path.exists(test_dir) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) assert session == builder.session dirs = ['/usr/bin', '/dev', test_dir, config_dir, config_dir] for path, window in zip(dirs, session.windows): for p in window.panes: while retry(): p.server._update_panes() # Handle case where directories resolve to /private/ in OSX pane_path = p.current_path if pane_path is None: pass elif path in pane_path or pane_path == path: result = path == pane_path or path in pane_path break assert result
def assert_last_line(p, s): correct = False while retry(): pane_out = p.cmd('capture-pane', '-p', '-J').stdout while not pane_out[-1].strip(): # delete trailing lines tmux 1.8 pane_out.pop() if len(pane_out) > 1 and pane_out[-2].strip() == s: correct = True break # Print output for easier debugging if assertion fails if not correct: print('\n'.join(pane_out)) return correct
def assert_last_line(p, s): correct = False while retry(): pane_out = p.cmd('capture-pane', '-p', '-J').stdout while not pane_out[-1].strip(): # delete trailing lines tmux 1.8 pane_out.pop() if len(pane_out) > 1 and pane_out[-2].strip() == s: correct = True break # Print output for easier debugging if assertion fails if not correct: print('\n'.join(pane_out)) return correct
def test_window_shell(session): yaml_config = loadfixture("workspacebuilder/window_shell.yaml") s = session sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) builder = WorkspaceBuilder(sconf=sconfig) for w, wconf in builder.iter_create_windows(s): if 'window_shell' in wconf: assert wconf['window_shell'] == text_type('top') while retry(): session.server._update_windows() if w['window_name'] != 'top': break assert w.name != text_type('top')
def test_window_shell(session): yaml_config = loadfixture("workspacebuilder/window_shell.yaml") s = session sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) builder = WorkspaceBuilder(sconf=sconfig) for w, wconf in builder.iter_create_windows(s): if 'window_shell' in wconf: assert wconf['window_shell'] == text_type('top') while retry(): session.server._update_windows() if w['window_name'] != 'top': break assert w.name != text_type('top')
def test_focus_pane_index(session): yaml_config = loadfixture('workspacebuilder/focus_and_pane.yaml') sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) assert session.attached_window.name == 'focused window' pane_base_index = int( session.attached_window.show_window_option('pane-base-index', g=True)) if not pane_base_index: pane_base_index = 0 else: pane_base_index = int(pane_base_index) # get the pane index for each pane pane_base_indexes = [] for pane in session.attached_window.panes: pane_base_indexes.append(int(pane.index)) pane_indexes_should_be = [pane_base_index + x for x in range(0, 3)] assert pane_indexes_should_be == pane_base_indexes w = session.attached_window assert w.name != 'man' pane_path = '/usr' while retry(): p = w.attached_pane p.server._update_panes() if p.current_path == pane_path: break assert p.current_path == pane_path proc = session.cmd('show-option', '-gv', 'base-index') base_index = int(proc.stdout[0]) session.server._update_windows() window3 = session.find_where({'window_index': str(base_index + 2)}) assert isinstance(window3, Window) p = None pane_path = '/' while retry(): p = window3.attached_pane p.server._update_panes() if p.current_path == pane_path: break assert p.current_path == pane_path
def test_focus_pane_index(session): yaml_config = loadfixture('workspacebuilder/focus_and_pane.yaml') sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) assert session.attached_window.name == 'focused window' pane_base_index = int( session.attached_window.show_window_option('pane-base-index', g=True) ) if not pane_base_index: pane_base_index = 0 else: pane_base_index = int(pane_base_index) # get the pane index for each pane pane_base_indexes = [] for pane in session.attached_window.panes: pane_base_indexes.append(int(pane.index)) pane_indexes_should_be = [pane_base_index + x for x in range(0, 3)] assert pane_indexes_should_be == pane_base_indexes w = session.attached_window assert w.name != 'man' pane_path = '/usr' while retry(): p = w.attached_pane p.server._update_panes() if p.current_path == pane_path: break assert p.current_path == pane_path proc = session.cmd('show-option', '-gv', 'base-index') base_index = int(proc.stdout[0]) session.server._update_windows() window3 = session.find_where({'window_index': str(base_index + 2)}) assert isinstance(window3, Window) p = None pane_path = '/' while retry(): p = window3.attached_pane p.server._update_panes() if p.current_path == pane_path: break assert p.current_path == pane_path