58 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| require 'securerandom'
 | |
| 
 | |
| class TerminalSession
 | |
|   ZSH_BIN = ENV['TEST_ZSH_BIN'] || 'zsh'
 | |
| 
 | |
|   def initialize(width: 80, height: 24, prompt: '', term: 'xterm-256color')
 | |
|     tmux_command("new-session -d -x #{width} -y #{height} 'PS1=#{prompt} TERM=#{term} #{ZSH_BIN} -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
 |