reek 6.0.3 → 6.0.4
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/CONTRIBUTING.md +3 -0
- data/Dockerfile +1 -1
- data/Gemfile +6 -6
- data/lib/reek/ast/ast_node_class_map.rb +1 -1
- data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
- data/lib/reek/smell_detectors/base_detector.rb +1 -1
- data/lib/reek/smell_warning.rb +1 -1
- data/lib/reek/source/source_locator.rb +1 -3
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +4 -1
- metadata +3 -208
- data/docs/API.md +0 -174
- data/docs/Attribute.md +0 -39
- data/docs/Basic-Smell-Options.md +0 -85
- data/docs/Boolean-Parameter.md +0 -54
- data/docs/Class-Variable.md +0 -40
- data/docs/Code-Smells.md +0 -39
- data/docs/Command-Line-Options.md +0 -119
- data/docs/Control-Couple.md +0 -26
- data/docs/Control-Parameter.md +0 -32
- data/docs/Data-Clump.md +0 -46
- data/docs/Duplicate-Method-Call.md +0 -264
- data/docs/Feature-Envy.md +0 -93
- data/docs/How-To-Write-New-Detectors.md +0 -132
- data/docs/How-reek-works-internally.md +0 -114
- data/docs/Instance-Variable-Assumption.md +0 -163
- data/docs/Irresponsible-Module.md +0 -47
- data/docs/Large-Class.md +0 -16
- data/docs/Long-Parameter-List.md +0 -39
- data/docs/Long-Yield-List.md +0 -37
- data/docs/Manual-Dispatch.md +0 -30
- data/docs/Missing-Safe-Method.md +0 -92
- data/docs/Module-Initialize.md +0 -62
- data/docs/Nested-Iterators.md +0 -59
- data/docs/Nil-Check.md +0 -47
- data/docs/RSpec-matchers.md +0 -129
- data/docs/Rake-Task.md +0 -66
- data/docs/Reek-4-to-Reek-5-migration.md +0 -188
- data/docs/Reek-Driven-Development.md +0 -46
- data/docs/Repeated-Conditional.md +0 -47
- data/docs/Simulated-Polymorphism.md +0 -16
- data/docs/Smell-Suppression.md +0 -96
- data/docs/Style-Guide.md +0 -19
- data/docs/Subclassed-From-Core-Class.md +0 -79
- data/docs/Too-Many-Constants.md +0 -37
- data/docs/Too-Many-Instance-Variables.md +0 -43
- data/docs/Too-Many-Methods.md +0 -56
- data/docs/Too-Many-Statements.md +0 -54
- data/docs/Uncommunicative-Method-Name.md +0 -94
- data/docs/Uncommunicative-Module-Name.md +0 -92
- data/docs/Uncommunicative-Name.md +0 -18
- data/docs/Uncommunicative-Parameter-Name.md +0 -90
- data/docs/Uncommunicative-Variable-Name.md +0 -96
- data/docs/Unused-Parameters.md +0 -28
- data/docs/Unused-Private-Method.md +0 -101
- data/docs/Utility-Function.md +0 -56
- data/docs/Versioning-Policy.md +0 -7
- data/docs/YAML-Reports.md +0 -93
- data/docs/defaults.reek.yml +0 -129
- data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
- data/docs/templates/default/docstring/setup.rb +0 -35
- data/docs/templates/default/fulldoc/html/css/common.css +0 -1
- data/docs/yard_plugin.rb +0 -17
- data/features/command_line_interface/basic_usage.feature +0 -15
- data/features/command_line_interface/options.feature +0 -123
- data/features/command_line_interface/show_progress.feature +0 -33
- data/features/command_line_interface/smell_selection.feature +0 -15
- data/features/command_line_interface/smells_count.feature +0 -38
- data/features/command_line_interface/stdin.feature +0 -65
- data/features/configuration_files/accept_setting.feature +0 -87
- data/features/configuration_files/directory_specific_directives.feature +0 -274
- data/features/configuration_files/exclude_directives.feature +0 -35
- data/features/configuration_files/exclude_paths_directives.feature +0 -42
- data/features/configuration_files/masking_smells.feature +0 -94
- data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
- data/features/configuration_files/reject_setting.feature +0 -89
- data/features/configuration_files/schema_validation.feature +0 -59
- data/features/configuration_files/show_configuration_file.feature +0 -44
- data/features/configuration_files/unused_private_method.feature +0 -68
- data/features/configuration_loading.feature +0 -91
- data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
- data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
- data/features/locales.feature +0 -32
- data/features/programmatic_access.feature +0 -41
- data/features/rake_task/rake_task.feature +0 -138
- data/features/reports/codeclimate.feature +0 -59
- data/features/reports/json.feature +0 -59
- data/features/reports/reports.feature +0 -219
- data/features/reports/yaml.feature +0 -52
- data/features/rspec_matcher.feature +0 -41
- data/features/samples.feature +0 -305
- data/features/step_definitions/.rubocop.yml +0 -5
- data/features/step_definitions/reek_steps.rb +0 -102
- data/features/step_definitions/sample_file_steps.rb +0 -63
- data/features/support/env.rb +0 -33
- data/features/todo_list.feature +0 -108
- data/samples/checkstyle.xml +0 -7
- data/samples/clean_source/clean.rb +0 -6
- data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
- data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
- data/samples/configuration/corrupt.reek +0 -1
- data/samples/configuration/empty.reek +0 -0
- data/samples/configuration/full_configuration.reek +0 -13
- data/samples/configuration/full_mask.reek +0 -6
- data/samples/configuration/home/home.reek.yml +0 -4
- data/samples/configuration/partial_mask.reek +0 -4
- data/samples/configuration/regular_configuration/.reek.yml +0 -4
- data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
- data/samples/configuration/with_excluded_paths.reek +0 -5
- data/samples/no_config_file/.keep +0 -0
- data/samples/paths.rb +0 -5
- data/samples/smelly_source/inline.rb +0 -704
- data/samples/smelly_source/optparse.rb +0 -1788
- data/samples/smelly_source/redcloth.rb +0 -1130
- data/samples/smelly_source/ruby.rb +0 -368
- data/samples/smelly_source/smelly.rb +0 -7
- data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
- data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
- data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
- data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
- data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
- data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
- data/samples/source_with_non_ruby_files/gibberish +0 -1
- data/samples/source_with_non_ruby_files/python_source.py +0 -1
- data/samples/source_with_non_ruby_files/ruby.rb +0 -6
- data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
- data/spec/quality/documentation_spec.rb +0 -41
- data/spec/quality/reek_source_spec.rb +0 -11
- data/spec/reek/ast/node_spec.rb +0 -211
- data/spec/reek/ast/object_refs_spec.rb +0 -83
- data/spec/reek/ast/reference_collector_spec.rb +0 -47
- data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
- data/spec/reek/cli/application_spec.rb +0 -168
- data/spec/reek/cli/command/report_command_spec.rb +0 -44
- data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
- data/spec/reek/cli/options_spec.rb +0 -51
- data/spec/reek/cli/silencer_spec.rb +0 -28
- data/spec/reek/code_comment_spec.rb +0 -184
- data/spec/reek/configuration/app_configuration_spec.rb +0 -195
- data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
- data/spec/reek/configuration/default_directive_spec.rb +0 -13
- data/spec/reek/configuration/directory_directives_spec.rb +0 -122
- data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
- data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
- data/spec/reek/configuration/schema_validator_spec.rb +0 -165
- data/spec/reek/context/code_context_spec.rb +0 -192
- data/spec/reek/context/ghost_context_spec.rb +0 -60
- data/spec/reek/context/method_context_spec.rb +0 -72
- data/spec/reek/context/module_context_spec.rb +0 -55
- data/spec/reek/context/root_context_spec.rb +0 -12
- data/spec/reek/context/statement_counter_spec.rb +0 -24
- data/spec/reek/context_builder_spec.rb +0 -457
- data/spec/reek/detector_repository_spec.rb +0 -22
- data/spec/reek/documentation_link_spec.rb +0 -20
- data/spec/reek/errors/base_error_spec.rb +0 -13
- data/spec/reek/examiner_spec.rb +0 -309
- data/spec/reek/logging_error_handler_spec.rb +0 -24
- data/spec/reek/rake/task_spec.rb +0 -56
- data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
- data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
- data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
- data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
- data/spec/reek/report/html_report_spec.rb +0 -19
- data/spec/reek/report/json_report_spec.rb +0 -58
- data/spec/reek/report/location_formatter_spec.rb +0 -32
- data/spec/reek/report/progress_formatter_spec.rb +0 -68
- data/spec/reek/report/text_report_spec.rb +0 -89
- data/spec/reek/report/xml_report_spec.rb +0 -24
- data/spec/reek/report/yaml_report_spec.rb +0 -55
- data/spec/reek/report_spec.rb +0 -28
- data/spec/reek/smell_configuration_spec.rb +0 -56
- data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
- data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
- data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
- data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
- data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
- data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
- data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
- data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
- data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
- data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
- data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
- data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
- data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
- data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
- data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
- data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
- data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
- data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
- data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
- data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
- data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
- data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
- data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
- data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
- data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
- data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
- data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
- data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
- data/spec/reek/smell_warning_spec.rb +0 -137
- data/spec/reek/source/source_code_spec.rb +0 -79
- data/spec/reek/source/source_locator_spec.rb +0 -166
- data/spec/reek/spec/should_reek_of_spec.rb +0 -153
- data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
- data/spec/reek/spec/should_reek_spec.rb +0 -52
- data/spec/reek/spec/smell_matcher_spec.rb +0 -87
- data/spec/reek/tree_dresser_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -110
- data/tasks/configuration.rake +0 -18
- data/tasks/console.rake +0 -5
- data/tasks/reek.rake +0 -6
- data/tasks/rubocop.rake +0 -11
- data/tasks/test.rake +0 -32
data/spec/reek/ast/node_spec.rb
DELETED
@@ -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
|
@@ -1,498 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/ast/sexp_extensions'
|
3
|
-
|
4
|
-
RSpec.describe Reek::AST::SexpExtensions::DefNode do
|
5
|
-
context 'with no parameters' do
|
6
|
-
let(:node) { sexp(:def, :hello, sexp(:args)) }
|
7
|
-
|
8
|
-
it 'has no arg names' do
|
9
|
-
expect(node.arg_names).to eq []
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'has no parameter names' do
|
13
|
-
expect(node.parameter_names).to eq []
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'includes outer scope in its full name' do
|
17
|
-
expect(node.full_name('Fred')).to eq 'Fred#hello'
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'includes no marker in its full name with empty outer scope' do
|
21
|
-
expect(node.full_name('')).to eq 'hello'
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'with 1 parameter' do
|
26
|
-
let(:node) do
|
27
|
-
sexp(:def, :hello,
|
28
|
-
sexp(:args, sexp(:arg, :parameter)))
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'has 1 arg name' do
|
32
|
-
expect(node.arg_names).to eq [:parameter]
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'has 1 parameter name' do
|
36
|
-
expect(node.parameter_names).to eq [:parameter]
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'includes outer scope in its full name' do
|
40
|
-
expect(node.full_name('Fred')).to eq 'Fred#hello'
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'includes no marker in its full name with empty outer scope' do
|
44
|
-
expect(node.full_name('')).to eq 'hello'
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'with a block parameter' do
|
49
|
-
let(:node) do
|
50
|
-
sexp(:def, :hello,
|
51
|
-
sexp(:args,
|
52
|
-
sexp(:arg, :parameter),
|
53
|
-
sexp(:blockarg, :blk)))
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'has 1 arg name' do
|
57
|
-
expect(node.arg_names).to eq [:parameter]
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'has 2 parameter names' do
|
61
|
-
expect(node.parameter_names).to eq [:parameter, :blk]
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'includes outer scope in its full name' do
|
65
|
-
expect(node.full_name('Fred')).to eq 'Fred#hello'
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'includes no marker in its full name with empty outer scope' do
|
69
|
-
expect(node.full_name('')).to eq 'hello'
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
context 'with 1 defaulted parameter' do
|
74
|
-
let(:node) do
|
75
|
-
sexp(:def, :hello,
|
76
|
-
sexp(:args,
|
77
|
-
sexp(:optarg, :parameter, sexp(:array))))
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'has 1 arg name' do
|
81
|
-
expect(node.arg_names).to eq [:parameter]
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'has 1 parameter name' do
|
85
|
-
expect(node.parameter_names).to eq [:parameter]
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'includes outer scope in its full name' do
|
89
|
-
expect(node.full_name('Fred')).to eq 'Fred#hello'
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'includes no marker in its full name with empty outer scope' do
|
93
|
-
expect(node.full_name('')).to eq 'hello'
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
context 'with a body with 2 statements' do
|
98
|
-
let(:node) do
|
99
|
-
sexp(:def, :hello, sexp(:args),
|
100
|
-
sexp(:begin,
|
101
|
-
sexp(:first),
|
102
|
-
sexp(:second)))
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'has 2 body statements' do
|
106
|
-
expect(node.body).to eq sexp(:begin, sexp(:first), sexp(:second))
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'finds nodes in the body with #body_nodes' do
|
110
|
-
expect(node.body_nodes([:first]).to_a).to eq [sexp(:first)]
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
context 'with no body' do
|
115
|
-
let(:node) { sexp(:def, :hello, sexp(:args), nil) }
|
116
|
-
|
117
|
-
it 'has a body that is nil' do
|
118
|
-
expect(node.body).to be_nil
|
119
|
-
end
|
120
|
-
|
121
|
-
it 'finds no nodes in the body' do
|
122
|
-
expect(node.body_nodes([:foo])).to eq []
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
RSpec.describe Reek::AST::SexpExtensions::CSendNode do
|
128
|
-
let(:node) { Reek::Source::SourceCode.from('1&.foo(true)').syntax_tree }
|
129
|
-
|
130
|
-
it 'has a class including SendNode' do
|
131
|
-
expect(node.class.included_modules).to include(Reek::AST::SexpExtensions::SendNode)
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'has a receiver' do
|
135
|
-
expect(node.receiver).to eq(sexp(:int, 1))
|
136
|
-
end
|
137
|
-
|
138
|
-
it 'has a name' do
|
139
|
-
expect(node.name).to eq(:foo)
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'has arguments' do
|
143
|
-
expect(node.args).to eq([sexp(:true)])
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
RSpec.describe Reek::AST::SexpExtensions::DefsNode do
|
148
|
-
context 'with no parameters' do
|
149
|
-
let(:node) { sexp(:defs, sexp(:lvar, :obj), :hello, sexp(:args)) }
|
150
|
-
|
151
|
-
it 'has no arg names' do
|
152
|
-
expect(node.arg_names).to eq []
|
153
|
-
end
|
154
|
-
|
155
|
-
it 'has no parameter names' do
|
156
|
-
expect(node.parameter_names).to eq []
|
157
|
-
end
|
158
|
-
|
159
|
-
it 'includes outer scope in its full name' do
|
160
|
-
expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
|
161
|
-
end
|
162
|
-
|
163
|
-
it 'includes no marker in its full name with empty outer scope' do
|
164
|
-
expect(node.full_name('')).to eq 'obj.hello'
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
context 'with 1 parameter' do
|
169
|
-
let(:node) do
|
170
|
-
sexp(:defs, sexp(:lvar, :obj), :hello,
|
171
|
-
sexp(:args, sexp(:arg, :parameter)))
|
172
|
-
end
|
173
|
-
|
174
|
-
it 'has 1 arg name' do
|
175
|
-
expect(node.arg_names).to eq [:parameter]
|
176
|
-
end
|
177
|
-
|
178
|
-
it 'has 1 parameter name' do
|
179
|
-
expect(node.parameter_names).to eq [:parameter]
|
180
|
-
end
|
181
|
-
|
182
|
-
it 'includes outer scope in its full name' do
|
183
|
-
expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
|
184
|
-
end
|
185
|
-
|
186
|
-
it 'includes no marker in its full name with empty outer scope' do
|
187
|
-
expect(node.full_name('')).to eq 'obj.hello'
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
context 'with a block' do
|
192
|
-
let(:node) do
|
193
|
-
sexp(:defs, sexp(:lvar, :obj), :hello,
|
194
|
-
sexp(:args,
|
195
|
-
sexp(:arg, :parameter),
|
196
|
-
sexp(:blockarg, :blk)))
|
197
|
-
end
|
198
|
-
|
199
|
-
it 'has 1 arg name' do
|
200
|
-
expect(node.arg_names).to eq [:parameter]
|
201
|
-
end
|
202
|
-
|
203
|
-
it 'has 2 parameter names' do
|
204
|
-
expect(node.parameter_names).to eq [:parameter, :blk]
|
205
|
-
end
|
206
|
-
|
207
|
-
it 'includes outer scope in its full name' do
|
208
|
-
expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
|
209
|
-
end
|
210
|
-
|
211
|
-
it 'includes no marker in its full name with empty outer scope' do
|
212
|
-
expect(node.full_name('')).to eq 'obj.hello'
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
context 'with 1 defaulted parameter' do
|
217
|
-
let(:node) do
|
218
|
-
sexp(:defs, sexp(:lvar, :obj), :hello,
|
219
|
-
sexp(:args,
|
220
|
-
sexp(:optarg, :parameter, sexp(:array))))
|
221
|
-
end
|
222
|
-
|
223
|
-
it 'has 1 arg name' do
|
224
|
-
expect(node.arg_names).to eq [:parameter]
|
225
|
-
end
|
226
|
-
|
227
|
-
it 'has 1 parameter name' do
|
228
|
-
expect(node.parameter_names).to eq [:parameter]
|
229
|
-
end
|
230
|
-
|
231
|
-
it 'includes outer scope in its full name' do
|
232
|
-
expect(node.full_name('Fred')).to eq 'Fred#obj.hello'
|
233
|
-
end
|
234
|
-
|
235
|
-
it 'includes no marker in its full name with empty outer scope' do
|
236
|
-
expect(node.full_name('')).to eq 'obj.hello'
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
context 'with a body with 2 statements' do
|
241
|
-
let(:node) do
|
242
|
-
sexp(:defs, sexp(:self), :hello, sexp(:args),
|
243
|
-
sexp(:begin,
|
244
|
-
sexp(:first),
|
245
|
-
sexp(:second)))
|
246
|
-
end
|
247
|
-
|
248
|
-
it 'has 2 body statements' do
|
249
|
-
expect(node.body).to eq sexp(:begin, sexp(:first), sexp(:second))
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
RSpec.describe Reek::AST::SexpExtensions::LvarNode do
|
255
|
-
let(:node) { sexp(:lvar, :foo) }
|
256
|
-
|
257
|
-
describe '#var_name' do
|
258
|
-
it 'returns the lvar’s name' do
|
259
|
-
expect(node.var_name).to eq(:foo)
|
260
|
-
end
|
261
|
-
end
|
262
|
-
end
|
263
|
-
|
264
|
-
RSpec.describe Reek::AST::SexpExtensions::ConstNode do
|
265
|
-
describe '#name' do
|
266
|
-
it 'returns the fully qualified name' do
|
267
|
-
node = sexp(:const, sexp(:const, sexp(:cbase), :Parser), :AST)
|
268
|
-
|
269
|
-
expect(node.name).to eq "#{sexp(:const, sexp(:cbase), :Parser)}::AST"
|
270
|
-
end
|
271
|
-
|
272
|
-
it 'returns only the name in case of no namespace' do
|
273
|
-
node = sexp(:const, nil, :AST)
|
274
|
-
|
275
|
-
expect(node.name).to eq 'AST'
|
276
|
-
end
|
277
|
-
end
|
278
|
-
|
279
|
-
describe '#simple_name' do
|
280
|
-
it 'returns the name' do
|
281
|
-
node = sexp(:const, sexp(:const, nil, :Rake), :TaskLib)
|
282
|
-
|
283
|
-
expect(node.simple_name).to eq :TaskLib
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
describe '#namespace' do
|
288
|
-
it 'returns the namespace' do
|
289
|
-
node = sexp(:const, :Parser, :AST)
|
290
|
-
|
291
|
-
expect(node.namespace).to eq :Parser
|
292
|
-
end
|
293
|
-
|
294
|
-
it 'returns nil in case of no namespace' do
|
295
|
-
node = sexp(:const, nil, :AST)
|
296
|
-
|
297
|
-
expect(node.namespace).to be_nil
|
298
|
-
end
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
|
-
RSpec.describe Reek::AST::SexpExtensions::SendNode do
|
303
|
-
context 'with no parameters' do
|
304
|
-
let(:node) { sexp(:send, nil, :hello) }
|
305
|
-
|
306
|
-
it 'is not considered to be a writable attr' do
|
307
|
-
expect(sexp(:send, nil, :attr)).not_to be_attr_with_writable_flag
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
context 'when it’s ‘new’ with no parameters and no receiver' do
|
312
|
-
let(:bare_new) { sexp(:send, nil, :new) }
|
313
|
-
|
314
|
-
it 'is not considered to be a module creation call' do
|
315
|
-
expect(bare_new).not_to be_module_creation_call
|
316
|
-
end
|
317
|
-
|
318
|
-
it 'is not considered to have a module creation receiver' do
|
319
|
-
expect(bare_new).not_to be_module_creation_receiver
|
320
|
-
end
|
321
|
-
|
322
|
-
it 'is considered to be an object creation call' do
|
323
|
-
expect(bare_new).to be_object_creation_call
|
324
|
-
end
|
325
|
-
end
|
326
|
-
|
327
|
-
context 'when it’s ‘new’ with a complex receiver' do
|
328
|
-
let(:node) { Reek::Source::SourceCode.from('(foo ? bar : baz).new').syntax_tree }
|
329
|
-
|
330
|
-
it 'is not considered to be a module creation call' do
|
331
|
-
expect(node).not_to be_module_creation_call
|
332
|
-
end
|
333
|
-
|
334
|
-
it 'is not considered to have a module creation receiver' do
|
335
|
-
expect(node).not_to be_module_creation_receiver
|
336
|
-
end
|
337
|
-
|
338
|
-
it 'is considered to be an object creation call' do
|
339
|
-
expect(node).to be_object_creation_call
|
340
|
-
end
|
341
|
-
end
|
342
|
-
end
|
343
|
-
|
344
|
-
RSpec.describe Reek::AST::SexpExtensions::BlockNode do
|
345
|
-
context 'with no parameters' do
|
346
|
-
let(:node) { sexp(:block, sexp(:send, nil, :map), sexp(:args), nil) }
|
347
|
-
|
348
|
-
it 'has no parameter names' do
|
349
|
-
expect(node.parameter_names).to eq []
|
350
|
-
end
|
351
|
-
|
352
|
-
it 'has a name' do
|
353
|
-
expect(node.simple_name).to eq(:block)
|
354
|
-
end
|
355
|
-
end
|
356
|
-
|
357
|
-
context 'with 1 parameter' do
|
358
|
-
let(:node) { sexp(:block, sexp(:send, nil, :map), sexp(:args, :parameter), nil) }
|
359
|
-
|
360
|
-
it 'has 1 parameter name' do
|
361
|
-
expect(node.parameter_names).to eq [:parameter]
|
362
|
-
end
|
363
|
-
end
|
364
|
-
|
365
|
-
context 'with 2 parameters' do
|
366
|
-
let(:node) { sexp(:block, sexp(:send, nil, :map), sexp(:args, :x, :y), nil) }
|
367
|
-
|
368
|
-
it 'has 2 parameter names' do
|
369
|
-
expect(node.parameter_names).to eq [:x, :y]
|
370
|
-
end
|
371
|
-
end
|
372
|
-
end
|
373
|
-
|
374
|
-
RSpec.describe Reek::AST::SexpExtensions::LambdaNode do
|
375
|
-
let(:node) { sexp(:lambda) }
|
376
|
-
|
377
|
-
describe '#name' do
|
378
|
-
it 'returns :lambda' do
|
379
|
-
expect(node.name).to eq 'lambda'
|
380
|
-
end
|
381
|
-
end
|
382
|
-
end
|
383
|
-
|
384
|
-
RSpec.describe Reek::AST::SexpExtensions::ModuleNode do
|
385
|
-
context 'with a simple name' do
|
386
|
-
let(:exp) do
|
387
|
-
Reek::Source::SourceCode.from('module Fred; end').syntax_tree
|
388
|
-
end
|
389
|
-
|
390
|
-
it 'has the correct #name' do
|
391
|
-
expect(exp.name).to eq 'Fred'
|
392
|
-
end
|
393
|
-
|
394
|
-
it 'has the correct #simple_name' do
|
395
|
-
expect(exp.simple_name).to eq 'Fred'
|
396
|
-
end
|
397
|
-
|
398
|
-
it 'has a simple full_name' do
|
399
|
-
expect(exp.full_name('')).to eq 'Fred'
|
400
|
-
end
|
401
|
-
|
402
|
-
it 'has a fq full_name' do
|
403
|
-
expect(exp.full_name('Blimey::O::Reilly')).to eq 'Blimey::O::Reilly::Fred'
|
404
|
-
end
|
405
|
-
end
|
406
|
-
|
407
|
-
context 'with a scoped name' do
|
408
|
-
let(:exp) do
|
409
|
-
Reek::Source::SourceCode.from('module Foo::Bar; end').syntax_tree
|
410
|
-
end
|
411
|
-
|
412
|
-
it 'has the correct #name' do
|
413
|
-
expect(exp.name).to eq 'Foo::Bar'
|
414
|
-
end
|
415
|
-
|
416
|
-
it 'has the correct #simple_name' do
|
417
|
-
expect(exp.simple_name).to eq 'Bar'
|
418
|
-
end
|
419
|
-
|
420
|
-
it 'has a simple full_name' do
|
421
|
-
expect(exp.full_name('')).to eq 'Foo::Bar'
|
422
|
-
end
|
423
|
-
|
424
|
-
it 'has a fully qualified full_name' do
|
425
|
-
expect(exp.full_name('Blimey::O::Reilly')).to eq 'Blimey::O::Reilly::Foo::Bar'
|
426
|
-
end
|
427
|
-
end
|
428
|
-
|
429
|
-
context 'with a name scoped in a namespace that is not a constant' do
|
430
|
-
let(:exp) do
|
431
|
-
Reek::Source::SourceCode.from('module foo::Bar; end').syntax_tree
|
432
|
-
end
|
433
|
-
|
434
|
-
it 'has the correct #name' do
|
435
|
-
expect(exp.name).to eq 'foo::Bar'
|
436
|
-
end
|
437
|
-
|
438
|
-
it 'has the correct #simple_name' do
|
439
|
-
expect(exp.simple_name).to eq 'Bar'
|
440
|
-
end
|
441
|
-
end
|
442
|
-
end
|
443
|
-
|
444
|
-
RSpec.describe Reek::AST::SexpExtensions::CasgnNode do
|
445
|
-
describe '#defines_module?' do
|
446
|
-
it 'is false for single assignment' do
|
447
|
-
exp = sexp(:casgn, nil, :Foo)
|
448
|
-
expect(exp).not_to be_defines_module
|
449
|
-
end
|
450
|
-
|
451
|
-
it 'is false for implicit receiver to new' do
|
452
|
-
exp = sexp(:casgn, nil, :Foo, sexp(:send, nil, :new))
|
453
|
-
expect(exp).not_to be_defines_module
|
454
|
-
end
|
455
|
-
|
456
|
-
it 'is true for explicit receiver to new' do
|
457
|
-
exp = Reek::Source::SourceCode.from('Foo = Class.new(Bar)').syntax_tree
|
458
|
-
expect(exp).to be_defines_module
|
459
|
-
end
|
460
|
-
|
461
|
-
it 'is false for assigning a lambda to a constant' do
|
462
|
-
exp = Reek::Source::SourceCode.from('C = ->{}').syntax_tree
|
463
|
-
expect(exp).not_to be_defines_module
|
464
|
-
end
|
465
|
-
|
466
|
-
it 'is false for assigning a string to a constant' do
|
467
|
-
exp = Reek::Source::SourceCode.from('C = "hello"').syntax_tree
|
468
|
-
expect(exp).not_to be_defines_module
|
469
|
-
end
|
470
|
-
end
|
471
|
-
|
472
|
-
describe '#superclass' do
|
473
|
-
it 'returns the superclass from the class definition' do
|
474
|
-
exp = Reek::Source::SourceCode.from('Foo = Class.new(Bar)').syntax_tree
|
475
|
-
expect(exp.superclass).to eq sexp(:const, nil, :Bar)
|
476
|
-
end
|
477
|
-
|
478
|
-
it 'returns nil in case of no class definition' do
|
479
|
-
exp = Reek::Source::SourceCode.from('Foo = 23').syntax_tree
|
480
|
-
expect(exp.superclass).to be_nil
|
481
|
-
end
|
482
|
-
|
483
|
-
it 'returns nil in case of no superclass' do
|
484
|
-
exp = Reek::Source::SourceCode.from('Foo = Class.new').syntax_tree
|
485
|
-
expect(exp.superclass).to be_nil
|
486
|
-
end
|
487
|
-
|
488
|
-
it 'returns nothing for a class definition using Struct.new' do
|
489
|
-
exp = Reek::Source::SourceCode.from('Foo = Struct.new("Bar")').syntax_tree
|
490
|
-
expect(exp.superclass).to be_nil
|
491
|
-
end
|
492
|
-
|
493
|
-
it 'returns nothing for a constant assigned with a bare method call' do
|
494
|
-
exp = Reek::Source::SourceCode.from('Foo = foo("Bar")').syntax_tree
|
495
|
-
expect(exp.superclass).to be_nil
|
496
|
-
end
|
497
|
-
end
|
498
|
-
end
|