class Shindo::Tests

def prompt(description, &block)

def prompt(description, &block)
  @formatador.display("Action? [c,i,q,r,t,#,?]? ")
  choice = STDIN.gets.strip
  @formatador.display_line("")
  case choice
  when 'c'
    return
  when 'i'
    @formatador.display_line('Starting interactive session...')
    if @irb.nil?
      require 'irb'
      ARGV.clear # Avoid passing args to IRB
      IRB.setup(nil)
      @irb = IRB::Irb.new(nil)
      IRB.conf[:MAIN_CONTEXT] = @irb.context
      IRB.conf[:PROMPT][:SHINDO] = {}
    end
    for key, value in IRB.conf[:PROMPT][:SIMPLE]
      IRB.conf[:PROMPT][:SHINDO][key] = "#{@formatador.indentation}#{value}"
    end
    @irb.context.prompt_mode = :SHINDO
    @irb.context.workspace = IRB::WorkSpace.new(block.binding)
    begin
      @irb.eval_input
    rescue SystemExit
    end
  when 'q'
    Thread.current[:success] = false
    Thread.exit
  when 'r'
    @formatador.display_line("Reloading...")
    Thread.current[:reload] = true
    Thread.exit
  when 't'
    @formatador.indent do
      if @annals.lines.empty?
        @formatador.display_line('no backtrace available')
      else
        @annals.lines.each_with_index do |line, index|
          @formatador.display_line("#{' ' * (2 - index.to_s.length)}#{index}  #{line}")
        end
      end
    end
    @formatador.display_line('')
  when '?'
    @formatador.display_line('c - ignore this error and continue')
    @formatador.display_line('i - interactive mode')
    @formatador.display_line('q - quit Shindo')
    @formatador.display_line('r - reload and run the tests again')
    @formatador.display_line('t - display backtrace')
    @formatador.display_line('# - enter a number of a backtrace line to see its context')
    @formatador.display_line('? - display help')
  when /\d/
    index = choice.to_i - 1
    if @annals.lines[index]
      @formatador.indent do
        @formatador.display_line("#{@annals.lines[index]}: ")
        @formatador.indent do
          @formatador.display("\n")
          current_line = @annals.buffer[index]
          File.open(current_line[:file], 'r') do |file|
            data = file.readlines
            current = current_line[:line]
            min     = [0, current - (@annals.max / 2)].max
            max     = [current + (@annals.max / 2), data.length].min
            min.upto(current - 1) do |line|
              @formatador.display_line("#{line}  #{data[line].rstrip}")
            end
            @formatador.display_line("[yellow]#{current}  #{data[current].rstrip}[/]")
            (current + 1).upto(max - 1) do |line|
              @formatador.display_line("#{line}  #{data[line].rstrip}")
            end
          end
          @formatador.display_line('')
        end
      end
    else
      @formatador.display_line("[red]#{choice} is not a valid backtrace line, please try again.[/]")
    end
  else
    @formatador.display_line("[red]#{choice} is not a valid choice, please try again.[/]")
  end
  @formatador.display_line("[red]- #{description}[/]")
  prompt(description, &block)
end