reek 6.0.2 → 6.1.0

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 (238) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +9 -0
  3. data/.github/workflows/ruby.yml +57 -0
  4. data/.rubocop.yml +5 -3
  5. data/.rubocop_todo.yml +6 -4
  6. data/CHANGELOG.md +26 -0
  7. data/CONTRIBUTING.md +3 -0
  8. data/Dockerfile +1 -1
  9. data/Gemfile +7 -7
  10. data/README.md +1 -1
  11. data/bin/code_climate_reek +2 -3
  12. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  13. data/lib/reek/ast/node.rb +1 -1
  14. data/lib/reek/ast/sexp_extensions/arguments.rb +11 -0
  15. data/lib/reek/ast/sexp_extensions/case.rb +1 -1
  16. data/lib/reek/ast/sexp_extensions/if.rb +1 -1
  17. data/lib/reek/ast/sexp_extensions/send.rb +1 -1
  18. data/lib/reek/cli/command/todo_list_command.rb +1 -1
  19. data/lib/reek/cli/options.rb +1 -1
  20. data/lib/reek/code_comment.rb +22 -17
  21. data/lib/reek/configuration/excluded_paths.rb +2 -1
  22. data/lib/reek/context/code_context.rb +1 -1
  23. data/lib/reek/context/refinement_context.rb +16 -0
  24. data/lib/reek/context_builder.rb +17 -3
  25. data/lib/reek/rake/task.rb +1 -1
  26. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  27. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  28. data/lib/reek/smell_warning.rb +1 -1
  29. data/lib/reek/source/source_locator.rb +1 -3
  30. data/lib/reek/spec/should_reek_of.rb +6 -4
  31. data/lib/reek/version.rb +2 -2
  32. data/reek.gemspec +28 -25
  33. metadata +13 -240
  34. data/.travis.yml +0 -40
  35. data/docs/API.md +0 -174
  36. data/docs/Attribute.md +0 -39
  37. data/docs/Basic-Smell-Options.md +0 -85
  38. data/docs/Boolean-Parameter.md +0 -54
  39. data/docs/Class-Variable.md +0 -40
  40. data/docs/Code-Smells.md +0 -39
  41. data/docs/Command-Line-Options.md +0 -119
  42. data/docs/Control-Couple.md +0 -26
  43. data/docs/Control-Parameter.md +0 -32
  44. data/docs/Data-Clump.md +0 -46
  45. data/docs/Duplicate-Method-Call.md +0 -264
  46. data/docs/Feature-Envy.md +0 -93
  47. data/docs/How-To-Write-New-Detectors.md +0 -132
  48. data/docs/How-reek-works-internally.md +0 -114
  49. data/docs/Instance-Variable-Assumption.md +0 -163
  50. data/docs/Irresponsible-Module.md +0 -47
  51. data/docs/Large-Class.md +0 -16
  52. data/docs/Long-Parameter-List.md +0 -39
  53. data/docs/Long-Yield-List.md +0 -37
  54. data/docs/Manual-Dispatch.md +0 -30
  55. data/docs/Missing-Safe-Method.md +0 -92
  56. data/docs/Module-Initialize.md +0 -62
  57. data/docs/Nested-Iterators.md +0 -59
  58. data/docs/Nil-Check.md +0 -47
  59. data/docs/RSpec-matchers.md +0 -129
  60. data/docs/Rake-Task.md +0 -66
  61. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  62. data/docs/Reek-Driven-Development.md +0 -46
  63. data/docs/Repeated-Conditional.md +0 -47
  64. data/docs/Simulated-Polymorphism.md +0 -16
  65. data/docs/Smell-Suppression.md +0 -96
  66. data/docs/Style-Guide.md +0 -19
  67. data/docs/Subclassed-From-Core-Class.md +0 -79
  68. data/docs/Too-Many-Constants.md +0 -37
  69. data/docs/Too-Many-Instance-Variables.md +0 -43
  70. data/docs/Too-Many-Methods.md +0 -56
  71. data/docs/Too-Many-Statements.md +0 -54
  72. data/docs/Uncommunicative-Method-Name.md +0 -94
  73. data/docs/Uncommunicative-Module-Name.md +0 -92
  74. data/docs/Uncommunicative-Name.md +0 -18
  75. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  76. data/docs/Uncommunicative-Variable-Name.md +0 -96
  77. data/docs/Unused-Parameters.md +0 -28
  78. data/docs/Unused-Private-Method.md +0 -101
  79. data/docs/Utility-Function.md +0 -56
  80. data/docs/Versioning-Policy.md +0 -7
  81. data/docs/YAML-Reports.md +0 -93
  82. data/docs/defaults.reek.yml +0 -129
  83. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  84. data/docs/templates/default/docstring/setup.rb +0 -37
  85. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  86. data/docs/yard_plugin.rb +0 -17
  87. data/features/command_line_interface/basic_usage.feature +0 -15
  88. data/features/command_line_interface/options.feature +0 -123
  89. data/features/command_line_interface/show_progress.feature +0 -33
  90. data/features/command_line_interface/smell_selection.feature +0 -15
  91. data/features/command_line_interface/smells_count.feature +0 -38
  92. data/features/command_line_interface/stdin.feature +0 -65
  93. data/features/configuration_files/accept_setting.feature +0 -87
  94. data/features/configuration_files/directory_specific_directives.feature +0 -274
  95. data/features/configuration_files/exclude_directives.feature +0 -35
  96. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  97. data/features/configuration_files/masking_smells.feature +0 -94
  98. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  99. data/features/configuration_files/reject_setting.feature +0 -89
  100. data/features/configuration_files/schema_validation.feature +0 -59
  101. data/features/configuration_files/show_configuration_file.feature +0 -44
  102. data/features/configuration_files/unused_private_method.feature +0 -68
  103. data/features/configuration_loading.feature +0 -91
  104. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  105. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  106. data/features/locales.feature +0 -32
  107. data/features/programmatic_access.feature +0 -41
  108. data/features/rake_task/rake_task.feature +0 -138
  109. data/features/reports/codeclimate.feature +0 -59
  110. data/features/reports/json.feature +0 -59
  111. data/features/reports/reports.feature +0 -219
  112. data/features/reports/yaml.feature +0 -52
  113. data/features/rspec_matcher.feature +0 -41
  114. data/features/samples.feature +0 -305
  115. data/features/step_definitions/.rubocop.yml +0 -5
  116. data/features/step_definitions/reek_steps.rb +0 -102
  117. data/features/step_definitions/sample_file_steps.rb +0 -63
  118. data/features/support/env.rb +0 -33
  119. data/features/todo_list.feature +0 -108
  120. data/samples/checkstyle.xml +0 -7
  121. data/samples/clean_source/clean.rb +0 -6
  122. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  123. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  124. data/samples/configuration/corrupt.reek +0 -1
  125. data/samples/configuration/empty.reek +0 -0
  126. data/samples/configuration/full_configuration.reek +0 -13
  127. data/samples/configuration/full_mask.reek +0 -6
  128. data/samples/configuration/home/home.reek.yml +0 -4
  129. data/samples/configuration/partial_mask.reek +0 -4
  130. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  131. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  132. data/samples/configuration/with_excluded_paths.reek +0 -5
  133. data/samples/no_config_file/.keep +0 -0
  134. data/samples/paths.rb +0 -5
  135. data/samples/smelly_source/inline.rb +0 -704
  136. data/samples/smelly_source/optparse.rb +0 -1788
  137. data/samples/smelly_source/redcloth.rb +0 -1130
  138. data/samples/smelly_source/ruby.rb +0 -368
  139. data/samples/smelly_source/smelly.rb +0 -7
  140. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  141. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  142. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  143. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  144. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  145. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  146. data/samples/source_with_non_ruby_files/gibberish +0 -1
  147. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  148. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  149. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  150. data/spec/quality/documentation_spec.rb +0 -41
  151. data/spec/quality/reek_source_spec.rb +0 -11
  152. data/spec/reek/ast/node_spec.rb +0 -211
  153. data/spec/reek/ast/object_refs_spec.rb +0 -83
  154. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  155. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  156. data/spec/reek/cli/application_spec.rb +0 -168
  157. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  158. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  159. data/spec/reek/cli/options_spec.rb +0 -51
  160. data/spec/reek/cli/silencer_spec.rb +0 -28
  161. data/spec/reek/code_comment_spec.rb +0 -184
  162. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  163. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  164. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  165. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  166. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  167. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  168. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  169. data/spec/reek/context/code_context_spec.rb +0 -192
  170. data/spec/reek/context/ghost_context_spec.rb +0 -60
  171. data/spec/reek/context/method_context_spec.rb +0 -72
  172. data/spec/reek/context/module_context_spec.rb +0 -55
  173. data/spec/reek/context/root_context_spec.rb +0 -12
  174. data/spec/reek/context/statement_counter_spec.rb +0 -24
  175. data/spec/reek/context_builder_spec.rb +0 -457
  176. data/spec/reek/detector_repository_spec.rb +0 -22
  177. data/spec/reek/documentation_link_spec.rb +0 -20
  178. data/spec/reek/errors/base_error_spec.rb +0 -13
  179. data/spec/reek/examiner_spec.rb +0 -309
  180. data/spec/reek/logging_error_handler_spec.rb +0 -24
  181. data/spec/reek/rake/task_spec.rb +0 -56
  182. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  183. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  184. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  185. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  186. data/spec/reek/report/html_report_spec.rb +0 -19
  187. data/spec/reek/report/json_report_spec.rb +0 -58
  188. data/spec/reek/report/location_formatter_spec.rb +0 -32
  189. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  190. data/spec/reek/report/text_report_spec.rb +0 -89
  191. data/spec/reek/report/xml_report_spec.rb +0 -24
  192. data/spec/reek/report/yaml_report_spec.rb +0 -55
  193. data/spec/reek/report_spec.rb +0 -28
  194. data/spec/reek/smell_configuration_spec.rb +0 -56
  195. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  196. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  197. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  198. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  199. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  200. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  201. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  202. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  203. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  204. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  205. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  206. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  207. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  208. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  209. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  210. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  211. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  212. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  213. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  214. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  215. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  216. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  217. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  218. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  219. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  220. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  221. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  222. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  223. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  224. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  225. data/spec/reek/smell_warning_spec.rb +0 -137
  226. data/spec/reek/source/source_code_spec.rb +0 -79
  227. data/spec/reek/source/source_locator_spec.rb +0 -166
  228. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  229. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  230. data/spec/reek/spec/should_reek_spec.rb +0 -52
  231. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  232. data/spec/reek/tree_dresser_spec.rb +0 -46
  233. data/spec/spec_helper.rb +0 -110
  234. data/tasks/configuration.rake +0 -18
  235. data/tasks/console.rake +0 -5
  236. data/tasks/reek.rake +0 -6
  237. data/tasks/rubocop.rake +0 -11
  238. data/tasks/test.rake +0 -32
