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

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)
    session.run_command('fc -p')

    commands.each do |c|
      c.respond_to?(:call) ? c.call : session.run_command(c)
    end

    session.clear_screen

    yield block

    session.send_keys('C-c')
    session.run_command('fc -P')
  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
