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,107 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
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)
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,411 @@
1
+ # encoding: utf-8
2
+ # rubocop:disable LineLength
3
+
4
+ require 'spec_helper'
5
+
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
28
+ end
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 5, 8 is not aligned with bar.get_stuffs at 2, 2 or' \
135
+ ' .reject do |stuff| at 3, 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 10, 8 is not aligned with bar.get_stuffs at 2, 2 or' \
139
+ ' .select do |stuff| at 8, 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
411
+ end