spec/reek/smells/data_clump_spec.rb in reek-2.0.0 vs spec/reek/smells/data_clump_spec.rb in reek-2.0.1
- old
+ new
@@ -1,122 +1,127 @@
require 'spec_helper'
require 'reek/smells/data_clump'
require 'reek/smells/smell_detector_shared'
-include Reek::Smells
-
shared_examples_for 'a data clump detector' do
it 'does not report small parameter sets' do
- src = <<EOS
-# test module
-#{@context} Scrunch
- def first(pa) @field == :sym ? 0 : 3; end
- def second(pa) @field == :sym; end
- def third(pa) pa - pb + @fred; end
-end
-EOS
- expect(src).not_to reek_of(DataClump)
+ src = <<-EOS
+ # test module
+ #{@context} Scrunch
+ def first(pa) @field == :sym ? 0 : 3; end
+ def second(pa) @field == :sym; end
+ def third(pa) pa - pb + @fred; end
+ end
+ EOS
+ expect(src).not_to reek_of(:DataClump)
end
context 'with 3 identical pairs' do
before :each do
@module_name = 'Scrunch'
- @src = <<EOS
-#{@context} #{@module_name}
- def first(pa, pb) @field == :sym ? 0 : 3; end
- def second(pa, pb) @field == :sym; end
- def third(pa, pb) pa - pb + @fred; end
-end
-EOS
- ctx = ModuleContext.new(nil, @src.to_reek_source.syntax_tree)
- detector = DataClump.new('newt')
+ @src = <<-EOS
+ #{@context} #{@module_name}
+ def first(pa, pb) @field == :sym ? 0 : 3; end
+ def second(pa, pb) @field == :sym; end
+ def third(pa, pb) pa - pb + @fred; end
+ end
+ EOS
+ ctx = Reek::Core::ModuleContext.new(nil, @src.to_reek_source.syntax_tree)
+ detector = build(:smell_detector, smell_type: :DataClump)
@smells = detector.examine_context(ctx)
end
+
it 'records only the one smell' do
expect(@smells.length).to eq(1)
end
+
it 'reports all parameters' do
expect(@smells[0].parameters[:parameters]).to eq(['pa', 'pb'])
end
+
it 'reports the number of occurrences' do
expect(@smells[0].parameters[:count]).to eq(3)
end
+
it 'reports all methods' do
expect(@smells[0].parameters[:methods]).to eq(['first', 'second', 'third'])
end
+
it 'reports the declaration line numbers' do
expect(@smells[0].lines).to eq([2, 3, 4])
end
+
it 'reports the correct smell class' do
- expect(@smells[0].smell_category).to eq(DataClump.smell_category)
+ expect(@smells[0].smell_category).to eq(Reek::Smells::DataClump.smell_category)
end
+
it 'reports the context fq name' do
expect(@smells[0].context).to eq(@module_name)
end
end
it 'reports 3 swapped pairs' do
- src = <<EOS
-#{@context} Scrunch
- def one(pa, pb) @field == :sym ? 0 : 3; end
- def two(pb, pa) @field == :sym; end
- def tri(pa, pb) pa - pb + @fred; end
-end
-EOS
- expect(src).to reek_of(DataClump,
+ src = <<-EOS
+ #{@context} Scrunch
+ def one(pa, pb) @field == :sym ? 0 : 3; end
+ def two(pb, pa) @field == :sym; end
+ def tri(pa, pb) pa - pb + @fred; end
+ end
+ EOS
+ expect(src).to reek_of(:DataClump,
count: 3,
parameters: ['pa', 'pb'])
end
it 'reports 3 identical parameter sets' do
- src = <<EOS
-#{@context} Scrunch
- def first(pa, pb, pc) @field == :sym ? 0 : 3; end
- def second(pa, pb, pc) @field == :sym; end
- def third(pa, pb, pc) pa - pb + @fred; end
-end
-EOS
- expect(src).to reek_of(DataClump,
+ src = <<-EOS
+ #{@context} Scrunch
+ def first(pa, pb, pc) @field == :sym ? 0 : 3; end
+ def second(pa, pb, pc) @field == :sym; end
+ def third(pa, pb, pc) pa - pb + @fred; end
+ end
+ EOS
+ expect(src).to reek_of(:DataClump,
count: 3,
parameters: ['pa', 'pb', 'pc'])
end
it 'reports re-ordered identical parameter sets' do
- src = <<EOS
-#{@context} Scrunch
- def first(pb, pa, pc) @field == :sym ? 0 : 3; end
- def second(pc, pb, pa) @field == :sym; end
- def third(pa, pb, pc) pa - pb + @fred; end
-end
-EOS
- expect(src).to reek_of(DataClump,
+ src = <<-EOS
+ #{@context} Scrunch
+ def first(pb, pa, pc) @field == :sym ? 0 : 3; end
+ def second(pc, pb, pa) @field == :sym; end
+ def third(pa, pb, pc) pa - pb + @fred; end
+ end
+ EOS
+ expect(src).to reek_of(:DataClump,
count: 3,
parameters: ['pa', 'pb', 'pc'])
end
it 'counts only identical parameter sets' do
- src = <<EOS
-#{@context} RedCloth
- def fa(p1, p2, p3, conten) end
- def fb(p1, p2, p3, conten) end
- def fc(name, windowW, windowH) end
-end
-EOS
- expect(src).not_to reek_of(DataClump)
+ src = <<-EOS
+ #{@context} RedCloth
+ def fa(p1, p2, p3, conten) end
+ def fb(p1, p2, p3, conten) end
+ def fc(name, windowW, windowH) end
+ end
+ EOS
+ expect(src).not_to reek_of(:DataClump)
end
it 'gets a real example right' do
- src = <<EOS
-#{@context} Inline
- def generate(src, options) end
- def c (src, options) end
- def c_singleton (src, options) end
- def c_raw (src, options) end
- def c_raw_singleton (src, options) end
-end
-EOS
- expect(src).to reek_of(DataClump, count: 5)
+ src = <<-EOS
+ #{@context} Inline
+ def generate(src, options) end
+ def c (src, options) end
+ def c_singleton (src, options) end
+ def c_raw (src, options) end
+ def c_raw_singleton (src, options) end
+ end
+ EOS
+ expect(src).to reek_of(:DataClump, count: 5)
end
it 'correctly checks number of occurences' do
src = <<-EOS
#{@context} Smelly
@@ -125,22 +130,22 @@
def fc(p3, p4, p5) end
def fd(p4, p5, p1) end
def fe(p5, p1, p2) end
end
EOS
- expect(src).not_to reek_of(DataClump)
+ expect(src).not_to reek_of(:DataClump)
end
it 'detects clumps smaller than the total number of arguments' do
src = <<-EOS
#{@context} Smelly
def fa(p1, p2, p3) end
def fb(p1, p3, p2) end
def fc(p4, p1, p2) end
end
EOS
- expect(src).to reek_of(DataClump,
+ expect(src).to reek_of(:DataClump,
parameters: %w(p1 p2))
end
it 'ignores anonymous parameters' do
src = <<-EOS
@@ -148,18 +153,18 @@
def fa(p1, p2, *) end
def fb(p1, p2, *) end
def fc(p1, p2, *) end
end
EOS
- expect(src).to reek_of(DataClump,
+ expect(src).to reek_of(:DataClump,
parameters: %w(p1 p2))
end
end
-describe DataClump do
+describe Reek::Smells::DataClump do
before(:each) do
- @detector = DataClump.new('newt')
+ @detector = build(:smell_detector, smell_type: :DataClump)
end
it_should_behave_like 'SmellDetector'
context 'in a class' do
@@ -175,8 +180,6 @@
@context = 'module'
end
it_should_behave_like 'a data clump detector'
end
-
- # TODO: include singleton methods in the calcs
end