class Shindo::Tests

def assert(type, expectation, description, &block)

def assert(type, expectation, description, &block)
  return if @exit || Thread.current[:reload]
  description = [@description, description].compact.join(' ')
  success = nil
  @gestalt = Gestalt.new({'formatador' => @formatador})
  if block_given?
    begin
      for before in @befores.flatten.compact
        before.call
      end
      value = @gestalt.run(&block)
      success = case type
      when :raises
        value.is_a?(expectation)
      when :returns
        value == expectation
      end
      for after in @afters.flatten.compact
        after.call
      end
    rescue => error
      success = false
      value = error
    end
    if success
      success(description)
    else
      failure(description)
      case value
      when Exception, Interrupt
        display_error(value)
      else
        @message ||= [
          "expected => #{expectation.inspect}",
          "returned => #{value.inspect}"
        ]
        @formatador.indent do
          @formatador.display_lines([*@message].map {|message| "[red]#{message}[/]"})
        end
        @message = nil
      end
      if STDOUT.tty?
        prompt(description, &block)
      end
    end
  else
    pending(description)
  end
  success
end