# frozen_string_literal: true

require 'cucumber/file_specs'

module Cucumber
  describe FileSpecs do
    let(:file_specs) { FileSpecs.new(['features/foo.feature:1:2:3', 'features/bar.feature:4:5:6']) }
    let(:locations) { file_specs.locations }
    let(:files) { file_specs.files }

    it 'parses locations from multiple files' do
      expect(locations.length).to eq 6
      expect(locations).to eq [
        Cucumber::Core::Test::Location.new('features/foo.feature', 1),
        Cucumber::Core::Test::Location.new('features/foo.feature', 2),
        Cucumber::Core::Test::Location.new('features/foo.feature', 3),
        Cucumber::Core::Test::Location.new('features/bar.feature', 4),
        Cucumber::Core::Test::Location.new('features/bar.feature', 5),
        Cucumber::Core::Test::Location.new('features/bar.feature', 6)
      ]
    end

    it 'parses file names from multiple file specs' do
      expect(files.length).to eq 2
      expect(files).to eq [
        'features/foo.feature',
        'features/bar.feature'
      ]
    end

    context 'when files are not unique' do
      let(:file_specs) { FileSpecs.new(['features/foo.feature:4', 'features/foo.feature:34']) }

      it 'parses unique file names' do
        expect(files.length).to eq 1
        expect(files).to eq ['features/foo.feature']
      end
    end

    context 'when no line number is specified' do
      let(:file_specs) { FileSpecs.new(['features/foo.feature', 'features/bar.feature:34']) }

      it 'returns a wildcard location for that file' do
        expect(locations).to eq [
          Cucumber::Core::Test::Location.new('features/foo.feature'),
          Cucumber::Core::Test::Location.new('features/bar.feature', 34)
        ]
      end
    end

    context 'when the same file is referenced more than once' do
      let(:file_specs) { FileSpecs.new(['features/foo.feature:10', 'features/foo.feature:1']) }

      it 'returns locations in the order specified' do
        expect(locations).to eq [
          Cucumber::Core::Test::Location.new('features/foo.feature', 10),
          Cucumber::Core::Test::Location.new('features/foo.feature', 1)
        ]
      end
    end
  end
end
