# frozen_string_literal: true

RSpec.describe RuboCop::Cop::RSpec::MultipleSubjects do
  let(:cop) { described_class.new }

  it 'registers an offense for every overwritten subject' do
    expect_offense(<<-RUBY.strip_indent)
      describe 'hello there' do
        subject(:foo) { 1 }
        ^^^^^^^^^^^^^^^^^^^ Do not set more than one subject per example group
        subject(:bar) { 2 }
        ^^^^^^^^^^^^^^^^^^^ Do not set more than one subject per example group
        subject { 3 }
        ^^^^^^^^^^^^^ Do not set more than one subject per example group
        subject(:baz) { 4 }

        describe 'baz' do
          subject(:norf) { 1 }
        end
      end
    RUBY

    expect_correction [
      "describe 'hello there' do",
      '  let(:foo) { 1 }',
      '  let(:bar) { 2 }',
      '  ',
      '  subject(:baz) { 4 }',
      '',
      "  describe 'baz' do",
      '    subject(:norf) { 1 }',
      '  end',
      'end',
      ''
    ].join("\n")
  end

  it 'does not try to autocorrect subject!' do
    source = <<-RUBY
      describe Foo do
        subject! { a }
        subject! { b }
      end
    RUBY

    expect(autocorrect_source(source, 'example_spec.rb')).to eql(source)
  end

  it 'does not flag shared example groups' do
    expect_no_offenses(<<-RUBY)
      describe Foo do
        it_behaves_like 'user' do
          subject { described_class.new(user, described_class) }

          it { expect(subject).not_to be_accessible }
        end

        it_behaves_like 'admin' do
          subject { described_class.new(user, described_class) }

          it { expect(subject).to be_accessible }
        end
      end
    RUBY
  end

  include_examples(
    'autocorrect',
    <<-RUBY.strip_indent.chomp,
      describe 'hello there' do
        subject { 1 }
        subject { 2 }
        subject { 3 }
      end
    RUBY
    [
      "describe 'hello there' do",
      '  ',
      '  ',
      '  subject { 3 }',
      'end'
    ].join("\n")
  )
end
