require 'pry'
require 'rspec/wait'
require 'terminal_session'
require 'tempfile'

RSpec.shared_context 'terminal session' do
  let(:term_opts) { {} }
  let(:session) { TerminalSession.new(term_opts) }
  let(:before_sourcing) { -> {} }
  let(:after_sourcing) { -> {} }
  let(:options) { [] }

  around do |example|
    before_sourcing.call
    session.run_command(['source zsh-autosuggestions.zsh', *options].join('; '))
    after_sourcing.call
    session.clear_screen

    example.run

    session.destroy
  end

  def with_history(*commands, &block)
    Tempfile.create do |f|
      f.write(commands.map{|c| c.gsub("\n", "\\\n")}.join("\n"))
      f.flush

      session.run_command('fc -p')
      session.run_command("fc -R #{f.path}")

      session.clear_screen

      yield block

      session.send_keys('C-c')
      session.run_command('fc -P')
    end
  end
end

RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

  config.wait_timeout = 2

  config.include_context 'terminal session'
end