reek 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +5 -0
  3. data/README.md +13 -2
  4. data/Rakefile +2 -1
  5. data/features/command_line_interface/options.feature +2 -3
  6. data/features/command_line_interface/smell_selection.feature +0 -1
  7. data/features/command_line_interface/smells_count.feature +0 -2
  8. data/features/command_line_interface/stdin.feature +3 -10
  9. data/features/configuration_files/masking_smells.feature +1 -5
  10. data/features/configuration_files/overrides_defaults.feature +0 -1
  11. data/features/rake_task/rake_task.feature +1 -4
  12. data/features/reports/json.feature +73 -0
  13. data/features/reports/reports.feature +0 -3
  14. data/features/reports/yaml.feature +0 -1
  15. data/features/ruby_api/api.feature +0 -1
  16. data/features/samples.feature +0 -4
  17. data/features/step_definitions/reek_steps.rb +14 -4
  18. data/features/support/env.rb +3 -0
  19. data/lib/reek/cli/option_interpreter.rb +2 -0
  20. data/lib/reek/cli/options.rb +3 -3
  21. data/lib/reek/cli/report/formatter.rb +1 -1
  22. data/lib/reek/cli/report/location_formatter.rb +11 -0
  23. data/lib/reek/cli/report/report.rb +11 -2
  24. data/lib/reek/core/code_context.rb +49 -10
  25. data/lib/reek/core/sniffer.rb +2 -2
  26. data/lib/reek/core/{code_parser.rb → tree_walker.rb} +16 -7
  27. data/lib/reek/examiner.rb +0 -39
  28. data/lib/reek/smells.rb +3 -25
  29. data/lib/reek/smells/feature_envy.rb +0 -2
  30. data/lib/reek/smells/smell_detector.rb +0 -6
  31. data/lib/reek/source/sexp_extensions.rb +17 -6
  32. data/lib/reek/source/sexp_node.rb +1 -1
  33. data/lib/reek/spec.rb +66 -0
  34. data/lib/reek/spec/should_reek.rb +0 -6
  35. data/lib/reek/spec/should_reek_of.rb +0 -49
  36. data/lib/reek/spec/should_reek_only_of.rb +0 -11
  37. data/lib/reek/version.rb +6 -1
  38. data/reek.gemspec +3 -2
  39. data/spec/reek/cli/json_report_spec.rb +20 -0
  40. data/spec/reek/core/code_context_spec.rb +6 -0
  41. data/spec/reek/core/smell_configuration_spec.rb +3 -3
  42. data/spec/reek/core/{code_parser_spec.rb → tree_walker_spec.rb} +4 -4
  43. data/spec/reek/examiner_spec.rb +0 -19
  44. data/spec/reek/smells/attribute_spec.rb +6 -9
  45. data/spec/reek/smells/boolean_parameter_spec.rb +13 -15
  46. data/spec/reek/smells/class_variable_spec.rb +17 -17
  47. data/spec/reek/smells/control_parameter_spec.rb +44 -46
  48. data/spec/reek/smells/data_clump_spec.rb +73 -70
  49. data/spec/reek/smells/duplicate_method_call_spec.rb +39 -37
  50. data/spec/reek/smells/feature_envy_spec.rb +53 -57
  51. data/spec/reek/smells/irresponsible_module_spec.rb +12 -11
  52. data/spec/reek/smells/long_parameter_list_spec.rb +33 -26
  53. data/spec/reek/smells/long_yield_list_spec.rb +15 -19
  54. data/spec/reek/smells/module_initialize_spec.rb +4 -6
  55. data/spec/reek/smells/nested_iterators_spec.rb +28 -28
  56. data/spec/reek/smells/nil_check_spec.rb +18 -20
  57. data/spec/reek/smells/prima_donna_method_spec.rb +6 -9
  58. data/spec/reek/smells/repeated_conditional_spec.rb +41 -43
  59. data/spec/reek/smells/too_many_instance_variables_spec.rb +6 -11
  60. data/spec/reek/smells/too_many_methods_spec.rb +44 -61
  61. data/spec/reek/smells/too_many_statements_spec.rb +14 -41
  62. data/spec/reek/smells/uncommunicative_method_name_spec.rb +6 -11
  63. data/spec/reek/smells/uncommunicative_module_name_spec.rb +10 -14
  64. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +15 -16
  65. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +33 -36
  66. data/spec/reek/smells/unused_parameters_spec.rb +16 -19
  67. data/spec/reek/smells/utility_function_spec.rb +7 -10
  68. metadata +22 -6
