ridecharge-rubocop 0.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 (219) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +14 -0
  5. data/CHANGELOG.md +0 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +35 -0
  9. data/Rakefile +22 -0
  10. data/bin/ridecharge-rubocop +49 -0
  11. data/config/0default.yml +8 -0
  12. data/config/fleet-magic-todo.yml +380 -0
  13. data/config/rc-todo.yml +190 -0
  14. data/config/ridecharge-rubocop_todo.yml +73 -0
  15. data/config/rubocop/default.yml +308 -0
  16. data/config/rubocop/disabled.yml +9 -0
  17. data/config/rubocop/enabled.yml +648 -0
  18. data/config/standard-todo.yml +24 -0
  19. data/config/tabs.yml +15 -0
  20. data/config/vehicle-todo.yml +195 -0
  21. data/lib/ridecharge/rubocop.rb +2 -0
  22. data/lib/ridecharge/rubocop/version.rb +5 -0
  23. data/lib/rubocop/config_loader_monkeypatch.rb +117 -0
  24. data/lib/rubocop/ridecharge.rb +1 -0
  25. data/ridecharge-rubocop.gemspec +25 -0
  26. data/spec/isolated_environment_spec.rb +24 -0
  27. data/spec/project_spec.rb +118 -0
  28. data/spec/rubocop/cli_spec.rb +1385 -0
  29. data/spec/rubocop/config_loader_spec.rb +328 -0
  30. data/spec/rubocop/config_spec.rb +179 -0
  31. data/spec/rubocop/config_store_spec.rb +53 -0
  32. data/spec/rubocop/cop/commissioner_spec.rb +83 -0
  33. data/spec/rubocop/cop/cop_spec.rb +114 -0
  34. data/spec/rubocop/cop/corrector_spec.rb +59 -0
  35. data/spec/rubocop/cop/lint/ambiguous_operator_spec.rb +113 -0
  36. data/spec/rubocop/cop/lint/ambiguous_regexp_literal_spec.rb +35 -0
  37. data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +107 -0
  38. data/spec/rubocop/cop/lint/block_alignment_spec.rb +411 -0
  39. data/spec/rubocop/cop/lint/condition_position_spec.rb +49 -0
  40. data/spec/rubocop/cop/lint/debugger_spec.rb +39 -0
  41. data/spec/rubocop/cop/lint/else_layout_spec.rb +65 -0
  42. data/spec/rubocop/cop/lint/empty_ensure_spec.rb +27 -0
  43. data/spec/rubocop/cop/lint/end_alignment_spec.rb +136 -0
  44. data/spec/rubocop/cop/lint/end_in_method_spec.rb +29 -0
  45. data/spec/rubocop/cop/lint/ensure_return_spec.rb +39 -0
  46. data/spec/rubocop/cop/lint/eval_spec.rb +35 -0
  47. data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +30 -0
  48. data/spec/rubocop/cop/lint/invalid_character_literal_spec.rb +33 -0
  49. data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +63 -0
  50. data/spec/rubocop/cop/lint/loop_spec.rb +27 -0
  51. data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +57 -0
  52. data/spec/rubocop/cop/lint/require_parentheses_spec.rb +82 -0
  53. data/spec/rubocop/cop/lint/rescue_exception_spec.rb +131 -0
  54. data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +237 -0
  55. data/spec/rubocop/cop/lint/syntax_spec.rb +34 -0
  56. data/spec/rubocop/cop/lint/unreachable_code_spec.rb +63 -0
  57. data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1570 -0
  58. data/spec/rubocop/cop/lint/useless_comparison_spec.rb +30 -0
  59. data/spec/rubocop/cop/lint/useless_else_without_rescue_spec.rb +48 -0
  60. data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +149 -0
  61. data/spec/rubocop/cop/lint/void_spec.rb +57 -0
  62. data/spec/rubocop/cop/offence_spec.rb +133 -0
  63. data/spec/rubocop/cop/rails/default_scope_spec.rb +37 -0
  64. data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +13 -0
  65. data/spec/rubocop/cop/rails/output_spec.rb +41 -0
  66. data/spec/rubocop/cop/rails/read_attribute_spec.rb +13 -0
  67. data/spec/rubocop/cop/rails/validation_spec.rb +21 -0
  68. data/spec/rubocop/cop/style/access_modifier_indentation_spec.rb +361 -0
  69. data/spec/rubocop/cop/style/accessor_method_name_spec.rb +81 -0
  70. data/spec/rubocop/cop/style/alias_spec.rb +59 -0
  71. data/spec/rubocop/cop/style/align_array_spec.rb +75 -0
  72. data/spec/rubocop/cop/style/align_hash_spec.rb +310 -0
  73. data/spec/rubocop/cop/style/align_parameters_spec.rb +222 -0
  74. data/spec/rubocop/cop/style/and_or_spec.rb +57 -0
  75. data/spec/rubocop/cop/style/ascii_comments_spec.rb +22 -0
  76. data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +36 -0
  77. data/spec/rubocop/cop/style/attr_spec.rb +19 -0
  78. data/spec/rubocop/cop/style/begin_block_spec.rb +13 -0
  79. data/spec/rubocop/cop/style/block_comments_spec.rb +21 -0
  80. data/spec/rubocop/cop/style/block_nesting_spec.rb +156 -0
  81. data/spec/rubocop/cop/style/blocks_spec.rb +99 -0
  82. data/spec/rubocop/cop/style/braces_around_hash_parameters_spec.rb +284 -0
  83. data/spec/rubocop/cop/style/case_equality_spec.rb +12 -0
  84. data/spec/rubocop/cop/style/case_indentation_spec.rb +289 -0
  85. data/spec/rubocop/cop/style/character_literal_spec.rb +37 -0
  86. data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +40 -0
  87. data/spec/rubocop/cop/style/class_length_spec.rb +131 -0
  88. data/spec/rubocop/cop/style/class_methods_spec.rb +45 -0
  89. data/spec/rubocop/cop/style/class_vars_spec.rb +19 -0
  90. data/spec/rubocop/cop/style/collection_methods_spec.rb +48 -0
  91. data/spec/rubocop/cop/style/colon_method_call_spec.rb +60 -0
  92. data/spec/rubocop/cop/style/comment_annotation_spec.rb +86 -0
  93. data/spec/rubocop/cop/style/constant_name_spec.rb +65 -0
  94. data/spec/rubocop/cop/style/cyclomatic_complexity_spec.rb +204 -0
  95. data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +39 -0
  96. data/spec/rubocop/cop/style/documentation_spec.rb +123 -0
  97. data/spec/rubocop/cop/style/dot_position_spec.rb +94 -0
  98. data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +127 -0
  99. data/spec/rubocop/cop/style/empty_lines_around_access_modifier_spec.rb +56 -0
  100. data/spec/rubocop/cop/style/empty_lines_around_body_spec.rb +131 -0
  101. data/spec/rubocop/cop/style/empty_lines_spec.rb +40 -0
  102. data/spec/rubocop/cop/style/empty_literal_spec.rb +100 -0
  103. data/spec/rubocop/cop/style/encoding_spec.rb +56 -0
  104. data/spec/rubocop/cop/style/end_block_spec.rb +13 -0
  105. data/spec/rubocop/cop/style/end_of_line_spec.rb +47 -0
  106. data/spec/rubocop/cop/style/even_odd_spec.rb +75 -0
  107. data/spec/rubocop/cop/style/favor_join_spec.rb +31 -0
  108. data/spec/rubocop/cop/style/favor_sprintf_spec.rb +47 -0
  109. data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +76 -0
  110. data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +41 -0
  111. data/spec/rubocop/cop/style/final_newline_spec.rb +30 -0
  112. data/spec/rubocop/cop/style/flip_flop_spec.rb +23 -0
  113. data/spec/rubocop/cop/style/for_spec.rb +105 -0
  114. data/spec/rubocop/cop/style/global_vars_spec.rb +34 -0
  115. data/spec/rubocop/cop/style/hash_methods_spec.rb +45 -0
  116. data/spec/rubocop/cop/style/hash_syntax_spec.rb +131 -0
  117. data/spec/rubocop/cop/style/if_unless_modifier_spec.rb +128 -0
  118. data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +19 -0
  119. data/spec/rubocop/cop/style/indentation_consistency_spec.rb +490 -0
  120. data/spec/rubocop/cop/style/indentation_width_spec.rb +470 -0
  121. data/spec/rubocop/cop/style/lambda_call_spec.rb +65 -0
  122. data/spec/rubocop/cop/style/lambda_spec.rb +41 -0
  123. data/spec/rubocop/cop/style/leading_comment_space_spec.rb +64 -0
  124. data/spec/rubocop/cop/style/line_end_concatenation_spec.rb +34 -0
  125. data/spec/rubocop/cop/style/line_length_spec.rb +20 -0
  126. data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +59 -0
  127. data/spec/rubocop/cop/style/method_called_on_do_end_block_spec.rb +60 -0
  128. data/spec/rubocop/cop/style/method_def_parentheses_spec.rb +106 -0
  129. data/spec/rubocop/cop/style/method_length_spec.rb +147 -0
  130. data/spec/rubocop/cop/style/method_name_spec.rb +125 -0
  131. data/spec/rubocop/cop/style/module_function_spec.rb +24 -0
  132. data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +78 -0
  133. data/spec/rubocop/cop/style/multiline_if_then_spec.rb +107 -0
  134. data/spec/rubocop/cop/style/multiline_ternary_operator_spec.rb +18 -0
  135. data/spec/rubocop/cop/style/nested_ternary_operator_spec.rb +21 -0
  136. data/spec/rubocop/cop/style/nil_comparison_spec.rb +30 -0
  137. data/spec/rubocop/cop/style/not_spec.rb +22 -0
  138. data/spec/rubocop/cop/style/numeric_literals_spec.rb +64 -0
  139. data/spec/rubocop/cop/style/one_line_conditional_spec.rb +13 -0
  140. data/spec/rubocop/cop/style/op_method_spec.rb +74 -0
  141. data/spec/rubocop/cop/style/parameter_lists_spec.rb +44 -0
  142. data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +122 -0
  143. data/spec/rubocop/cop/style/perl_backrefs_spec.rb +17 -0
  144. data/spec/rubocop/cop/style/predicate_name_spec.rb +25 -0
  145. data/spec/rubocop/cop/style/proc_spec.rb +27 -0
  146. data/spec/rubocop/cop/style/raise_args_spec.rb +82 -0
  147. data/spec/rubocop/cop/style/redundant_begin_spec.rb +57 -0
  148. data/spec/rubocop/cop/style/redundant_exception_spec.rb +27 -0
  149. data/spec/rubocop/cop/style/redundant_return_spec.rb +171 -0
  150. data/spec/rubocop/cop/style/redundant_self_spec.rb +142 -0
  151. data/spec/rubocop/cop/style/regexp_literal_spec.rb +83 -0
  152. data/spec/rubocop/cop/style/rescue_modifier_spec.rb +116 -0
  153. data/spec/rubocop/cop/style/semicolon_spec.rb +100 -0
  154. data/spec/rubocop/cop/style/signal_exception_spec.rb +266 -0
  155. data/spec/rubocop/cop/style/single_line_block_params_spec.rb +68 -0
  156. data/spec/rubocop/cop/style/single_line_methods_spec.rb +52 -0
  157. data/spec/rubocop/cop/style/space_after_colon_spec.rb +38 -0
  158. data/spec/rubocop/cop/style/space_after_comma_spec.rb +30 -0
  159. data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +84 -0
  160. data/spec/rubocop/cop/style/space_after_method_name_spec.rb +70 -0
  161. data/spec/rubocop/cop/style/space_after_not_spec.rb +22 -0
  162. data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +23 -0
  163. data/spec/rubocop/cop/style/space_around_block_braces_spec.rb +283 -0
  164. data/spec/rubocop/cop/style/space_around_equals_in_parameter_default_spec.rb +33 -0
  165. data/spec/rubocop/cop/style/space_around_operators_spec.rb +325 -0
  166. data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +70 -0
  167. data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +52 -0
  168. data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +138 -0
  169. data/spec/rubocop/cop/style/space_inside_parens_spec.rb +34 -0
  170. data/spec/rubocop/cop/style/special_global_vars_spec.rb +56 -0
  171. data/spec/rubocop/cop/style/string_literals_spec.rb +212 -0
  172. data/spec/rubocop/cop/style/symbol_array_spec.rb +37 -0
  173. data/spec/rubocop/cop/style/tab_spec.rb +17 -0
  174. data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +43 -0
  175. data/spec/rubocop/cop/style/trailing_comma_spec.rb +230 -0
  176. data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +30 -0
  177. data/spec/rubocop/cop/style/trivial_accessors_spec.rb +415 -0
  178. data/spec/rubocop/cop/style/unless_else_spec.rb +25 -0
  179. data/spec/rubocop/cop/style/variable_interpolation_spec.rb +47 -0
  180. data/spec/rubocop/cop/style/variable_name_spec.rb +107 -0
  181. data/spec/rubocop/cop/style/when_then_spec.rb +41 -0
  182. data/spec/rubocop/cop/style/while_until_do_spec.rb +53 -0
  183. data/spec/rubocop/cop/style/while_until_modifier_spec.rb +75 -0
  184. data/spec/rubocop/cop/style/word_array_spec.rb +97 -0
  185. data/spec/rubocop/cop/team_spec.rb +156 -0
  186. data/spec/rubocop/cop/util_spec.rb +49 -0
  187. data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +213 -0
  188. data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +734 -0
  189. data/spec/rubocop/cop/variable_inspector/scope_spec.rb +184 -0
  190. data/spec/rubocop/cop/variable_inspector/variable_spec.rb +73 -0
  191. data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +269 -0
  192. data/spec/rubocop/cop/variable_inspector_spec.rb +29 -0
  193. data/spec/rubocop/file_inspector_spec.rb +78 -0
  194. data/spec/rubocop/formatter/base_formatter_spec.rb +191 -0
  195. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +114 -0
  196. data/spec/rubocop/formatter/colorizable_spec.rb +107 -0
  197. data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +50 -0
  198. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +62 -0
  199. data/spec/rubocop/formatter/file_list_formatter_spec.rb +33 -0
  200. data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
  201. data/spec/rubocop/formatter/json_formatter_spec.rb +148 -0
  202. data/spec/rubocop/formatter/offence_count_formatter_spec.rb +52 -0
  203. data/spec/rubocop/formatter/progress_formatter_spec.rb +182 -0
  204. data/spec/rubocop/formatter/simple_text_formatter_spec.rb +123 -0
  205. data/spec/rubocop/options_spec.rb +145 -0
  206. data/spec/rubocop/path_util_spec.rb +42 -0
  207. data/spec/rubocop/processed_source_spec.rb +114 -0
  208. data/spec/rubocop/source_parser_spec.rb +139 -0
  209. data/spec/rubocop/target_finder_spec.rb +180 -0
  210. data/spec/rubocop/token_spec.rb +25 -0
  211. data/spec/spec_helper.rb +136 -0
  212. data/spec/support/ast_helper.rb +15 -0
  213. data/spec/support/file_helper.rb +21 -0
  214. data/spec/support/isolated_environment.rb +34 -0
  215. data/spec/support/mri_syntax_checker.rb +73 -0
  216. data/spec/support/shared_context.rb +22 -0
  217. data/spec/support/shared_examples.rb +33 -0
  218. data/spec/support/statement_modifier_helper.rb +41 -0
  219. metadata +511 -0
