require "rspec/core/formatters/base_text_formatter"

module RSpecSystem
  # This custom formatter is designed for rspec-system test presentation
  #
  # Because rspec-system tests are often wordier and require lots of diagnostic
  # information to be enabled for future debugging, the traditional document
  # and progress formatters just simply aren't sufficient.
  #
  # This formatter instead treats each test as a document section, splitting
  # up the output with obvious breaks so the user can clearly see when a test
  # has started and finished. It also attempts to use color for visibility
  # as well as listing test case information in a more verbose way.
  class Formatter < RSpec::Core::Formatters::BaseTextFormatter
    def initialize(output)
      super(output)
    end

    def start(count)
      super(count)
      output << "=================================================================\n\n"
      output << bold("Commencing rspec-system tests\n")
      output << bold("Total Test Count: ") << color(count, :cyan) << "\n\n"
    end

    def example_started(example)
      super(example)
      output << "=================================================================\n\n"
      output << bold("Running test:\n  ") << color(example.full_description, :magenta) << "\n\n"
    end

    def example_passed(example)
      super(example)
      output << "\n" << bold('Result: ') << success_color('passed') << "\n\n"
    end

    def example_pending(example)
      super(example)
      msg = example.execution_result[:pending_message]
      output << "\n" << bold('Result: ') << pending_color('pending') << "\n"
      output << bold("Reason: ") << "#{msg}\n\n"
    end

    def example_failed(example)
      super(example)
      msg = example.execution_result[:exception]
      output << "\n" << bold('Result: ') << failure_color('failed') << "\n"
      output << bold("Index: ") << "#{next_failure_index}\n"
      output << bold("Reason:\n") << "#{msg}\n\n"
    end

    def next_failure_index
      @next_failure_index ||= 0
      @next_failure_index += 1
    end
  end
end