# frozen_string_literal: true

require 'cucumber/formatter/fail_fast'
require 'cucumber/core'
require 'cucumber/core/gherkin/writer'
require 'cucumber/core/test/result'
require 'cucumber/core/filter'
require 'cucumber'
require 'support/standard_step_actions'

module Cucumber::Formatter
  describe FailFast do
    include Cucumber::Core
    include Cucumber::Core::Gherkin::Writer

    let(:configuration) { Cucumber::Configuration.new }
    before { FailFast.new(configuration) }

    context 'failing scenario' do
      before(:each) do
        @gherkin = gherkin('foo.feature') do
          feature do
            scenario do
              step 'failing'
            end

            scenario do
              step 'failing'
            end
          end
        end
      end

      after(:each) do
        Cucumber.wants_to_quit = false
      end

      it 'sets Cucumber.wants_to_quit' do
        execute [@gherkin], [StandardStepActions.new], configuration.event_bus
        expect(Cucumber.wants_to_quit).to be true
      end
    end

    context 'passing scenario' do
      before(:each) do
        @gherkin = gherkin('foo.feature') do
          feature do
            scenario do
              step 'passing'
            end
          end
        end
      end

      it 'doesn\'t set Cucumber.wants_to_quit' do
        execute [@gherkin], [StandardStepActions.new], configuration.event_bus
        expect(Cucumber.wants_to_quit).to be_falsey
      end
    end

    context 'undefined scenario' do
      before(:each) do
        @gherkin = gherkin('foo.feature') do
          feature do
            scenario do
              step 'undefined'
            end
          end
        end
      end

      it 'doesn\'t set Cucumber.wants_to_quit' do
        execute [@gherkin], [StandardStepActions.new], configuration.event_bus
        expect(Cucumber.wants_to_quit).to be_falsey
      end

      context 'in strict mode' do
        let(:configuration) { Cucumber::Configuration.new strict: Cucumber::Core::Test::Result::StrictConfiguration.new([:undefined]) }

        it 'sets Cucumber.wants_to_quit' do
          execute [@gherkin], [StandardStepActions.new], configuration.event_bus
          expect(Cucumber.wants_to_quit).to be_truthy
        end
      end
    end
  end
end
