rubocop 0.13.1 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubocop might be problematic. Click here for more details.

Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/CHANGELOG.md +42 -0
  4. data/README.md +59 -54
  5. data/config/default.yml +124 -95
  6. data/config/disabled.yml +4 -0
  7. data/config/enabled.yml +286 -264
  8. data/lib/rubocop.rb +10 -3
  9. data/lib/rubocop/cli.rb +10 -171
  10. data/lib/rubocop/cop/cop.rb +14 -11
  11. data/lib/rubocop/cop/lint/debugger.rb +35 -0
  12. data/lib/rubocop/cop/lint/syntax.rb +34 -0
  13. data/lib/rubocop/cop/offence.rb +15 -23
  14. data/lib/rubocop/cop/style/align_array.rb +1 -10
  15. data/lib/rubocop/cop/style/align_hash.rb +14 -2
  16. data/lib/rubocop/cop/style/align_parameters.rb +1 -11
  17. data/lib/rubocop/cop/style/and_or.rb +13 -11
  18. data/lib/rubocop/cop/style/attr.rb +1 -1
  19. data/lib/rubocop/cop/style/autocorrect_alignment.rb +31 -6
  20. data/lib/rubocop/cop/style/blocks.rb +14 -6
  21. data/lib/rubocop/cop/style/character_literal.rb +1 -1
  22. data/lib/rubocop/cop/style/class_length.rb +38 -0
  23. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  24. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  25. data/lib/rubocop/cop/style/configurable_naming.rb +47 -0
  26. data/lib/rubocop/cop/style/def_parentheses.rb +2 -2
  27. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  28. data/lib/rubocop/cop/style/even_odd.rb +7 -3
  29. data/lib/rubocop/cop/style/hash_methods.rb +1 -1
  30. data/lib/rubocop/cop/style/hash_syntax.rb +36 -7
  31. data/lib/rubocop/cop/style/lambda_call.rb +36 -11
  32. data/lib/rubocop/cop/style/method_call_parentheses.rb +1 -1
  33. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +41 -0
  34. data/lib/rubocop/cop/style/method_length.rb +2 -13
  35. data/lib/rubocop/cop/style/method_name.rb +42 -0
  36. data/lib/rubocop/cop/style/numeric_literals.rb +4 -0
  37. data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
  38. data/lib/rubocop/cop/style/raise_args.rb +60 -0
  39. data/lib/rubocop/cop/style/redundant_exception.rb +32 -0
  40. data/lib/rubocop/cop/style/redundant_return.rb +14 -5
  41. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  42. data/lib/rubocop/cop/style/semicolon.rb +13 -4
  43. data/lib/rubocop/cop/style/signal_exception.rb +63 -14
  44. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  45. data/lib/rubocop/cop/style/string_help.rb +4 -1
  46. data/lib/rubocop/cop/style/string_literals.rb +34 -11
  47. data/lib/rubocop/cop/style/surrounding_space.rb +64 -17
  48. data/lib/rubocop/cop/style/tab.rb +1 -1
  49. data/lib/rubocop/cop/style/variable_name.rb +44 -0
  50. data/lib/rubocop/cop/style/when_then.rb +1 -1
  51. data/lib/rubocop/cop/style/while_until_do.rb +1 -1
  52. data/lib/rubocop/cop/team.rb +4 -7
  53. data/lib/rubocop/cop/util.rb +12 -0
  54. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  55. data/lib/rubocop/formatter/emacs_style_formatter.rb +5 -2
  56. data/lib/rubocop/formatter/json_formatter.rb +1 -0
  57. data/lib/rubocop/formatter/progress_formatter.rb +9 -13
  58. data/lib/rubocop/formatter/simple_text_formatter.rb +63 -15
  59. data/lib/rubocop/options.rb +184 -0
  60. data/lib/rubocop/processed_source.rb +4 -0
  61. data/lib/rubocop/version.rb +1 -1
  62. data/rubocop.gemspec +1 -1
  63. data/spec/rubocop/cli_spec.rb +870 -1001
  64. data/spec/rubocop/config_spec.rb +13 -13
  65. data/spec/rubocop/config_store_spec.rb +38 -37
  66. data/spec/rubocop/cop/commissioner_spec.rb +42 -46
  67. data/spec/rubocop/cop/cop_spec.rb +72 -77
  68. data/spec/rubocop/cop/corrector_spec.rb +51 -55
  69. data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +100 -106
  70. data/spec/rubocop/cop/lint/block_alignment_spec.rb +403 -409
  71. data/spec/rubocop/cop/lint/debugger_spec.rb +39 -0
  72. data/spec/rubocop/cop/lint/empty_ensure_spec.rb +19 -25
  73. data/spec/rubocop/cop/lint/end_alignment_spec.rb +50 -56
  74. data/spec/rubocop/cop/lint/end_in_method_spec.rb +20 -26
  75. data/spec/rubocop/cop/lint/ensure_return_spec.rb +30 -36
  76. data/spec/rubocop/cop/lint/eval_spec.rb +25 -31
  77. data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +22 -28
  78. data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +51 -57
  79. data/spec/rubocop/cop/lint/loop_spec.rb +17 -23
  80. data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +51 -57
  81. data/spec/rubocop/cop/lint/rescue_exception_spec.rb +105 -111
  82. data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +230 -236
  83. data/spec/rubocop/cop/lint/syntax_spec.rb +33 -0
  84. data/spec/rubocop/cop/lint/unreachable_code_spec.rb +51 -57
  85. data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1544 -1550
  86. data/spec/rubocop/cop/lint/useless_comparison_spec.rb +21 -27
  87. data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +119 -125
  88. data/spec/rubocop/cop/lint/void_spec.rb +50 -56
  89. data/spec/rubocop/cop/offence_spec.rb +101 -131
  90. data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +6 -12
  91. data/spec/rubocop/cop/rails/read_attribute_spec.rb +6 -12
  92. data/spec/rubocop/cop/rails/validation_spec.rb +13 -19
  93. data/spec/rubocop/cop/style/access_control_spec.rb +146 -152
  94. data/spec/rubocop/cop/style/alias_spec.rb +30 -36
  95. data/spec/rubocop/cop/style/align_array_spec.rb +57 -56
  96. data/spec/rubocop/cop/style/align_hash_spec.rb +256 -237
  97. data/spec/rubocop/cop/style/align_parameters_spec.rb +216 -202
  98. data/spec/rubocop/cop/style/and_or_spec.rb +51 -55
  99. data/spec/rubocop/cop/style/ascii_comments_spec.rb +14 -20
  100. data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +26 -32
  101. data/spec/rubocop/cop/style/attr_spec.rb +11 -17
  102. data/spec/rubocop/cop/style/begin_block_spec.rb +6 -12
  103. data/spec/rubocop/cop/style/block_comments_spec.rb +13 -19
  104. data/spec/rubocop/cop/style/block_nesting_spec.rb +134 -140
  105. data/spec/rubocop/cop/style/blocks_spec.rb +81 -84
  106. data/spec/rubocop/cop/style/case_equality_spec.rb +5 -11
  107. data/spec/rubocop/cop/style/case_indentation_spec.rb +71 -77
  108. data/spec/rubocop/cop/style/character_literal_spec.rb +31 -37
  109. data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +31 -37
  110. data/spec/rubocop/cop/style/class_length_spec.rb +65 -0
  111. data/spec/rubocop/cop/style/class_methods_spec.rb +35 -41
  112. data/spec/rubocop/cop/style/class_vars_spec.rb +11 -17
  113. data/spec/rubocop/cop/style/collection_methods_spec.rb +41 -47
  114. data/spec/rubocop/cop/style/colon_method_call_spec.rb +45 -51
  115. data/spec/rubocop/cop/style/comment_annotation_spec.rb +79 -85
  116. data/spec/rubocop/cop/style/constant_name_spec.rb +45 -51
  117. data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +28 -34
  118. data/spec/rubocop/cop/style/def_without_parentheses_spec.rb +23 -29
  119. data/spec/rubocop/cop/style/documentation_spec.rb +60 -66
  120. data/spec/rubocop/cop/style/dot_position_spec.rb +50 -56
  121. data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +109 -110
  122. data/spec/rubocop/cop/style/empty_lines_spec.rb +28 -34
  123. data/spec/rubocop/cop/style/empty_literal_spec.rb +80 -86
  124. data/spec/rubocop/cop/style/encoding_spec.rb +50 -56
  125. data/spec/rubocop/cop/style/end_block_spec.rb +6 -12
  126. data/spec/rubocop/cop/style/end_of_line_spec.rb +13 -19
  127. data/spec/rubocop/cop/style/even_odd_spec.rb +69 -41
  128. data/spec/rubocop/cop/style/favor_join_spec.rb +21 -27
  129. data/spec/rubocop/cop/style/favor_modifier_spec.rb +180 -176
  130. data/spec/rubocop/cop/style/favor_sprintf_spec.rb +41 -47
  131. data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +63 -69
  132. data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +32 -38
  133. data/spec/rubocop/cop/style/final_newline_spec.rb +16 -22
  134. data/spec/rubocop/cop/style/for_spec.rb +18 -24
  135. data/spec/rubocop/cop/style/global_vars_spec.rb +23 -29
  136. data/spec/rubocop/cop/style/hash_methods_spec.rb +39 -45
  137. data/spec/rubocop/cop/style/hash_syntax_spec.rb +93 -65
  138. data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +11 -17
  139. data/spec/rubocop/cop/style/indentation_width_spec.rb +377 -383
  140. data/spec/rubocop/cop/style/lambda_call_spec.rb +40 -22
  141. data/spec/rubocop/cop/style/lambda_spec.rb +30 -34
  142. data/spec/rubocop/cop/style/leading_comment_space_spec.rb +44 -50
  143. data/spec/rubocop/cop/style/line_length_spec.rb +11 -17
  144. data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +14 -20
  145. data/spec/rubocop/cop/style/method_called_on_do_end_block_spec.rb +60 -0
  146. data/spec/rubocop/cop/style/method_length_spec.rb +127 -133
  147. data/spec/rubocop/cop/style/method_name_spec.rb +103 -0
  148. data/spec/rubocop/cop/style/module_function_spec.rb +16 -22
  149. data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +64 -70
  150. data/spec/rubocop/cop/style/multiline_if_then_spec.rb +74 -80
  151. data/spec/rubocop/cop/style/nil_comparison_spec.rb +20 -26
  152. data/spec/rubocop/cop/style/not_spec.rb +13 -19
  153. data/spec/rubocop/cop/style/numeric_literals_spec.rb +36 -35
  154. data/spec/rubocop/cop/style/one_line_conditional_spec.rb +5 -11
  155. data/spec/rubocop/cop/style/op_method_spec.rb +61 -67
  156. data/spec/rubocop/cop/style/parameter_lists_spec.rb +31 -37
  157. data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +62 -68
  158. data/spec/rubocop/cop/style/perl_backrefs_spec.rb +9 -15
  159. data/spec/rubocop/cop/style/proc_spec.rb +13 -19
  160. data/spec/rubocop/cop/style/raise_args_spec.rb +55 -0
  161. data/spec/rubocop/cop/style/reduce_arguments_spec.rb +49 -55
  162. data/spec/rubocop/cop/style/redundant_begin_spec.rb +47 -53
  163. data/spec/rubocop/cop/style/redundant_exception_spec.rb +27 -0
  164. data/spec/rubocop/cop/style/redundant_return_spec.rb +164 -72
  165. data/spec/rubocop/cop/style/redundant_self_spec.rb +109 -115
  166. data/spec/rubocop/cop/style/regexp_literal_spec.rb +57 -63
  167. data/spec/rubocop/cop/style/rescue_modifier_spec.rb +99 -105
  168. data/spec/rubocop/cop/style/semicolon_spec.rb +95 -90
  169. data/spec/rubocop/cop/style/signal_exception_spec.rb +248 -95
  170. data/spec/rubocop/cop/style/single_line_methods_spec.rb +45 -51
  171. data/spec/rubocop/cop/style/space_after_colon_spec.rb +14 -20
  172. data/spec/rubocop/cop/style/space_after_comma_spec.rb +16 -22
  173. data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +48 -54
  174. data/spec/rubocop/cop/style/space_after_method_name_spec.rb +49 -55
  175. data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +10 -16
  176. data/spec/rubocop/cop/style/space_around_block_braces_spec.rb +118 -50
  177. data/spec/rubocop/cop/style/space_around_equals_in_default_parameter_spec.rb +18 -24
  178. data/spec/rubocop/cop/style/space_around_operators_spec.rb +204 -210
  179. data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +36 -42
  180. data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +39 -45
  181. data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +62 -68
  182. data/spec/rubocop/cop/style/space_inside_parens_spec.rb +18 -24
  183. data/spec/rubocop/cop/style/special_global_vars_spec.rb +40 -46
  184. data/spec/rubocop/cop/style/string_literals_spec.rb +148 -70
  185. data/spec/rubocop/cop/style/symbol_array_spec.rb +28 -34
  186. data/spec/rubocop/cop/style/symbol_name_spec.rb +132 -138
  187. data/spec/rubocop/cop/style/tab_spec.rb +9 -15
  188. data/spec/rubocop/cop/style/ternary_operator_spec.rb +25 -31
  189. data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +10 -16
  190. data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +14 -20
  191. data/spec/rubocop/cop/style/trivial_accessors_spec.rb +374 -380
  192. data/spec/rubocop/cop/style/unless_else_spec.rb +17 -23
  193. data/spec/rubocop/cop/style/variable_interpolation_spec.rb +36 -42
  194. data/spec/rubocop/cop/style/variable_name_spec.rb +83 -0
  195. data/spec/rubocop/cop/style/when_then_spec.rb +31 -37
  196. data/spec/rubocop/cop/style/while_until_do_spec.rb +47 -53
  197. data/spec/rubocop/cop/style/word_array_spec.rb +49 -55
  198. data/spec/rubocop/cop/team_spec.rb +125 -127
  199. data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +176 -180
  200. data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +580 -586
  201. data/spec/rubocop/cop/variable_inspector/scope_spec.rb +140 -146
  202. data/spec/rubocop/cop/variable_inspector/variable_spec.rb +52 -58
  203. data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +217 -223
  204. data/spec/rubocop/cop/variable_inspector_spec.rb +15 -19
  205. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +35 -36
  206. data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +2 -2
  207. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +24 -1
  208. data/spec/rubocop/formatter/file_list_formatter_spec.rb +1 -1
  209. data/spec/rubocop/formatter/formatter_set_spec.rb +3 -3
  210. data/spec/rubocop/formatter/json_formatter_spec.rb +7 -2
  211. data/spec/rubocop/formatter/offence_count_formatter_spec.rb +1 -1
  212. data/spec/rubocop/formatter/progress_formatter_spec.rb +1 -1
  213. data/spec/rubocop/formatter/simple_text_formatter_spec.rb +55 -6
  214. data/spec/rubocop/options_spec.rb +233 -0
  215. data/spec/rubocop/processed_source_spec.rb +85 -42
  216. data/spec/rubocop/source_parser_spec.rb +108 -110
  217. data/spec/rubocop/target_finder_spec.rb +125 -127
  218. data/spec/rubocop/token_spec.rb +15 -17
  219. metadata +32 -8
  220. data/lib/rubocop/backports/bsearch.rb +0 -39
  221. data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +0 -77
  222. data/spec/rubocop/cop/style/method_and_variable_snake_case_spec.rb +0 -102
