# Restores the config to the default state before each requirement

module Bacon
  class Context
    old_run_requirement = instance_method(:run_requirement)

    define_method(:run_requirement) do |description, spec|
      ::Pod::Config.instance = nil
      ::Pod::Config.instance.tap do |c|
        c.verbose           =  false
        c.silent            =  true
        c.repos_dir         =  fixture('spec-repos')
        c.installation_root =  SpecHelper.temporary_directory
        c.cache_root        =  SpecHelper.temporary_directory + 'Cache'
      end

      ::Pod::UI.output = ''
      ::Pod::UI.warnings = ''
      ::Pod::UI.next_input = ''
      # The following prevents a nasty behaviour where the increments are not
      # balanced when testing informative which might lead to sections not
      # being printed to the output as they are too nested.
      ::Pod::UI.indentation_level = 0
      ::Pod::UI.title_level = 0

      SpecHelper.temporary_directory.rmtree if SpecHelper.temporary_directory.exist?
      SpecHelper.temporary_directory.mkpath

      # TODO
      ::Pod::Source::Manager.any_instance.stubs(:search_index_path).returns(temporary_directory + 'search_index.json')

      old_run_requirement.bind(self).call(description, spec)
    end
  end
end
