Sha256: 326de50aa14660b8fa43e676e3888a5eb2a74a44028f36a01af0c2a1eea4d8b6

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

require 'spec_helper'
require 'reek/smells/too_many_instance_variables'
require 'reek/examiner'
require 'reek/core/code_parser'
require 'reek/smells/smell_detector_shared'

include Reek
include Reek::Smells

describe TooManyInstanceVariables do
  before(:each) do
    @source_name = 'elephant'
    @detector = TooManyInstanceVariables.new(@source_name)
  end

  it_should_behave_like 'SmellDetector'

  context 'counting instance variables' do
    it 'should not report 9 ivars' do
      expect('# clean class for testing purposes
class Empty;def ivars() @aa=@ab=@ac=@ad=@ae=@af=@ag=@ah=@ai=4; end;end').not_to reek
    end

    it 'counts each ivar only once' do
      expect('# clean class for testing purposes
class Empty;def ivars() @aa=@ab=@ac=@ad=@ae=@af=@ag=@ah=@ai=4;@aa=3; end;end').not_to reek
    end

    it 'should report 10 ivars' do
      expect('# smelly class for testing purposes
class Empty;def ivars() @aa=@ab=@ac=@ad=@ae=@af=@ag=@ah=@ai=@aj=4; end;end').to reek_only_of(:TooManyInstanceVariables)
    end

    it 'should not report 10 ivars in 2 extensions' do
      src = <<EOS
# clean class for testing purposes
class Full;def ivars_a() @aa=@ab=@ac=@ad=@ae; end;end
# clean class for testing purposes
class Full;def ivars_b() @af=@ag=@ah=@ai=@aj; end;end
EOS
      expect(src).not_to reek
    end
  end

  it 'reports correctly when the class has 10 instance variables' do
    src = <<EOS
# smelly class for testing purposes
class Empty
  def ivars
    @aa=@ab=@ac=@ad=@ae=@af=@ag=@ah=@ai=@aj=4
  end
end
EOS
    ctx = CodeContext.new(nil, src.to_reek_source.syntax_tree)
    @warning = @detector.examine_context(ctx)[0]
    expect(@warning.source).to eq(@source_name)
    expect(@warning.smell_class).to eq('LargeClass')
    expect(@warning.subclass).to eq(TooManyInstanceVariables::SMELL_SUBCLASS)
    expect(@warning.smell[TooManyInstanceVariables::IVAR_COUNT_KEY]).to eq(10)
    expect(@warning.lines).to eq([2])
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
reek-1.4.0 spec/reek/smells/too_many_instance_variables_spec.rb