@@ -2,62 +2,58 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- module Rubocop
6
- module Cop
7
- describe Corrector do
8
- describe '#rewrite' do
9
- it 'allows removal of a range' do
10
- source = 'true and false'
11
- processed_source = parse_source(source)
12
-
13
- correction = lambda do |corrector|
14
- node = processed_source.ast
15
- corrector.remove(node.loc.operator)
16
- end
17
-
18
- corrector = Corrector.new(processed_source.buffer, [correction])
19
- expect(corrector.rewrite).to eq 'true false'
20
- end
21
-
22
- it 'allows insertion before a source range' do
23
- source = 'true and false'
24
- processed_source = parse_source(source)
25
-
26
- correction = lambda do |corrector|
27
- node = processed_source.ast
28
- corrector.insert_before(node.loc.operator, ';nil ')
29
- end
30
-
31
- corrector = Corrector.new(processed_source.buffer, [correction])
32
- expect(corrector.rewrite).to eq 'true ;nil and false'
33
- end
34
-
35
- it 'allows insertion after a source range' do
36
- source = 'true and false'
37
- processed_source = parse_source(source)
38
-
39
- correction = lambda do |corrector|
40
- node = processed_source.ast
41
- corrector.insert_after(node.loc.operator, ' nil;')
42
- end
43
-
44
- corrector = Corrector.new(processed_source.buffer, [correction])
45
- expect(corrector.rewrite).to eq 'true and nil; false'
46
- end
47
-
48
- it 'allows replacement of a range' do
49
- source = 'true and false'
50
- processed_source = parse_source(source)
51
-
52
- correction = lambda do |corrector|
53
- node = processed_source.ast
54
- corrector.replace(node.loc.operator, 'or')
55
- end
56
-
57
- corrector = Corrector.new(processed_source.buffer, [correction])
58
- expect(corrector.rewrite).to eq 'true or false'
59
- end
5
+ describe Rubocop::Cop::Corrector do
6
+ describe '#rewrite' do
7
+ it 'allows removal of a range' do
8
+ source = 'true and false'
9
+ processed_source = parse_source(source)
10
+
11
+ correction = lambda do |corrector|
12
+ node = processed_source.ast
13
+ corrector.remove(node.loc.operator)
60
14
  end