@@ -2,119 +2,124 @@ require 'spec_helper'
2
2
  require 'reek/smells/data_clump'
3
3
  require 'reek/smells/smell_detector_shared'
4
4
 
5
- include Reek::Smells
6
-
7
5
  shared_examples_for 'a data clump detector' do
8
6
  it 'does not report small parameter sets' do
9
- src = <<EOS
10
- # test module
11
- #{@context} Scrunch
12
- def first(pa) @field == :sym ? 0 : 3; end
13
- def second(pa) @field == :sym; end
14
- def third(pa) pa - pb + @fred; end
15
- end
16
- EOS
17
- expect(src).not_to reek_of(DataClump)
7
+ src = <<-EOS
8
+ # test module
9
+ #{@context} Scrunch
10
+ def first(pa) @field == :sym ? 0 : 3; end
11
+ def second(pa) @field == :sym; end
12
+ def third(pa) pa - pb + @fred; end
13
+ end
14
+ EOS
15
+ expect(src).not_to reek_of(:DataClump)
18
16
  end
19
17
 
20
18
  context 'with 3 identical pairs' do
21
19
  before :each do
22
20
  @module_name = 'Scrunch'
23
- @src = <<EOS
24
- #{@context} #{@module_name}
25
- def first(pa, pb) @field == :sym ? 0 : 3; end
26
- def second(pa, pb) @field == :sym; end
27
- def third(pa, pb) pa - pb + @fred; end
28
- end
29
- EOS
30
- ctx = ModuleContext.new(nil, @src.to_reek_source.syntax_tree)
31
- detector = DataClump.new('newt')
21
+ @src = <<-EOS
22
+ #{@context} #{@module_name}
23
+ def first(pa, pb) @field == :sym ? 0 : 3; end
24
+ def second(pa, pb) @field == :sym; end
25
+ def third(pa, pb) pa - pb + @fred; end
26
+ end
27
+ EOS
28
+ ctx = Reek::Core::ModuleContext.new(nil, @src.to_reek_source.syntax_tree)
29
+ detector = build(:smell_detector, smell_type: :DataClump)
32
30
  @smells = detector.examine_context(ctx)
33
31
  end
32
+
34
33
  it 'records only the one smell' do
35
34
  expect(@smells.length).to eq(1)
36
35
  end
36
+
37
37
  it 'reports all parameters' do
38
38
  expect(@smells[0].parameters[:parameters]).to eq(['pa', 'pb'])
39
39
  end
40
+
40
41
  it 'reports the number of occurrences' do
41
42
  expect(@smells[0].parameters[:count]).to eq(3)
42
43
  end
44
+
43
45
  it 'reports all methods' do
44
46
  expect(@smells[0].parameters[:methods]).to eq(['first', 'second', 'third'])
45
47
  end
48
+
46
49
  it 'reports the declaration line numbers' do
47
50
  expect(@smells[0].lines).to eq([2, 3, 4])
48
51
  end
52
+
49
53
  it 'reports the correct smell class' do
50
- expect(@smells[0].smell_category).to eq(DataClump.smell_category)
54
+ expect(@smells[0].smell_category).to eq(Reek::Smells::DataClump.smell_category)
51
55
  end
56
+
52
57
  it 'reports the context fq name' do
53
58
  expect(@smells[0].context).to eq(@module_name)
54
59
  end
55
60
  end
56
61
 
57
62
  it 'reports 3 swapped pairs' do
