diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 38e3f56..b3882d7 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,4 +1,5 @@ require 'rspec/wait' +require 'terminal_session' RSpec.configure do |config| config.expect_with :rspec do |expectations| diff --git a/spec/terminal_session.rb b/spec/terminal_session.rb new file mode 100644 index 0000000..63eaf0d --- /dev/null +++ b/spec/terminal_session.rb @@ -0,0 +1,55 @@ +require 'securerandom' + +class TerminalSession + def initialize(width: 80, height: 24, prompt: '', term: 'xterm-256color') + tmux_command("new-session -d -x #{width} -y #{height} 'PS1=#{prompt} TERM=#{term} zsh -f'") + end + + def run_command(command) + send_string(command) + send_keys('enter') + end + + def send_string(str) + tmux_command("send-keys -t 0 -l '#{str.gsub("'", "\\'")}'") + end + + def send_keys(*keys) + tmux_command("send-keys -t 0 #{keys.join(' ')}") + end + + def content(esc_seqs: false) + cmd = 'capture-pane -p -t 0' + cmd += ' -e' if esc_seqs + tmux_command(cmd).strip + end + + def clear + send_keys('C-l') + end + + def destroy + tmux_command('kill-session') + end + + def cursor + tmux_command("display-message -t 0 -p '\#{cursor_x},\#{cursor_y}'"). + strip. + split(','). + map(&:to_i) + end + + private + + def socket_name + @socket_name ||= SecureRandom.hex(6) + end + + def tmux_command(cmd) + out = `tmux -u -L #{socket_name} #{cmd}` + + raise('tmux error') unless $?.success? + + out + end +end