require_relative "../../test_helper"
require "minitest/mock"

module MinitestReportersTest
  class ReportersTest < Minitest::Test
    def test_chooses_the_rubymine_reporter_when_necessary
      # Rubymine reporter complains when RubyMine libs are not available, so
      # stub its #puts method out.
      $stdout.stub :puts, nil do
        reporters = Minitest::Reporters.choose_reporters [], { "RM_INFO" => "x" }
        assert_instance_of Minitest::Reporters::RubyMineReporter, reporters[0]

        reporters = Minitest::Reporters.choose_reporters [], { "TEAMCITY_VERSION" => "x" }
        assert_instance_of Minitest::Reporters::RubyMineReporter, reporters[0]
      end
    end

    def test_chooses_the_textmate_reporter_when_necessary
      reporters = Minitest::Reporters.choose_reporters [], {"TM_PID" => "x"}
      assert_instance_of Minitest::Reporters::RubyMateReporter, reporters[0]
    end

    def test_chooses_the_console_reporters_when_necessary
      reporters = Minitest::Reporters.choose_reporters [Minitest::Reporters::SpecReporter.new], {}
      assert_instance_of Minitest::Reporters::SpecReporter, reporters[0]
    end

    def test_chooses_no_reporters_when_running_under_vim
      reporters = Minitest::Reporters.choose_reporters(
        [Minitest::Reporters::DefaultReporter.new], { "VIM" => "/usr/share/vim" })
      assert_nil reporters
    end

    def test_chooses_given_reporter_when_MINITEST_REPORTERS_env_set
      env = {
        "MINITEST_REPORTER" => "JUnitReporter", 
        "RM_INFO" => "x", 
        "TEAMCITY_VERSION" => "x", 
        "TM_PID" => "x" }
      # JUnit reporter init has stdout messages... capture them to keep test output clean
      $stdout.stub :puts, nil do
        reporters = Minitest::Reporters.choose_reporters [], env
        assert_instance_of Minitest::Reporters::JUnitReporter, reporters[0]
      end
    end

    def test_uses_minitest_clock_time_when_minitest_version_greater_than_561
      Minitest::Reporters.stub :minitest_version, 583 do
        Minitest.stub :clock_time, 6765.378751009 do
          clock_time = Minitest::Reporters.clock_time
          assert_equal 6765.378751009, clock_time
        end
      end
    end

    def test_register_minitest_plugin
      original_extensions = Minitest.extensions.dup
      Minitest.extensions.delete("minitest_reporter")
      Minitest::Reporters.register_minitest_plugin!

      if Gem::Version.new(Minitest::VERSION) >= Gem::Version.new("6.0.0")
        assert_includes Minitest.extensions, "minitest_reporter"
      else
        refute_includes Minitest.extensions, "minitest_reporter"
      end
    ensure
      Minitest.extensions.replace(original_extensions)
    end

    def test_uses_minitest_clock_time_when_minitest_version_less_than_561
      Minitest::Reporters.stub :minitest_version, 431 do
        Time.stub :now, Time.new(2015, 11, 20, 17, 35) do
          clock_time = Minitest::Reporters.clock_time
          assert_equal Time.new(2015, 11, 20, 17, 35), clock_time
        end
      end
    end
  end
end
