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,34 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Lint::Syntax do
6
+ describe '.offence_from_diagnostic' do
7
+ subject(:offence) { described_class.offence_from_diagnostic(diagnostic) }
8
+ let(:diagnostic) { Parser::Diagnostic.new(level, reason, args, location) }
9
+ let(:level) { :warning }
10
+ let(:reason) { :odd_hash }
11
+ let(:args) { [] }
12
+ let(:location) { double('location').as_null_object }
13
+
14
+ it 'returns an offence' do
15
+ expect(offence).to be_a(Rubocop::Cop::Offence)
16
+ end
17
+
18
+ it "sets diagnostic's level to offence's severity" do
19
+ expect(offence.severity).to eq(level)
20
+ end
21
+
22
+ it "sets diagnostic's message to offence's message" do
23
+ expect(offence.message).to eq('odd number of entries for a hash')
24
+ end
25
+
26
+ it "sets diagnostic's location to offence's location" do
27
+ expect(offence.location).to eq(location)
28
+ end
29
+
30
+ it 'sets Syntax as a cop name' do
31
+ expect(offence.cop_name).to eq('Syntax')
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Lint::UnreachableCode do
6
+ subject(:cop) { described_class.new }
7
+
8
+ described_class::NODE_TYPES.each do |t|
9
+ it "registers an offence for #{t} before other statements" do
10
+ inspect_source(cop,
11
+ ['foo = 5',
12
+ "#{t}",
13
+ 'bar'
14
+ ])
15
+ expect(cop.offences.size).to eq(1)
16
+ end
17
+
18
+ it "accepts code with conditional #{t}" do
19
+ inspect_source(cop,
20
+ ['foo = 5',
21
+ "#{t} if test",
22
+ 'bar'
23
+ ])
24
+ expect(cop.offences).to be_empty
25
+ end
26
+
27
+ it "accepts #{t} as the final expression" do
28
+ inspect_source(cop,
29
+ ['foo = 5',
30
+ "#{t} if test"
31
+ ])
32
+ expect(cop.offences).to be_empty
33
+ end
34
+ end
35
+
36
+ described_class::FLOW_COMMANDS.each do |t|
37
+ it "registers an offence for #{t} before other statements" do
38
+ inspect_source(cop,
39
+ ['foo = 5',
40
+ "#{t} something",
41
+ 'bar'
42
+ ])
43
+ expect(cop.offences.size).to eq(1)
44
+ end
45
+
46
+ it "accepts code with conditional #{t}" do
47
+ inspect_source(cop,
48
+ ['foo = 5',
49
+ "#{t} something if test",
50
+ 'bar'
51
+ ])
52
+ expect(cop.offences).to be_empty
53
+ end
54
+
55
+ it "accepts #{t} as the final expression" do
56
+ inspect_source(cop,
57
+ ['foo = 5',
58
+ "#{t} something if test"
59
+ ])
60
+ expect(cop.offences).to be_empty
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,1570 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Lint::UselessAssignment do
6
+ subject(:cop) { described_class.new }
7
+
8
+ context 'when a variable is assigned and unreferenced in a method' do
9
+ let(:source) do
10
+ [
11
+ 'class SomeClass',
12
+ ' foo = 1',
13
+ ' puts foo',
14
+ ' def some_method',
15
+ ' foo = 2',
16
+ ' bar = 3',
17
+ ' puts bar',
18
+ ' end',
19
+ 'end'
20
+ ]
21
+ end
22
+
23
+ it 'registers an offence' do
24
+ inspect_source(cop, source)
25
+ expect(cop.offences.size).to eq(1)
26
+ expect(cop.offences.first.message)
27
+ .to eq('Useless assignment to variable - foo')
28
+ expect(cop.offences.first.line).to eq(5)
29
+ expect(cop.highlights).to eq(['foo'])
30
+ end
31
+
32
+ include_examples 'mimics MRI 2.1'
33
+ end
34
+
35
+ context 'when a variable is assigned and unreferenced ' \
36
+ 'in a singleton method defined with self keyword' do
37
+ let(:source) do
38
+ [
39
+ 'class SomeClass',
40
+ ' foo = 1',
41
+ ' puts foo',
42
+ ' def self.some_method',
43
+ ' foo = 2',
44
+ ' bar = 3',
45
+ ' puts bar',
46
+ ' end',
47
+ 'end'
48
+ ]
49
+ end
50
+
51
+ it 'registers an offence' do
52
+ inspect_source(cop, source)
53
+ expect(cop.offences.size).to eq(1)
54
+ expect(cop.offences.first.message)
55
+ .to eq('Useless assignment to variable - foo')
56
+ expect(cop.offences.first.line).to eq(5)
57
+ expect(cop.highlights).to eq(['foo'])
58
+ end
59
+
60
+ include_examples 'mimics MRI 2.1'
61
+ end
62
+
63
+ context 'when a variable is assigned and unreferenced ' \
64
+ 'in a singleton method defined with variable name' do
65
+ let(:source) do
66
+ [
67
+ '1.times do',
68
+ ' foo = 1',
69
+ ' puts foo',
70
+ ' instance = Object.new',
71
+ ' def instance.some_method',
72
+ ' foo = 2',
73
+ ' bar = 3',
74
+ ' puts bar',
75
+ ' end',
76
+ 'end'
77
+ ]
78
+ end
79
+
80
+ it 'registers an offence' do
81
+ inspect_source(cop, source)
82
+ expect(cop.offences.size).to eq(1)
83
+ expect(cop.offences.first.message)
84
+ .to eq('Useless assignment to variable - foo')
85
+ expect(cop.offences.first.line).to eq(6)
86
+ expect(cop.highlights).to eq(['foo'])
87
+ end
88
+
89
+ include_examples 'mimics MRI 2.1'
90
+ end
91
+
92
+ context 'when a variable is assigned and unreferenced in a class' do
93
+ let(:source) do
94
+ [
95
+ '1.times do',
96
+ ' foo = 1',
97
+ ' puts foo',
98
+ ' class SomeClass',
99
+ ' foo = 2',
100
+ ' bar = 3',
101
+ ' puts bar',
102
+ ' end',
103
+ 'end'
104
+ ]
105
+ end
106
+
107
+ it 'registers an offence' do
108
+ inspect_source(cop, source)
109
+ expect(cop.offences.size).to eq(1)
110
+ expect(cop.offences.first.message)
111
+ .to eq('Useless assignment to variable - foo')
112
+ expect(cop.offences.first.line).to eq(5)
113
+ expect(cop.highlights).to eq(['foo'])
114
+ end
115
+
116
+ include_examples 'mimics MRI 2.1'
117
+ end
118
+
119
+ context 'when a variable is assigned and unreferenced in a class ' \
120
+ 'subclassing another class stored in local variable' do
121
+ let(:source) do
122
+ [
123
+ '1.times do',
124
+ ' foo = 1',
125
+ ' puts foo',
126
+ ' array_class = Array',
127
+ ' class SomeClass < array_class',
128
+ ' foo = 2',
129
+ ' bar = 3',
130
+ ' puts bar',
131
+ ' end',
132
+ 'end'
133
+ ]
134
+ end
135
+
136
+ it 'registers an offence' do
137
+ inspect_source(cop, source)
138
+ expect(cop.offences.size).to eq(1)
139
+ expect(cop.offences.first.message)
140
+ .to eq('Useless assignment to variable - foo')
141
+ expect(cop.offences.first.line).to eq(6)
142
+ expect(cop.highlights).to eq(['foo'])
143
+ end
144
+
145
+ include_examples 'mimics MRI 2.1'
146
+ end
147
+
148
+ context 'when a variable is assigned and unreferenced ' \
149
+ 'in a singleton class' do
150
+ let(:source) do
151
+ [
152
+ '1.times do',
153
+ ' foo = 1',
154
+ ' puts foo',
155
+ ' instance = Object.new',
156
+ ' class << instance',
157
+ ' foo = 2',
158
+ ' bar = 3',
159
+ ' puts bar',
160
+ ' end',
161
+ 'end'
162
+ ]
163
+ end
164
+
165
+ it 'registers an offence' do
166
+ inspect_source(cop, source)
167
+ expect(cop.offences.size).to eq(1)
168
+ expect(cop.offences.first.message)
169
+ .to eq('Useless assignment to variable - foo')
170
+ expect(cop.offences.first.line).to eq(6)
171
+ expect(cop.highlights).to eq(['foo'])
172
+ end
173
+
174
+ include_examples 'mimics MRI 2.1'
175
+ end
176
+
177
+ context 'when a variable is assigned and unreferenced in a module' do
178
+ let(:source) do
179
+ [
180
+ '1.times do',
181
+ ' foo = 1',
182
+ ' puts foo',
183
+ ' module SomeModule',
184
+ ' foo = 2',
185
+ ' bar = 3',
186
+ ' puts bar',
187
+ ' end',
188
+ 'end'
189
+ ]
190
+ end
191
+
192
+ it 'registers an offence' do
193
+ inspect_source(cop, source)
194
+ expect(cop.offences.size).to eq(1)
195
+ expect(cop.offences.first.message)
196
+ .to eq('Useless assignment to variable - foo')
197
+ expect(cop.offences.first.line).to eq(5)
198
+ expect(cop.highlights).to eq(['foo'])
199
+ end
200
+
201
+ include_examples 'mimics MRI 2.1'
202
+ end
203
+
204
+ context 'when a variable is assigned and unreferenced in top level' do
205
+ let(:source) do
206
+ [
207
+ 'foo = 1',
208
+ 'bar = 2',
209
+ 'puts bar'
210
+ ]
211
+ end
212
+
213
+ it 'registers an offence' do
214
+ inspect_source(cop, source)
215
+ expect(cop.offences.size).to eq(1)
216
+ expect(cop.offences.first.message)
217
+ .to eq('Useless assignment to variable - foo')
218
+ expect(cop.offences.first.line).to eq(1)
219
+ expect(cop.highlights).to eq(['foo'])
220
+ end
221
+
222
+ include_examples 'mimics MRI 2.1'
223
+ end
224
+
225
+ context 'when a variable is assigned with operator assignment ' \
226
+ 'in top level' do
227
+ let(:source) do
228
+ [
229
+ 'foo ||= 1'
230
+ ]
231
+ end
232
+
233
+ it 'registers an offence' do
234
+ inspect_source(cop, source)
235
+ expect(cop.offences.size).to eq(1)
236
+ expect(cop.offences.first.message)
237
+ .to eq('Useless assignment to variable - foo. Use just operator ||.')
238
+ expect(cop.offences.first.line).to eq(1)
239
+ expect(cop.highlights).to eq(['foo'])
240
+ end
241
+ end
242
+
243
+ context 'when a variable is assigned multiple times ' \
244
+ 'but unreferenced' do
245
+ let(:source) do
246
+ [
247
+ 'def some_method',
248
+ ' foo = 1',
249
+ ' bar = 2',
250
+ ' foo = 3',
251
+ ' puts bar',
252
+ 'end'
253
+ ]
254
+ end
255
+
256
+ it 'registers offences for each asignment' do
257
+ inspect_source(cop, source)
258
+ expect(cop.offences.size).to eq(2)
259
+
260
+ expect(cop.offences[0].message)
261
+ .to eq('Useless assignment to variable - foo')
262
+ expect(cop.offences[0].line).to eq(2)
263
+
264
+ expect(cop.offences[1].message)
265
+ .to eq('Useless assignment to variable - foo')
266
+ expect(cop.offences[1].line).to eq(4)
267
+
268
+ expect(cop.highlights).to eq(%w(foo foo))
269
+ end
270
+ end
271
+
272
+ context 'when a referenced variable is reassigned ' \
273
+ 'but not re-referenced' do
274
+ let(:source) do
275
+ [
276
+ 'def some_method',
277
+ ' foo = 1',
278
+ ' puts foo',
279
+ ' foo = 3',
280
+ 'end'
281
+ ]
282
+ end
283
+
284
+ it 'registers an offence for the non-re-referenced assignment' do
285
+ inspect_source(cop, source)
286
+ expect(cop.offences.size).to eq(1)
287
+ expect(cop.offences.first.message)
288
+ .to eq('Useless assignment to variable - foo')
289
+ expect(cop.offences.first.line).to eq(4)
290
+ expect(cop.highlights).to eq(['foo'])
291
+ end
292
+ end
293
+
294
+ context 'when an unreferenced variable is reassigned ' \
295
+ 'and re-referenced' do
296
+ let(:source) do
297
+ [
298
+ 'def some_method',
299
+ ' foo = 1',
300
+ ' foo = 3',
301
+ ' puts foo',
302
+ 'end'
303
+ ]
304
+ end
305
+
306
+ it 'registers an offence for the unreferenced assignment' do
307
+ inspect_source(cop, source)
308
+ expect(cop.offences.size).to eq(1)
309
+ expect(cop.offences.first.message)
310
+ .to eq('Useless assignment to variable - foo')
311
+ expect(cop.offences.first.line).to eq(2)
312
+ expect(cop.highlights).to eq(['foo'])
313
+ end
314
+ end
315
+
316
+ context 'when an unreferenced variable is reassigned in a block' do
317
+ let(:source) do
318
+ [
319
+ 'def const_name(node)',
320
+ ' const_names = []',
321
+ ' const_node = node',
322
+ '',
323
+ ' loop do',
324
+ ' namespace_node, name = *const_node',
325
+ ' const_names << name',
326
+ ' break unless namespace_node',
327
+ ' break if namespace_node.type == :cbase',
328
+ ' const_node = namespace_node',
329
+ ' end',
330
+ '',
331
+ " const_names.reverse.join('::')",
332
+ 'end'
333
+ ]
334
+ end
335
+
336
+ include_examples 'accepts'
337
+ include_examples 'mimics MRI 2.1'
338
+ end
339
+
340
+ context 'when a referenced variable is reassigned in a block' do
341
+ let(:source) do
342
+ [
343
+ 'def some_method',
344
+ ' foo = 1',
345
+ ' puts foo',
346
+ ' 1.times do',
347
+ ' foo = 2',
348
+ ' end',
349
+ 'end'
350
+ ]
351
+ end
352
+
353
+ include_examples 'accepts'
354
+ include_examples 'mimics MRI 2.1'
355
+ end
356
+
357
+ context 'when a block local variable is declared but not assigned' do
358
+ let(:source) do
359
+ [
360
+ '1.times do |i; foo|',
361
+ 'end'
362
+ ]
363
+ end
364
+
365
+ it 'registers an offence for the declaration' do
366
+ inspect_source(cop, source)
367
+ expect(cop.offences.size).to eq(1)
368
+ expect(cop.offences.first.message)
369
+ .to eq('Useless assignment to variable - foo')
370
+ expect(cop.offences.first.line).to eq(1)
371
+ expect(cop.highlights).to eq(['foo'])
372
+ end
373
+
374
+ include_examples 'mimics MRI 2.1'
375
+ end
376
+
377
+ context 'when a block local variable is assigned and unreferenced' do
378
+ let(:source) do
379
+ [
380
+ '1.times do |i; foo|',
381
+ ' foo = 2',
382
+ 'end'
383
+ ]
384
+ end
385
+
386
+ it 'registers offences for the assignment' do
387
+ inspect_source(cop, source)
388
+ expect(cop.offences.size).to eq(1)
389
+ expect(cop.offences.first.message)
390
+ .to eq('Useless assignment to variable - foo')
391
+ expect(cop.offences.first.line).to eq(2)
392
+ expect(cop.highlights).to eq(['foo'])
393
+ end
394
+ end
395
+
396
+ context 'when a variable is assigned in loop body and unreferenced' do
397
+ let(:source) do
398
+ [
399
+ 'def some_method',
400
+ ' while true',
401
+ ' foo = 1',
402
+ ' end',
403
+ 'end'
404
+ ]
405
+ end
406
+
407
+ it 'registers an offence' do
408
+ inspect_source(cop, source)
409
+ expect(cop.offences.size).to eq(1)
410
+ expect(cop.offences.first.message)
411
+ .to eq('Useless assignment to variable - foo')
412
+ expect(cop.offences.first.line).to eq(3)
413
+ expect(cop.highlights).to eq(['foo'])
414
+ end
415
+
416
+ include_examples 'mimics MRI 2.1'
417
+ end
418
+
419
+ context 'when a variable is reassigned at the end of loop body ' \
420
+ 'and would be referenced in next iteration' do
421
+ let(:source) do
422
+ [
423
+ 'def some_method',
424
+ ' total = 0',
425
+ ' foo = 0',
426
+ '',
427
+ ' while total < 100',
428
+ ' total += foo',
429
+ ' foo += 1',
430
+ ' end',
431
+ '',
432
+ ' total',
433
+ 'end'
434
+ ]
435
+ end
436
+
437
+ include_examples 'accepts'
438
+ include_examples 'mimics MRI 2.1'
439
+ end
440
+
441
+ context 'when a variable is reassigned at the end of loop body ' \
442
+ 'and would be referenced in loop condition' do
443
+ let(:source) do
444
+ [
445
+ 'def some_method',
446
+ ' total = 0',
447
+ ' foo = 0',
448
+ '',
449
+ ' while foo < 100',
450
+ ' total += 1',
451
+ ' foo += 1',
452
+ ' end',
453
+ '',
454
+ ' total',
455
+ 'end'
456
+ ]
457
+ end
458
+
459
+ include_examples 'accepts'
460
+ include_examples 'mimics MRI 2.1'
461
+ end
462
+
463
+ context "when a variable is reassigned in loop body but won't " \
464
+ 'be referenced either next iteration or loop condition' do
465
+ let(:source) do
466
+ [
467
+ 'def some_method',
468
+ ' total = 0',
469
+ ' foo = 0',
470
+ '',
471
+ ' while total < 100',
472
+ ' total += 1',
473
+ ' foo += 1',
474
+ ' end',
475
+ '',
476
+ ' total',
477
+ 'end'
478
+ ]
479
+ end
480
+
481
+ it 'registers an offence' do
482
+ inspect_source(cop, source)
483
+ expect(cop.offences.size).to eq(1)
484
+ expect(cop.offences.first.message)
485
+ .to eq('Useless assignment to variable - foo')
486
+ expect(cop.offences.first.line).to eq(7)
487
+ expect(cop.highlights).to eq(['foo'])
488
+ end
489
+ end
490
+
491
+ context 'when a referenced variable is reassigned ' \
492
+ 'but not re-referenced in a method defined in loop' do
493
+ let(:source) do
494
+ [
495
+ 'while true',
496
+ ' def some_method',
497
+ ' foo = 1',
498
+ ' puts foo',
499
+ ' foo = 3',
500
+ ' end',
501
+ 'end'
502
+ ]
503
+ end
504
+
505
+ it 'registers an offence' do
506
+ inspect_source(cop, source)
507
+ expect(cop.offences.size).to eq(1)
508
+ expect(cop.offences.first.message)
509
+ .to eq('Useless assignment to variable - foo')
510
+ expect(cop.offences.first.line).to eq(5)
511
+ expect(cop.highlights).to eq(['foo'])
512
+ end
513
+ end
514
+
515
+ context 'when a variable that has same name as outer scope variable ' \
516
+ 'is not referenced in a method defined in loop' do
517
+ let(:source) do
518
+ [
519
+ 'foo = 1',
520
+ '',
521
+ 'while foo < 100',
522
+ ' foo += 1',
523
+ ' def some_method',
524
+ ' foo = 1',
525
+ ' end',
526
+ 'end'
527
+ ]
528
+ end
529
+
530
+ it 'registers an offence' do
531
+ inspect_source(cop, source)
532
+ expect(cop.offences.size).to eq(1)
533
+ expect(cop.offences.first.message)
534
+ .to eq('Useless assignment to variable - foo')
535
+ expect(cop.offences.first.line).to eq(6)
536
+ expect(cop.highlights).to eq(['foo'])
537
+ end
538
+ end
539
+
540
+ context 'when a variable is assigned in single branch if ' \
541
+ 'and unreferenced' do
542
+ let(:source) do
543
+ [
544
+ 'def some_method(flag)',
545
+ ' if flag',
546
+ ' foo = 1',
547
+ ' end',
548
+ 'end'
549
+ ]
550
+ end
551
+
552
+ it 'registers an offence' do
553
+ inspect_source(cop, source)
554
+ expect(cop.offences.size).to eq(1)
555
+ expect(cop.offences.first.message)
556
+ .to eq('Useless assignment to variable - foo')
557
+ expect(cop.offences.first.line).to eq(3)
558
+ expect(cop.highlights).to eq(['foo'])
559
+ end
560
+
561
+ include_examples 'mimics MRI 2.1'
562
+ end
563
+
564
+ context 'when a unreferenced variable is reassigned in same branch ' \
565
+ 'and referenced after the branching' do
566
+ let(:source) do
567
+ [
568
+ 'def some_method(flag)',
569
+ ' if flag',
570
+ ' foo = 1',
571
+ ' foo = 2',
572
+ ' end',
573
+ '',
574
+ ' foo',
575
+ 'end'
576
+ ]
577
+ end
578
+
579
+ it 'registers an offence for the unreferenced assignment' do
580
+ inspect_source(cop, source)
581
+ expect(cop.offences.size).to eq(1)
582
+ expect(cop.offences.first.message)
583
+ .to eq('Useless assignment to variable - foo')
584
+ expect(cop.offences.first.line).to eq(3)
585
+ expect(cop.highlights).to eq(['foo'])
586
+ end
587
+ end
588
+
589
+ context 'when a variable is reassigned in single branch if ' \
590
+ 'and referenced after the branching' do
591
+ let(:source) do
592
+ [
593
+ 'def some_method(flag)',
594
+ ' foo = 1',
595
+ '',
596
+ ' if flag',
597
+ ' foo = 2',
598
+ ' end',
599
+ '',
600
+ ' foo',
601
+ 'end'
602
+ ]
603
+ end
604
+
605
+ include_examples 'accepts'
606
+ include_examples 'mimics MRI 2.1'
607
+ end
608
+
609
+ context 'when a variable is assigned in each branch of if ' \
610
+ 'and referenced after the branching' do
611
+ let(:source) do
612
+ [
613
+ 'def some_method(flag)',
614
+ ' if flag',
615
+ ' foo = 2',
616
+ ' else',
617
+ ' foo = 3',
618
+ ' end',
619
+ '',
620
+ ' foo',
621
+ 'end'
622
+ ]
623
+ end
624
+
625
+ include_examples 'accepts'
626
+ include_examples 'mimics MRI 2.1'
627
+ end
628
+
629
+ context 'when a variable is reassigned in single branch if ' \
630
+ 'and referenced in the branch' do
631
+ let(:source) do
632
+ [
633
+ 'def some_method(flag)',
634
+ ' foo = 1',
635
+ '',
636
+ ' if flag',
637
+ ' foo = 2',
638
+ ' puts foo',
639
+ ' end',
640
+ 'end'
641
+ ]
642
+ end
643
+
644
+ it 'registers an offence for the unreferenced assignment' do
645
+ inspect_source(cop, source)
646
+ expect(cop.offences.size).to eq(1)
647
+ expect(cop.offences.first.message)
648
+ .to eq('Useless assignment to variable - foo')
649
+ expect(cop.offences.first.line).to eq(2)
650
+ expect(cop.highlights).to eq(['foo'])
651
+ end
652
+ end
653
+
654
+ context 'when a variable is assigned in each branch of if ' \
655
+ 'and referenced in the else branch' do
656
+ let(:source) do
657
+ [
658
+ 'def some_method(flag)',
659
+ ' if flag',
660
+ ' foo = 2',
661
+ ' else',
662
+ ' foo = 3',
663
+ ' puts foo',
664
+ ' end',
665
+ 'end'
666
+ ]
667
+ end
668
+
669
+ it 'registers an offence for the assignment in the if branch' do
670
+ inspect_source(cop, source)
671
+ expect(cop.offences.size).to eq(1)
672
+ expect(cop.offences.first.message)
673
+ .to eq('Useless assignment to variable - foo')
674
+ expect(cop.offences.first.line).to eq(3)
675
+ expect(cop.highlights).to eq(['foo'])
676
+ end
677
+ end
678
+
679
+ context 'when a variable is assigned in branch of modifier if ' \
680
+ 'that references the variable in its conditional clause' +
681
+ 'and referenced after the branching' do
682
+ let(:source) do
683
+ [
684
+ 'def some_method(flag)',
685
+ ' foo = 1 unless foo',
686
+ ' puts foo',
687
+ 'end'
688
+ ]
689
+ end
690
+
691
+ include_examples 'accepts'
692
+ include_examples 'mimics MRI 2.1'
693
+ end
694
+
695
+ context 'when a variable is assigned in branch of modifier if ' \
696
+ 'that references the variable in its conditional clause' +
697
+ 'and unreferenced' do
698
+ let(:source) do
699
+ [
700
+ 'def some_method(flag)',
701
+ ' foo = 1 unless foo',
702
+ 'end'
703
+ ]
704
+ end
705
+
706
+ it 'registers an offence' do
707
+ inspect_source(cop, source)
708
+ expect(cop.offences.size).to eq(1)
709
+ expect(cop.offences.first.message)
710
+ .to eq('Useless assignment to variable - foo')
711
+ expect(cop.offences.first.line).to eq(2)
712
+ expect(cop.highlights).to eq(['foo'])
713
+ end
714
+ end
715
+
716
+ context 'when a variable is assigned on each side of && ' \
717
+ 'and referenced after the &&' do
718
+ let(:source) do
719
+ [
720
+ 'def some_method',
721
+ ' (foo = do_something_returns_object_or_nil) && (foo = 1)',
722
+ ' foo',
723
+ 'end'
724
+ ]
725
+ end
726
+
727
+ include_examples 'accepts'
728
+ include_examples 'mimics MRI 2.1'
729
+ end
730
+
731
+ context 'when a unreferenced variable is reassigned ' \
732
+ 'on the left side of && and referenced after the &&' do
733
+ let(:source) do
734
+ [
735
+ 'def some_method',
736
+ ' foo = 1',
737
+ ' (foo = do_something_returns_object_or_nil) && do_something',
738
+ ' foo',
739
+ 'end'
740
+ ]
741
+ end
742
+
743
+ it 'registers an offence for the unreferenced assignment' do
744
+ inspect_source(cop, source)
745
+ expect(cop.offences.size).to eq(1)
746
+ expect(cop.offences.first.message)
747
+ .to eq('Useless assignment to variable - foo')
748
+ expect(cop.offences.first.line).to eq(2)
749
+ expect(cop.highlights).to eq(['foo'])
750
+ end
751
+ end
752
+
753
+ context 'when a unreferenced variable is reassigned ' \
754
+ 'on the right side of && and referenced after the &&' do
755
+ let(:source) do
756
+ [
757
+ 'def some_method',
758
+ ' foo = 1',
759
+ ' do_something_returns_object_or_nil && foo = 2',
760
+ ' foo',
761
+ 'end'
762
+ ]
763
+ end
764
+
765
+ include_examples 'accepts'
766
+ include_examples 'mimics MRI 2.1'
767
+ end
768
+
769
+ context 'when a variable is reassigned ' \
770
+ 'while referencing itself in rhs and referenced' do
771
+ let(:source) do
772
+ [
773
+ 'def some_method',
774
+ ' foo = [1, 2]',
775
+ ' foo = foo.map { |i| i + 1 }',
776
+ ' puts foo',
777
+ 'end'
778
+ ]
779
+ end
780
+
781
+ include_examples 'accepts'
782
+ include_examples 'mimics MRI 2.1'
783
+ end
784
+
785
+ context 'when a variable is reassigned ' \
786
+ 'with binary operator assignment and referenced' do
787
+ let(:source) do
788
+ [
789
+ 'def some_method',
790
+ ' foo = 1',
791
+ ' foo += 1',
792
+ ' foo',
793
+ 'end'
794
+ ]
795
+ end
796
+
797
+ include_examples 'accepts'
798
+ include_examples 'mimics MRI 2.1'
799
+ end
800
+
801
+ context 'when a variable is reassigned ' \
802
+ 'with logical operator assignment and referenced' do
803
+ let(:source) do
804
+ [
805
+ 'def some_method',
806
+ ' foo = do_something_returns_object_or_nil',
807
+ ' foo ||= 1',
808
+ ' foo',
809
+ 'end'
810
+ ]
811
+ end
812
+
813
+ include_examples 'accepts'
814
+ include_examples 'mimics MRI 2.1'
815
+ end
816
+
817
+ context 'when a variable is reassigned with binary operator ' \
818
+ 'assignment while assigning to itself in rhs ' +
819
+ 'then referenced' do
820
+ let(:source) do
821
+ [
822
+ 'def some_method',
823
+ ' foo = 1',
824
+ ' foo += foo = 2',
825
+ ' foo',
826
+ 'end'
827
+ ]
828
+ end
829
+
830
+ it 'registers an offence for the assignment in rhs' do
831
+ inspect_source(cop, source)
832
+ expect(cop.offences.size).to eq(1)
833
+ expect(cop.offences.first.message)
834
+ .to eq('Useless assignment to variable - foo')
835
+ expect(cop.offences.first.line).to eq(3)
836
+ expect(cop.highlights).to eq(['foo'])
837
+ end
838
+ end
839
+
840
+ context 'when a variable is assigned first with ||= and referenced' do
841
+ let(:source) do
842
+ [
843
+ 'def some_method',
844
+ ' foo ||= 1',
845
+ ' foo',
846
+ 'end'
847
+ ]
848
+ end
849
+
850
+ include_examples 'accepts'
851
+ include_examples 'mimics MRI 2.1'
852
+ end
853
+
854
+ context 'when a variable is assigned with ||= ' \
855
+ 'at the last expression of the scope' do
856
+ let(:source) do
857
+ [
858
+ 'def some_method',
859
+ ' foo = do_something_returns_object_or_nil',
860
+ ' foo ||= 1',
861
+ 'end'
862
+ ]
863
+ end
864
+
865
+ it 'registers an offence' do
866
+ inspect_source(cop, source)
867
+ expect(cop.offences.size).to eq(1)
868
+ expect(cop.offences.first.message).to eq(
869
+ 'Useless assignment to variable - foo. Use just operator ||.'
870
+ )
871
+ expect(cop.offences.first.line).to eq(3)
872
+ expect(cop.highlights).to eq(['foo'])
873
+ end
874
+ end
875
+
876
+ context 'when a variable is assigned with ||= ' \
877
+ 'before the last expression of the scope' do
878
+ let(:source) do
879
+ [
880
+ 'def some_method',
881
+ ' foo = do_something_returns_object_or_nil',
882
+ ' foo ||= 1',
883
+ ' some_return_value',
884
+ 'end'
885
+ ]
886
+ end
887
+
888
+ it 'registers an offence' do
889
+ inspect_source(cop, source)
890
+ expect(cop.offences.size).to eq(1)
891
+ expect(cop.offences.first.message)
892
+ .to eq('Useless assignment to variable - foo')
893
+ expect(cop.offences.first.line).to eq(3)
894
+ expect(cop.highlights).to eq(['foo'])
895
+ end
896
+ end
897
+
898
+ context 'when a variable is assigned with multiple assignment ' \
899
+ 'and unreferenced' do
900
+ let(:source) do
901
+ [
902
+ 'def some_method',
903
+ ' foo, bar = do_something',
904
+ ' puts foo',
905
+ 'end'
906
+ ]
907
+ end
908
+
909
+ it 'registers an offence' do
910
+ inspect_source(cop, source)
911
+ expect(cop.offences.size).to eq(1)
912
+ expect(cop.offences.first.message).to eq(
913
+ 'Useless assignment to variable - bar. ' \
914
+ 'Use _ or _bar as a variable name ' +
915
+ "to indicate that it won't be used."
916
+ )
917
+ expect(cop.offences.first.line).to eq(2)
918
+ expect(cop.highlights).to eq(['bar'])
919
+ end
920
+
921
+ include_examples 'mimics MRI 2.1'
922
+ end
923
+
924
+ context 'when a variable is reassigned with multiple assignment ' \
925
+ 'while referencing itself in rhs and referenced' do
926
+ let(:source) do
927
+ [
928
+ 'def some_method',
929
+ ' foo = 1',
930
+ ' foo, bar = do_something(foo)',
931
+ ' puts foo, bar',
932
+ 'end'
933
+ ]
934
+ end
935
+
936
+ include_examples 'accepts'
937
+ include_examples 'mimics MRI 2.1'
938
+ end
939
+
940
+ context 'when a variable is assigned in loop body ' \
941
+ 'and referenced in post while condition' do
942
+ let(:source) do
943
+ [
944
+ 'begin',
945
+ ' a = (a || 0) + 1',
946
+ ' puts a',
947
+ 'end while a <= 2'
948
+ ]
949
+ end
950
+
951
+ include_examples 'accepts'
952
+ include_examples 'mimics MRI 2.1'
953
+ end
954
+
955
+ context 'when a variable is assigned in loop body ' \
956
+ 'and referenced in post until condition' do
957
+ let(:source) do
958
+ [
959
+ 'begin',
960
+ ' a = (a || 0) + 1',
961
+ ' puts a',
962
+ 'end until a > 2'
963
+ ]
964
+ end
965
+
966
+ include_examples 'accepts'
967
+ include_examples 'mimics MRI 2.1'
968
+ end
969
+
970
+ context 'when a variable is assigned ' \
971
+ 'in main body of begin with rescue but unreferenced' do
972
+ let(:source) do
973
+ [
974
+ 'begin',
975
+ ' do_something',
976
+ ' foo = true',
977
+ 'rescue',
978
+ ' do_anything',
979
+ 'end'
980
+ ]
981
+ end
982
+
983
+ it 'registers an offence' do
984
+ inspect_source(cop, source)
985
+ expect(cop.offences.size).to eq(1)
986
+ expect(cop.offences.first.message)
987
+ .to eq('Useless assignment to variable - foo')
988
+ expect(cop.offences.first.line).to eq(3)
989
+ expect(cop.highlights).to eq(['foo'])
990
+ end
991
+
992
+ include_examples 'mimics MRI 2.1'
993
+ end
994
+
995
+ context 'when a variable is assigned in main body of begin, rescue ' \
996
+ 'and else then referenced after the begin' do
997
+ let(:source) do
998
+ [
999
+ 'begin',
1000
+ ' do_something',
1001
+ ' foo = :in_begin',
1002
+ 'rescue FirstError',
1003
+ ' foo = :in_first_rescue',
1004
+ 'rescue SecondError',
1005
+ ' foo = :in_second_rescue',
1006
+ 'else',
1007
+ ' foo = :in_else',
1008
+ 'end',
1009
+ '',
1010
+ 'puts foo'
1011
+ ]
1012
+ end
1013
+
1014
+ include_examples 'accepts'
1015
+ include_examples 'mimics MRI 2.1'
1016
+ end
1017
+
1018
+ context 'when a variable is reassigned multiple times ' \
1019
+ 'in main body of begin then referenced after the begin' do
1020
+ let(:source) do
1021
+ [
1022
+ 'begin',
1023
+ ' status = :initial',
1024
+ ' connect_sometimes_fails!',
1025
+ ' status = :connected',
1026
+ ' fetch_sometimes_fails!',
1027
+ ' status = :fetched',
1028
+ 'rescue',
1029
+ ' do_something',
1030
+ 'end',
1031
+ '',
1032
+ 'puts status'
1033
+ ]
1034
+ end
1035
+
1036
+ include_examples 'accepts'
1037
+ include_examples 'mimics MRI 2.1'
1038
+ end
1039
+
1040
+ context 'when a variable is reassigned multiple times ' \
1041
+ 'in main body of begin then referenced in rescue' do
1042
+ let(:source) do
1043
+ [
1044
+ 'begin',
1045
+ ' status = :initial',
1046
+ ' connect_sometimes_fails!',
1047
+ ' status = :connected',
1048
+ ' fetch_sometimes_fails!',
1049
+ ' status = :fetched',
1050
+ 'rescue',
1051
+ ' puts status',
1052
+ 'end'
1053
+ ]
1054
+ end
1055
+
1056
+ include_examples 'accepts'
1057
+ include_examples 'mimics MRI 2.1'
1058
+ end
1059
+
1060
+ context 'when a variable is reassigned multiple times ' \
1061
+ 'in main body of begin then referenced in ensure' do
1062
+ let(:source) do
1063
+ [
1064
+ 'begin',
1065
+ ' status = :initial',
1066
+ ' connect_sometimes_fails!',
1067
+ ' status = :connected',
1068
+ ' fetch_sometimes_fails!',
1069
+ ' status = :fetched',
1070
+ 'ensure',
1071
+ ' puts status',
1072
+ 'end'
1073
+ ]
1074
+ end
1075
+
1076
+ include_examples 'accepts'
1077
+ include_examples 'mimics MRI 2.1'
1078
+ end
1079
+
1080
+ context 'when a variable is reassigned multiple times in rescue ' \
1081
+ 'and referenced after the begin' do
1082
+ let(:source) do
1083
+ [
1084
+ 'foo = false',
1085
+ '',
1086
+ 'begin',
1087
+ ' do_something',
1088
+ 'rescue',
1089
+ ' foo = true',
1090
+ ' foo = true',
1091
+ 'end',
1092
+ '',
1093
+ 'puts foo'
1094
+ ]
1095
+ end
1096
+
1097
+ it 'registers an offence' do
1098
+ inspect_source(cop, source)
1099
+ expect(cop.offences.size).to eq(1)
1100
+ expect(cop.offences.first.message)
1101
+ .to eq('Useless assignment to variable - foo')
1102
+ expect(cop.offences.first.line).to eq(6)
1103
+ expect(cop.highlights).to eq(['foo'])
1104
+ end
1105
+ end
1106
+
1107
+ context 'when a variable is reassigned multiple times ' \
1108
+ 'in rescue with ensure then referenced after the begin' do
1109
+ let(:source) do
1110
+ [
1111
+ 'foo = false',
1112
+ '',
1113
+ 'begin',
1114
+ ' do_something',
1115
+ 'rescue',
1116
+ ' foo = true',
1117
+ ' foo = true',
1118
+ 'ensure',
1119
+ ' do_anything',
1120
+ 'end',
1121
+ '',
1122
+ 'puts foo'
1123
+ ]
1124
+ end
1125
+
1126
+ it 'registers an offence' do
1127
+ inspect_source(cop, source)
1128
+ expect(cop.offences.size).to eq(1)
1129
+ expect(cop.offences.first.message)
1130
+ .to eq('Useless assignment to variable - foo')
1131
+ expect(cop.offences.first.line).to eq(6)
1132
+ expect(cop.highlights).to eq(['foo'])
1133
+ end
1134
+ end
1135
+
1136
+ context 'when a variable is reassigned multiple times ' \
1137
+ 'in ensure with rescue then referenced after the begin' do
1138
+ let(:source) do
1139
+ [
1140
+ 'begin',
1141
+ ' do_something',
1142
+ 'rescue',
1143
+ ' do_anything',
1144
+ 'ensure',
1145
+ ' foo = true',
1146
+ ' foo = true',
1147
+ 'end',
1148
+ '',
1149
+ 'puts foo'
1150
+ ]
1151
+ end
1152
+
1153
+ it 'registers an offence' do
1154
+ inspect_source(cop, source)
1155
+ expect(cop.offences.size).to eq(1)
1156
+ expect(cop.offences.first.message)
1157
+ .to eq('Useless assignment to variable - foo')
1158
+ expect(cop.offences.first.line).to eq(6)
1159
+ expect(cop.highlights).to eq(['foo'])
1160
+ end
1161
+ end
1162
+
1163
+ context 'when a variable is assigned at the end of rescue ' \
1164
+ 'and would be referenced with retry' do
1165
+ let(:source) do
1166
+ [
1167
+ 'retried = false',
1168
+ '',
1169
+ 'begin',
1170
+ ' do_something',
1171
+ 'rescue',
1172
+ ' fail if retried',
1173
+ ' retried = true',
1174
+ ' retry',
1175
+ 'end'
1176
+ ]
1177
+ end
1178
+
1179
+ include_examples 'accepts'
1180
+ include_examples 'mimics MRI 2.1'
1181
+ end
1182
+
1183
+ context 'when a variable is assigned ' \
1184
+ 'in main body of begin, rescue and else ' +
1185
+ 'and reassigned in ensure then referenced after the begin' do
1186
+ let(:source) do
1187
+ [
1188
+ 'begin',
1189
+ ' do_something',
1190
+ ' foo = :in_begin',
1191
+ 'rescue FirstError',
1192
+ ' foo = :in_first_rescue',
1193
+ 'rescue SecondError',
1194
+ ' foo = :in_second_rescue',
1195
+ 'else',
1196
+ ' foo = :in_else',
1197
+ 'ensure',
1198
+ ' foo = :in_ensure',
1199
+ 'end',
1200
+ '',
1201
+ 'puts foo'
1202
+ ]
1203
+ end
1204
+
1205
+ it 'registers offences for each assignment before ensure' do
1206
+ inspect_source(cop, source)
1207
+ expect(cop.offences.size).to eq(4)
1208
+
1209
+ expect(cop.offences[0].line).to eq(3)
1210
+ expect(cop.offences[1].line).to eq(5)
1211
+ expect(cop.offences[2].line).to eq(7)
1212
+ expect(cop.offences[3].line).to eq(9)
1213
+ end
1214
+ end
1215
+
1216
+ context 'when a method argument is reassigned ' \
1217
+ 'and zero arity super is called' do
1218
+ let(:source) do
1219
+ [
1220
+ 'def some_method(foo)',
1221
+ ' foo = 1',
1222
+ ' super',
1223
+ 'end'
1224
+ ]
1225
+ end
1226
+
1227
+ include_examples 'accepts'
1228
+ include_examples 'mimics MRI 2.1'
1229
+ end
1230
+
1231
+ context 'when a local variable is unreferenced ' \
1232
+ 'and zero arity super is called' do
1233
+ let(:source) do
1234
+ [
1235
+ 'def some_method(bar)',
1236
+ ' foo = 1',
1237
+ ' super',
1238
+ 'end'
1239
+ ]
1240
+ end
1241
+
1242
+ it 'registers an offence' do
1243
+ inspect_source(cop, source)
1244
+ expect(cop.offences.size).to eq(1)
1245
+ expect(cop.offences.first.message)
1246
+ .to eq('Useless assignment to variable - foo')
1247
+ expect(cop.offences.first.line).to eq(2)
1248
+ expect(cop.highlights).to eq(['foo'])
1249
+ end
1250
+
1251
+ include_examples 'mimics MRI 2.1'
1252
+ end
1253
+
1254
+ context 'when a method argument is reassigned ' \
1255
+ 'but not passed to super' do
1256
+ let(:source) do
1257
+ [
1258
+ 'def some_method(foo, bar)',
1259
+ ' foo = 1',
1260
+ ' super(bar)',
1261
+ 'end'
1262
+ ]
1263
+ end
1264
+
1265
+ it 'registers an offence' do
1266
+ inspect_source(cop, source)
1267
+ expect(cop.offences.size).to eq(1)
1268
+ expect(cop.offences.first.message)
1269
+ .to eq('Useless assignment to variable - foo')
1270
+ expect(cop.offences.first.line).to eq(2)
1271
+ expect(cop.highlights).to eq(['foo'])
1272
+ end
1273
+ end
1274
+
1275
+ context 'when a named capture is unreferenced in top level' do
1276
+ let(:source) do
1277
+ [
1278
+ "/(?<foo>\w+)/ =~ 'FOO'"
1279
+ ]
1280
+ end
1281
+
1282
+ it 'registers an offence' do
1283
+ inspect_source(cop, source)
1284
+ expect(cop.offences.size).to eq(1)
1285
+ expect(cop.offences.first.message)
1286
+ .to eq('Useless assignment to variable - foo')
1287
+ expect(cop.offences.first.line).to eq(1)
1288
+ end
1289
+
1290
+ include_examples 'mimics MRI 2.1'
1291
+ end
1292
+
1293
+ context 'when a named capture is unreferenced ' \
1294
+ 'in other than top level' do
1295
+ let(:source) do
1296
+ [
1297
+ 'def some_method',
1298
+ " /(?<foo>\w+)/ =~ 'FOO'",
1299
+ 'end'
1300
+ ]
1301
+ end
1302
+
1303
+ it 'registers an offence' do
1304
+ inspect_source(cop, source)
1305
+ expect(cop.offences.size).to eq(1)
1306
+ expect(cop.offences.first.message)
1307
+ .to eq('Useless assignment to variable - foo')
1308
+ expect(cop.offences.first.line).to eq(2)
1309
+ expect(cop.highlights).to eq(["/(?<foo>\w+)/"])
1310
+ end
1311
+
1312
+ # MRI 2.0 accepts this case, but I have no idea why it does so
1313
+ # and there's no convincing reason to conform to this behavior,
1314
+ # so RuboCop does not mimic MRI in this case.
1315
+ end
1316
+
1317
+ context 'when a named capture is referenced' do
1318
+ let(:source) do
1319
+ [
1320
+ 'def some_method',
1321
+ " /(?<foo>\w+)(?<bar>\s+)/ =~ 'FOO'",
1322
+ ' puts foo',
1323
+ ' puts bar',
1324
+ 'end'
1325
+ ]
1326
+ end
1327
+
1328
+ include_examples 'accepts'
1329
+ include_examples 'mimics MRI 2.1'
1330
+ end
1331
+
1332
+ context 'when a variable is referenced ' \
1333
+ 'in rhs of named capture expression' do
1334
+ let(:source) do
1335
+ [
1336
+ 'def some_method',
1337
+ " foo = 'some string'",
1338
+ " /(?<foo>\w+)/ =~ foo",
1339
+ ' puts foo',
1340
+ 'end'
1341
+ ]
1342
+ end
1343
+
1344
+ include_examples 'accepts'
1345
+ end
1346
+
1347
+ context 'when a variable is assigned in begin ' \
1348
+ 'and referenced outside' do
1349
+ let(:source) do
1350
+ [
1351
+ 'def some_method',
1352
+ ' begin',
1353
+ ' foo = 1',
1354
+ ' end',
1355
+ ' puts foo',
1356
+ 'end'
1357
+ ]
1358
+ end
1359
+
1360
+ include_examples 'accepts'
1361
+ include_examples 'mimics MRI 2.1'
1362
+ end
1363
+
1364
+ context 'when a variable is shadowed by a block argument ' \
1365
+ 'and unreferenced' do
1366
+ let(:source) do
1367
+ [
1368
+ 'def some_method',
1369
+ ' foo = 1',
1370
+ ' 1.times do |foo|',
1371
+ ' puts foo',
1372
+ ' end',
1373
+ 'end'
1374
+ ]
1375
+ end
1376
+
1377
+ it 'registers an offence' do
1378
+ inspect_source(cop, source)
1379
+ expect(cop.offences.size).to eq(1)
1380
+ expect(cop.offences.first.message)
1381
+ .to eq('Useless assignment to variable - foo')
1382
+ expect(cop.offences.first.line).to eq(2)
1383
+ expect(cop.highlights).to eq(['foo'])
1384
+ end
1385
+
1386
+ include_examples 'mimics MRI 2.1', 'unused variable'
1387
+ end
1388
+
1389
+ context 'when a variable is not used and the name starts with _' do
1390
+ let(:source) do
1391
+ [
1392
+ 'def some_method',
1393
+ ' _foo = 1',
1394
+ ' bar = 2',
1395
+ ' puts bar',
1396
+ 'end'
1397
+ ]
1398
+ end
1399
+
1400
+ include_examples 'accepts'
1401
+ include_examples 'mimics MRI 2.1'
1402
+ end
1403
+
1404
+ context 'when a method argument is not used' do
1405
+ let(:source) do
1406
+ [
1407
+ 'def some_method(arg)',
1408
+ 'end'
1409
+ ]
1410
+ end
1411
+
1412
+ include_examples 'accepts'
1413
+ include_examples 'mimics MRI 2.1'
1414
+ end
1415
+
1416
+ context 'when an optional method argument is not used' do
1417
+ let(:source) do
1418
+ [
1419
+ 'def some_method(arg = nil)',
1420
+ 'end'
1421
+ ]
1422
+ end
1423
+
1424
+ include_examples 'accepts'
1425
+ include_examples 'mimics MRI 2.1'
1426
+ end
1427
+
1428
+ context 'when a block method argument is not used' do
1429
+ let(:source) do
1430
+ [
1431
+ 'def some_method(&block)',
1432
+ 'end'
1433
+ ]
1434
+ end
1435
+
1436
+ include_examples 'accepts'
1437
+ include_examples 'mimics MRI 2.1'
1438
+ end
1439
+
1440
+ context 'when a splat method argument is not used' do
1441
+ let(:source) do
1442
+ [
1443
+ 'def some_method(*args)',
1444
+ 'end'
1445
+ ]
1446
+ end
1447
+
1448
+ include_examples 'accepts'
1449
+ include_examples 'mimics MRI 2.1'
1450
+ end
1451
+
1452
+ context 'when a optional keyword method argument is not used' do
1453
+ let(:source) do
1454
+ [
1455
+ 'def some_method(name: value)',
1456
+ 'end'
1457
+ ]
1458
+ end
1459
+
1460
+ include_examples 'accepts' unless RUBY_VERSION < '2.0'
1461
+ include_examples 'mimics MRI 2.1'
1462
+ end
1463
+
1464
+ context 'when a keyword splat method argument is used' do
1465
+ let(:source) do
1466
+ [
1467
+ 'def some_method(name: value, **rest_keywords)',
1468
+ ' p rest_keywords',
1469
+ 'end'
1470
+ ]
1471
+ end
1472
+
1473
+ include_examples 'accepts' unless RUBY_VERSION < '2.0'
1474
+ include_examples 'mimics MRI 2.1'
1475
+ end
1476
+
1477
+ context 'when a keyword splat method argument is not used' do
1478
+ let(:source) do
1479
+ [
1480
+ 'def some_method(name: value, **rest_keywords)',
1481
+ 'end'
1482
+ ]
1483
+ end
1484
+
1485
+ include_examples 'accepts' unless RUBY_VERSION < '2.0'
1486
+ include_examples 'mimics MRI 2.1'
1487
+ end
1488
+
1489
+ context 'when a block argument is not used' do
1490
+ let(:source) do
1491
+ [
1492
+ '1.times do |i|',
1493
+ 'end'
1494
+ ]
1495
+ end
1496
+
1497
+ include_examples 'accepts'
1498
+ include_examples 'mimics MRI 2.1'
1499
+ end
1500
+
1501
+ context 'when there is only one AST node and it is unused variable' do
1502
+ let(:source) do
1503
+ [
1504
+ 'foo = 1'
1505
+ ]
1506
+ end
1507
+
1508
+ it 'registers an offence' do
1509
+ inspect_source(cop, source)
1510
+ expect(cop.offences.size).to eq(1)
1511
+ expect(cop.offences.first.message)
1512
+ .to eq('Useless assignment to variable - foo')
1513
+ expect(cop.offences.first.line).to eq(1)
1514
+ expect(cop.highlights).to eq(['foo'])
1515
+ end
1516
+
1517
+ include_examples 'mimics MRI 2.1'
1518
+ end
1519
+
1520
+ context 'when a variable is assigned ' \
1521
+ 'while being passed to a method taking block' do
1522
+
1523
+ context 'and the variable is used' do
1524
+ let(:source) do
1525
+ [
1526
+ 'some_method(foo = 1) do',
1527
+ 'end',
1528
+ 'puts foo'
1529
+ ]
1530
+ end
1531
+
1532
+ include_examples 'accepts'
1533
+ include_examples 'mimics MRI 2.1'
1534
+ end
1535
+
1536
+ context 'and the variable is not used' do
1537
+ let(:source) do
1538
+ [
1539
+ 'some_method(foo = 1) do',
1540
+ 'end'
1541
+ ]
1542
+ end
1543
+
1544
+ it 'registers an offence' do
1545
+ inspect_source(cop, source)
1546
+ expect(cop.offences.size).to eq(1)
1547
+ expect(cop.offences.first.message)
1548
+ .to eq('Useless assignment to variable - foo')
1549
+ expect(cop.offences.first.line).to eq(1)
1550
+ expect(cop.highlights).to eq(['foo'])
1551
+ end
1552
+
1553
+ include_examples 'mimics MRI 2.1'
1554
+ end
1555
+ end
1556
+
1557
+ context 'when a variabled is assigned ' \
1558
+ 'and passed to a method followed by method taking block' do
1559
+ let(:source) do
1560
+ [
1561
+ "pattern = '*.rb'",
1562
+ 'Dir.glob(pattern).map do |path|',
1563
+ 'end'
1564
+ ]
1565
+ end
1566
+
1567
+ include_examples 'accepts'
1568
+ include_examples 'mimics MRI 2.1'
1569
+ end
1570
+ end