@@ -1,211 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/ast/node'
3
-
4
- RSpec.describe Reek::AST::Node do
5
- describe '#each_node' do
6
- context 'with an empty module' do
7
- let(:ast) do
8
- src = 'module Emptiness; end'
9
- Reek::Source::SourceCode.from(src).syntax_tree
10
- end
11
-
12
- it 'yields no calls' do
13
- ast.each_node(:send, []) { |exp| raise "#{exp} yielded by empty module!" }
14
- end
15
-
16
- it 'yields one module' do
17
- mods = 0
18
- ast.each_node(:module, []) { |_exp| mods += 1 }
19
- expect(mods).to eq(1)
20
- end
21
-
22
- it "yields the module's full AST" do
23
- ast.each_node(:module, []) do |exp|
24
- expect(exp).to eq(sexp(:module, sexp(:const, nil, :Emptiness), nil))
25
- end
26
- end
27
-
28
- it 'returns an enumerator when no block is passed' do
29
- expect(ast.each_node(:if)).to be_instance_of Enumerator
30
- end
31
- end
32
-
33
- context 'with a nested element' do
34
- let(:ast) do
35
- src = "module Loneliness; def calloo; puts('hello') end; end"
36
- Reek::Source::SourceCode.from(src).syntax_tree
37
- end
38
-
39
- it 'yields no ifs' do
40
- ast.each_node(:if) { |exp| raise "#{exp} yielded by empty module!" }
41
- end
42
-
43
- it 'yields one module' do
44
- expect(ast.each_node(:module).to_a.length).to eq(1)
45
- end
46
-
47
- it "yields the module's full AST" do
48
- ast.each_node(:module) do |exp|
49
- expect(exp).to eq sexp(:module,
50
- sexp(:const, nil, :Loneliness),
51
- sexp(:def, :calloo,
52
- sexp(:args),
53
- sexp(:send, nil, :puts, sexp(:str, 'hello'))))
54
- end
55
- end
56
-
57
- it 'yields one method' do
58
- expect(ast.each_node(:def).to_a.length).to eq(1)
59
- end
60
-
61
- it "yields the method's full AST" do
62
- ast.each_node(:def, []) { |exp| expect(exp.children.first).to eq(:calloo) }
63
- end
64
-
65
- it 'ignores the call inside the method if the traversal is pruned' do
66
- expect(ast.each_node(:send, [:def]).to_a).to be_empty
67
- end
68
- end
69
-
70
- it 'finds 3 ifs in a class' do
71
- src = <<-RUBY
72
- class Scrunch
73
- def first
74
- return @field == :sym ? 0 : 3;
75
- end
76
- def second
77
- if @field == :sym
78
- @other += " quarts"
79
- end
80
- end
81
- def third
82
- raise 'flu!' unless @field == :sym
83
- end
84
- end
85
- RUBY
86
- ast = Reek::Source::SourceCode.from(src).syntax_tree
87
- expect(ast.each_node(:if).to_a.length).to eq(3)
88
- end
89
- end
90
-
91
- describe '#format_to_ruby' do
92
- it 'returns #to_s if location is not present' do
93
- ast = sexp(:self)
94
- expect(ast.format_to_ruby).to eq ast.to_s
95
- end
96
-
97
- it 'gives the right result for self' do
98
- ast = Reek::Source::SourceCode.from('self').syntax_tree
99
- expect(ast.format_to_ruby).to eq 'self'
100
- end
101
-
102
- it 'gives the right result for a simple expression' do
103
- ast = Reek::Source::SourceCode.from('foo').syntax_tree
104
- expect(ast.format_to_ruby).to eq 'foo'
105
- end
106
-
107
- it 'gives the right result for a more complex expression' do
108
- ast = Reek::Source::SourceCode.from('foo(bar)').syntax_tree
109
- result = ast.format_to_ruby
110
- expect(result).to eq 'foo(bar)'
111
- end
112
-
113
- it 'gives te right result for send with a receiver' do
114
- ast = Reek::Source::SourceCode.from('baz.foo(bar)').syntax_tree
115
- expect(ast.format_to_ruby).to eq 'baz.foo(bar)'
116
- end
117
-
118
- it 'gives the right result for if' do
119
- source = <<-SRC
120
- if foo
121
- bar
122
- else
123
- baz
124
- qux
125
- end
126
- SRC
127
-
128
- ast = Reek::Source::SourceCode.from(source).syntax_tree
129
- expect(ast.format_to_ruby).to eq 'if foo ... end'
130
- end
131
-
132
- it 'gives the right result for def with no body' do
133
- source = "def my_method\nend"
134
- ast = Reek::Source::SourceCode.from(source).syntax_tree
135
- expect(ast.format_to_ruby).to eq 'def my_method; end'
136
- end
137
-
138
- it 'gives the right result for ivar' do
139
- source = '@foo'
140
- ast = Reek::Source::SourceCode.from(source).syntax_tree
141
- expect(ast.format_to_ruby).to eq '@foo'
142
- end
143
- end
144
-
145
- describe '#hash' do
146
- it 'hashes equal for equal sexps' do
147
- node1 = sexp(:def, :jim, sexp(:args), sexp(:send, sexp(:int, 4), :+, sexp(:send, nil, :fred)))
148
- node2 = sexp(:def, :jim, sexp(:args), sexp(:send, sexp(:int, 4), :+, sexp(:send, nil, :fred)))
149
- expect(node1.hash).to eq(node2.hash)
150
- end
151
-
152
- it 'hashes diferent for diferent sexps' do
153
- node1 = sexp(:def, :jim, sexp(:args), sexp(:send, sexp(:int, 4), :+, sexp(:send, nil, :fred)))
154
- node2 = sexp(:def, :jim, sexp(:args), sexp(:send, sexp(:int, 3), :+, sexp(:send, nil, :fred)))
155
- expect(node1.hash).not_to eq(node2.hash)
156
- end
157
- end
158
-
159
- describe '#length' do
160
- it 'counts itself as representing one statement' do
161
- expect(sexp(:foo).length).to eq 1
162
- end
163
- end
164
-
165
- describe '#line' do
166
- context 'with source from a file' do
167
- let(:file) { SMELLY_FILE }
168
- let(:ast) { Reek::Source::SourceCode.from(file).syntax_tree }
169
-
170
- it 'returns the right line number' do
171
- expect(ast.line).to eq(2)
172
- end
173
- end
174
-
175
- context 'with source from a string' do
176
- let(:source) { File.read(SMELLY_FILE) }
177
- let(:ast) { Reek::Source::SourceCode.from(source).syntax_tree }
178
-
179
- it 'returns the right line number' do
180
- expect(ast.line).to eq(2)
181
- end
182
- end
183
- end
184
-
185
- describe '#source' do
186
- context 'with source from a file' do
187
- let(:file) { SMELLY_FILE }
188
- let(:ast) { Reek::Source::SourceCode.from(file).syntax_tree }
189
-
190
- it 'returns the file name' do
191
- expect(ast.source).to eq(SMELLY_FILE.to_s)
192
- end
193
- end
194
-
195
- context 'with source from a string' do
196
- let(:source) { File.read SMELLY_FILE }
197
- let(:ast) { Reek::Source::SourceCode.from(source).syntax_tree }
198
-
199
- it 'returns "string"' do
200
- expect(ast.source).to eq('string')
201
- end
202
- end
203
- end
204
-
205
- describe '#name' do
206
- it 'returns #to_s if no override is present' do
207
- ast = sexp(:foo)
208
- expect(ast.name).to eq ast.to_s
209
- end
210
- end
211
- end
@@ -1,83 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/ast/object_refs'
3
-
4
- RSpec.describe Reek::AST::ObjectRefs do
5
- let(:refs) { described_class.new }
6
-
7
- context 'when empty' do
8
- it 'reports no refs to self' do
9
- expect(refs.references_to(:self)).to be_empty
10
- end
11
- end
12
-
13
- context 'with many refs to self' do
14
- before do
15
- refs.record_reference(name: :self)
16
- refs.record_reference(name: :self)
17
- refs.record_reference(name: :a)
18
- refs.record_reference(name: :self)
19
- refs.record_reference(name: :b)
20
- refs.record_reference(name: :a)
21
- refs.record_reference(name: :self)
22
- end
23
-
24
- it 'reports all refs to self' do
25
- expect(refs.references_to(:self).size).to eq(4)
26
- end
27
-
28
- it 'reports self among the max' do
29
- expect(refs.most_popular).to include(:self)
30
- end
31
-
32
- it 'reports self as the max' do
33
- expect(refs.self_is_max?).to eq(true)
34
- end
35
- end
36
-
37
- context 'when self is not the only max' do
38
- before do
39
- refs.record_reference(name: :a)
40
- refs.record_reference(name: :self)
41
- refs.record_reference(name: :self)
42
- refs.record_reference(name: :b)
43
- refs.record_reference(name: :a)
44
- end
45
-
46
- it 'reports all refs to self' do
47
- expect(refs.references_to(:self).size).to eq(2)
48
- end
49
-
50
- it 'reports self among the max' do
51
- expect(refs.most_popular).to include(:self)
52
- end
53
-
54
- it 'reports the other max among the max' do
55
- expect(refs.most_popular).to include(:a)
56
- end
57
-
58
- it 'reports self as the max' do
59
- expect(refs.self_is_max?).to eq(true)
60
- end
61
- end
62
-
63
- context 'when self is not recorded' do
64
- before do
65
- refs.record_reference(name: :a)
66
- refs.record_reference(name: :b)
67
- refs.record_reference(name: :a)
68
- refs.record_reference(name: :b)
69
- end
70
-
71
- it 'reports no refs to self' do
72
- expect(refs.references_to(:self).size).to eq(0)
73
- end
74
-
75
- it 'does not report self among the max' do
76
- expect(refs.most_popular).not_to include(:self)
77
- end
78
-
79
- it 'does not report self as the max' do
80
- expect(refs.self_is_max?).to eq(false)
81
- end
82
- end
83
- end
@@ -1,47 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/ast/reference_collector'
3
-
4
- RSpec.describe Reek::AST::ReferenceCollector do
5
- describe '#num_refs_to_self' do
6
- def refs_to_self(src)
7
- syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
8
- described_class.new(syntax_tree).num_refs_to_self
9
- end
10
-
11
- it 'with no refs to self' do
12
- expect(refs_to_self('def no_envy(arga) arga.barg end')).to eq(0)
13
- end
14
-
15
- it 'counts a call to super' do
16
- expect(refs_to_self('def simple() super; end')).to eq(1)
17
- end
18
-
19
- it 'counts a call to super with arguments' do
20
- expect(refs_to_self('def simple() super(); end')).to eq(1)
21
- end
22
-
23
- it 'counts a local call' do
24
- expect(refs_to_self('def simple() to_s; end')).to eq(1)
25
- end
26
-
27
- it 'counts a use of self' do
28
- expect(refs_to_self('def simple() lv = self; end')).to eq(1)
29
- end
30
-
31
- it 'counts a call with self as receiver' do
32
- expect(refs_to_self('def simple() self.to_s; end')).to eq(1)
33
- end
34
-
35
- it 'counts uses of an ivar' do
36
- expect(refs_to_self('def no_envy() @item.to_a; @item = 4; @item end')).to eq(3)
37
- end
38
-
39
- it 'counts an ivar passed to a method' do
40
- expect(refs_to_self('def no_envy(arga) arga.barg(@item); arga end')).to eq(1)
41
- end
42
-
43
- it 'ignores global variables' do
44
- expect(refs_to_self('def no_envy(arga) $s2.to_a; $s2[arga] end')).to eq(0)
45
- end
46
- end
47
- end