15
+
16
+ corrector = described_class.new(processed_source.buffer, [correction])
17
+ expect(corrector.rewrite).to eq 'true false'
18
+ end
19
+
20
+ it 'allows insertion before a source range' do
21
+ source = 'true and false'
22
+ processed_source = parse_source(source)
23
+
24
+ correction = lambda do |corrector|
25
+ node = processed_source.ast
26
+ corrector.insert_before(node.loc.operator, ';nil ')
27
+ end
28
+
29
+ corrector = described_class.new(processed_source.buffer, [correction])
30
+ expect(corrector.rewrite).to eq 'true ;nil and false'
31
+ end
32
+
33
+ it 'allows insertion after a source range' do
34
+ source = 'true and false'
35
+ processed_source = parse_source(source)
36
+
37
+ correction = lambda do |corrector|
38
+ node = processed_source.ast
39
+ corrector.insert_after(node.loc.operator, ' nil;')
40
+ end
41
+
42
+ corrector = described_class.new(processed_source.buffer, [correction])
43
+ expect(corrector.rewrite).to eq 'true and nil; false'
44
+ end
45
+
46
+ it 'allows replacement of a range' do
47
+ source = 'true and false'
48
+ processed_source = parse_source(source)
49
+
50
+ correction = lambda do |corrector|
51
+ node = processed_source.ast
52
+ corrector.replace(node.loc.operator, 'or')
53
+ end
54
+
55
+ corrector = described_class.new(processed_source.buffer, [correction])
56
+ expect(corrector.rewrite).to eq 'true or false'
61
57
  end
62
58
  end
63
59
  end
