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,207 +2,221 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- module Rubocop
6
- module Cop
7
- module Style
8
- describe AlignParameters do
9
- subject(:align) { AlignParameters.new }
10
-
11
- it 'registers an offence for parameters with single indent' do
12
- inspect_source(align, ['function(a,',
13
- ' if b then c else d end)'])
14
- expect(align.offences.size).to eq(1)
15
- end
16
-
17
- it 'registers an offence for parameters with double indent' do
18
- inspect_source(align, ['function(a,',
19
- ' if b then c else d end)'])
20
- expect(align.offences.size).to eq(1)
21
- end
22
-
23
- it 'accepts multiline []= method call' do
24
- inspect_source(align, ['Test.config["something"] =',
25
- ' true'])
26
- expect(align.offences).to be_empty
27
- end
28
-
29
- it 'accepts correctly aligned parameters' do
30
- inspect_source(align, ['function(a,',
31
- ' 0, 1,',
32
- ' (x + y),',
33
- ' if b then c else d end)'])
34
- expect(align.offences).to be_empty
35
- end
36
-
37
- it 'accepts calls that only span one line' do
38
- inspect_source(align, ['find(path, s, @special[sexp[0]])'])
39
- expect(align.offences).to be_empty
40
- end
41
-
42
- it "doesn't get confused by a symbol argument" do
43
- inspect_source(align,
44
- ['add_offence(:convention, index,',
45
- ' MSG % kind)'])
46
- expect(align.offences).to be_empty
47
- end
48
-
49
- it "doesn't get confused by splat operator" do
50
- inspect_source(align,
51
- ['func1(*a,',
52
- ' *b,',
53
- ' c)',
54
- 'func2(a,',
55
- ' *b,',
56
- ' c)',
57
- 'func3(*a)',
58
- ])
59
- expect(align.offences.map(&:to_s)).to eq(
60
- ['C: 5: 6: Align the parameters of a method call if they span ' +
61
- 'more than one line.'])
62
- end
63
-
64
- it "doesn't get confused by extra comma at the end" do
65
- inspect_source(align,
66
- ['func1(a,',
67
- ' b,)'])
68
- expect(align.offences.map(&:to_s)).to eq(
69
- ['C: 2: 6: Align the parameters of a method call if they span ' +
70
- 'more than one line.'])
71
- end
72
-
73
- it 'can handle a correctly aligned string literal as first argument' do
74
- inspect_source(align,
75
- ['add_offence(:convention, x,',
76
- ' a)'])
77
- expect(align.offences).to be_empty
78
- end
79
-
80
- it 'can handle a string literal as other argument' do
81
- inspect_source(align,
82
- ['add_offence(:convention,',
83
- ' "", a)'])
84
- expect(align.offences).to be_empty
85
- end
86
-
87
- it "doesn't get confused by a line break inside a parameter" do
88
- inspect_source(align,
89
- ['read(path, { headers: true,',
90
- ' converters: :numeric })'])
91
- expect(align.offences).to be_empty
92
- end
93
-
94
- it "doesn't get confused by symbols with embedded expressions" do
95
- inspect_source(align,
96
- ['send(:"#{name}_comments_path")'])
97
- expect(align.offences).to be_empty
98
- end
99
-
100
- it "doesn't get confused by regexen with embedded expressions" do
101
- inspect_source(align,
102
- ['a(/#{name}/)'])
103
- expect(align.offences).to be_empty
104
- end
105
-
106
- it 'accepts braceless hashes' do
107
- inspect_source(align,
108
- ['run(collection, :entry_name => label,',
109
- ' :paginator => paginator)'])
110
- expect(align.offences).to be_empty
111
- end
112
-
113
- it 'accepts the first parameter being on a new row' do
114
- inspect_source(align,
115
- [' match(',
116
- ' a,',
117
- ' b',
118
- ' )'])
119
- expect(align.offences).to be_empty
120
- end
121
-
122
- it 'can handle heredoc strings' do
123
- src = ['class_eval(<<-EOS, __FILE__, __LINE__ + 1)',
124
- ' def run_#{name}_callbacks(*args)',
125
- ' a = 1',
126
- ' return value',
127
- ' end',
128
- ' EOS']
129
- inspect_source(align, src)
130
- expect(align.offences).to be_empty
131
- end
132
-
133
- it 'can handle a method call within a method call' do
134
- inspect_source(align,
135
- ['a(a1,',
136
- ' b(b1,',
137
- ' b2),',
138
- ' a2)'])
139
- expect(align.offences).to be_empty
140
- end
141
-
142
- it 'can handle a call embedded in a string' do
143
- inspect_source(align,
144
- ['model("#{index(name)}", child)'])
145
- expect(align.offences).to be_empty
146
- end
147
-
148
- it 'can handle do-end' do
149
- inspect_source(align,
150
- [' run(lambda do |e|',
151
- " w = e['warden']",
152
- ' end)'])
153
- expect(align.offences).to be_empty
154
- end
155
-
156
- it 'can handle a call with a block inside another call' do
157
- src = ['new(table_name,',
158
- ' exec_query("info(\'#{row[\'name\']}\')").map { |col|',
159
- " col['name']",
160
- ' })']
161
- inspect_source(align, src)
162
- expect(align.offences).to be_empty
163
- end
164
-
165
- it 'can handle a ternary condition with a block reference' do
166
- src = ['cond ? a : func(&b)']
167
- inspect_source(align, src)
168
- expect(align.offences).to be_empty
169
- end
170
-
171
- it 'can handle parentheses used with no parameters' do
172
- src = ['func()']
173
- inspect_source(align, src)
174
- expect(align.offences).to be_empty
175
- end
176
-
177
- it 'can handle a multiline hash as second parameter' do
178
- src = ['tag(:input, {',
179
- ' :value => value',
180
- '})']
181
- inspect_source(align, src)
182
- expect(align.offences).to be_empty
183
- end
184
-
185
- it 'can handle method calls without parentheses' do
186
- src = ['a(b c, d)']
187
- inspect_source(align, src)
188
- expect(align.offences).to be_empty
189
- end
190
-
191
- it 'can handle other method calls without parentheses' do
192
- src = ['chars(Unicode.apply_mapping @wrapped_string, :uppercase)']
193
- inspect_source(align, src)
194
- expect(align.offences).to be_empty
195
- end
196
-
197
- it 'auto-corrects alignment' do
198
- new_source = autocorrect_source(align, ['func(a,',
199
- ' b,',
200
- 'c)'])
201
- expect(new_source.split("\n")).to eq(['func(a,',
202
- ' b,',
203
- ' c)'])
204
- end
205
- end
206
- end
5
+ describe Rubocop::Cop::Style::AlignParameters do
6
+ subject(:cop) { described_class.new }
7
+
8
+ it 'registers an offence for parameters with single indent' do
9
+ inspect_source(cop, ['function(a,',
10
+ ' if b then c else d end)'])
11
+ expect(cop.offences.size).to eq(1)
12
+ expect(cop.highlights).to eq(['if b then c else d end'])
13
+ end
14
+
15
+ it 'registers an offence for parameters with double indent' do
16
+ inspect_source(cop, ['function(a,',
17
+ ' if b then c else d end)'])
18
+ expect(cop.offences.size).to eq(1)
19
+ end
20
+
21
+ it 'accepts multiline []= method call' do
22
+ inspect_source(cop, ['Test.config["something"] =',
23
+ ' true'])
24
+ expect(cop.offences).to be_empty
25
+ end
26
+
27
+ it 'accepts correctly aligned parameters' do
28
+ inspect_source(cop, ['function(a,',
29
+ ' 0, 1,',
30
+ ' (x + y),',
31
+ ' if b then c else d end)'])
32
+ expect(cop.offences).to be_empty
33
+ end
34
+
35
+ it 'accepts calls that only span one line' do
36
+ inspect_source(cop, ['find(path, s, @special[sexp[0]])'])
37
+ expect(cop.offences).to be_empty
38
+ end
39
+
40
+ it "doesn't get confused by a symbol argument" do
41
+ inspect_source(cop, ['add_offence(:convention, index,',
42
+ ' MSG % kind)'])
43
+ expect(cop.offences).to be_empty
44
+ end
45
+
46
+ it "doesn't get confused by splat operator" do
47
+ inspect_source(cop, ['func1(*a,',
48
+ ' *b,',
49
+ ' c)',
50
+ 'func2(a,',
51
+ ' *b,',
52
+ ' c)',
53
+ 'func3(*a)',
54
+ ])
55
+ expect(cop.offences.map(&:to_s))
56
+ .to eq(['C: 5: 6: Align the parameters of a method call if ' +
57
+ 'they span more than one line.'])
58
+ expect(cop.highlights).to eq(['*b'])
59
+ end
60
+
61
+ it "doesn't get confused by extra comma at the end" do
62
+ inspect_source(cop, ['func1(a,',
63
+ ' b,)'])
64
+ expect(cop.offences.map(&:to_s))
65
+ .to eq(['C: 2: 6: Align the parameters of a method call if ' +
66
+ 'they span more than one line.'])
67
+ expect(cop.highlights).to eq(['b'])
68
+ end
69
+
70
+ it 'can handle a correctly aligned string literal as first argument' do
71
+ inspect_source(cop, ['add_offence(:convention, x,',
72
+ ' a)'])
73
+ expect(cop.offences).to be_empty
74
+ end
75
+
76
+ it 'can handle a string literal as other argument' do
77
+ inspect_source(cop, ['add_offence(:convention,',
78
+ ' "", a)'])
79
+ expect(cop.offences).to be_empty
80
+ end
81
+
82
+ it "doesn't get confused by a line break inside a parameter" do
83
+ inspect_source(cop, ['read(path, { headers: true,',
84
+ ' converters: :numeric })'])
85
+ expect(cop.offences).to be_empty
86
+ end
87
+
88
+ it "doesn't get confused by symbols with embedded expressions" do
89
+ inspect_source(cop, ['send(:"#{name}_comments_path")'])
90
+ expect(cop.offences).to be_empty
91
+ end
92
+
93
+ it "doesn't get confused by regexen with embedded expressions" do
94
+ inspect_source(cop, ['a(/#{name}/)'])
95
+ expect(cop.offences).to be_empty
96
+ end
97
+
98
+ it 'accepts braceless hashes' do
99
+ inspect_source(cop, ['run(collection, :entry_name => label,',
100
+ ' :paginator => paginator)'])
101
+ expect(cop.offences).to be_empty
102
+ end
103
+
104
+ it 'accepts the first parameter being on a new row' do
105
+ inspect_source(cop, [' match(',
106
+ ' a,',
107
+ ' b',
108
+ ' )'])
109
+ expect(cop.offences).to be_empty
110
+ end
111
+
112
+ it 'can handle heredoc strings' do
113
+ inspect_source(cop, ['class_eval(<<-EOS, __FILE__, __LINE__ + 1)',
114
+ ' def run_#{name}_callbacks(*args)',
115
+ ' a = 1',
116
+ ' return value',
117
+ ' end',
118
+ ' EOS'])
119
+ expect(cop.offences).to be_empty
120
+ end
121
+
122
+ it 'can handle a method call within a method call' do
123
+ inspect_source(cop, ['a(a1,',
124
+ ' b(b1,',
125
+ ' b2),',
126
+ ' a2)'])
127
+ expect(cop.offences).to be_empty
128
+ end
129
+
130
+ it 'can handle a call embedded in a string' do
131
+ inspect_source(cop, ['model("#{index(name)}", child)'])
132
+ expect(cop.offences).to be_empty
133
+ end
134
+
135
+ it 'can handle do-end' do
136
+ inspect_source(cop, [' run(lambda do |e|',
137
+ " w = e['warden']",
138
+ ' end)'])
139
+ expect(cop.offences).to be_empty
140
+ end
141
+
142
+ it 'can handle a call with a block inside another call' do
143
+ src = ['new(table_name,',
144
+ ' exec_query("info(\'#{row[\'name\']}\')").map { |col|',
145
+ " col['name']",
146
+ ' })']
147
+ inspect_source(cop, src)
148
+ expect(cop.offences).to be_empty
149
+ end
150
+
151
+ it 'can handle a ternary condition with a block reference' do
152
+ inspect_source(cop, ['cond ? a : func(&b)'])
153
+ expect(cop.offences).to be_empty
154
+ end
155
+
156
+ it 'can handle parentheses used with no parameters' do
157
+ inspect_source(cop, ['func()'])
158
+ expect(cop.offences).to be_empty
159
+ end
160
+
161
+ it 'can handle a multiline hash as second parameter' do
162
+ inspect_source(cop, ['tag(:input, {',
163
+ ' :value => value',
164
+ '})'])
165
+ expect(cop.offences).to be_empty
166
+ end
167
+
168
+ it 'can handle method calls without parentheses' do
169
+ inspect_source(cop, ['a(b c, d)'])
170
+ expect(cop.offences).to be_empty
171
+ end
172
+
173
+ it 'can handle other method calls without parentheses' do
174
+ src = ['chars(Unicode.apply_mapping @wrapped_string, :uppercase)']
175
+ inspect_source(cop, src)
176
+ expect(cop.offences).to be_empty
177
+ end
178
+
179
+ it 'auto-corrects alignment' do
180
+ new_source = autocorrect_source(cop, ['func(a,',
181
+ ' b,',
182
+ 'c)'])
183
+ expect(new_source).to eq(['func(a,',
184
+ ' b,',
185
+ ' c)'].join("\n"))
186
+ end
187
+
188
+ it 'auto-corrects each line of a multi-line parameter to the right' do
189
+ new_source =
190
+ autocorrect_source(cop,
191
+ ['create :transaction, :closed,',
192
+ ' account: account,',
193
+ ' open_price: 1.29,',
194
+ ' close_price: 1.30'])
195
+ expect(new_source)
196
+ .to eq(['create :transaction, :closed,',
197
+ ' account: account,',
198
+ ' open_price: 1.29,',
199
+ ' close_price: 1.30'].join("\n"))
200
+ end
201
+
202
+ it 'auto-corrects each line of a multi-line parameter to the left' do
203
+ new_source =
204
+ autocorrect_source(cop,
205
+ ['create :transaction, :closed,',
206
+ ' account: account,',
207
+ ' open_price: 1.29,',
208
+ ' close_price: 1.30'])
209
+ expect(new_source)
210
+ .to eq(['create :transaction, :closed,',
211
+ ' account: account,',
212
+ ' open_price: 1.29,',
213
+ ' close_price: 1.30'].join("\n"))
214
+ end
215
+
216
+ it 'auto-corrects only parameters that begin a line' do
217
+ original_source = ['foo(:bar, {',
218
+ ' whiz: 2, bang: 3 }, option: 3)']
219
+ new_source = autocorrect_source(cop, original_source)
220
+ expect(new_source).to eq(original_source.join("\n"))
207
221
  end
