require 'rdoc/test_case'
require 'rake'

class TestRDocTask < RDoc::TestCase

  def setup
    super

    Rake::Task.clear

    @t = RDoc::Task.new
  end

  def test_clobber_task_description
    assert_equal 'Remove RDoc HTML files', @t.clobber_task_description
  end

  def test_inline_source
    _, err = verbose_capture_io do
      assert @t.inline_source
    end

    assert_equal "RDoc::Task#inline_source is deprecated\n", err

    _, err = verbose_capture_io do
      @t.inline_source = false
    end

    assert_equal "RDoc::Task#inline_source is deprecated\n", err

    capture_io do
      assert @t.inline_source
    end
  end

  def test_markup_option
    rdoc_task = RDoc::Task.new do |rd|
      rd.markup = "tomdoc"
    end

    assert_equal %w[-o html --markup tomdoc], rdoc_task.option_list
  end

  def test_tasks_creation
    RDoc::Task.new
    assert Rake::Task[:rdoc]
    assert Rake::Task[:clobber_rdoc]
    assert Rake::Task[:rerdoc]
    assert_equal ["html/created.rid"], Rake::Task[:rdoc].prerequisites
  end

  def test_tasks_creation_with_custom_name_symbol
    rd = RDoc::Task.new(:rdoc_dev)
    assert Rake::Task[:rdoc_dev]
    assert Rake::Task[:clobber_rdoc_dev]
    assert Rake::Task[:rerdoc_dev]
    assert_equal :rdoc_dev, rd.name
  end

  def test_tasks_option_parser
    rdoc_task = RDoc::Task.new do |rd|
      rd.title = "Test Tasks Option Parser"
      rd.main = "README.md"
      rd.rdoc_files.include("README.md")
      rd.options << "--all"
    end

    assert rdoc_task.title, "Test Tasks Option Parser"
    assert rdoc_task.main, "README.md"
    assert rdoc_task.rdoc_files.include?("README.md")
    assert rdoc_task.options.include?("--all")

    args = %w[--all -o html --main README.md] << "--title" << "Test Tasks Option Parser" << "README.md"
    assert_equal args, rdoc_task.option_list + rdoc_task.rdoc_files
  end

  def test_generator_option
    rdoc_task = RDoc::Task.new do |rd|
      rd.generator = "ri"
    end

    assert_equal %w[-o html -f ri], rdoc_task.option_list
  end

  def test_main_option
    rdoc_task = RDoc::Task.new do |rd|
      rd.main = "README.md"
    end

    assert_equal %w[-o html --main README.md], rdoc_task.option_list
  end

  def test_output_dir_option
    rdoc_task = RDoc::Task.new do |rd|
      rd.rdoc_dir = "zomg"
    end

    assert_equal %w[-o zomg], rdoc_task.option_list
  end

  def test_rdoc_task_description
    assert_equal 'Build RDoc HTML files', @t.rdoc_task_description
  end

  def test_rerdoc_task_description
    assert_equal 'Rebuild RDoc HTML files', @t.rerdoc_task_description
  end

  def test_tasks_creation_with_custom_name_string
    rd = RDoc::Task.new("rdoc_dev")
    assert Rake::Task[:rdoc_dev]
    assert Rake::Task[:clobber_rdoc_dev]
    assert Rake::Task[:rerdoc_dev]
    assert_equal "rdoc_dev", rd.name
  end

  def test_tasks_creation_with_custom_name_hash
    options = {
      :rdoc => "rdoc",
      :clobber_rdoc => "rdoc:clean",
      :rerdoc => "rdoc:force"
    }

    Rake::Task.clear

    rd = RDoc::Task.new(options)
    assert Rake::Task[:"rdoc"]
    assert Rake::Task[:"rdoc:clean"]
    assert Rake::Task[:"rdoc:force"]
    assert_raises(RuntimeError) { Rake::Task[:clobber_rdoc] }
    assert_equal options, rd.name
  end

  def test_tasks_creation_with_custom_name_hash_will_use_default_if_an_option_isnt_given
    RDoc::Task.new(:clobber_rdoc => "rdoc:clean")
    assert Rake::Task[:rdoc]
    assert Rake::Task[:"rdoc:clean"]
    assert Rake::Task[:rerdoc]
  end

  def test_tasks_creation_with_custom_name_hash_raises_exception_if_invalid_option_given
    assert_raises(ArgumentError) do
      RDoc::Task.new(:foo => "bar")
    end

    begin
      RDoc::Task.new(:foo => "bar")
    rescue ArgumentError => e
      assert_match(/foo/, e.message)
    end
  end

  def test_template_option
    rdoc_task = RDoc::Task.new do |rd|
      rd.template = "foo"
    end

    assert_equal %w[-o html -T foo], rdoc_task.option_list
  end

  def test_title_option
    rdoc_task = RDoc::Task.new do |rd|
      rd.title = "Test Title Option"
    end

    assert_equal %w[-o html] << "--title" << "Test Title Option", rdoc_task.option_list
  end

end