@@ -2,112 +2,106 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- module Rubocop
6
- module Cop
7
- module Lint
8
- describe AssignmentInCondition, :config do
9
- subject(:cop) { AssignmentInCondition.new(config) }
10
- let(:cop_config) { { 'AllowSafeAssignment' => true } }
11
-
12
- it 'registers an offence for lvar assignment in condition' do
13
- inspect_source(cop,
14
- ['if test = 10',
15
- 'end'
16
- ])
17
- expect(cop.offences.size).to eq(1)
18
- end
19
-
20
- it 'registers an offence for lvar assignment in while condition' do
21
- inspect_source(cop,
22
- ['while test = 10',
23
- 'end'
24
- ])
25
- expect(cop.offences.size).to eq(1)
26
- end
27
-
28
- it 'registers an offence for lvar assignment in until condition' do
29
- inspect_source(cop,
30
- ['until test = 10',
31
- 'end'
32
- ])
33
- expect(cop.offences.size).to eq(1)
34
- end
35
-
36
- it 'registers an offence for ivar assignment in condition' do
37
- inspect_source(cop,
38
- ['if @test = 10',
39
- 'end'
40
- ])
41
- expect(cop.offences.size).to eq(1)
42
- end
43
-
44
- it 'registers an offence for clvar assignment in condition' do
45
- inspect_source(cop,
46
- ['if @@test = 10',
47
- 'end'
48
- ])
49
- expect(cop.offences.size).to eq(1)
50
- end
51
-
52
- it 'registers an offence for gvar assignment in condition' do
53
- inspect_source(cop,
54
- ['if $test = 10',
55
- 'end'
56
- ])
57
- expect(cop.offences.size).to eq(1)
58
- end
59
-
60
- it 'registers an offence for constant assignment in condition' do
61
- inspect_source(cop,
62
- ['if TEST = 10',
63
- 'end'
64
- ])
65
- expect(cop.offences.size).to eq(1)
66
- end
67
-
68
- it 'accepts == in condition' do
69
- inspect_source(cop,
70
- ['if test == 10',
71
- 'end'
72
- ])
73
- expect(cop.offences).to be_empty
74
- end
75
-
76
- it 'accepts = in a block that is called in a condition' do
77
- inspect_source(cop,
78
- ['return 1 if any_errors? { o = inspect(file) }'])
79
- expect(cop.offences).to be_empty
80
- end
81
-
82
- it 'accepts ||= in condition' do
83
- inspect_source(cop,
84
- ['raise StandardError unless foo ||= bar'])
85
- expect(cop.offences).to be_empty
86
- end
87
-
88
- context 'safe assignment is allowed' do
89
- it 'accepts = in condition surrounded with braces' do
90
- inspect_source(cop,
91
- ['if (test = 10)',
92
- 'end'
93
- ])
94
- expect(cop.offences).to be_empty
95
- end
96
-
97
- end
98
-
99
- context 'safe assignment is not allowed' do
100
- let(:cop_config) { { 'AllowSafeAssignment' => false } }
101
-
102
- it 'does not accepts = in condition surrounded with braces' do
103
- inspect_source(cop,
104
- ['if (test = 10)',
105
- 'end'
106
- ])
107
- expect(cop.offences.size).to eq(1)
108
- end
109
- end
110
- end
5
+ describe Rubocop::Cop::Lint::AssignmentInCondition, :config do
6
+ subject(:cop) { described_class.new(config) }
7
+ let(:cop_config) { { 'AllowSafeAssignment' => true } }
8
+
9
+ it 'registers an offence for lvar assignment in condition' do
10
+ inspect_source(cop,
11
+ ['if test = 10',
12
+ 'end'
13
+ ])
14
+ expect(cop.offences.size).to eq(1)
15
+ end
16
+
17
+ it 'registers an offence for lvar assignment in while condition' do
18
+ inspect_source(cop,
19
+ ['while test = 10',
20
+ 'end'
21
+ ])
22
+ expect(cop.offences.size).to eq(1)
23
+ end
24
+
25
+ it 'registers an offence for lvar assignment in until condition' do
26
+ inspect_source(cop,
27
+ ['until test = 10',
28
+ 'end'
29
+ ])
30
+ expect(cop.offences.size).to eq(1)
31
+ end
32
+
33
+ it 'registers an offence for ivar assignment in condition' do
34
+ inspect_source(cop,
35
+ ['if @test = 10',
36
+ 'end'
37
+ ])
38
+ expect(cop.offences.size).to eq(1)
39
+ end
40
+
41
+ it 'registers an offence for clvar assignment in condition' do
42
+ inspect_source(cop,
43
+ ['if @@test = 10',
44
+ 'end'
45
+ ])
46
+ expect(cop.offences.size).to eq(1)
47
+ end
48
+
49
+ it 'registers an offence for gvar assignment in condition' do
50
+ inspect_source(cop,
51
+ ['if $test = 10',
52
+ 'end'
53
+ ])
54
+ expect(cop.offences.size).to eq(1)
55
+ end
56
+
57
+ it 'registers an offence for constant assignment in condition' do
58
+ inspect_source(cop,
59
+ ['if TEST = 10',
60
+ 'end'
61
+ ])
62
+ expect(cop.offences.size).to eq(1)
63
+ end
64
+
65
+ it 'accepts == in condition' do
66
+ inspect_source(cop,
67
+ ['if test == 10',
68
+ 'end'
69
+ ])
70
+ expect(cop.offences).to be_empty
71
+ end
72
+
73
+ it 'accepts = in a block that is called in a condition' do
74
+ inspect_source(cop,
75
+ ['return 1 if any_errors? { o = inspect(file) }'])
76
+ expect(cop.offences).to be_empty
77
+ end
78
+
79
+ it 'accepts ||= in condition' do
80
+ inspect_source(cop,
81
+ ['raise StandardError unless foo ||= bar'])
82
+ expect(cop.offences).to be_empty
83
+ end
84
+
85
+ context 'safe assignment is allowed' do
86
+ it 'accepts = in condition surrounded with braces' do
87
+ inspect_source(cop,
88
+ ['if (test = 10)',
89
+ 'end'
90
+ ])
91
+ expect(cop.offences).to be_empty
92
+ end
93
+
94
+ end
95
+
96
+ context 'safe assignment is not allowed' do
97
+ let(:cop_config) { { 'AllowSafeAssignment' => false } }
98
+
99
+ it 'does not accepts = in condition surrounded with braces' do
100
+ inspect_source(cop,
101
+ ['if (test = 10)',
102
+ 'end'
103
+ ])
104
+ expect(cop.offences.size).to eq(1)
111
105
  end
112
106
  end
113
107
  end
@@ -3,415 +3,409 @@
3
3
 
4
4
  require 'spec_helper'
5
5
 