@@ -0,0 +1,156 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Team do
6
+ subject(:team) { described_class.new(cop_classes, config, options) }
7
+ let(:cop_classes) { Rubocop::Cop::Cop.non_rails }
8
+ let(:config) { Rubocop::ConfigLoader.default_configuration }
9
+ let(:options) { nil }
10
+
11
+ describe '#autocorrect?' do
12
+ subject { team.autocorrect? }
13
+
14
+ context 'when the option argument of .new is omitted' do
15
+ subject { described_class.new(cop_classes, config).autocorrect? }
16
+ it { should be_false }
17
+ end
18
+
19
+ context 'when { auto_correct: true } is passed to .new' do
20
+ let(:options) { { auto_correct: true } }
21
+ it { should be_true }
22
+ end
23
+ end
24
+
25
+ describe '#debug?' do
26
+ subject { team.debug? }
27
+
28
+ context 'when the option argument of .new is omitted' do
29
+ subject { described_class.new(cop_classes, config).debug? }
30
+ it { should be_false }
31
+ end
32
+
33
+ context 'when { debug: true } is passed to .new' do
34
+ let(:options) { { debug: true } }
35
+ it { should be_true }
36
+ end
37
+ end
38
+
39
+ describe '#inspect_file', :isolated_environment do
40
+ include FileHelper
41
+
42
+ let(:file_path) { 'example.rb' }
43
+ let(:offences) { team.inspect_file(file_path) }
44
+
45
+ before do
46
+ create_file(file_path, [
47
+ '#' * 90,
48
+ 'puts test;'
49
+ ])
50
+ end
51
+
52
+ it 'returns offences' do
53
+ expect(offences).not_to be_empty
54
+ expect(offences.all? { |o| o.is_a?(Rubocop::Cop::Offence) }).to be_true
55
+ end
56
+
57
+ context 'when Parser cannot parse the file' do
58
+ before do
59
+ create_file(file_path, [
60
+ '#' * 90,
61
+ 'class Test'
62
+ ])
63
+ end
64
+
65
+ it 'returns only error offences' do
66
+ expect(offences.size).to eq(1)
67
+ offence = offences.first
68
+ expect(offence.cop_name).to eq('Syntax')
69
+ expect(offence.severity).to eq(:error)
70
+ end
71
+ end
72
+
73
+ context 'when Parser reports non-fatal warning for the file' do
74
+ before do
75
+ create_file(file_path, [
76
+ '# encoding: utf-8',
77
+ '#' * 90,
78
+ 'puts *test'
79
+ ])
80
+ end
81
+
82
+ let(:cop_names) { offences.map(&:cop_name) }
83
+
84
+ it 'returns Parser warning offences' do
85
+ expect(cop_names).to include('AmbiguousOperator')
86
+ end
87
+
88
+ it 'returns offences from cops' do
89
+ expect(cop_names).to include('LineLength')
90
+ end
91
+ end
92
+
93
+ context 'when autocorrection is enabled' do
94
+ let(:options) { { auto_correct: true } }
95
+
96
+ before do
97
+ create_file(file_path, [
98
+ '# encoding: utf-8',
99
+ 'puts "string"'
100
+ ])
101
+ end
102
+
103
+ it 'does autocorrection' do
104
+ team.inspect_file(file_path)
105
+ corrected_source = File.read(file_path)
106
+ expect(corrected_source).to eq([
107
+ '# encoding: utf-8',
108
+ "puts 'string'",
109
+ ''
110
+ ].join("\n"))
111
+ end
112
+
113
+ it 'still returns offences' do
114
+ expect(offences.first.cop_name).to eq('StringLiterals')
115
+ end
116
+ end
117
+ end
118
+
119
+ describe '#cops' do
120
+ subject(:cops) { team.cops }
121
+
122
+ it 'returns cop instances' do
123
+ expect(cops).not_to be_empty
124
+ expect(cops.all? { |c| c.is_a?(Rubocop::Cop::Cop) }).to be_true
125
+ end
126
+
127
+ context 'when only some cop classes are passed to .new' do
128
+ let(:cop_classes) do
129
+ [Rubocop::Cop::Lint::Void, Rubocop::Cop::Style::LineLength]
130
+ end
131
+
132
+ it 'returns only intances of the classes' do
133
+ expect(cops.size).to eq(2)
134
+ cops.sort! { |a, b| a.name <=> b.name }
135
+ expect(cops[0].name).to eq('LineLength')
136
+ expect(cops[1].name).to eq('Void')
137
+ end
138
+ end
139
+
140
+ context 'when some classes are disabled with config' do
141
+ before do
142
+ %w(Void LineLength).each do |cop_name|
143
+ config.for_cop(cop_name)['Enabled'] = false
144
+ end
145
+ end
146
+
147
+ let(:cop_names) { cops.map(&:name) }
148
+
149
+ it 'does not return intances of the classes' do
150
+ expect(cops).not_to be_empty
151
+ expect(cop_names).not_to include('Void')
152
+ expect(cop_names).not_to include('LineLength')
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Util do
6
+ describe '#line_range' do
7
+ include ASTHelper
8
+
9
+ let(:source) do
10
+ <<-END
11
+ foo = 1
12
+ bar = 2
13
+ class Test
14
+ def some_method
15
+ do_something
16
+ end
17
+ end
18
+ baz = 8
19
+ END
20
+ end
21
+
22
+ let(:ast) do
23
+ processed_source = parse_source(source)
24
+ processed_source.ast
25
+ end
26
+
27
+ let(:node) do
28
+ target_node = scan_node(ast) do |node|
29
+ break node if node.type == :class
30
+ end
31
+ fail 'No target node found!' unless target_node
32
+ target_node
33
+ end
34
+
35
+ context 'when Source::Range object is passed' do
36
+ it 'returns line range of that' do
37
+ line_range = Rubocop::Cop::Util.line_range(node.loc.expression)
38
+ expect(line_range).to eq(3..7)
39
+ end
40
+ end
41
+
42
+ context 'when AST::Node object is passed' do
43
+ it 'returns line range of the expression' do
44
+ line_range = Rubocop::Cop::Util.line_range(node)
45
+ expect(line_range).to eq(3..7)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,213 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::VariableInspector::Assignment do
6
+ include ASTHelper
7
+ include AST::Sexp
8
+
9
+ let(:ast) do
10
+ processed_source = Rubocop::SourceParser.parse(source)
11
+ processed_source.ast
12
+ end
13
+
14
+ let(:source) do
15
+ <<-END
16
+ class SomeClass
17
+ def some_method(flag)
18
+ puts 'Hello World!'
19
+
20
+ if flag > 0
21
+ foo = 1
22
+ end
23
+ end
24
+ end
25
+ END
26
+ end
27
+
28
+ let(:def_node) do
29
+ found_node = scan_node(ast, include_origin_node: true) do |node|
30
+ break node if node.type == :def
31
+ end
32
+ fail 'No def node found!' unless found_node
33
+ found_node
34
+ end
35
+
36
+ let(:lvasgn_node) do
37
+ found_node = scan_node(ast) do |node|
38
+ break node if node.type == :lvasgn
39
+ end
40
+ fail 'No lvasgn node found!' unless found_node
41
+ found_node
42
+ end
43
+
44
+ let(:name) { lvasgn_node.children.first }
45
+ let(:scope) { Rubocop::Cop::VariableInspector::Scope.new(def_node) }
46
+ let(:variable) do
47
+ Rubocop::Cop::VariableInspector::Variable.new(name, lvasgn_node, scope)
48
+ end
49
+ let(:assignment) { described_class.new(lvasgn_node, variable) }
50
+
51
+ describe '.new' do
52
+ let(:variable) { double('variable') }
53
+
54
+ context 'when an assignment node is passed' do
55
+ it 'does not raise error' do
56
+ node = s(:lvasgn, :foo)
57
+ expect { described_class.new(node, variable) }.not_to raise_error
58
+ end
59
+ end
60
+
61
+ context 'when an argument declaration node is passed' do
62
+ it 'raises error' do
63
+ node = s(:arg, :foo)
64
+ expect { described_class.new(node, variable) }
65
+ .to raise_error(ArgumentError)
66
+ end
67
+ end
68
+
69
+ context 'when any other type node is passed' do
70
+ it 'raises error' do
71
+ node = s(:def)
72
+ expect { described_class.new(node, variable) }
73
+ .to raise_error(ArgumentError)
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '#name' do
79
+ it 'returns the variable name' do
80
+ expect(assignment.name).to eq(:foo)
81
+ end
82
+ end
83
+
84
+ describe '#meta_assignment_node' do
85
+ context 'when it is += operator assignment' do
86
+ let(:source) do
87
+ <<-END
88
+ def some_method
89
+ foo += 1
90
+ end
91
+ END
92
+ end
93
+
94
+ it 'returns op_asgn node' do
95
+ expect(assignment.meta_assignment_node.type).to eq(:op_asgn)
96
+ end
97
+ end
98
+
99
+ context 'when it is ||= operator assignment' do
100
+ let(:source) do
101
+ <<-END
102
+ def some_method
103
+ foo ||= 1
104
+ end
105
+ END
106
+ end
107
+
108
+ it 'returns or_asgn node' do
109
+ expect(assignment.meta_assignment_node.type).to eq(:or_asgn)
110
+ end
111
+ end
112
+
113
+ context 'when it is &&= operator assignment' do
114
+ let(:source) do
115
+ <<-END
116
+ def some_method
117
+ foo &&= 1
118
+ end
119
+ END
120
+ end
121
+
122
+ it 'returns and_asgn node' do
123
+ expect(assignment.meta_assignment_node.type).to eq(:and_asgn)
124
+ end
125
+ end
126
+
127
+ context 'when it is multiple assignment' do
128
+ let(:source) do
129
+ <<-END
130
+ def some_method
131
+ foo, bar = [1, 2]
132
+ end
133
+ END
134
+ end
135
+
136
+ it 'returns masgn node' do
137
+ expect(assignment.meta_assignment_node.type).to eq(:masgn)
138
+ end
139
+ end
140
+ end
141
+
142
+ describe '#operator' do
143
+ context 'when it is normal assignment' do
144
+ let(:source) do
145
+ <<-END
146
+ def some_method
147
+ foo = 1
148
+ end
149
+ END
150
+ end
151
+
152
+ it 'returns =' do
153
+ expect(assignment.operator).to eq('=')
154
+ end
155
+ end
156
+
157
+ context 'when it is += operator assignment' do
158
+ let(:source) do
159
+ <<-END
160
+ def some_method
161
+ foo += 1
162
+ end
163
+ END
164
+ end
165
+
166
+ it 'returns +=' do
167
+ expect(assignment.operator).to eq('+=')
168
+ end
169
+ end
170
+
171
+ context 'when it is ||= operator assignment' do
172
+ let(:source) do
173
+ <<-END
174
+ def some_method
175
+ foo ||= 1
176
+ end
177
+ END
178
+ end
179
+
180
+ it 'returns ||=' do
181
+ expect(assignment.operator).to eq('||=')
182
+ end
183
+ end
184
+
185
+ context 'when it is &&= operator assignment' do
186
+ let(:source) do
187
+ <<-END
188
+ def some_method
189
+ foo &&= 1
190
+ end
191
+ END
192
+ end
193
+
194
+ it 'returns &&=' do
195
+ expect(assignment.operator).to eq('&&=')
196
+ end
197
+ end
198
+
199
+ context 'when it is multiple assignment' do
200
+ let(:source) do
201
+ <<-END
202
+ def some_method
203
+ foo, bar = [1, 2]
204
+ end
205
+ END
206
+ end
207
+
208
+ it 'returns =' do
209
+ expect(assignment.operator).to eq('=')
210
+ end
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,734 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::VariableInspector::Locatable do
6
+ include ASTHelper
7
+ include AST::Sexp
8
+
9
+ class LocatableObject
10
+ include Rubocop::Cop::VariableInspector::Locatable
11
+
12
+ attr_reader :node, :scope
13
+
14
+ def initialize(node, scope)
15
+ @node = node
16
+ @scope = scope
17
+ end
18
+ end
19
+
20
+ let(:ast) do
21
+ processed_source = Rubocop::SourceParser.parse(source)
22
+ processed_source.ast
23
+ end
24
+
25
+ let(:def_node) do
26
+ found_node = scan_node(ast, include_origin_node: true) do |node|
27
+ break node if node.type == :def
28
+ end
29
+ fail 'No def node found!' unless found_node
30
+ found_node
31
+ end
32
+
33
+ let(:lvasgn_node) do
34
+ found_node = scan_node(ast) do |node|
35
+ break node if node.type == :lvasgn
36
+ end
37
+ fail 'No lvasgn node found!' unless found_node
38
+ found_node
39
+ end
40
+
41
+ let(:scope) { Rubocop::Cop::VariableInspector::Scope.new(def_node) }
42
+ let(:assignment) { LocatableObject.new(lvasgn_node, scope) }
43
+
44
+ describe '#ancestor_nodes_in_scope' do
45
+ let(:source) do
46
+ <<-END
47
+ class SomeClass
48
+ def some_method(flag)
49
+ puts 'Hello World!'
50
+
51
+ if flag > 0
52
+ foo = 1
53
+ end
54
+ end
55
+ end
56
+ END
57
+ end
58
+
59
+ it 'returns its ancestor nodes in the scope excluding scope node' do
60
+ ancestor_types = assignment.ancestor_nodes_in_scope.map(&:type)
61
+ expect(ancestor_types).to eq([:begin, :if])
62
+ end
63
+ end
64
+
65
+ describe '#branch_point_node' do
66
+ context 'when it is not in branch' do
67
+ let(:source) do
68
+ <<-END
69
+ def some_method(flag)
70
+ foo = 1
71
+ end
72
+ END
73
+ end
74
+
75
+ it 'returns nil' do
76
+ expect(assignment.branch_point_node).to be_nil
77
+ end
78
+ end
79
+
80
+ context 'when it is inside of if' do
81
+ let(:source) do
82
+ <<-END
83
+ def some_method(flag)
84
+ if flag
85
+ foo = 1
86
+ end
87
+ end
88
+ END
89
+ end
90
+
91
+ it 'returns the if node' do
92
+ expect(assignment.branch_point_node.type).to eq(:if)
93
+ end
94
+ end
95
+
96
+ context 'when it is inside of else of if' do
97
+ let(:source) do
98
+ <<-END
99
+ def some_method(flag)
100
+ if flag
101
+ else
102
+ foo = 1
103
+ end
104
+ end
105
+ END
106
+ end
107
+
108
+ it 'returns the if node' do
109
+ expect(assignment.branch_point_node.type).to eq(:if)
110
+ end
111
+ end
112
+
113
+ context 'when it is inside of if condition' do
114
+ let(:source) do
115
+ <<-END
116
+ def some_method(flag)
117
+ if foo = 1
118
+ do_something
119
+ end
120
+ end
121
+ END
122
+ end
123
+
124
+ it 'returns nil' do
125
+ expect(assignment.branch_point_node).to be_nil
126
+ end
127
+ end
128
+
129
+ context 'when multiple if are nested' do
130
+ context 'and it is inside of inner if' do
131
+ let(:source) do
132
+ <<-END
133
+ def some_method(a, b)
134
+ if a
135
+ if b
136
+ foo = 1
137
+ end
138
+ end
139
+ end
140
+ END
141
+ end
142
+
143
+ it 'returns inner if node' do
144
+ if_node = assignment.branch_point_node
145
+ expect(if_node.type).to eq(:if)
146
+ condition_node = if_node.children.first
147
+ expect(condition_node).to eq(s(:lvar, :b))
148
+ end
149
+ end
150
+
151
+ context 'and it is inside of inner if condition' do
152
+ let(:source) do
153
+ <<-END
154
+ def some_method(a, b)
155
+ if a
156
+ if foo = 1
157
+ do_something
158
+ end
159
+ end
160
+ end
161
+ END
162
+ end
163
+
164
+ it 'returns the next outer if node' do
165
+ if_node = assignment.branch_point_node
166
+ expect(if_node.type).to eq(:if)
167
+ condition_node = if_node.children.first
168
+ expect(condition_node).to eq(s(:lvar, :a))
169
+ end
170
+ end
171
+ end
172
+
173
+ context 'when it is inside of when of case' do
174
+ let(:source) do
175
+ <<-END
176
+ def some_method(flag)
177
+ case flag
178
+ when 1
179
+ foo = 1
180
+ end
181
+ end
182
+ END
183
+ end
184
+
185
+ it 'returns the case node' do
186
+ expect(assignment.branch_point_node.type).to eq(:case)
187
+ end
188
+ end
189
+
190
+ context 'when it is on the left side of &&' do
191
+ let(:source) do
192
+ <<-END
193
+ def some_method
194
+ (foo = 1) && do_something
195
+ end
196
+ END
197
+ end
198
+
199
+ it 'returns nil' do
200
+ expect(assignment.branch_point_node).to be_nil
201
+ end
202
+ end
203
+
204
+ context 'when it is on the right side of &&' do
205
+ let(:source) do
206
+ <<-END
207
+ def some_method
208
+ do_something && (foo = 1)
209
+ end
210
+ END
211
+ end
212
+
213
+ it 'returns the and node' do
214
+ expect(assignment.branch_point_node.type).to eq(:and)
215
+ end
216
+ end
217
+
218
+ context 'when it is on the left side of ||' do
219
+ let(:source) do
220
+ <<-END
221
+ def some_method
222
+ (foo = 1) || do_something
223
+ end
224
+ END
225
+ end
226
+
227
+ it 'returns nil' do
228
+ expect(assignment.branch_point_node).to be_nil
229
+ end
230
+ end
231
+
232
+ context 'when it is on the right side of ||' do
233
+ let(:source) do
234
+ <<-END
235
+ def some_method
236
+ do_something || (foo = 1)
237
+ end
238
+ END
239
+ end
240
+
241
+ it 'returns the or node' do
242
+ expect(assignment.branch_point_node.type).to eq(:or)
243
+ end
244
+ end
245
+
246
+ context 'when multiple && are chained' do
247
+ context 'and it is on the right side of the right &&' do
248
+ let(:source) do
249
+ <<-END
250
+ def some_method
251
+ do_something && do_anything && (foo = 1)
252
+ end
253
+ END
254
+ end
255
+
256
+ it 'returns the right and node' do
257
+ and_node = assignment.branch_point_node
258
+ expect(and_node.type).to eq(:and)
259
+ right_side_node = and_node.children[1]
260
+ expect(right_side_node.type).to eq(:begin)
261
+ end
262
+ end
263
+
264
+ context 'and it is on the right side of the left &&' do
265
+ let(:source) do
266
+ <<-END
267
+ def some_method
268
+ do_something && (foo = 1) && do_anything
269
+ end
270
+ END
271
+ end
272
+
273
+ it 'returns the left and node' do
274
+ and_node = assignment.branch_point_node
275
+ expect(and_node.type).to eq(:and)
276
+ right_side_node = and_node.children[1]
277
+ expect(right_side_node.type).to eq(:begin)
278
+ end
279
+ end
280
+ end
281
+
282
+ context 'when it is inside of begin with rescue' do
283
+ let(:source) do
284
+ <<-END
285
+ def some_method(flag)
286
+ begin
287
+ foo = 1
288
+ rescue
289
+ do_something
290
+ end
291
+ end
292
+ END
293
+ end
294
+
295
+ it 'returns the rescue node' do
296
+ expect(assignment.branch_point_node.type).to eq(:rescue)
297
+ end
298
+ end
299
+
300
+ context 'when it is inside of rescue' do
301
+ let(:source) do
302
+ <<-END
303
+ def some_method(flag)
304
+ begin
305
+ do_something
306
+ rescue
307
+ foo = 1
308
+ end
309
+ end
310
+ END
311
+ end
312
+
313
+ it 'returns the rescue node' do
314
+ expect(assignment.branch_point_node.type).to eq(:rescue)
315
+ end
316
+ end
317
+
318
+ context 'when it is inside of begin with ensure' do
319
+ let(:source) do
320
+ <<-END
321
+ def some_method(flag)
322
+ begin
323
+ foo = 1
324
+ ensure
325
+ do_something
326
+ end
327
+ end
328
+ END
329
+ end
330
+
331
+ it 'returns the ensure node' do
332
+ expect(assignment.branch_point_node.type).to eq(:ensure)
333
+ end
334
+ end
335
+
336
+ context 'when it is inside of ensure' do
337
+ let(:source) do
338
+ <<-END
339
+ def some_method(flag)
340
+ begin
341
+ do_something
342
+ ensure
343
+ foo = 1
344
+ end
345
+ end
346
+ END
347
+ end
348
+
349
+ it 'returns nil' do
350
+ expect(assignment.branch_point_node).to be_nil
351
+ end
352
+ end
353
+
354
+ context 'when it is inside of begin without rescue' do
355
+ let(:source) do
356
+ <<-END
357
+ def some_method(flag)
358
+ begin
359
+ foo = 1
360
+ end
361
+ end
362
+ END
363
+ end
364
+
365
+ it 'returns nil' do
366
+ expect(assignment.branch_point_node).to be_nil
367
+ end
368
+ end
369
+ end
370
+
371
+ describe '#branch_body_node' do
372
+ context 'when it is not in branch' do
373
+ let(:source) do
374
+ <<-END
375
+ def some_method(flag)
376
+ foo = 1
377
+ end
378
+ END
379
+ end
380
+
381
+ it 'returns nil' do
382
+ expect(assignment.branch_body_node).to be_nil
383
+ end
384
+ end
385
+
386
+ context 'when it is inside body of if' do
387
+ let(:source) do
388
+ <<-END
389
+ def some_method(flag)
390
+ if flag
391
+ foo = 1
392
+ puts foo
393
+ end
394
+ end
395
+ END
396
+ end
397
+
398
+ it 'returns the body node' do
399
+ expect(assignment.branch_body_node.type).to eq(:begin)
400
+ end
401
+ end
402
+
403
+ context 'when it is inside body of else of if' do
404
+ let(:source) do
405
+ <<-END
406
+ def some_method(flag)
407
+ if flag
408
+ do_something
409
+ else
410
+ foo = 1
411
+ puts foo
412
+ end
413
+ end
414
+ END
415
+ end
416
+
417
+ it 'returns the body node' do
418
+ expect(assignment.branch_body_node.type).to eq(:begin)
419
+ end
420
+ end
421
+
422
+ context 'when it is on the right side of &&' do
423
+ let(:source) do
424
+ <<-END
425
+ def some_method
426
+ do_something && (foo = 1)
427
+ end
428
+ END
429
+ end
430
+
431
+ it 'returns the right side node' do
432
+ expect(assignment.branch_body_node.type).to eq(:begin)
433
+ end
434
+ end
435
+
436
+ context 'when it is on the right side of ||' do
437
+ let(:source) do
438
+ <<-END
439
+ def some_method
440
+ do_something || (foo = 1)
441
+ end
442
+ END
443
+ end
444
+
445
+ it 'returns the right side node' do
446
+ expect(assignment.branch_body_node.type).to eq(:begin)
447
+ end
448
+ end
449
+
450
+ context 'when it is inside of begin with rescue' do
451
+ let(:source) do
452
+ <<-END
453
+ def some_method(flag)
454
+ begin
455
+ foo = 1
456
+ rescue
457
+ do_something
458
+ end
459
+ end
460
+ END
461
+ end
462
+
463
+ it 'returns the body node' do
464
+ expect(assignment.branch_body_node.type).to eq(:lvasgn)
465
+ end
466
+ end
467
+
468
+ context 'when it is inside of rescue' do
469
+ let(:source) do
470
+ <<-END
471
+ def some_method(flag)
472
+ begin
473
+ do_something
474
+ rescue
475
+ foo = 1
476
+ end
477
+ end
478
+ END
479
+ end
480
+
481
+ it 'returns the resbody node' do
482
+ expect(assignment.branch_body_node.type).to eq(:resbody)
483
+ end
484
+ end
485
+
486
+ context 'when it is inside of begin with ensure' do
487
+ let(:source) do
488
+ <<-END
489
+ def some_method(flag)
490
+ begin
491
+ foo = 1
492
+ ensure
493
+ do_something
494
+ end
495
+ end
496
+ END
497
+ end
498
+
499
+ it 'returns the body node' do
500
+ expect(assignment.branch_body_node.type).to eq(:lvasgn)
501
+ end
502
+ end
503
+ end
504
+
505
+ describe '#branch_id' do
506
+ context 'when it is not in branch' do
507
+ let(:source) do
508
+ <<-END
509
+ def some_method(flag)
510
+ foo = 1
511
+ end
512
+ END
513
+ end
514
+
515
+ it 'returns nil' do
516
+ expect(assignment.branch_id).to be_nil
517
+ end
518
+ end
519
+
520
+ context 'when it is inside body of if' do
521
+ let(:source) do
522
+ <<-END
523
+ def some_method(flag)
524
+ if flag
525
+ foo = 1
526
+ puts foo
527
+ end
528
+ end
529
+ END
530
+ end
531
+
532
+ it 'returns BRANCHNODEID_if_true' do
533
+ expect(assignment.branch_id).to match(/^\d+_if_true/)
534
+ end
535
+ end
536
+
537
+ context 'when it is inside body of else of if' do
538
+ let(:source) do
539
+ <<-END
540
+ def some_method(flag)
541
+ if flag
542
+ do_something
543
+ else
544
+ foo = 1
545
+ puts foo
546
+ end
547
+ end
548
+ END
549
+ end
550
+
551
+ it 'returns BRANCHNODEID_if_false' do
552
+ expect(assignment.branch_id).to match(/^\d+_if_false/)
553
+ end
554
+ end
555
+
556
+ context 'when it is inside body of when of case' do
557
+ let(:source) do
558
+ <<-END
559
+ def some_method(flag)
560
+ case flag
561
+ when first
562
+ do_something
563
+ when second
564
+ foo = 1
565
+ puts foo
566
+ else
567
+ do_something
568
+ end
569
+ end
570
+ END
571
+ end
572
+
573
+ it 'returns BRANCHNODEID_case_whenINDEX' do
574
+ expect(assignment.branch_id).to match(/^\d+_case_when1/)
575
+ end
576
+ end
577
+
578
+ context 'when it is inside body of when of case' do
579
+ let(:source) do
580
+ <<-END
581
+ def some_method(flag)
582
+ case flag
583
+ when first
584
+ do_something
585
+ when second
586
+ do_something
587
+ else
588
+ foo = 1
589
+ puts foo
590
+ end
591
+ end
592
+ END
593
+ end
594
+
595
+ it 'returns BRANCHNODEID_case_else' do
596
+ expect(assignment.branch_id).to match(/^\d+_case_else/)
597
+ end
598
+ end
599
+
600
+ context 'when it is on the left side of &&' do
601
+ let(:source) do
602
+ <<-END
603
+ def some_method
604
+ (foo = 1) && do_something
605
+ end
606
+ END
607
+ end
608
+
609
+ it 'returns nil' do
610
+ expect(assignment.branch_id).to be_nil
611
+ end
612
+ end
613
+
614
+ context 'when it is on the right side of &&' do
615
+ let(:source) do
616
+ <<-END
617
+ def some_method
618
+ do_something && (foo = 1)
619
+ end
620
+ END
621
+ end
622
+
623
+ it 'returns BRANCHNODEID_and_right' do
624
+ expect(assignment.branch_id).to match(/^\d+_and_right/)
625
+ end
626
+ end
627
+
628
+ context 'when it is on the left side of ||' do
629
+ let(:source) do
630
+ <<-END
631
+ def some_method
632
+ (foo = 1) || do_something
633
+ end
634
+ END
635
+ end
636
+
637
+ it 'returns nil' do
638
+ expect(assignment.branch_id).to be_nil
639
+ end
640
+ end
641
+
642
+ context 'when it is on the right side of ||' do
643
+ let(:source) do
644
+ <<-END
645
+ def some_method
646
+ do_something || (foo = 1)
647
+ end
648
+ END
649
+ end
650
+
651
+ it 'returns BRANCHNODEID_or_right' do
652
+ expect(assignment.branch_id).to match(/^\d+_or_right/)
653
+ end
654
+ end
655
+
656
+ context 'when it is inside of begin with rescue' do
657
+ let(:source) do
658
+ <<-END
659
+ def some_method(flag)
660
+ begin
661
+ foo = 1
662
+ rescue
663
+ do_something
664
+ end
665
+ end
666
+ END
667
+ end
668
+
669
+ it 'returns BRANCHNODEID_rescue_main' do
670
+ expect(assignment.branch_id).to match(/^\d+_rescue_main/)
671
+ end
672
+ end
673
+
674
+ context 'when it is inside of rescue' do
675
+ let(:source) do
676
+ <<-END
677
+ def some_method(flag)
678
+ begin
679
+ do_something
680
+ rescue FirstError
681
+ do_something
682
+ rescue SecondError
683
+ foo = 1
684
+ end
685
+ end
686
+ END
687
+ end
688
+
689
+ it 'returns BRANCHNODEID_rescue_rescueINDEX' do
690
+ expect(assignment.branch_id).to match(/^\d+_rescue_rescue1/)
691
+ end
692
+ end
693
+
694
+ context 'when it is inside of else of rescue' do
695
+ let(:source) do
696
+ <<-END
697
+ def some_method(flag)
698
+ begin
699
+ do_something
700
+ rescue FirstError
701
+ do_something
702
+ rescue SecondError
703
+ do_something
704
+ else
705
+ foo = 1
706
+ end
707
+ end
708
+ END
709
+ end
710
+
711
+ it 'returns BRANCHNODEID_rescue_else' do
712
+ expect(assignment.branch_id).to match(/^\d+_rescue_else/)
713
+ end
714
+ end
715
+
716
+ context 'when it is inside of begin with ensure' do
717
+ let(:source) do
718
+ <<-END
719
+ def some_method(flag)
720
+ begin
721
+ foo = 1
722
+ ensure
723
+ do_something
724
+ end
725
+ end
726
+ END
727
+ end
728
+
729
+ it 'returns BRANCHNODEID_ensure_main' do
730
+ expect(assignment.branch_id).to match(/^\d+_ensure_main/)
731
+ end
732
+ end
733
+ end
734
+ end