208
222
  end
@@ -2,60 +2,56 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- module Rubocop
6
- module Cop
7
- module Style
8
- describe AndOr do
9
- subject(:cop) { AndOr.new }
10
-
11
- it 'registers an offence for OR' do
12
- inspect_source(cop,
13
- ['test if a or b'])
14
- expect(cop.offences.size).to eq(1)
15
- expect(cop.messages).to eq(['Use || instead of or.'])
16
- end
17
-
18
- it 'registers an offence for AND' do
19
- inspect_source(cop,
20
- ['test if a and b'])
21
- expect(cop.offences.size).to eq(1)
22
- expect(cop.messages).to eq(['Use && instead of and.'])
23
- end
24
-
25
- it 'accepts ||' do
26
- inspect_source(cop,
27
- ['test if a || b'])
28
- expect(cop.offences).to be_empty
29
- end
30
-
31
- it 'accepts &&' do
32
- inspect_source(cop,
33
- ['test if a && b'])
34
- expect(cop.offences).to be_empty
35
- end
36
-
37
- it 'auto-corrects "and" with &&' do
38
- new_source = autocorrect_source(cop, 'true and false')
39
- expect(new_source).to eq('true && false')
40
- end
41
-
42
- it 'auto-corrects "or" with ||' do
43
- new_source = autocorrect_source(cop, 'true or false')
44
- expect(new_source).to eq('true || false')
45
- end
46
-
47
- it 'leaves *or* as is if auto-correction changes the meaning' do
48
- src = "teststring.include? 'a' or teststring.include? 'b'"
49
- new_source = autocorrect_source(cop, src)
50
- expect(new_source).to eq(src)
51
- end
52
-
53
- it 'leaves *and* as is if auto-correction changes the meaning' do
54
- src = 'x = a + b and return x'
55
- new_source = autocorrect_source(cop, src)
56
- expect(new_source).to eq(src)
57
- end
58
- end
59
- end
5
+ describe Rubocop::Cop::Style::AndOr do
6
+ subject(:cop) { described_class.new }
7
+
8
+ it 'registers an offence for OR' do
9
+ inspect_source(cop,
10
+ ['test if a or b'])
11
+ expect(cop.offences.size).to eq(1)
12
+ expect(cop.messages).to eq(['Use || instead of or.'])
13
+ end
14
+
15
+ it 'registers an offence for AND' do
16
+ inspect_source(cop,
17
+ ['test if a and b'])
18
+ expect(cop.offences.size).to eq(1)
19
+ expect(cop.messages).to eq(['Use && instead of and.'])
20
+ end
21
+
22
+ it 'accepts ||' do
23
+ inspect_source(cop,
24
+ ['test if a || b'])
25
+ expect(cop.offences).to be_empty
26
+ end
27
+
28
+ it 'accepts &&' do
29
+ inspect_source(cop,
30
+ ['test if a && b'])
31
+ expect(cop.offences).to be_empty
32
+ end
33
+
34
+ it 'auto-corrects "and" with &&' do
35
+ new_source = autocorrect_source(cop, 'true and false')
36
+ expect(new_source).to eq('true && false')
37
+ end
38
+
39
+ it 'auto-corrects "or" with ||' do
40
+ new_source = autocorrect_source(cop, ['x = 12345',
41
+ 'true or false'])
42
+ expect(new_source).to eq(['x = 12345',
43
+ 'true || false'].join("\n"))
44
+ end
45
+
46
+ it 'leaves *or* as is if auto-correction changes the meaning' do
47
+ src = "teststring.include? 'a' or teststring.include? 'b'"
48
+ new_source = autocorrect_source(cop, src)
49
+ expect(new_source).to eq(src)
50
+ end
51
+
52
+ it 'leaves *and* as is if auto-correction changes the meaning' do
53
+ src = 'x = a + b and return x'
54
+ new_source = autocorrect_source(cop, src)
55
+ expect(new_source).to eq(src)
60
56
  end
61
57
  end