6
- module Rubocop
7
- module Cop
8
- module Lint
9
- describe BlockAlignment do
10
- subject(:cop) { BlockAlignment.new }
11
-
12
- it 'registers an offence for mismatched block end' do
13
- inspect_source(cop,
14
- ['test do |ala|',
15
- ' end'
16
- ])
17
- expect(cop.messages)
18
- .to eq(['end at 2, 2 is not aligned with test do |ala| at 1, 0'])
19
- end
20
-
21
- context 'when the block is a logical operand' do
22
- it 'accepts a correctly aligned block end' do
23
- inspect_source(cop,
24
- ['(value.is_a? Array) && value.all? do |subvalue|',
25
- ' type_check_value(subvalue, array_type)',
26
- 'end',
27
- 'a || b do',
28
- 'end',
29
- ])
30
- expect(cop.offences).to be_empty
31
- end
32
- end
33
-
34
- it 'accepts end aligned with a variable' do
35
- inspect_source(cop,
36
- ['variable = test do |ala|',
37
- 'end'
38
- ])
39
- expect(cop.offences).to be_empty
40
- end
41
-
42
- context 'when there is an assignment chain' do
43
- it 'registers an offence for an end aligned with the 2nd variable' do
44
- inspect_source(cop,
45
- ['a = b = c = test do |ala|',
46
- ' end'
47
- ])
48
- expect(cop.messages)
49
- .to eq(['end at 2, 4 is not aligned with a = b = c = test do |ala| at 1, 0'])
50
- end
51
-
52
- it 'accepts end aligned with the first variable' do
53
- inspect_source(cop,
54
- ['a = b = c = test do |ala|',
55
- 'end',
56
- ])
57
- expect(cop.offences).to be_empty
58
- end
59
- end
60
-
61
- context 'and the block is an operand' do
62
- it 'accepts end aligned with a variable' do
63
- inspect_source(cop,
64
- ['b = 1 + preceding_line.reduce(0) do |a, e|',
65
- ' a + e.length + newline_length',
66
- 'end + 1'
67
- ])
68
- expect(cop.offences).to be_empty
69
- end
70
- end
71
-
72
- it 'registers an offence for mismatched block end with a variable' do
73
- inspect_source(cop,
74
- ['variable = test do |ala|',
75
- ' end'
76
- ])
77
- expect(cop.messages)
78
- .to eq(['end at 2, 2 is not aligned with variable = test do |ala| at 1, 0'])
79
- end
80
-
81
- context 'when the block is defined on the next line' do
82
- it 'accepts end aligned with the block expression' do
83
- inspect_source(cop,
84
- ['variable =',
85
- ' a_long_method_that_dont_fit_on_the_line do |v|',
86
- ' v.foo',
87
- ' end'
88
- ])
89
- expect(cop.offences).to be_empty
90
- end
91
-
92
- it 'registers an offences for mismatched end alignment' do
93
- inspect_source(cop,
94
- ['variable =',
95
- ' a_long_method_that_dont_fit_on_the_line do |v|',
96
- ' v.foo',
97
- 'end'
98
- ])
99
- expect(cop.messages)
100
- .to eq(['end at 4, 0 is not aligned with a_long_method_that_dont_fit_on_the_line ' +
101
- 'do |v| at 2, 2'])
102
- end
103
- end
104
-
105
- context 'when the method part is a call chain that spans several lines' do
106
- # Example from issue 346 of bbatsov/rubocop on github:
107
- it 'accepts pretty alignment style' do
108
- src = ['def foo(bar)',
109
- ' bar.get_stuffs',
110
- ' .reject do |stuff| ',
111
- ' stuff.with_a_very_long_expression_that_doesnt_fit_the_line',
112
- ' end.select do |stuff|',
113
- ' stuff.another_very_long_expression_that_doesnt_fit_the_line',
114
- ' end',
115
- ' .select do |stuff|',
116
- ' stuff.another_very_long_expression_that_doesnt_fit_the_line',
117
- ' end',
118
- 'end']
119
- inspect_source(cop, src)
120
- expect(cop.offences).to be_empty
121
- end
122
-
123
- it 'registers offences for misaligned ends' do
124
- src = ['def foo(bar)',
125
- ' bar.get_stuffs',
126
- ' .reject do |stuff|',
127
- ' stuff.with_a_very_long_expression_that_doesnt_fit_the_line',
128
- ' end.select do |stuff|',
129
- ' stuff.another_very_long_expression_that_doesnt_fit_the_line',
130
- ' end',
131
- ' .select do |stuff|',
132
- ' stuff.another_very_long_expression_that_doesnt_fit_the_line',
133
- ' end',
134
- 'end']
135
- inspect_source(cop, src)
136
- expect(cop.messages)
137
- .to eq(['end at 10, 8 is not aligned with bar.get_stuffs at 2, 2 or' +
138
- ' .select do |stuff| at 8, 6',
139
- 'end at 7, 4 is not aligned with bar.get_stuffs at 2, 2 or' +
140
- ' end.select do |stuff| at 5, 8',
141
- 'end at 5, 8 is not aligned with bar.get_stuffs at 2, 2 or' +
142
- ' .reject do |stuff| at 3, 6'])
143
- end
144
-
145
- # Example from issue 393 of bbatsov/rubocop on github:
146
- it 'accepts end indented as the start of the block' do
147
- src = ['my_object.chaining_this_very_long_method(with_a_parameter)',
148
- ' .and_one_with_a_block do',
149
- ' do_something',
150
- 'end',
151
- '', # Other variant:
152
- 'my_object.chaining_this_very_long_method(',
153
- ' with_a_parameter).and_one_with_a_block do',
154
- ' do_something',
155
- 'end']
156
- inspect_source(cop, src)
157
- expect(cop.offences).to be_empty
158
- end
159
-
160
- # Example from issue 447 of bbatsov/rubocop on github:
161
- it 'accepts two kinds of end alignment' do
162
- src = [
163
- # Aligned with start of line where do is:
164
- 'params = default_options.merge(options)',
165
- ' .delete_if { |k, v| v.nil? }',
166
- ' .each_with_object({}) do |(k, v), new_hash|',
167
- ' new_hash[k.to_s] = v.to_s',
168
- ' end',
169
- # Aligned with start of the whole expression:
170
- 'params = default_options.merge(options)',
171
- ' .delete_if { |k, v| v.nil? }',
172
- ' .each_with_object({}) do |(k, v), new_hash|',
173
- ' new_hash[k.to_s] = v.to_s',
174
- 'end'
175
- ]
176
- inspect_source(cop, src)
177
- expect(cop.offences).to be_empty
178
- end
179
- end
180
-
181
- context 'when variables of a mass assignment spans several lines' do
182
- it 'accepts end aligned with the variables' do
183
- src = ['e,',
184
- 'f = [5, 6].map do |i|',
185
- ' i - 5',
186
- 'end']
187
- inspect_source(cop, src)
188
- expect(cop.offences).to be_empty
189
- end
190
-
191
- it 'registers an offence for end aligned with the block' do
192
- src = ['e,',
193
- 'f = [5, 6].map do |i|',
194
- ' i - 5',
195
- ' end']
196
- inspect_source(cop, src)
197
- expect(cop.messages)
198
- .to eq(['end at 4, 4 is not aligned with e, at 1, 0 or f = [5, 6].map do |i| at 2, 0'])
199
- end
200
- end
201
-
202
- it 'accepts end aligned with an instance variable' do
203
- inspect_source(cop,
204
- ['@variable = test do |ala|',
205
- 'end'
206
- ])
207
- expect(cop.offences).to be_empty
208
- end
209
-
210
- it 'registers an offence for mismatched block end with an instance variable' do
211
- inspect_source(cop,
212
- ['@variable = test do |ala|',
213
- ' end'
214
- ])
215
- expect(cop.messages)
216
- .to eq(['end at 2, 2 is not aligned with @variable = test do |ala| at 1, 0'])
217
- end
218
-
219
- it 'accepts end aligned with a class variable' do
220
- inspect_source(cop,
221
- ['@@variable = test do |ala|',
222
- 'end'
223
- ])
224
- expect(cop.offences).to be_empty
225
- end
226
-
227
- it 'registers an offence for mismatched block end with a class variable' do
228
- inspect_source(cop,
229
- ['@@variable = test do |ala|',
230
- ' end'
231
- ])
232
- expect(cop.messages)
233
- .to eq(['end at 2, 2 is not aligned with @@variable = test do |ala| at 1, 0'])
234
- end
235
-
236
- it 'accepts end aligned with a global variable' do
237
- inspect_source(cop,
238
- ['$variable = test do |ala|',
239
- 'end'
240
- ])
241
- expect(cop.offences).to be_empty
242
- end
243
-
244
- it 'registers an offence for mismatched block end with a global variable' do
245
- inspect_source(cop,
246
- ['$variable = test do |ala|',
247
- ' end'
248
- ])
249
- expect(cop.messages)
250
- .to eq(['end at 2, 2 is not aligned with $variable = test do |ala| at 1, 0'])
251
- end
252
-
253
- it 'accepts end aligned with a constant' do
254
- inspect_source(cop,
255
- ['CONSTANT = test do |ala|',
256
- 'end'
257
- ])
258
- expect(cop.offences).to be_empty
259
- end
260
-
261
- it 'registers an offence for mismatched block end with a constant' do
262
- inspect_source(cop,
263
- ['Module::CONSTANT = test do |ala|',
264
- ' end'
265
- ])
266
- expect(cop.messages)
267
- .to eq(['end at 2, 2 is not aligned with Module::CONSTANT = test do |ala| at 1, 0'])
268
- end
269
-
270
- it 'accepts end aligned with a method call' do
271
- inspect_source(cop,
272
- ['parser.childs << lambda do |token|',
273
- ' token << 1',
274
- 'end'
275
- ])
276
- expect(cop.offences).to be_empty
277
- end
278
-
279
- it 'registers an offence for mismatched block end with a method call' do
280
- inspect_source(cop,
281
- ['parser.childs << lambda do |token|',
282
- ' token << 1',
283
- ' end'
284
- ])
285
- expect(cop.messages)
286
- .to eq(['end at 3, 2 is not aligned with parser.childs << lambda do |token| at 1, 0'])
287
- end
288
-
289
- it 'accepts end aligned with a method call with arguments' do
290
- inspect_source(cop,
291
- ['@h[:f] = f.each_pair.map do |f, v|',
292
- ' v = 1',
293
- 'end'
294
- ])
295
- expect(cop.offences).to be_empty
296
- end
297
-
298
- it 'registers an offence for mismatched end with a method call with arguments' do
299
- inspect_source(cop,
300
- ['@h[:f] = f.each_pair.map do |f, v|',
301
- ' v = 1',
302
- ' end'
303
- ])
304
- expect(cop.messages)
305
- .to eq(['end at 3, 2 is not aligned with @h[:f] = f.each_pair.map do |f, v| at 1, 0'])
306
- end
307
-
308
- it 'does not raise an error for nested block in a method call' do
309
- inspect_source(cop,
310
- ['expect(arr.all? { |o| o.valid? })'
311
- ])
312
- expect(cop.offences).to be_empty
313
- end
314
-
315
- it 'accepts end aligned with the block when the block is a method argument' do
316
- inspect_source(cop,
317
- ['expect(arr.all? do |o|',
318
- ' o.valid?',
319
- ' end)'
320
- ])
321
- expect(cop.offences).to be_empty
322
- end
323
-
324
- it 'registers an offence for mismatched end not aligned with the block that is an argument' do
325
- inspect_source(cop,
326
- ['expect(arr.all? do |o|',
327
- ' o.valid?',
328
- ' end)'
329
- ])
330
- expect(cop.messages)
331
- .to eq(['end at 3, 2 is not aligned with arr.all? do |o| at 1, 7 or ' +
332
- 'expect(arr.all? do |o| at 1, 0'])
333
- end
334
-
335
- it 'accepts end aligned with an op-asgn (+=, -=)' do
336
- inspect_source(cop,
337
- ['rb += files.select do |file|',
338
- ' file << something',
339
- 'end'
340
- ])
341
- expect(cop.offences).to be_empty
342
- end
343
-
344
- it 'registers an offence for mismatched block end with an op-asgn (+=, -=)' do
345
- inspect_source(cop,
346
- ['rb += files.select do |file|',
347
- ' file << something',
348
- ' end'
349
- ])
350
- expect(cop.messages)
351
- .to eq(['end at 3, 2 is not aligned with rb at 1, 0'])
352
- end
353
-
354
- it 'accepts end aligned with an and-asgn (&&=)' do
355
- inspect_source(cop,
356
- ['variable &&= test do |ala|',
357
- 'end'
358
- ])
359
- expect(cop.offences).to be_empty
360
- end
361
-
362
- it 'registers an offence for mismatched block end with an and-asgn (&&=)' do
363
- inspect_source(cop,
364
- ['variable &&= test do |ala|',
365
- ' end'
366
- ])
367
- expect(cop.messages)
368
- .to eq(['end at 2, 2 is not aligned with variable &&= test do |ala| at 1, 0'])
369
- end
370
-
371
- it 'accepts end aligned with an or-asgn (||=)' do
372
- inspect_source(cop,
373
- ['variable ||= test do |ala|',
374
- 'end'
375
- ])
376
- expect(cop.offences).to be_empty
377
- end
378
-
379
- it 'registers an offence for mismatched block end with an or-asgn (||=)' do
380
- inspect_source(cop,
381
- ['variable ||= test do |ala|',
382
- ' end'
383
- ])
384
- expect(cop.messages)
385
- .to eq(['end at 2, 2 is not aligned with variable ||= test do |ala| at 1, 0'])
386
- end
387
-
388
- it 'accepts end aligned with a mass assignment' do
389
- inspect_source(cop,
390
- ['var1, var2 = lambda do |test|',
391
- ' [1, 2]',
392
- 'end'
393
- ])
394
- expect(cop.offences).to be_empty
395
- end
396
-
397
- it 'accepts end aligned with a call chain left hand side' do
398
- inspect_source(cop,
399
- ['parser.diagnostics.consumer = lambda do |diagnostic|',
400
- ' diagnostics << diagnostic',
401
- 'end'])
402
- expect(cop.offences).to be_empty
403
- end
404
-
405
- it 'registers an offence for mismatched block end with a mass assignment' do
406
- inspect_source(cop,
407
- ['var1, var2 = lambda do |test|',
408
- ' [1, 2]',
409
- ' end'
410
- ])
411
- expect(cop.messages)
412
- .to eq(['end at 3, 2 is not aligned with var1, var2 at 1, 0'])
413
- end
414
- end
6
+ describe Rubocop::Cop::Lint::BlockAlignment do
7
+ subject(:cop) { described_class.new }
8
+
9
+ it 'registers an offence for mismatched block end' do
10
+ inspect_source(cop,
11
+ ['test do |ala|',
12
+ ' end'
13
+ ])
14
+ expect(cop.messages)
15
+ .to eq(['end at 2, 2 is not aligned with test do |ala| at 1, 0'])
16
+ end
17
+
18
+ context 'when the block is a logical operand' do
19
+ it 'accepts a correctly aligned block end' do
20
+ inspect_source(cop,
21
+ ['(value.is_a? Array) && value.all? do |subvalue|',
22
+ ' type_check_value(subvalue, array_type)',
23
+ 'end',
24
+ 'a || b do',
25
+ 'end',
26
+ ])
27
+ expect(cop.offences).to be_empty
415
28
  end
