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,99 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Style::Blocks do
6
+ subject(:cop) { described_class.new }
7
+
8
+ it 'accepts a multiline block with do-end' do
9
+ inspect_source(cop, ['each do |x|',
10
+ 'end'])
11
+ expect(cop.offences).to be_empty
12
+ end
13
+
14
+ it 'registers an offence for a single line block with do-end' do
15
+ inspect_source(cop, ['each do |x| end'])
16
+ expect(cop.messages)
17
+ .to eq(['Prefer {...} over do...end for single-line blocks.'])
18
+ end
19
+
20
+ it 'accepts a single line block with braces' do
21
+ inspect_source(cop, ['each { |x| }'])
22
+ expect(cop.offences).to be_empty
23
+ end
24
+
25
+ it 'auto-corrects do and end for single line blocks to { and }' do
26
+ new_source = autocorrect_source(cop, 'block do |x| end')
27
+ expect(new_source).to eq('block { |x| }')
28
+ end
29
+
30
+ context 'when there are braces around a multi-line block' do
31
+ it 'registers an offence in the simple case' do
32
+ inspect_source(cop, ['each { |x|',
33
+ '}'])
34
+ expect(cop.messages)
35
+ .to eq(['Avoid using {...} for multi-line blocks.'])
36
+ end
37
+
38
+ it 'accepts braces if do-end would change the meaning' do
39
+ src = ['scope :foo, lambda { |f|',
40
+ ' where(condition: "value")',
41
+ '}',
42
+ '',
43
+ 'expect { something }.to raise_error(ErrorClass) { |error|',
44
+ ' # ...',
45
+ '}',
46
+ '',
47
+ 'expect { x }.to change {',
48
+ ' Counter.count',
49
+ '}.from(0).to(1)']
50
+ inspect_source(cop, src)
51
+ expect(cop.offences).to be_empty
52
+ end
53
+
54
+ it 'registers an offence for braces if do-end would not change ' \
55
+ 'the meaning' do
56
+ src = ['scope :foo, (lambda { |f|',
57
+ ' where(condition: "value")',
58
+ '})',
59
+ '',
60
+ 'expect { something }.to(raise_error(ErrorClass) { |error|',
61
+ ' # ...',
62
+ '})']
63
+ inspect_source(cop, src)
64
+ expect(cop.offences.size).to eq(2)
65
+ end
66
+
67
+ it 'can handle special method names such as []= and done?' do
68
+ src = ['h2[k2] = Hash.new { |h3,k3|',
69
+ ' h3[k3] = 0',
70
+ '}',
71
+ '',
72
+ 'x = done? list.reject { |e|',
73
+ ' e.nil?',
74
+ '}']
75
+ inspect_source(cop, src)
76
+ expect(cop.messages)
77
+ .to eq(['Avoid using {...} for multi-line blocks.'])
78
+ end
79
+
80
+ it 'auto-corrects { and } to do and end' do
81
+ source = <<-END.strip_indent
82
+ each{ |x|
83
+ some_method
84
+ other_method
85
+ }
86
+ END
87
+
88
+ expected_source = <<-END.strip_indent
89
+ each do |x|
90
+ some_method
91
+ other_method
92
+ end
93
+ END
94
+
95
+ new_source = autocorrect_source(cop, source)
96
+ expect(new_source).to eq(expected_source)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,284 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Style::BracesAroundHashParameters, :config do
6
+ subject(:cop) { described_class.new(config) }
7
+
8
+ context 'no_braces' do
9
+ let(:cop_config) do
10
+ { 'EnforcedStyle' => 'no_braces' }
11
+ end
12
+
13
+ describe 'accepts' do
14
+ it 'one non-hash parameter' do
15
+ inspect_source(cop, ['where(2)'])
16
+ expect(cop.messages).to be_empty
17
+ expect(cop.highlights).to be_empty
18
+ end
19
+
20
+ it 'one empty hash parameter' do
21
+ inspect_source(cop, ['where({})'])
22
+ expect(cop.messages).to be_empty
23
+ expect(cop.highlights).to be_empty
24
+ end
25
+
26
+ it 'one hash parameter with separators' do
27
+ inspect_source(cop, ["where( { \n }\t ) "])
28
+ expect(cop.messages).to be_empty
29
+ expect(cop.highlights).to be_empty
30
+ end
31
+
32
+ it 'multiple non-hash parameters' do
33
+ inspect_source(cop, ['where(1, "2")'])
34
+ expect(cop.messages).to be_empty
35
+ expect(cop.highlights).to be_empty
36
+ end
37
+
38
+ it 'one hash parameter without braces' do
39
+ inspect_source(cop, ['where(x: "y")'])
40
+ expect(cop.messages).to be_empty
41
+ expect(cop.highlights).to be_empty
42
+ end
43
+
44
+ it 'one hash parameter without braces and multiple keys' do
45
+ inspect_source(cop, ['where(x: "y", foo: "bar")'])
46
+ expect(cop.messages).to be_empty
47
+ expect(cop.highlights).to be_empty
48
+ end
49
+
50
+ it 'one hash parameter without braces and one hash value' do
51
+ inspect_source(cop, ['where(x: { "y" => "z" })'])
52
+ expect(cop.messages).to be_empty
53
+ expect(cop.highlights).to be_empty
54
+ end
55
+
56
+ it 'multiple hash parameters with braces' do
57
+ inspect_source(cop, ['where({ x: 1 }, { y: 2 })'])
58
+ expect(cop.messages).to be_empty
59
+ expect(cop.highlights).to be_empty
60
+ end
61
+
62
+ it 'property assignment with braces' do
63
+ inspect_source(cop, ['x.z = { y: "z" }'])
64
+ expect(cop.messages).to be_empty
65
+ expect(cop.highlights).to be_empty
66
+ end
67
+
68
+ it 'operator with a hash parameter with braces' do
69
+ inspect_source(cop, ['x.z - { y: "z" }'])
70
+ expect(cop.messages).to be_empty
71
+ expect(cop.highlights).to be_empty
72
+ end
73
+
74
+ end
75
+
76
+ describe 'registers an offence for' do
77
+ it 'one non-hash parameter followed by a hash parameter with braces' do
78
+ inspect_source(cop, ['where(1, { y: 2 })'])
79
+ expect(cop.messages).to eq([
80
+ 'Redundant curly braces around a hash parameter.'
81
+ ])
82
+ expect(cop.highlights).to eq(['{ y: 2 }'])
83
+ expect(cop.config_to_allow_offences).to eq('EnforcedStyle' => 'braces')
84
+ end
85
+
86
+ it 'correct + opposite style' do
87
+ inspect_source(cop, ['where(1, y: 2)',
88
+ 'where(1, { y: 2 })'])
89
+ expect(cop.messages).to eq([
90
+ 'Redundant curly braces around a hash parameter.'
91
+ ])
92
+ expect(cop.config_to_allow_offences).to eq('Enabled' => false)
93
+ end
94
+
95
+ it 'opposite + correct style' do
96
+ inspect_source(cop, ['where(1, { y: 2 })',
97
+ 'where(1, y: 2)'])
98
+ expect(cop.messages).to eq([
99
+ 'Redundant curly braces around a hash parameter.'
100
+ ])
101
+ expect(cop.config_to_allow_offences).to eq('Enabled' => false)
102
+ end
103
+
104
+ it 'one object method hash parameter with braces' do
105
+ inspect_source(cop, ['x.func({ y: "z" })'])
106
+ expect(cop.messages).to eq([
107
+ 'Redundant curly braces around a hash parameter.'
108
+ ])
109
+ expect(cop.highlights).to eq(['{ y: "z" }'])
110
+ end
111
+
112
+ it 'one hash parameter with braces' do
113
+ inspect_source(cop, ['where({ x: 1 })'])
114
+ expect(cop.messages).to eq([
115
+ 'Redundant curly braces around a hash parameter.'
116
+ ])
117
+ expect(cop.highlights).to eq(['{ x: 1 }'])
118
+ end
119
+
120
+ it 'one hash parameter with braces and separators' do
121
+ inspect_source(cop, ["where( \n { x: 1 } )"])
122
+ expect(cop.messages).to eq([
123
+ 'Redundant curly braces around a hash parameter.'
124
+ ])
125
+ expect(cop.highlights).to eq(['{ x: 1 }'])
126
+ end
127
+
128
+ it 'one hash parameter with braces and multiple keys' do
129
+ inspect_source(cop, ['where({ x: 1, foo: "bar" })'])
130
+ expect(cop.messages).to eq([
131
+ 'Redundant curly braces around a hash parameter.'
132
+ ])
133
+ expect(cop.highlights).to eq(['{ x: 1, foo: "bar" }'])
134
+ end
135
+ end
136
+
137
+ describe 'auto-corrects' do
138
+ it 'one non-hash parameter followed by a hash parameter with braces' do
139
+ corrected = autocorrect_source(cop, ['where(1, { y: 2 })'])
140
+ expect(corrected).to eq 'where(1, y: 2 )'
141
+ end
142
+
143
+ it 'one object method hash parameter with braces' do
144
+ corrected = autocorrect_source(cop, ['x.func({ y: "z" })'])
145
+ expect(corrected).to eq 'x.func( y: "z" )'
146
+ end
147
+
148
+ it 'one hash parameter with braces' do
149
+ corrected = autocorrect_source(cop, ['where({ x: 1 })'])
150
+ expect(corrected).to eq 'where( x: 1 )'
151
+ end
152
+
153
+ it 'one hash parameter with braces and separators' do
154
+ corrected = autocorrect_source(cop, ["where( \n { x: 1 } )"])
155
+ expect(corrected).to eq "where( \n x: 1 )"
156
+ end
157
+
158
+ it 'one hash parameter with braces and multiple keys' do
159
+ corrected = autocorrect_source(cop, ['where({ x: 1, foo: "bar" })'])
160
+ expect(corrected).to eq 'where( x: 1, foo: "bar" )'
161
+ end
162
+
163
+ it 'one hash parameter with braces and a trailing comma' do
164
+ corrected = autocorrect_source(cop, ['where({ x: 1, y: 2, })'])
165
+ expect(corrected).to eq 'where( x: 1, y: 2 )'
166
+ end
167
+ end
168
+ end
169
+
170
+ context 'braces' do
171
+ let(:cop_config) do
172
+ { 'EnforcedStyle' => 'braces' }
173
+ end
174
+
175
+ describe 'accepts' do
176
+ it 'an empty hash parameter' do
177
+ inspect_source(cop, ['where({})'])
178
+ expect(cop.messages).to be_empty
179
+ expect(cop.highlights).to be_empty
180
+ end
181
+
182
+ it 'one non-hash parameter' do
183
+ inspect_source(cop, ['where(2)'])
184
+ expect(cop.messages).to be_empty
185
+ expect(cop.highlights).to be_empty
186
+ end
187
+
188
+ it 'multiple non-hash parameters' do
189
+ inspect_source(cop, ['where(1, "2")'])
190
+ expect(cop.messages).to be_empty
191
+ expect(cop.highlights).to be_empty
192
+ end
193
+
194
+ it 'one hash parameter with braces' do
195
+ inspect_source(cop, ['where({ x: 1 })'])
196
+ expect(cop.messages).to be_empty
197
+ expect(cop.highlights).to be_empty
198
+ end
199
+
200
+ it 'multiple hash parameters with braces' do
201
+ inspect_source(cop, ['where({ x: 1 }, { y: 2 })'])
202
+ expect(cop.messages).to be_empty
203
+ expect(cop.highlights).to be_empty
204
+ end
205
+
206
+ it 'one hash parameter with braces and spaces around it' do
207
+ inspect_source(cop, [
208
+ 'where( { x: 1 } )'
209
+ ])
210
+ expect(cop.messages).to be_empty
211
+ expect(cop.highlights).to be_empty
212
+ end
213
+
214
+ it 'one hash parameter with braces and separators around it' do
215
+ inspect_source(cop, ["where( \t { x: 1 \n } )"])
216
+ expect(cop.messages).to be_empty
217
+ expect(cop.highlights).to be_empty
218
+ end
219
+ end
220
+
221
+ describe 'registers an offence for' do
222
+ it 'one hash parameter without braces' do
223
+ inspect_source(cop, ['where(x: "y")'])
224
+ expect(cop.messages).to eq([
225
+ 'Missing curly braces around a hash parameter.'
226
+ ])
227
+ expect(cop.highlights).to eq(['x: "y"'])
228
+ expect(cop.config_to_allow_offences).to eq('EnforcedStyle' =>
229
+ 'no_braces')
230
+ end
231
+
232
+ it 'opposite + correct style' do
233
+ inspect_source(cop, ['where(y: 2)',
234
+ 'where({ y: 2 })'])
235
+ expect(cop.messages).to eq([
236
+ 'Missing curly braces around a hash parameter.'
237
+ ])
238
+ expect(cop.config_to_allow_offences).to eq('Enabled' => false)
239
+ end
240
+
241
+ it 'correct + opposite style' do
242
+ inspect_source(cop, ['where({ y: 2 })',
243
+ 'where(y: 2)'])
244
+ expect(cop.messages).to eq([
245
+ 'Missing curly braces around a hash parameter.'
246
+ ])
247
+ expect(cop.config_to_allow_offences).to eq('Enabled' => false)
248
+ end
249
+
250
+ it 'one hash parameter with multiple keys and without braces' do
251
+ inspect_source(cop, ['where(x: "y", foo: "bar")'])
252
+ expect(cop.messages).to eq([
253
+ 'Missing curly braces around a hash parameter.'
254
+ ])
255
+ expect(cop.highlights).to eq(['x: "y", foo: "bar"'])
256
+ end
257
+
258
+ it 'one hash parameter without braces with one hash value' do
259
+ inspect_source(cop, ['where(x: { "y" => "z" })'])
260
+ expect(cop.messages).to eq([
261
+ 'Missing curly braces around a hash parameter.'
262
+ ])
263
+ expect(cop.highlights).to eq(['x: { "y" => "z" }'])
264
+ end
265
+ end
266
+
267
+ describe 'auto-corrects' do
268
+ it 'one hash parameter without braces' do
269
+ corrected = autocorrect_source(cop, ['where(x: "y")'])
270
+ expect(corrected).to eq 'where({x: "y"})'
271
+ end
272
+
273
+ it 'one hash parameter with multiple keys and without braces' do
274
+ corrected = autocorrect_source(cop, ['where(x: "y", foo: "bar")'])
275
+ expect(corrected).to eq 'where({x: "y", foo: "bar"})'
276
+ end
277
+
278
+ it 'one hash parameter without braces with one hash value' do
279
+ corrected = autocorrect_source(cop, ['where(x: { "y" => "z" })'])
280
+ expect(corrected).to eq 'where({x: { "y" => "z" }})'
281
+ end
282
+ end
283
+ end
284
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Style::CaseEquality do
6
+ subject(:cop) { described_class.new }
7
+
8
+ it 'registers an offence for ===' do
9
+ inspect_source(cop, ['Array === var'])
10
+ expect(cop.offences.size).to eq(1)
11
+ end
12
+ end
@@ -0,0 +1,289 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Style::CaseIndentation do
6
+ subject(:cop) { described_class.new(config) }
7
+ let(:config) do
8
+ merged = Rubocop::ConfigLoader
9
+ .default_configuration['CaseIndentation'].merge(cop_config)
10
+ Rubocop::Config.new('CaseIndentation' => merged)
11
+ end
12
+
13
+ context 'with IndentWhenRelativeTo: case' do
14
+ context 'with IndentOneStep: false' do
15
+ let(:cop_config) do
16
+ { 'IndentWhenRelativeTo' => 'case', 'IndentOneStep' => false }
17
+ end
18
+
19
+ context 'regarding assignment where the right hand side is a case' do
20
+ it 'accepts a correcty indented assignment' do
21
+ source = ['output = case variable',
22
+ " when 'value1'",
23
+ " 'output1'",
24
+ ' else',
25
+ " 'output2'",
26
+ ' end']
27
+ inspect_source(cop, source)
28
+ expect(cop.offences).to be_empty
29
+ end
30
+
31
+ it 'registers on offence for an assignment indented as end' do
32
+ source = ['output = case variable',
33
+ "when 'value1'",
34
+ " 'output1'",
35
+ 'else',
36
+ " 'output2'",
37
+ 'end']
38
+ inspect_source(cop, source)
39
+ expect(cop.messages).to eq(['Indent when as deep as case.'])
40
+ expect(cop.config_to_allow_offences).to eq('IndentWhenRelativeTo' =>
41
+ 'end')
42
+ end
43
+
44
+ it 'registers on offence for an assignment indented some other way' do
45
+ source = ['output = case variable',
46
+ " when 'value1'",
47
+ " 'output1'",
48
+ ' else',
49
+ " 'output2'",
50
+ 'end']
51
+ inspect_source(cop, source)
52
+ expect(cop.messages).to eq(['Indent when as deep as case.'])
53
+ expect(cop.config_to_allow_offences).to eq('Enabled' => false)
54
+ end
55
+
56
+ it 'registers on offence for correct + opposite' do
57
+ source = ['output = case variable',
58
+ " when 'value1'",
59
+ " 'output1'",
60
+ ' else',
61
+ " 'output2'",
62
+ ' end',
63
+ 'output = case variable',
64
+ "when 'value1'",
65
+ " 'output1'",
66
+ 'else',
67
+ " 'output2'",
68
+ 'end']
69
+ inspect_source(cop, source)
70
+ expect(cop.messages).to eq(['Indent when as deep as case.'])
71
+ expect(cop.config_to_allow_offences).to eq('Enabled' => false)
72
+ end
73
+ end
74
+
75
+ it "registers an offence for a when clause that's deeper than case" do
76
+ source = ['case a',
77
+ ' when 0 then return',
78
+ ' else',
79
+ ' case b',
80
+ ' when 1 then return',
81
+ ' end',
82
+ 'end']
83
+ inspect_source(cop, source)
84
+ expect(cop.messages).to eq(['Indent when as deep as case.'] * 2)
85
+ end
86
+
87
+ it "accepts a when clause that's equally indented with case" do
88
+ source = ['y = case a',
89
+ ' when 0 then break',
90
+ ' when 0 then return',
91
+ ' else',
92
+ ' z = case b',
93
+ ' when 1 then return',
94
+ ' when 1 then break',
95
+ ' end',
96
+ ' end',
97
+ 'case c',
98
+ 'when 2 then encoding',
99
+ 'end',
100
+ '']
101
+ inspect_source(cop, source)
102
+ expect(cop.offences).to be_empty
103
+ end
104
+
105
+ it "doesn't get confused by strings with case in them" do
106
+ source = ['a = "case"',
107
+ 'case x',
108
+ 'when 0',
109
+ 'end',
110
+ '']
111
+ inspect_source(cop, source)
112
+ expect(cop.messages).to be_empty
113
+ end
114
+
115
+ it "doesn't get confused by symbols named case or when" do
116
+ source = ['KEYWORDS = { :case => true, :when => true }',
117
+ 'case type',
118
+ 'when 0',
119
+ ' ParameterNode',
120
+ 'when 1',
121
+ ' MethodCallNode',
122
+ 'end',
123
+ '']
124
+ inspect_source(cop, source)
125
+ expect(cop.messages).to be_empty
126
+ end
127
+
128
+ it 'accepts correctly indented whens in complex combinations' do
129
+ source = ['each {',
130
+ ' case state',
131
+ ' when 0',
132
+ ' case name',
133
+ ' when :a',
134
+ ' end',
135
+ ' when 1',
136
+ ' loop {',
137
+ ' case name',
138
+ ' when :b',
139
+ ' end',
140
+ ' }',
141
+ ' end',
142
+ '}',
143
+ 'case s',
144
+ 'when Array',
145
+ 'end',
146
+ '']
147
+ inspect_source(cop, source)
148
+ expect(cop.messages).to be_empty
149
+ end
150
+ end
151
+
152
+ context 'with IndentOneStep: true' do
153
+ let(:cop_config) do
154
+ { 'IndentWhenRelativeTo' => 'case', 'IndentOneStep' => true }
155
+ end
156
+
157
+ context 'regarding assignment where the right hand side is a case' do
158
+ it 'accepts a correcty indented assignment' do
159
+ source = ['output = case variable',
160
+ " when 'value1'",
161
+ " 'output1'",
162
+ ' else',
163
+ " 'output2'",
164
+ ' end']
165
+ inspect_source(cop, source)
166
+ expect(cop.offences).to be_empty
167
+ end
168
+
169
+ it 'registers on offence for an assignment indented some other way' do
170
+ source = ['output = case variable',
171
+ " when 'value1'",
172
+ " 'output1'",
173
+ ' else',
174
+ " 'output2'",
175
+ ' end']
176
+ inspect_source(cop, source)
177
+ expect(cop.messages).to eq(['Indent when one step more than case.'])
178
+ end
179
+ end
180
+
181
+ it "accepts a when clause that's 2 spaces deeper than case" do
182
+ source = ['case a',
183
+ ' when 0 then return',
184
+ ' else',
185
+ ' case b',
186
+ ' when 1 then return',
187
+ ' end',
188
+ 'end']
189
+ inspect_source(cop, source)
190
+ expect(cop.offences).to be_empty
191
+ end
192
+
193
+ it "registers an offence for a when clause that's equally indented " \
194
+ 'with case' do
195
+ source = ['y = case a',
196
+ ' when 0 then break',
197
+ ' when 0 then return',
198
+ ' z = case b',
199
+ ' when 1 then return',
200
+ ' when 1 then break',
201
+ ' end',
202
+ ' end',
203
+ 'case c',
204
+ 'when 2 then encoding',
205
+ 'end',
206
+ '']
207
+ inspect_source(cop, source)
208
+ expect(cop.messages)
209
+ .to eq(['Indent when one step more than case.'] * 5)
210
+ end
211
+ end
212
+ end
213
+
214
+ context 'with IndentWhenRelativeTo: end' do
215
+ context 'with IndentOneStep: false' do
216
+ let(:cop_config) do
217
+ { 'IndentWhenRelativeTo' => 'end', 'IndentOneStep' => false }
218
+ end
219
+
220
+ context 'regarding assignment where the right hand side is a case' do
221
+ it 'accepts a correcty indented assignment' do
222
+ source = ['output = case variable',
223
+ "when 'value1'",
224
+ " 'output1'",
225
+ 'else',
226
+ " 'output2'",
227
+ 'end']
228
+ inspect_source(cop, source)
229
+ expect(cop.offences).to be_empty
230
+ end
231
+
232
+ it 'registers on offence for an assignment indented some other way' do
233
+ source = ['output = case variable',
234
+ " when 'value1'",
235
+ " 'output1'",
236
+ ' else',
237
+ " 'output2'",
238
+ 'end']
239
+ inspect_source(cop, source)
240
+ expect(cop.messages).to eq(['Indent when as deep as end.'])
241
+ end
242
+ end
243
+ end
244
+
245
+ context 'with IndentOneStep: true' do
246
+ let(:cop_config) do
247
+ { 'IndentWhenRelativeTo' => 'end', 'IndentOneStep' => true }
248
+ end
249
+
250
+ context 'regarding assignment where the right hand side is a case' do
251
+ it 'accepts a correcty indented assignment' do
252
+ source = ['output = case variable',
253
+ " when 'value1'",
254
+ " 'output1'",
255
+ ' else',
256
+ " 'output2'",
257
+ 'end']
258
+ inspect_source(cop, source)
259
+ expect(cop.offences).to be_empty
260
+ end
261
+
262
+ it 'registers on offence for an assignment indented as case' do
263
+ source = ['output = case variable',
264
+ " when 'value1'",
265
+ " 'output1'",
266
+ ' else',
267
+ " 'output2'",
268
+ ' end']
269
+ inspect_source(cop, source)
270
+ expect(cop.messages).to eq(['Indent when one step more than end.'])
271
+ expect(cop.config_to_allow_offences).to eq('IndentWhenRelativeTo' =>
272
+ 'case')
273
+ end
274
+
275
+ it 'registers on offence for an assignment indented some other way' do
276
+ source = ['output = case variable',
277
+ " when 'value1'",
278
+ " 'output1'",
279
+ ' else',
280
+ " 'output2'",
281
+ ' end']
282
+ inspect_source(cop, source)
283
+ expect(cop.messages).to eq(['Indent when one step more than end.'])
284
+ expect(cop.config_to_allow_offences).to eq('Enabled' => false)
285
+ end
286
+ end
287
+ end
288
+ end
289
+ end