lib/ttytest/tmux/session.rb in ttytest2-0.9.8 vs lib/ttytest/tmux/session.rb in ttytest2-0.9.9

- old
+ new

@@ -1,159 +1,163 @@ -# frozen_string_literal: true - -module TTYtest - module Tmux - # represents a tmux session and how to send output to the current tmux session - class Session - # @api private - def initialize(driver, name) - @driver = driver - @name = name - - # ObjectSpace.define_finalizer(self, self.class.finalize(driver, name)) - end - - # @api private - # def self.finalize(driver, name) - # proc { driver.tmux(*%W[kill-session -t #{name}]) } - # end - - def capture - contents = driver.tmux(*%W[capture-pane -t #{name} -p]) - str = driver.tmux(*%W[display-message -t #{name} -p - #\{cursor_x},#\{cursor_y},#\{cursor_flag},#\{pane_width},#\{pane_height},#\{pane_dead},#\{pane_dead_status},]) - x, y, cursor_flag, width, height, pane_dead, pane_dead_status, _newline = str.split(',') - - if pane_dead == '1' - raise Driver::TmuxError, - "Tmux pane has died\nCommand exited with status: #{pane_dead_status}\nEntire screen:\n#{contents}" - end - - TTYtest::Capture.new( - contents.chomp("\n"), - cursor_x: x.to_i, - cursor_y: y.to_i, - width: width.to_i, - height: height.to_i, - cursor_visible: (cursor_flag != '0') - ) - end - - # Send the array of keys as a string literal to tmux. - # Will not be interpreted as send-keys values like Enter, Escape, DC for Delete, etc. - # @param [%w()] keys the keys to send to tmux - def send_keys(*keys) - driver.tmux(*%W[send-keys -t #{name} -l], *keys) - end - - # Send a string of keys one character at a time as literals to tmux. - # @param [String] keys the keys to send one at a time to tmux - def send_keys_one_at_a_time(keys) - keys.split('').each do |key| - driver.tmux(*%W[send-keys -t #{name} -l], key) - end - end - - def send_newline - driver.tmux(*%W[send-keys -t #{name} -l], %(\n)) - end - - def send_newlines(number_of_times) - while number_of_times.positive? - send_newline - number_of_times -= 1 - end - end - - def send_delete - send_keys_exact(%(DC)) - end - - def send_deletes(number_of_times) - while number_of_times.positive? - send_delete - number_of_times -= 1 - end - end - - def send_backspace - send_keys_exact(%(BSpace)) - end - - def send_backspaces(number_of_times) - while number_of_times.positive? - send_backspace - number_of_times -= 1 - end - end - - def send_right_arrow - send_keys(TTYtest::RIGHT_ARROW) - end - - def send_right_arrows(number_of_times) - while number_of_times.positive? - send_right_arrow - number_of_times -= 1 - end - end - - def send_left_arrow - send_keys(TTYtest::LEFT_ARROW) - end - - def send_left_arrows(number_of_times) - while number_of_times.positive? - send_left_arrow - number_of_times -= 1 - end - end - - def send_up_arrow - send_keys(TTYtest::UP_ARROW) - end - - def send_up_arrows(number_of_times) - while number_of_times.positive? - send_up_arrow - number_of_times -= 1 - end - end - - def send_down_arrow - send_keys(TTYtest::DOWN_ARROW) - end - - def send_down_arrows(number_of_times) - while number_of_times.positive? - send_down_arrow - number_of_times -= 1 - end - end - - # Useful to send send-keys commands to tmux without sending them as a string literal. - # So you can send Escape for escape key, DC for delete, etc. - # Uses the same key bindings as bind-key as well. C-c represents Ctrl + C keys, F1 is F1 key, etc. - # @param [String] keys the keys to send to tmux - def send_keys_exact(keys) - driver.tmux(*%W[send-keys -t #{name}], keys) - end - - def send_home - send_keys_exact(%(Home)) - end - - def send_end - send_keys_exact(%(End)) - end - - def send_clear - send_keys_one_at_a_time(TTYtest::CLEAR) - send_newline - end - - private - - attr_reader :driver, :name - end - end -end +# frozen_string_literal: true + +module TTYtest + module Tmux + # represents a tmux session and how to send output to the current tmux session + class Session + # @api private + def initialize(driver, name) + @driver = driver + @name = name + + # ObjectSpace.define_finalizer(self, self.class.finalize(driver, name)) + end + + # @api private + # def self.finalize(driver, name) + # proc { driver.tmux(*%W[kill-session -t #{name}]) } + # end + + def capture + contents = driver.tmux(*%W[capture-pane -t #{name} -p]) + str = driver.tmux(*%W[display-message -t #{name} -p + #\{cursor_x},#\{cursor_y},#\{cursor_flag},#\{pane_width},#\{pane_height},#\{pane_dead},#\{pane_dead_status},]) + x, y, cursor_flag, width, height, pane_dead, pane_dead_status, _newline = str.split(',') + + if pane_dead == '1' + raise Driver::TmuxError, + "Tmux pane has died\nCommand exited with status: #{pane_dead_status}\nEntire screen:\n#{contents}" + end + + TTYtest::Capture.new( + contents.chomp("\n"), + cursor_x: x.to_i, + cursor_y: y.to_i, + width: width.to_i, + height: height.to_i, + cursor_visible: (cursor_flag != '0') + ) + end + + # Send the array of keys as a string literal to tmux. + # Will not be interpreted as send-keys values like Enter, Escape, DC for Delete, etc. + # @param [%w()] keys the keys to send to tmux + def send_keys(*keys) + driver.tmux(*%W[send-keys -t #{name} -l], *keys) + end + + # Send a string of keys one character at a time as literals to tmux. + # @param [String] keys the keys to send one at a time to tmux + def send_keys_one_at_a_time(keys) + keys.split('').each do |key| + driver.tmux(*%W[send-keys -t #{name} -l], key) + end + end + + def send_newline + driver.tmux(*%W[send-keys -t #{name} -l], %(\n)) + end + + def send_newlines(number_of_times) + while number_of_times.positive? + send_newline + number_of_times -= 1 + end + end + + def send_delete + send_keys_exact(%(DC)) + end + + def send_deletes(number_of_times) + while number_of_times.positive? + send_delete + number_of_times -= 1 + end + end + + def send_backspace + send_keys_exact(%(BSpace)) + end + + def send_backspaces(number_of_times) + while number_of_times.positive? + send_backspace + number_of_times -= 1 + end + end + + def send_right_arrow + send_keys(TTYtest::RIGHT_ARROW) + end + + def send_right_arrows(number_of_times) + while number_of_times.positive? + send_right_arrow + number_of_times -= 1 + end + end + + def send_left_arrow + send_keys(TTYtest::LEFT_ARROW) + end + + def send_left_arrows(number_of_times) + while number_of_times.positive? + send_left_arrow + number_of_times -= 1 + end + end + + def send_up_arrow + send_keys(TTYtest::UP_ARROW) + end + + def send_up_arrows(number_of_times) + while number_of_times.positive? + send_up_arrow + number_of_times -= 1 + end + end + + def send_down_arrow + send_keys(TTYtest::DOWN_ARROW) + end + + def send_down_arrows(number_of_times) + while number_of_times.positive? + send_down_arrow + number_of_times -= 1 + end + end + + # Useful to send send-keys commands to tmux without sending them as a string literal. + # So you can send Escape for escape key, DC for delete, etc. + # Uses the same key bindings as bind-key as well. C-c represents Ctrl + C keys, F1 is F1 key, etc. + # @param [String] keys the keys to send to tmux + def send_keys_exact(keys) + driver.tmux(*%W[send-keys -t #{name}], keys) + end + + def send_home + send_keys_exact(TTYtest::HOME_KEY) + end + + def send_end + send_keys_exact(TTYtest::END_KEY) + end + + def send_clear + send_keys_one_at_a_time(TTYtest::CLEAR) + send_newline + end + + def send_escape + send_keys_exact(%(Escape)) + end + + private + + attr_reader :driver, :name + end + end +end