416
29
  end
30
+
31
+ it 'accepts end aligned with a variable' do
32
+ inspect_source(cop,
33
+ ['variable = test do |ala|',
34
+ 'end'
35
+ ])
36
+ expect(cop.offences).to be_empty
37
+ end
38
+
39
+ context 'when there is an assignment chain' do
40
+ it 'registers an offence for an end aligned with the 2nd variable' do
41
+ inspect_source(cop,
42
+ ['a = b = c = test do |ala|',
43
+ ' end'
44
+ ])
45
+ expect(cop.messages)
46
+ .to eq(['end at 2, 4 is not aligned with a = b = c = test do |ala| at 1, 0'])
47
+ end
48
+
49
+ it 'accepts end aligned with the first variable' do
50
+ inspect_source(cop,
51
+ ['a = b = c = test do |ala|',
52
+ 'end',
53
+ ])
54
+ expect(cop.offences).to be_empty
55
+ end
56
+ end
57
+
58
+ context 'and the block is an operand' do
59
+ it 'accepts end aligned with a variable' do
60
+ inspect_source(cop,
61
+ ['b = 1 + preceding_line.reduce(0) do |a, e|',
62
+ ' a + e.length + newline_length',
63
+ 'end + 1'
64
+ ])
65
+ expect(cop.offences).to be_empty
66
+ end
67
+ end
68
+
69
+ it 'registers an offence for mismatched block end with a variable' do
70
+ inspect_source(cop,
71
+ ['variable = test do |ala|',
72
+ ' end'
73
+ ])
74
+ expect(cop.messages)
75
+ .to eq(['end at 2, 2 is not aligned with variable = test do |ala| at 1, 0'])
76
+ end
77
+
78
+ context 'when the block is defined on the next line' do
79
+ it 'accepts end aligned with the block expression' do
80
+ inspect_source(cop,
81
+ ['variable =',
82
+ ' a_long_method_that_dont_fit_on_the_line do |v|',
83
+ ' v.foo',
84
+ ' end'
85
+ ])
86
+ expect(cop.offences).to be_empty
87
+ end
88
+
89
+ it 'registers an offences for mismatched end alignment' do
90
+ inspect_source(cop,
91
+ ['variable =',
92
+ ' a_long_method_that_dont_fit_on_the_line do |v|',
93
+ ' v.foo',
94
+ 'end'
95
+ ])
96
+ expect(cop.messages)
97
+ .to eq(['end at 4, 0 is not aligned with a_long_method_that_dont_fit_on_the_line ' +
98
+ 'do |v| at 2, 2'])
99
+ end
100
+ end
101
+
102
+ context 'when the method part is a call chain that spans several lines' do
103
+ # Example from issue 346 of bbatsov/rubocop on github:
104
+ it 'accepts pretty alignment style' do
105
+ src = ['def foo(bar)',
106
+ ' bar.get_stuffs',
107
+ ' .reject do |stuff| ',
108
+ ' stuff.with_a_very_long_expression_that_doesnt_fit_the_line',
109
+ ' end.select do |stuff|',
110
+ ' stuff.another_very_long_expression_that_doesnt_fit_the_line',
111
+ ' end',
112
+ ' .select do |stuff|',
113
+ ' stuff.another_very_long_expression_that_doesnt_fit_the_line',
114
+ ' end',
115
+ 'end']
116
+ inspect_source(cop, src)
117
+ expect(cop.offences).to be_empty
118
+ end
119
+
120
+ it 'registers offences for misaligned ends' do
121
+ src = ['def foo(bar)',
122
+ ' bar.get_stuffs',
123
+ ' .reject do |stuff|',
124
+ ' stuff.with_a_very_long_expression_that_doesnt_fit_the_line',
125
+ ' end.select do |stuff|',
126
+ ' stuff.another_very_long_expression_that_doesnt_fit_the_line',
127
+ ' end',
128
+ ' .select do |stuff|',
129
+ ' stuff.another_very_long_expression_that_doesnt_fit_the_line',
130
+ ' end',
131
+ 'end']
132
+ inspect_source(cop, src)
133
+ expect(cop.messages)
134
+ .to eq(['end at 10, 8 is not aligned with bar.get_stuffs at 2, 2 or' +
135
+ ' .select do |stuff| at 8, 6',
136
+ 'end at 7, 4 is not aligned with bar.get_stuffs at 2, 2 or' +
137
+ ' end.select do |stuff| at 5, 8',
138
+ 'end at 5, 8 is not aligned with bar.get_stuffs at 2, 2 or' +
139
+ ' .reject do |stuff| at 3, 6'])
140
+ end
141
+
142
+ # Example from issue 393 of bbatsov/rubocop on github:
143
+ it 'accepts end indented as the start of the block' do
144
+ src = ['my_object.chaining_this_very_long_method(with_a_parameter)',
145
+ ' .and_one_with_a_block do',
146
+ ' do_something',
147
+ 'end',
148
+ '', # Other variant:
149
+ 'my_object.chaining_this_very_long_method(',
150
+ ' with_a_parameter).and_one_with_a_block do',
151
+ ' do_something',
152
+ 'end']
153
+ inspect_source(cop, src)
154
+ expect(cop.offences).to be_empty
155
+ end
156
+
157
+ # Example from issue 447 of bbatsov/rubocop on github:
158
+ it 'accepts two kinds of end alignment' do
159
+ src = [
160
+ # Aligned with start of line where do is:
161
+ 'params = default_options.merge(options)',
162
+ ' .delete_if { |k, v| v.nil? }',
163
+ ' .each_with_object({}) do |(k, v), new_hash|',
164
+ ' new_hash[k.to_s] = v.to_s',
165
+ ' end',
166
+ # Aligned with start of the whole expression:
167
+ 'params = default_options.merge(options)',
168
+ ' .delete_if { |k, v| v.nil? }',
169
+ ' .each_with_object({}) do |(k, v), new_hash|',
170
+ ' new_hash[k.to_s] = v.to_s',
171
+ 'end'
172
+ ]
173
+ inspect_source(cop, src)
174
+ expect(cop.offences).to be_empty
175
+ end
176
+ end
177
+
178
+ context 'when variables of a mass assignment spans several lines' do
179
+ it 'accepts end aligned with the variables' do
180
+ src = ['e,',
181
+ 'f = [5, 6].map do |i|',
182
+ ' i - 5',
183
+ 'end']
184
+ inspect_source(cop, src)
185
+ expect(cop.offences).to be_empty
186
+ end
187
+
188
+ it 'registers an offence for end aligned with the block' do
189
+ src = ['e,',
190
+ 'f = [5, 6].map do |i|',
191
+ ' i - 5',
192
+ ' end']
193
+ inspect_source(cop, src)
194
+ expect(cop.messages)
195
+ .to eq(['end at 4, 4 is not aligned with e, at 1, 0 or f = [5, 6].map do |i| at 2, 0'])
196
+ end
197
+ end
198
+
199
+ it 'accepts end aligned with an instance variable' do
200
+ inspect_source(cop,
201
+ ['@variable = test do |ala|',
202
+ 'end'
203
+ ])
204
+ expect(cop.offences).to be_empty
205
+ end
206
+
207
+ it 'registers an offence for mismatched block end with an instance variable' do
208
+ inspect_source(cop,
209
+ ['@variable = test do |ala|',
210
+ ' end'
211
+ ])
212
+ expect(cop.messages)
213
+ .to eq(['end at 2, 2 is not aligned with @variable = test do |ala| at 1, 0'])
214
+ end
215
+
216
+ it 'accepts end aligned with a class variable' do
217
+ inspect_source(cop,
218
+ ['@@variable = test do |ala|',
219
+ 'end'
220
+ ])
221
+ expect(cop.offences).to be_empty
222
+ end
223
+
224
+ it 'registers an offence for mismatched block end with a class variable' do
225
+ inspect_source(cop,
226
+ ['@@variable = test do |ala|',
227
+ ' end'
228
+ ])
229
+ expect(cop.messages)
230
+ .to eq(['end at 2, 2 is not aligned with @@variable = test do |ala| at 1, 0'])
231
+ end
232
+
233
+ it 'accepts end aligned with a global variable' do
234
+ inspect_source(cop,
235
+ ['$variable = test do |ala|',
236
+ 'end'
237
+ ])
238
+ expect(cop.offences).to be_empty
239
+ end
240
+
241
+ it 'registers an offence for mismatched block end with a global variable' do
242
+ inspect_source(cop,
243
+ ['$variable = test do |ala|',
244
+ ' end'
245
+ ])
246
+ expect(cop.messages)
247
+ .to eq(['end at 2, 2 is not aligned with $variable = test do |ala| at 1, 0'])
248
+ end
249
+
250
+ it 'accepts end aligned with a constant' do
251
+ inspect_source(cop,
252
+ ['CONSTANT = test do |ala|',
253
+ 'end'
254
+ ])
255
+ expect(cop.offences).to be_empty
256
+ end
257
+
258
+ it 'registers an offence for mismatched block end with a constant' do
259
+ inspect_source(cop,
260
+ ['Module::CONSTANT = test do |ala|',
261
+ ' end'
262
+ ])
263
+ expect(cop.messages)
264
+ .to eq(['end at 2, 2 is not aligned with Module::CONSTANT = test do |ala| at 1, 0'])
265
+ end
266
+
267
+ it 'accepts end aligned with a method call' do
268
+ inspect_source(cop,
269
+ ['parser.childs << lambda do |token|',
270
+ ' token << 1',
271
+ 'end'
272
+ ])
273
+ expect(cop.offences).to be_empty
274
+ end
275
+
276
+ it 'registers an offence for mismatched block end with a method call' do
277
+ inspect_source(cop,
278
+ ['parser.childs << lambda do |token|',
279
+ ' token << 1',
280
+ ' end'
281
+ ])
282
+ expect(cop.messages)
283
+ .to eq(['end at 3, 2 is not aligned with parser.childs << lambda do |token| at 1, 0'])
284
+ end
285
+
286
+ it 'accepts end aligned with a method call with arguments' do
287
+ inspect_source(cop,
288
+ ['@h[:f] = f.each_pair.map do |f, v|',
289
+ ' v = 1',
290
+ 'end'
291
+ ])
292
+ expect(cop.offences).to be_empty
293
+ end
294
+
295
+ it 'registers an offence for mismatched end with a method call with arguments' do
296
+ inspect_source(cop,
297
+ ['@h[:f] = f.each_pair.map do |f, v|',
298
+ ' v = 1',
299
+ ' end'
300
+ ])
301
+ expect(cop.messages)
302
+ .to eq(['end at 3, 2 is not aligned with @h[:f] = f.each_pair.map do |f, v| at 1, 0'])
303
+ end
304
+
305
+ it 'does not raise an error for nested block in a method call' do
306
+ inspect_source(cop,
307
+ ['expect(arr.all? { |o| o.valid? })'
308
+ ])
309
+ expect(cop.offences).to be_empty
310
+ end
311
+
312
+ it 'accepts end aligned with the block when the block is a method argument' do
313
+ inspect_source(cop,
314
+ ['expect(arr.all? do |o|',
315
+ ' o.valid?',
316
+ ' end)'
317
+ ])
318
+ expect(cop.offences).to be_empty
319
+ end
320
+
321
+ it 'registers an offence for mismatched end not aligned with the block that is an argument' do
322
+ inspect_source(cop,
323
+ ['expect(arr.all? do |o|',
324
+ ' o.valid?',
325
+ ' end)'
326
+ ])
327
+ expect(cop.messages)
328
+ .to eq(['end at 3, 2 is not aligned with arr.all? do |o| at 1, 7 or ' +
329
+ 'expect(arr.all? do |o| at 1, 0'])
330
+ end
331
+
332
+ it 'accepts end aligned with an op-asgn (+=, -=)' do
333
+ inspect_source(cop,
334
+ ['rb += files.select do |file|',
335
+ ' file << something',
336
+ 'end'
337
+ ])
338
+ expect(cop.offences).to be_empty
339
+ end
340
+
341
+ it 'registers an offence for mismatched block end with an op-asgn (+=, -=)' do
342
+ inspect_source(cop,
343
+ ['rb += files.select do |file|',
344
+ ' file << something',
345
+ ' end'
346
+ ])
347
+ expect(cop.messages)
348
+ .to eq(['end at 3, 2 is not aligned with rb at 1, 0'])
349
+ end
350
+
351
+ it 'accepts end aligned with an and-asgn (&&=)' do
352
+ inspect_source(cop,
353
+ ['variable &&= test do |ala|',
354
+ 'end'
355
+ ])
356
+ expect(cop.offences).to be_empty
357
+ end
358
+
359
+ it 'registers an offence for mismatched block end with an and-asgn (&&=)' do
360
+ inspect_source(cop,
361
+ ['variable &&= test do |ala|',
362
+ ' end'
363
+ ])
364
+ expect(cop.messages)
365
+ .to eq(['end at 2, 2 is not aligned with variable &&= test do |ala| at 1, 0'])
366
+ end
367
+
368
+ it 'accepts end aligned with an or-asgn (||=)' do
369
+ inspect_source(cop,
370
+ ['variable ||= test do |ala|',
371
+ 'end'
372
+ ])
373
+ expect(cop.offences).to be_empty
374
+ end
375
+
376
+ it 'registers an offence for mismatched block end with an or-asgn (||=)' do
377
+ inspect_source(cop,
378
+ ['variable ||= test do |ala|',
379
+ ' end'
380
+ ])
381
+ expect(cop.messages)
382
+ .to eq(['end at 2, 2 is not aligned with variable ||= test do |ala| at 1, 0'])
383
+ end
384
+
385
+ it 'accepts end aligned with a mass assignment' do
386
+ inspect_source(cop,
387
+ ['var1, var2 = lambda do |test|',
388
+ ' [1, 2]',
389
+ 'end'
390
+ ])
391
+ expect(cop.offences).to be_empty
392
+ end
393
+
394
+ it 'accepts end aligned with a call chain left hand side' do
395
+ inspect_source(cop,
396
+ ['parser.diagnostics.consumer = lambda do |diagnostic|',
397
+ ' diagnostics << diagnostic',
398
+ 'end'])
399
+ expect(cop.offences).to be_empty
400
+ end
401
+
402
+ it 'registers an offence for mismatched block end with a mass assignment' do
403
+ inspect_source(cop,
404
+ ['var1, var2 = lambda do |test|',
405
+ ' [1, 2]',
406
+ ' end'
407
+ ])
408
+ expect(cop.messages)
409
+ .to eq(['end at 3, 2 is not aligned with var1, var2 at 1, 0'])
410
+ end
417
411
  end