# frozen_string_literal: true

require 'spec_helper'

module Cucumber
  module Cli
    describe RerunFile do
      let(:rerun_file) { RerunFile.new('@rerun.txt') }

      it 'expects rerun files to have a leading @' do
        allow(File).to receive(:file?) { true }
        expect(RerunFile.can_read?('rerun.txt')).to eq false
        expect(RerunFile.can_read?('@rerun.txt')).to eq true
      end

      it 'does not treat directories as rerun files' do
        allow(File).to receive(:file?) { false }
        expect(RerunFile.can_read?('@rerun.txt')).to eq false
      end

      it 'removes leading @ character from filename' do
        expect(rerun_file.path).to eq 'rerun.txt'
      end

      context 'rerun file containing single feature' do
        before(:each) do
          allow(IO).to receive(:read).and_return('cucumber.feature')
        end

        it 'produces an array containing a single feature file path' do
          expect(rerun_file.features).to eq %w[cucumber.feature]
        end
      end

      context 'contains multiple features on multiple lines' do
        before(:each) do
          allow(IO).to receive(:read).and_return("cucumber.feature\nfoo.feature")
        end

        it 'produces an array containing multiple feature file paths' do
          expect(rerun_file.features).to eq %w[cucumber.feature foo.feature]
        end
      end

      context 'contains multiple features on same line' do
        before(:each) do
          allow(IO).to receive(:read).and_return('cucumber.feature foo.feature')
        end

        it 'produces an array containing multiple feature file paths' do
          expect(rerun_file.features).to eq %w[cucumber.feature foo.feature]
        end
      end

      context 'contains multiple scenarios on same line' do
        before(:each) do
          allow(IO).to receive(:read).and_return('cucumber.feature:8 foo.feature:8:16')
        end

        it 'produces an array containing multiple feature file paths with scenario lines' do
          expect(rerun_file.features).to eq %w[cucumber.feature:8 foo.feature:8:16]
        end
      end

      context 'contains features with spaces in file names' do
        before(:each) do
          allow(IO).to receive(:read).and_return('cucumber test.feature:8 foo.feature:8:16')
        end

        it 'produces an array containing multiple feature file paths with scenario lines' do
          expect(rerun_file.features).to eq ['cucumber test.feature:8', 'foo.feature:8:16']
        end
      end

      context 'contains multiple scenarios without spaces between them' do
        before(:each) do
          allow(IO).to receive(:read).and_return('cucumber test.feature:8foo.feature:8:16')
        end

        it 'produces an array containing multiple feature file paths with scenario lines' do
          expect(rerun_file.features).to eq ['cucumber test.feature:8', 'foo.feature:8:16']
        end
      end
    end
  end
end
