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,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::ConfigStore do
6
+ subject(:config_store) { described_class.new }
7
+
8
+ before do
9
+ allow(Rubocop::ConfigLoader).to receive(:configuration_file_for) do |arg|
10
+ # File tree:
11
+ # file1
12
+ # dir/.rubocop.yml
13
+ # dir/file2
14
+ # dir/subdir/file3
15
+ (arg =~ /dir/ ? 'dir' : '.') + '/.rubocop.yml'
16
+ end
17
+ allow(Rubocop::ConfigLoader)
18
+ .to receive(:configuration_from_file) { |arg| arg }
19
+ allow(Rubocop::ConfigLoader)
20
+ .to receive(:load_file) { |arg| "#{arg} loaded" }
21
+ allow(Rubocop::ConfigLoader)
22
+ .to receive(:merge_with_default) { |config, file| "merged #{config}" }
23
+ end
24
+
25
+ describe '.for' do
26
+ it 'always uses config specified in command line' do
27
+ config_store.options_config = :options_config
28
+ expect(config_store.for('file1')).to eq('merged options_config loaded')
29
+ end
30
+
31
+ context 'when no config specified in command line' do
32
+ it 'gets config path and config from cache if available' do
33
+ expect(Rubocop::ConfigLoader).to receive(:configuration_file_for).once
34
+ .with('dir')
35
+ expect(Rubocop::ConfigLoader).to receive(:configuration_file_for).once
36
+ .with('dir/subdir')
37
+ # The stub returns the same config path for dir and dir/subdir.
38
+ expect(Rubocop::ConfigLoader).to receive(:configuration_from_file).once
39
+ .with('dir/.rubocop.yml')
40
+
41
+ config_store.for('dir/file2')
42
+ config_store.for('dir/file2')
43
+ config_store.for('dir/subdir/file3')
44
+ end
45
+
46
+ it 'searches for config path if not available in cache' do
47
+ expect(Rubocop::ConfigLoader).to receive(:configuration_file_for).once
48
+ expect(Rubocop::ConfigLoader).to receive(:configuration_from_file).once
49
+ config_store.for('file1')
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+ # rubocop:disable LineLength
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Rubocop::Cop::Commissioner do
7
+ describe '#investigate' do
8
+ let(:cop) { double(Rubocop::Cop, offences: []).as_null_object }
9
+
10
+ it 'returns all offences found by the cops' do
11
+ allow(cop).to receive(:offences).and_return([1])
12
+
13
+ commissioner = described_class.new([cop])
14
+ source = []
15
+ processed_source = parse_source(source)
16
+
17
+ expect(commissioner.investigate(processed_source)).to eq [1]
18
+ end
19
+
20
+ context 'when a cop has no interest in the file' do
21
+ it 'returns all offences except the ones of the cop' do
22
+ cops = []
23
+ cops << double('cop A', offences: %w(foo), relevant_file?: true)
24
+ cops << double('cop B', offences: %w(bar), relevant_file?: false)
25
+ cops << double('cop C', offences: %w(baz), relevant_file?: true)
26
+ cops.each(&:as_null_object)
27
+
28
+ commissioner = described_class.new(cops)
29
+ source = []
30
+ processed_source = parse_source(source)
31
+
32
+ expect(commissioner.investigate(processed_source)).to eq %w(foo baz)
33
+ end
34
+ end
35
+
36
+ it 'traverses the AST and invoke cops specific callbacks' do
37
+ expect(cop).to receive(:on_def)
38
+
39
+ commissioner = described_class.new([cop])
40
+ source = ['def method', '1', 'end']
41
+ processed_source = parse_source(source)
42
+
43
+ commissioner.investigate(processed_source)
44
+ end
45
+
46
+ it 'passes the input params to all cops that implement their own #investigate method' do
47
+ source = []
48
+ processed_source = parse_source(source)
49
+ expect(cop).to receive(:investigate).with(processed_source)
50
+
51
+ commissioner = described_class.new([cop])
52
+
53
+ commissioner.investigate(processed_source)
54
+ end
55
+
56
+ it 'stores all errors raised by the cops' do
57
+ allow(cop).to receive(:on_def) { fail RuntimeError }
58
+
59
+ commissioner = described_class.new([cop])
60
+ source = ['def method', '1', 'end']
61
+ processed_source = parse_source(source)
62
+
63
+ commissioner.investigate(processed_source)
64
+
65
+ expect(commissioner.errors[cop].size).to eq(1)
66
+ expect(commissioner.errors[cop][0]).to be_instance_of(RuntimeError)
67
+ end
68
+
69
+ context 'when passed :raise_error option' do
70
+ it 're-raises the exception received while processing' do
71
+ allow(cop).to receive(:on_def) { fail RuntimeError }
72
+
73
+ commissioner = described_class.new([cop], raise_error: true)
74
+ source = ['def method', '1', 'end']
75
+ processed_source = parse_source(source)
76
+
77
+ expect do
78
+ commissioner.investigate(processed_source)
79
+ end.to raise_error(RuntimeError)
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,114 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Cop do
6
+ subject(:cop) { described_class.new }
7
+ let(:location) do
8
+ source_buffer = Parser::Source::Buffer.new('test', 1)
9
+ source_buffer.source = "a\n"
10
+ Parser::Source::Range.new(source_buffer, 0, 1)
11
+ end
12
+
13
+ it 'initially has 0 offences' do
14
+ expect(cop.offences).to be_empty
15
+ end
16
+
17
+ it 'keeps track of offences' do
18
+ cop.add_offence(nil, location, 'message')
19
+
20
+ expect(cop.offences.size).to eq(1)
21
+ end
22
+
23
+ it 'will report registered offences' do
24
+ cop.add_offence(nil, location, 'message')
25
+
26
+ expect(cop.offences).not_to be_empty
27
+ end
28
+
29
+ it 'will set default severity' do
30
+ cop.add_offence(nil, location, 'message')
31
+
32
+ expect(cop.offences.first.severity).to eq(:convention)
33
+ end
34
+
35
+ it 'will set custom severity if present' do
36
+ cop.config[cop.name] = { 'Severity' => 'warning' }
37
+ cop.add_offence(nil, location, 'message')
38
+
39
+ expect(cop.offences.first.severity).to eq(:warning)
40
+ end
41
+
42
+ it 'will warn if custom severity is invalid' do
43
+ cop.config[cop.name] = { 'Severity' => 'superbad' }
44
+ expect(cop).to receive(:warn)
45
+ cop.add_offence(nil, location, 'message')
46
+ end
47
+
48
+ it 'registers offence with its name' do
49
+ cop = Rubocop::Cop::Style::For.new
50
+ cop.add_offence(nil, location, 'message')
51
+ expect(cop.offences.first.cop_name).to eq('For')
52
+ end
53
+
54
+ context 'with no submodule' do
55
+ subject(:cop) { described_class }
56
+ it('has right name') { expect(cop.cop_name).to eq('Cop') }
57
+ it('has right type') { expect(cop.cop_type).to eq(:cop) }
58
+ end
59
+
60
+ context 'with style cops' do
61
+ subject(:cop) { Rubocop::Cop::Style::For }
62
+ it('has right name') { expect(cop.cop_name).to eq('For') }
63
+ it('has right type') { expect(cop.cop_type).to eq(:style) }
64
+ end
65
+
66
+ context 'with lint cops' do
67
+ subject(:cop) { Rubocop::Cop::Lint::Loop }
68
+ it('has right name') { expect(cop.cop_name).to eq('Loop') }
69
+ it('has right type') { expect(cop.cop_type).to eq(:lint) }
70
+ end
71
+
72
+ context 'with rails cops' do
73
+ subject(:cop) { Rubocop::Cop::Rails::Validation }
74
+ it('has right name') { expect(cop.cop_name).to eq('Validation') }
75
+ it('has right type') { expect(cop.cop_type).to eq(:rails) }
76
+ end
77
+
78
+ describe 'CopStore' do
79
+ context '#types' do
80
+ subject { described_class.all.types }
81
+ it('has types') { expect(subject.length).not_to eq(0) }
82
+ it { should include :lint }
83
+ it do
84
+ pending 'Rails cops are usually removed after CLI start, ' \
85
+ 'so CLI spec impacts this one'
86
+ should include :rails
87
+ end
88
+ it { should include :style }
89
+ it 'contains every value only once' do
90
+ expect(subject.length).to eq(subject.uniq.length)
91
+ end
92
+ end
93
+ context '#with_type' do
94
+ let(:types) { described_class.all.types }
95
+ it 'has at least one cop per type' do
96
+ types.each do |c|
97
+ expect(described_class.all.with_type(c).length).to be > 0
98
+ end
99
+ end
100
+
101
+ it 'has each cop in exactly one type' do
102
+ sum = 0
103
+ types.each do |c|
104
+ sum = sum + described_class.all.with_type(c).length
105
+ end
106
+ expect(sum).to be described_class.all.length
107
+ end
108
+
109
+ it 'returns 0 for an invalid type' do
110
+ expect(described_class.all.with_type('x').length).to be 0
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Corrector do
6
+ describe '#rewrite' do
7
+ it 'allows removal of a range' do
8
+ source = 'true and false'
9
+ processed_source = parse_source(source)
10
+
11
+ correction = lambda do |corrector|
12
+ node = processed_source.ast
13
+ corrector.remove(node.loc.operator)
14
+ end
15
+
16
+ corrector = described_class.new(processed_source.buffer, [correction])
17
+ expect(corrector.rewrite).to eq 'true false'
18
+ end
19
+
20
+ it 'allows insertion before a source range' do
21
+ source = 'true and false'
22
+ processed_source = parse_source(source)
23
+
24
+ correction = lambda do |corrector|
25
+ node = processed_source.ast
26
+ corrector.insert_before(node.loc.operator, ';nil ')
27
+ end
28
+
29
+ corrector = described_class.new(processed_source.buffer, [correction])
30
+ expect(corrector.rewrite).to eq 'true ;nil and false'
31
+ end
32
+
33
+ it 'allows insertion after a source range' do
34
+ source = 'true and false'
35
+ processed_source = parse_source(source)
36
+
37
+ correction = lambda do |corrector|
38
+ node = processed_source.ast
39
+ corrector.insert_after(node.loc.operator, ' nil;')
40
+ end
41
+
42
+ corrector = described_class.new(processed_source.buffer, [correction])
43
+ expect(corrector.rewrite).to eq 'true and nil; false'
44
+ end
45
+
46
+ it 'allows replacement of a range' do
47
+ source = 'true and false'
48
+ processed_source = parse_source(source)
49
+
50
+ correction = lambda do |corrector|
51
+ node = processed_source.ast
52
+ corrector.replace(node.loc.operator, 'or')
53
+ end
54
+
55
+ corrector = described_class.new(processed_source.buffer, [correction])
56
+ expect(corrector.rewrite).to eq 'true or false'
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,113 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Lint::AmbiguousOperator do
6
+ subject(:cop) { described_class.new }
7
+
8
+ before do
9
+ inspect_source(cop, source)
10
+ end
11
+
12
+ context 'with a splat operator in the first argument' do
13
+ context 'without parentheses' do
14
+ context 'without whitespaces on the right of the operator' do
15
+ let(:source) do
16
+ [
17
+ 'array = [1, 2, 3]',
18
+ 'puts *array'
19
+ ]
20
+ end
21
+
22
+ it 'registers an offence' do
23
+ expect(cop.offences.size).to eq(1)
24
+ expect(cop.offences.first.message).to eq(
25
+ 'Ambiguous splat operator. ' \
26
+ "Parenthesize the method arguments if it's surely a splat " +
27
+ 'operator, ' +
28
+ 'or add a whitespace to the right of the * if it should be a ' +
29
+ 'multiplication.'
30
+ )
31
+ expect(cop.highlights).to eq(['*'])
32
+ end
33
+ end
34
+
35
+ context 'with a whitespace on the right of the operator' do
36
+ let(:source) do
37
+ [
38
+ 'array = [1, 2, 3]',
39
+ 'puts * array'
40
+ ]
41
+ end
42
+
43
+ it 'accepts' do
44
+ expect(cop.offences).to be_empty
45
+ end
46
+ end
47
+ end
48
+
49
+ context 'with parentheses' do
50
+ let(:source) do
51
+ [
52
+ 'array = [1, 2, 3]',
53
+ 'puts(*array)'
54
+ ]
55
+ end
56
+
57
+ it 'accepts' do
58
+ expect(cop.offences).to be_empty
59
+ end
60
+ end
61
+ end
62
+
63
+ context 'with a block ampersand in the first argument' do
64
+ context 'without parentheses' do
65
+ context 'without whitespaces on the right of the operator' do
66
+ let(:source) do
67
+ [
68
+ 'process = proc { do_something }',
69
+ '2.times &process'
70
+ ]
71
+ end
72
+
73
+ it 'registers an offence' do
74
+ expect(cop.offences.size).to eq(1)
75
+ expect(cop.offences.first.message).to eq(
76
+ 'Ambiguous block operator. ' \
77
+ "Parenthesize the method arguments if it's surely a block " +
78
+ 'operator, ' +
79
+ 'or add a whitespace to the right of the & if it should be a ' +
80
+ 'binary AND.'
81
+ )
82
+ expect(cop.highlights).to eq(['&'])
83
+ end
84
+ end
85
+
86
+ context 'with a whitespace on the right of the operator' do
87
+ let(:source) do
88
+ [
89
+ 'process = proc { do_something }',
90
+ '2.times & process'
91
+ ]
92
+ end
93
+
94
+ it 'accepts' do
95
+ expect(cop.offences).to be_empty
96
+ end
97
+ end
98
+ end
99
+
100
+ context 'with parentheses' do
101
+ let(:source) do
102
+ [
103
+ 'process = proc { do_something }',
104
+ '2.times(&process)'
105
+ ]
106
+ end
107
+
108
+ it 'accepts' do
109
+ expect(cop.offences).to be_empty
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Lint::AmbiguousRegexpLiteral do
6
+ subject(:cop) { described_class.new }
7
+
8
+ before do
9
+ inspect_source(cop, source)
10
+ end
11
+
12
+ context 'with a regexp literal in the first argument' do
13
+ context 'without parentheses' do
14
+ let(:source) { 'p /pattern/' }
15
+
16
+ it 'registers an offence' do
17
+ expect(cop.offences.size).to eq(1)
18
+ expect(cop.offences.first.message).to eq(
19
+ 'Ambiguous regexp literal. Parenthesize the method arguments ' \
20
+ "if it's surely a regexp literal, or add a whitespace to the " +
21
+ 'right of the / if it should be a division.'
22
+ )
23
+ expect(cop.highlights).to eq(['/'])
24
+ end
25
+ end
26
+
27
+ context 'with parentheses' do
28
+ let(:source) { 'p(/pattern/)' }
29
+
30
+ it 'accepts' do
31
+ expect(cop.offences).to be_empty
32
+ end
33
+ end
34
+ end
35
+ end