58
- src = <<EOS
59
- #{@context} Scrunch
60
- def one(pa, pb) @field == :sym ? 0 : 3; end
61
- def two(pb, pa) @field == :sym; end
62
- def tri(pa, pb) pa - pb + @fred; end
63
- end
64
- EOS
65
- expect(src).to reek_of(DataClump,
63
+ src = <<-EOS
64
+ #{@context} Scrunch
65
+ def one(pa, pb) @field == :sym ? 0 : 3; end
66
+ def two(pb, pa) @field == :sym; end
67
+ def tri(pa, pb) pa - pb + @fred; end
68
+ end
69
+ EOS
70
+ expect(src).to reek_of(:DataClump,
66
71
  count: 3,
67
72
  parameters: ['pa', 'pb'])
68
73
  end
69
74
 
70
75
  it 'reports 3 identical parameter sets' do
71
- src = <<EOS
72
- #{@context} Scrunch
73
- def first(pa, pb, pc) @field == :sym ? 0 : 3; end
74
- def second(pa, pb, pc) @field == :sym; end
75
- def third(pa, pb, pc) pa - pb + @fred; end
76
- end
77
- EOS
78
- expect(src).to reek_of(DataClump,
76
+ src = <<-EOS
77
+ #{@context} Scrunch
78
+ def first(pa, pb, pc) @field == :sym ? 0 : 3; end
79
+ def second(pa, pb, pc) @field == :sym; end
80
+ def third(pa, pb, pc) pa - pb + @fred; end
81
+ end
82
+ EOS
83
+ expect(src).to reek_of(:DataClump,
79
84
  count: 3,
80
85
  parameters: ['pa', 'pb', 'pc'])
81
86
  end
82
87
 
83
88
  it 'reports re-ordered identical parameter sets' do
84
- src = <<EOS
85
- #{@context} Scrunch
86
- def first(pb, pa, pc) @field == :sym ? 0 : 3; end
87
- def second(pc, pb, pa) @field == :sym; end
88
- def third(pa, pb, pc) pa - pb + @fred; end
89
- end
90
- EOS
91
- expect(src).to reek_of(DataClump,
89
+ src = <<-EOS
90
+ #{@context} Scrunch
91
+ def first(pb, pa, pc) @field == :sym ? 0 : 3; end
92
+ def second(pc, pb, pa) @field == :sym; end
93
+ def third(pa, pb, pc) pa - pb + @fred; end
94
+ end
95
+ EOS
96
+ expect(src).to reek_of(:DataClump,
92
97
  count: 3,
93
98
  parameters: ['pa', 'pb', 'pc'])
94
99
  end
95
100
 
96
101
  it 'counts only identical parameter sets' do
97
- src = <<EOS
98
- #{@context} RedCloth
99
- def fa(p1, p2, p3, conten) end
100
- def fb(p1, p2, p3, conten) end
101
- def fc(name, windowW, windowH) end
102
- end
103
- EOS
104
- expect(src).not_to reek_of(DataClump)
102
+ src = <<-EOS
103
+ #{@context} RedCloth
104
+ def fa(p1, p2, p3, conten) end
105
+ def fb(p1, p2, p3, conten) end
106
+ def fc(name, windowW, windowH) end
107
+ end
108
+ EOS
109
+ expect(src).not_to reek_of(:DataClump)
105
110
  end
106
111
 
107
112
  it 'gets a real example right' do
108
- src = <<EOS
109
- #{@context} Inline
110
- def generate(src, options) end
111
- def c (src, options) end
112
- def c_singleton (src, options) end
113
- def c_raw (src, options) end
114
- def c_raw_singleton (src, options) end
115
- end
116
- EOS
117
- expect(src).to reek_of(DataClump, count: 5)
113
+ src = <<-EOS
114
+ #{@context} Inline
115
+ def generate(src, options) end
116
+ def c (src, options) end
117
+ def c_singleton (src, options) end
118
+ def c_raw (src, options) end
119
+ def c_raw_singleton (src, options) end
120
+ end
121
+ EOS
122
+ expect(src).to reek_of(:DataClump, count: 5)
118
123
  end
119
124
 
120
125
  it 'correctly checks number of occurences' do
@@ -127,7 +132,7 @@ EOS
127
132
  def fe(p5, p1, p2) end
128
133
  end
129
134
  EOS
130
- expect(src).not_to reek_of(DataClump)
135
+ expect(src).not_to reek_of(:DataClump)
131
136
  end
132
137
 
133
138
  it 'detects clumps smaller than the total number of arguments' do
@@ -138,7 +143,7 @@ EOS
138
143
  def fc(p4, p1, p2) end
139
144
  end
140
145
  EOS
141
- expect(src).to reek_of(DataClump,
146
+ expect(src).to reek_of(:DataClump,
142
147
  parameters: %w(p1 p2))
143
148
  end
144
149
 
@@ -150,14 +155,14 @@ EOS
150
155
  def fc(p1, p2, *) end
151
156
  end
152
157
  EOS
153
- expect(src).to reek_of(DataClump,
158
+ expect(src).to reek_of(:DataClump,
154
159
  parameters: %w(p1 p2))
155
160
  end
156
161
  end
157
162
 
158
- describe DataClump do
163
+ describe Reek::Smells::DataClump do
159
164
  before(:each) do
160
- @detector = DataClump.new('newt')
165
+ @detector = build(:smell_detector, smell_type: :DataClump)
161
166
  end
162
167
 
163
168
  it_should_behave_like 'SmellDetector'
@@ -177,6 +182,4 @@ describe DataClump do
177
182
 
178
183
  it_should_behave_like 'a data clump detector'
179
184
  end
180
-
181
- # TODO: include singleton methods in the calcs
182
185
  end
@@ -1,17 +1,15 @@
1
1
  require 'spec_helper'
2
2
  require 'reek/smells/duplicate_method_call'
3
- require 'reek/core/code_parser'
3
+ require 'reek/core/code_context'
4
+ require 'reek/core/tree_walker'
4
5
  require 'reek/core/sniffer'
5
6
  require 'reek/smells/smell_detector_shared'
6
7
 
7
- include Reek
8
- include Reek::Smells
9
-
10
- describe DuplicateMethodCall do
8
+ describe Reek::Smells::DuplicateMethodCall do
11
9
  context 'when a smell is reported' do
12
10
  before :each do
13
- @source_name = 'copy-cat'
14
- @detector = DuplicateMethodCall.new(@source_name)
11
+ @source_name = 'dummy_source'
12
+ @detector = build(:smell_detector, smell_type: :DuplicateMethodCall, source: @source_name)
15
13
  src = <<-EOS
16
14
  def double_thing(other)
17
15
  other[@thing]
@@ -19,7 +17,7 @@ describe DuplicateMethodCall do
19
17
  other[@thing]
20
18
  end
21
19
  EOS
22
- ctx = CodeContext.new(nil, src.to_reek_source.syntax_tree)
20
+ ctx = Reek::Core::CodeContext.new(nil, src.to_reek_source.syntax_tree)
23
21
  smells = @detector.examine_context(ctx)
24
22
  expect(smells.length).to eq(1)
25
23
  @warning = smells[0]
@@ -31,6 +29,7 @@ describe DuplicateMethodCall do
31
29
  it 'reports the call' do
32
30
  expect(@warning.parameters[:name]).to eq('other[@thing]')
33
31
  end
32
+
34
33
  it 'reports the correct lines' do
35
34
  expect(@warning.lines).to eq([2, 4])
36
35
  end
@@ -39,28 +38,28 @@ describe DuplicateMethodCall do
39
38
  context 'with repeated method calls' do
40
39
  it 'reports repeated call' do
41
40
  src = 'def double_thing() @other.thing + @other.thing end'
42
- expect(src).to reek_of(DuplicateMethodCall, name: '@other.thing')
41
+ expect(src).to reek_of(:DuplicateMethodCall, name: '@other.thing')
43
42
  end
44
43
 
45
44
  it 'reports repeated call to lvar' do
46
45
  src = 'def double_thing(other) other[@thing] + other[@thing] end'
47
- expect(src).to reek_of(DuplicateMethodCall, name: 'other[@thing]')
46
+ expect(src).to reek_of(:DuplicateMethodCall, name: 'other[@thing]')
48
47
  end
49
48
 
50
49
  it 'reports call parameters' do
51
50
  src = 'def double_thing() @other.thing(2,3) + @other.thing(2,3) end'
52
- expect(src).to reek_of(DuplicateMethodCall, name: '@other.thing(2, 3)')
51
+ expect(src).to reek_of(:DuplicateMethodCall, name: '@other.thing(2, 3)')
53
52
  end
54
53
 
55
54
  it 'should report nested calls' do
56
55
  src = 'def double_thing() @other.thing.foo + @other.thing.foo end'
57
- expect(src).to reek_of(DuplicateMethodCall, name: '@other.thing')
58
- expect(src).to reek_of(DuplicateMethodCall, name: '@other.thing.foo')
56
+ expect(src).to reek_of(:DuplicateMethodCall, name: '@other.thing')
57
+ expect(src).to reek_of(:DuplicateMethodCall, name: '@other.thing.foo')
59
58
  end
60
59
 
61
60
  it 'should ignore calls to new' do
62
61
  src = 'def double_thing() @other.new + @other.new end'
63
- expect(src).not_to reek_of(DuplicateMethodCall)
62
+ expect(src).not_to reek_of(:DuplicateMethodCall)
64
63
  end
65
64
  end
66
65
 
@@ -76,7 +75,7 @@ describe DuplicateMethodCall do
76
75
  end
77
76
  end
78
77
  EOS
79
- expect(src).not_to reek_of(DuplicateMethodCall)
78
+ expect(src).not_to reek_of(:DuplicateMethodCall)
80
79
  end
81
80
  end
82
81
 
@@ -88,7 +87,7 @@ describe DuplicateMethodCall do
88
87
  bar { baz }
89
88
  end
90
89
  EOS
91
- expect(src).to reek_of(DuplicateMethodCall)
90
+ expect(src).to reek_of(:DuplicateMethodCall)
92
91
  end
93
92
 
94
93
  it 'reports no smell if the blocks are different' do
@@ -98,7 +97,7 @@ describe DuplicateMethodCall do
98
97
  bar { qux }
99
98
  end
100
99
  EOS
101
- expect(src).not_to reek_of(DuplicateMethodCall)
100
+ expect(src).not_to reek_of(:DuplicateMethodCall)
102
101
  end
103
102
  end
104
103
 
@@ -110,7 +109,7 @@ describe DuplicateMethodCall do
110
109
  bar.qux { baz }
111
110
  end
112
111
  EOS
113
- expect(src).to reek_of(DuplicateMethodCall)
112
+ expect(src).to reek_of(:DuplicateMethodCall)
114
113
  end
115
114
 
116
115
  it 'reports a smell if the blocks are different' do
@@ -120,53 +119,55 @@ describe DuplicateMethodCall do
120
119
  bar.qux { qux }
121
120
  end
122
121
  EOS
123
- expect(src).to reek_of(DuplicateMethodCall)
122
+ expect(src).to reek_of(:DuplicateMethodCall)
124
123
  end
125
124
  end
126
125
 
127
126
  context 'with repeated attribute assignment' do
128
127
  it 'reports repeated assignment' do
129
128
  src = 'def double_thing(thing) @other[thing] = true; @other[thing] = true; end'
130
- expect(src).to reek_of(DuplicateMethodCall, name: '@other[thing] = true')
129
+ expect(src).to reek_of(:DuplicateMethodCall, name: '@other[thing] = true')
131
130
  end
132
131
  it 'does not report multi-assignments' do
133
- src = <<EOS
134
- def _parse ctxt
135
- ctxt.index, result = @ind, @result
136
- error, ctxt.index = @err, @err_ind
137
- end
138
- EOS
139
- expect(src).not_to reek_of(DuplicateMethodCall)
132
+ src = <<-EOS
133
+ def _parse ctxt
134
+ ctxt.index, result = @ind, @result
135
+ error, ctxt.index = @err, @err_ind
136
+ end
137
+ EOS
138
+ expect(src).not_to reek_of(:DuplicateMethodCall)
140
139
  end
141
140
  end
142
141
 
143
142
  context 'non-repeated method calls' do
144
143
  it 'should not report similar calls' do
145
144
  src = 'def equals(other) other.thing == self.thing end'
146
- expect(src).not_to reek_of(DuplicateMethodCall)
145
+ expect(src).not_to reek_of(:DuplicateMethodCall)
147
146
  end
147
+
148
148
  it 'should respect call parameters' do
149
149
  src = 'def double_thing() @other.thing(3) + @other.thing(2) end'
150
- expect(src).not_to reek_of(DuplicateMethodCall)
150
+ expect(src).not_to reek_of(:DuplicateMethodCall)
151
151
  end
152
152
  end
153
153
 
154
154
  context 'allowing up to 3 calls' do
155
155
  before :each do
156
- @config = { DuplicateMethodCall: { DuplicateMethodCall::MAX_ALLOWED_CALLS_KEY => 3 } }
156
+ @config = { DuplicateMethodCall:
157
+ { Reek::Smells::DuplicateMethodCall::MAX_ALLOWED_CALLS_KEY => 3 } }
157
158
  end
158
159
 
159
160
  it 'does not report double calls' do
160
161
  src = 'def double_thing() @other.thing + @other.thing end'
161
162
  with_test_config(@config) do
162
- expect(src).not_to reek_of(DuplicateMethodCall)
163
+ expect(src).not_to reek_of(:DuplicateMethodCall)
163
164
  end
164
165
  end
165
166
 
166
167
  it 'does not report triple calls' do
167
168
  src = 'def double_thing() @other.thing + @other.thing + @other.thing end'
168
169
  with_test_config(@config) do
169
- expect(src).not_to reek_of(DuplicateMethodCall)
170
+ expect(src).not_to reek_of(:DuplicateMethodCall)
170
171
  end
171
172
  end
172
173
 
@@ -177,7 +178,7 @@ EOS
177
178
  end
178
179
  '
179
180
  with_test_config(@config) do
180
- expect(src).to reek_of(DuplicateMethodCall, name: '@other.thing', count: 4)
181
+ expect(src).to reek_of(:DuplicateMethodCall, name: '@other.thing', count: 4)
181
182
  end
182
183
  end
183
184
  end
@@ -185,14 +186,15 @@ EOS
185
186
  context 'allowing calls to some methods' do
186
187
  before :each do
187
188
  @config = { DuplicateMethodCall:
188
- { DuplicateMethodCall::ALLOW_CALLS_KEY => ['@some.thing', /puts/] } }
189
+ { Reek::Smells::DuplicateMethodCall::ALLOW_CALLS_KEY =>
190
+ ['@some.thing', /puts/] } }
189
191
  end
190
192
 
191
193
  it 'does not report calls to some methods' do
192
194
  src = 'def double_some_thing() @some.thing + @some.thing end'
193
195
 
194
196
  with_test_config(@config) do
195
- expect(src).not_to reek_of(DuplicateMethodCall)
197
+ expect(src).not_to reek_of(:DuplicateMethodCall)
196
198
  end
197
199
  end
198
200
 
@@ -200,7 +202,7 @@ EOS
200
202
  src = 'def double_other_thing() @other.thing + @other.thing end'
201
203
 
202
204
  with_test_config(@config) do
203
- expect(src).to reek_of(DuplicateMethodCall, name: '@other.thing')
205
+ expect(src).to reek_of(:DuplicateMethodCall, name: '@other.thing')
204
206
  end
205
207
  end
206
208
 
@@ -208,7 +210,7 @@ EOS
208
210
  src = 'def double_puts() puts @other.thing; puts @other.thing end'
209
211
 
210
212
  with_test_config(@config) do
211
- expect(src).to reek_of(DuplicateMethodCall, name: '@other.thing')
213
+ expect(src).to reek_of(:DuplicateMethodCall, name: '@other.thing')
212
214
  end
213
215
  end
214
216
  end
@@ -2,10 +2,7 @@ require 'spec_helper'
2
2
  require 'reek/smells/feature_envy'
3
3
  require 'reek/smells/smell_detector_shared'
4
4
 
5
- include Reek
6
- include Reek::Smells
7
-
8
- describe FeatureEnvy do
5
+ describe Reek::Smells::FeatureEnvy do
9
6
  context 'with no smell' do
10
7
  it 'should not report use of self' do
11
8
  expect('def simple() self.to_s + self.to_i end').not_to reek_of(:FeatureEnvy)
@@ -132,14 +129,6 @@ describe FeatureEnvy do
132
129
  lv.price + lv.tax
133
130
  end
134
131
  ').to reek_only_of(:FeatureEnvy)
135
- #
136
- # def moved_version
137
- # price + tax
138
- # end
139
- #
140
- # def envy
141
- # @item.moved_version
142
- # end
143
132
  end
144
133
 
145
134
  it 'ignores frequent use of a call' do
@@ -177,54 +166,54 @@ describe FeatureEnvy do
177
166
  end
178
167
 
179
168
  it 'counts self references correctly' do
180
- src = <<EOS
181
- def adopt(other)
182
- other.keys.each do |key|
183
- self[key] += 3
184
- self[key] = o4
185
- end
186
- self
187
- end
188
- EOS
169
+ src = <<-EOS
170
+ def adopt(other)
171
+ other.keys.each do |key|
172
+ self[key] += 3
173
+ self[key] = o4
174
+ end
175
+ self
176
+ end
177
+ EOS
189
178
  expect(src).not_to reek_of(:FeatureEnvy)
190
179
  end
191
180
  end
192
181
 
193
- describe FeatureEnvy do
182
+ describe Reek::Smells::FeatureEnvy do
194
183
  it 'counts references to self correctly' do
195
- ruby = <<EOS
196
- def report
197
- unless @report
198
- @report = Report.new
199
- cf = SmellConfig.new
200
- cf = cf.load_local(@dir) if @dir
201
- CodeParser.new(@report, cf.smell_listeners).check_source(@source)
202
- end
203
- @report
204
- end
205
- EOS
184
+ ruby = <<-EOS
185
+ def report
186
+ unless @report
187
+ @report = Report.new
188
+ cf = SmellConfig.new
189
+ cf = cf.load_local(@dir) if @dir
190
+ TreeWalker.new(@report, cf.smell_listeners).check_source(@source)
191
+ end
192
+ @report
193
+ end
194
+ EOS
206
195
  expect(ruby).not_to reek_of(:FeatureEnvy)
207
196
  end
208
197
 
209
198
  it 'interprets << correctly' do
210
- ruby = <<EOS
211
- def report_on(report)
212
- if @is_doubled
213
- report.record_doubled_smell(self)
214
- else
215
- report << self
216
- end
217
- end
218
- EOS
199
+ ruby = <<-EOS
200
+ def report_on(report)
201
+ if @is_doubled
202
+ report.record_doubled_smell(self)
203
+ else
204
+ report << self
205
+ end
206
+ end
207
+ EOS
219
208
 
220
209
  expect(ruby).not_to reek_of(:FeatureEnvy)
221
210
  end
222
211
  end
223
212
 
224
- describe FeatureEnvy do
213
+ describe Reek::Smells::FeatureEnvy do
225
214
  before(:each) do
226
- @source_name = 'green as a cucumber'
227
- @detector = FeatureEnvy.new(@source_name)
215
+ @source_name = 'dummy_source'
216
+ @detector = build(:smell_detector, smell_type: :FeatureEnvy, source: @source_name)
228
217
  end
229
218
 
230
219
  it_should_behave_like 'SmellDetector'
@@ -232,37 +221,44 @@ describe FeatureEnvy do
232
221
  context 'when reporting yaml' do
233
222
  before :each do
234
223
  @receiver = 'other'
235
- src = <<EOS
236
- def envious(other)
237
- #{@receiver}.call
238
- self.do_nothing
239
- #{@receiver}.other
240
- #{@receiver}.fred
241
- end
242
- EOS
224
+ src = <<-EOS
225
+ def envious(other)
226
+ #{@receiver}.call
227
+ self.do_nothing
228
+ #{@receiver}.other
229
+ #{@receiver}.fred
230
+ end
231
+ EOS
243
232
  source = src.to_reek_source
244
- sniffer = Sniffer.new(source)
245
- @mctx = CodeParser.new(sniffer).process_def(source.syntax_tree)
233
+ sniffer = Reek::Core::Sniffer.new(source)
234
+ @mctx = Reek::Core::TreeWalker.new(sniffer).process_def(source.syntax_tree)
246
235
  @smells = @detector.examine_context(@mctx)
247
236
  end
237
+
248
238
  it 'reports only that smell' do
249
239
  expect(@smells.length).to eq(1)
250
240
  end
241
+
251
242
  it 'reports the source' do
252
243
  expect(@smells[0].source).to eq(@source_name)
253
244
  end
245
+
254
246
  it 'reports the smell class' do
255
- expect(@smells[0].smell_category).to eq(FeatureEnvy.smell_category)
247
+ expect(@smells[0].smell_category).to eq(described_class.smell_category)
256
248
  end
249
+
257
250
  it 'reports the smell sub class' do
258
- expect(@smells[0].smell_type).to eq(FeatureEnvy.smell_type)
251
+ expect(@smells[0].smell_type).to eq(described_class.smell_type)
259
252
  end
253
+
260
254
  it 'reports the envious receiver' do
261
255
  expect(@smells[0].parameters[:name]).to eq(@receiver)
262
256
  end
257
+
263
258
  it 'reports the number of references' do
264
259
  expect(@smells[0].parameters[:count]).to eq(3)
265
260
  end
261
+
266
262
  it 'reports the referring lines' do
267
263
  skip
268
264
  expect(@smells[0].lines).to eq([2, 4, 5])