require 'abstract_unit'
require 'rails/test_unit/sub_test_task'

module Rails
  class TestInfoTest < ActiveSupport::TestCase
    def test_test_files
      info = new_test_info ['test']
      assert_predicate info.files, :empty?
      assert_nil info.opts
      assert_equal ['test'], info.tasks
    end

    def test_with_file
      info = new_test_info ['test', __FILE__]
      assert_equal [__FILE__], info.files
      assert_nil info.opts
      assert_equal ['test'], info.tasks
    end

    def test_with_opts
      info = new_test_info ['test', __FILE__, '/foo/']
      assert_equal [__FILE__], info.files
      assert_equal '-n /foo/', info.opts
      assert_equal ['test'], info.tasks
    end

    def test_with_model_shorthand
      info = new_test_info ['test', 'models/foo', '/foo/']

      def info.test_file?(file)
        file == "test/models/foo_test.rb" || super
      end

      assert_equal ['test/models/foo_test.rb'], info.files
      assert_equal '-n /foo/', info.opts
      assert_equal ['test'], info.tasks
    end

    def test_with_model_path
      info = new_test_info ['test', 'app/models/foo.rb', '/foo/']

      def info.test_file?(file)
        file == "test/models/foo_test.rb" || super
      end

      assert_equal ['test/models/foo_test.rb'], info.files
      assert_equal '-n /foo/', info.opts
      assert_equal ['test'], info.tasks
    end

    private
    def new_test_info(tasks)
      Class.new(TestTask::TestInfo) {
        def task_defined?(task)
          task == "test"
        end
      }.new tasks
    end
  end
end
