mocha 1.1.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (264) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +1 -0
  3. data/.rubocop.yml +65 -0
  4. data/.rubocop_todo.yml +27 -0
  5. data/.yardopts +1 -0
  6. data/CONTRIBUTING.md +4 -9
  7. data/Gemfile +27 -0
  8. data/README.md +120 -28
  9. data/RELEASE.md +351 -1
  10. data/Rakefile +60 -43
  11. data/gemfiles/Gemfile.minitest.latest +1 -0
  12. data/gemfiles/Gemfile.test-unit.latest +1 -0
  13. data/lib/mocha/any_instance_method.rb +9 -74
  14. data/lib/mocha/api.rb +85 -69
  15. data/lib/mocha/argument_iterator.rb +4 -8
  16. data/lib/mocha/backtrace_filter.rb +1 -5
  17. data/lib/mocha/block_matcher.rb +31 -0
  18. data/lib/mocha/cardinality.rb +60 -49
  19. data/lib/mocha/central.rb +21 -12
  20. data/lib/mocha/change_state_side_effect.rb +0 -4
  21. data/lib/mocha/class_methods.rb +19 -20
  22. data/lib/mocha/configuration.rb +312 -47
  23. data/lib/mocha/debug.rb +3 -2
  24. data/lib/mocha/deprecation.rb +8 -11
  25. data/lib/mocha/detection/mini_test.rb +0 -2
  26. data/lib/mocha/detection/test_unit.rb +3 -5
  27. data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
  28. data/lib/mocha/exception_raiser.rb +4 -6
  29. data/lib/mocha/expectation.rb +186 -95
  30. data/lib/mocha/expectation_error.rb +1 -1
  31. data/lib/mocha/expectation_error_factory.rb +0 -1
  32. data/lib/mocha/expectation_list.rb +7 -11
  33. data/lib/mocha/hooks.rb +1 -3
  34. data/lib/mocha/in_state_ordering_constraint.rb +0 -4
  35. data/lib/mocha/inspect.rb +30 -38
  36. data/lib/mocha/instance_method.rb +11 -8
  37. data/lib/mocha/integration/mini_test/adapter.rb +2 -4
  38. data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
  39. data/lib/mocha/integration/mini_test.rb +10 -31
  40. data/lib/mocha/integration/monkey_patcher.rb +8 -2
  41. data/lib/mocha/integration/test_unit/adapter.rb +5 -6
  42. data/lib/mocha/integration/test_unit.rb +10 -26
  43. data/lib/mocha/invocation.rb +73 -0
  44. data/lib/mocha/is_a.rb +0 -2
  45. data/lib/mocha/logger.rb +0 -4
  46. data/lib/mocha/macos_version.rb +5 -0
  47. data/lib/mocha/method_matcher.rb +1 -5
  48. data/lib/mocha/minitest.rb +6 -0
  49. data/lib/mocha/mock.rb +105 -57
  50. data/lib/mocha/mockery.rb +70 -98
  51. data/lib/mocha/names.rb +2 -12
  52. data/lib/mocha/not_initialized_error.rb +7 -0
  53. data/lib/mocha/object_methods.rb +25 -31
  54. data/lib/mocha/parameter_matchers/all_of.rb +2 -8
  55. data/lib/mocha/parameter_matchers/any_of.rb +2 -8
  56. data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
  57. data/lib/mocha/parameter_matchers/anything.rb +2 -8
  58. data/lib/mocha/parameter_matchers/base.rb +7 -13
  59. data/lib/mocha/parameter_matchers/equals.rb +1 -7
  60. data/lib/mocha/parameter_matchers/{query_string.rb → equivalent_uri.rb} +14 -15
  61. data/lib/mocha/parameter_matchers/has_entries.rb +2 -7
  62. data/lib/mocha/parameter_matchers/has_entry.rb +26 -21
  63. data/lib/mocha/parameter_matchers/has_key.rb +2 -7
  64. data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
  65. data/lib/mocha/parameter_matchers/has_value.rb +2 -7
  66. data/lib/mocha/parameter_matchers/includes.rb +50 -8
  67. data/lib/mocha/parameter_matchers/instance_methods.rb +27 -0
  68. data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
  69. data/lib/mocha/parameter_matchers/is_a.rb +2 -7
  70. data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
  71. data/lib/mocha/parameter_matchers/not.rb +2 -7
  72. data/lib/mocha/parameter_matchers/optionally.rb +4 -10
  73. data/lib/mocha/parameter_matchers/positional_or_keyword_hash.rb +64 -0
  74. data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
  75. data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
  76. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
  77. data/lib/mocha/parameter_matchers.rb +3 -4
  78. data/lib/mocha/parameters_matcher.rb +8 -11
  79. data/lib/mocha/raised_exception.rb +11 -0
  80. data/lib/mocha/receivers.rb +10 -14
  81. data/lib/mocha/return_values.rb +4 -8
  82. data/lib/mocha/ruby_version.rb +3 -0
  83. data/lib/mocha/sequence.rb +4 -9
  84. data/lib/mocha/single_return_value.rb +2 -5
  85. data/lib/mocha/state_machine.rb +33 -46
  86. data/lib/mocha/stubbed_method.rb +88 -0
  87. data/lib/mocha/stubbing_error.rb +2 -13
  88. data/lib/mocha/test_unit.rb +5 -2
  89. data/lib/mocha/thrower.rb +4 -6
  90. data/lib/mocha/thrown_object.rb +12 -0
  91. data/lib/mocha/version.rb +1 -1
  92. data/lib/mocha/yield_parameters.rb +7 -17
  93. data/mocha.gemspec +16 -43
  94. data/yard-templates/default/layout/html/google_analytics.erb +6 -9
  95. data/yard-templates/default/layout/html/setup.rb +2 -3
  96. metadata +38 -246
  97. data/bin/build-matrix +0 -71
  98. data/gemfiles/Gemfile.minitest.1.3.0 +0 -7
  99. data/gemfiles/Gemfile.minitest.1.4.0 +0 -7
  100. data/gemfiles/Gemfile.minitest.1.4.1 +0 -7
  101. data/gemfiles/Gemfile.minitest.1.4.2 +0 -7
  102. data/gemfiles/Gemfile.minitest.2.0.0 +0 -7
  103. data/gemfiles/Gemfile.minitest.2.0.1 +0 -7
  104. data/gemfiles/Gemfile.minitest.2.11.0 +0 -7
  105. data/gemfiles/Gemfile.minitest.2.11.2 +0 -7
  106. data/gemfiles/Gemfile.minitest.2.3.0 +0 -7
  107. data/gemfiles/Gemfile.test-unit.2.0.0 +0 -7
  108. data/gemfiles/Gemfile.test-unit.2.0.1 +0 -7
  109. data/gemfiles/Gemfile.test-unit.2.0.3 +0 -7
  110. data/init.rb +0 -3
  111. data/lib/mocha/class_method.rb +0 -127
  112. data/lib/mocha/integration/mini_test/nothing.rb +0 -19
  113. data/lib/mocha/integration/mini_test/version_13.rb +0 -51
  114. data/lib/mocha/integration/mini_test/version_140.rb +0 -51
  115. data/lib/mocha/integration/mini_test/version_141.rb +0 -62
  116. data/lib/mocha/integration/mini_test/version_142_to_172.rb +0 -62
  117. data/lib/mocha/integration/mini_test/version_200.rb +0 -63
  118. data/lib/mocha/integration/mini_test/version_201_to_222.rb +0 -63
  119. data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +0 -67
  120. data/lib/mocha/integration/mini_test/version_2112_to_320.rb +0 -70
  121. data/lib/mocha/integration/mini_test/version_230_to_2101.rb +0 -65
  122. data/lib/mocha/integration/test_unit/gem_version_200.rb +0 -59
  123. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +0 -59
  124. data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +0 -59
  125. data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +0 -65
  126. data/lib/mocha/integration/test_unit/nothing.rb +0 -19
  127. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +0 -58
  128. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +0 -60
  129. data/lib/mocha/integration.rb +0 -14
  130. data/lib/mocha/mini_test.rb +0 -3
  131. data/lib/mocha/module_method.rb +0 -16
  132. data/lib/mocha/module_methods.rb +0 -14
  133. data/lib/mocha/multiple_yields.rb +0 -20
  134. data/lib/mocha/no_yields.rb +0 -11
  135. data/lib/mocha/parameter_matchers/object.rb +0 -17
  136. data/lib/mocha/pretty_parameters.rb +0 -28
  137. data/lib/mocha/setup.rb +0 -9
  138. data/lib/mocha/single_yield.rb +0 -18
  139. data/lib/mocha/standalone.rb +0 -4
  140. data/lib/mocha/unexpected_invocation.rb +0 -26
  141. data/lib/mocha_standalone.rb +0 -4
  142. data/test/acceptance/acceptance_test_helper.rb +0 -41
  143. data/test/acceptance/bug_18914_test.rb +0 -43
  144. data/test/acceptance/bug_21465_test.rb +0 -34
  145. data/test/acceptance/bug_21563_test.rb +0 -25
  146. data/test/acceptance/exception_rescue_test.rb +0 -55
  147. data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -55
  148. data/test/acceptance/expected_invocation_count_test.rb +0 -232
  149. data/test/acceptance/failure_messages_test.rb +0 -64
  150. data/test/acceptance/issue_65_test.rb +0 -63
  151. data/test/acceptance/issue_70_test.rb +0 -55
  152. data/test/acceptance/mocha_example_test.rb +0 -98
  153. data/test/acceptance/mocha_test_result_test.rb +0 -84
  154. data/test/acceptance/mock_test.rb +0 -100
  155. data/test/acceptance/mock_with_initializer_block_test.rb +0 -51
  156. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -78
  157. data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -68
  158. data/test/acceptance/optional_parameters_test.rb +0 -70
  159. data/test/acceptance/parameter_matcher_test.rb +0 -337
  160. data/test/acceptance/partial_mocks_test.rb +0 -47
  161. data/test/acceptance/prepend_test.rb +0 -88
  162. data/test/acceptance/raise_exception_test.rb +0 -39
  163. data/test/acceptance/return_value_test.rb +0 -52
  164. data/test/acceptance/sequence_test.rb +0 -192
  165. data/test/acceptance/states_test.rb +0 -70
  166. data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -34
  167. data/test/acceptance/stub_any_instance_method_test.rb +0 -238
  168. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -106
  169. data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -78
  170. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -75
  171. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -112
  172. data/test/acceptance/stub_everything_test.rb +0 -56
  173. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -93
  174. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -69
  175. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -69
  176. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -75
  177. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -75
  178. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
  179. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -70
  180. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -72
  181. data/test/acceptance/stub_module_method_test.rb +0 -163
  182. data/test/acceptance/stub_test.rb +0 -52
  183. data/test/acceptance/stubba_example_test.rb +0 -102
  184. data/test/acceptance/stubba_test_result_test.rb +0 -66
  185. data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
  186. data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
  187. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -48
  188. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
  189. data/test/acceptance/stubbing_nil_test.rb +0 -59
  190. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -130
  191. data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
  192. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
  193. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
  194. data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
  195. data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
  196. data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
  197. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -35
  198. data/test/acceptance/throw_test.rb +0 -45
  199. data/test/acceptance/unexpected_invocation_test.rb +0 -25
  200. data/test/acceptance/unstubbing_test.rb +0 -168
  201. data/test/assertions.rb +0 -6
  202. data/test/deprecation_disabler.rb +0 -15
  203. data/test/execution_point.rb +0 -36
  204. data/test/integration/mini_test_test.rb +0 -8
  205. data/test/integration/shared_tests.rb +0 -174
  206. data/test/integration/test_unit_test.rb +0 -8
  207. data/test/method_definer.rb +0 -24
  208. data/test/mini_test_result.rb +0 -90
  209. data/test/minitest_result.rb +0 -49
  210. data/test/simple_counter.rb +0 -13
  211. data/test/test_helper.rb +0 -50
  212. data/test/test_runner.rb +0 -58
  213. data/test/test_unit_result.rb +0 -20
  214. data/test/unit/any_instance_method_test.rb +0 -132
  215. data/test/unit/array_inspect_test.rb +0 -16
  216. data/test/unit/backtrace_filter_test.rb +0 -19
  217. data/test/unit/cardinality_test.rb +0 -56
  218. data/test/unit/central_test.rb +0 -100
  219. data/test/unit/change_state_side_effect_test.rb +0 -41
  220. data/test/unit/class_method_test.rb +0 -223
  221. data/test/unit/class_methods_test.rb +0 -40
  222. data/test/unit/configuration_test.rb +0 -38
  223. data/test/unit/date_time_inspect_test.rb +0 -21
  224. data/test/unit/exception_raiser_test.rb +0 -42
  225. data/test/unit/expectation_list_test.rb +0 -82
  226. data/test/unit/expectation_test.rb +0 -497
  227. data/test/unit/hash_inspect_test.rb +0 -16
  228. data/test/unit/hooks_test.rb +0 -29
  229. data/test/unit/in_state_ordering_constraint_test.rb +0 -43
  230. data/test/unit/method_matcher_test.rb +0 -28
  231. data/test/unit/mock_test.rb +0 -341
  232. data/test/unit/mockery_test.rb +0 -151
  233. data/test/unit/module_methods_test.rb +0 -19
  234. data/test/unit/multiple_yields_test.rb +0 -18
  235. data/test/unit/no_yields_test.rb +0 -18
  236. data/test/unit/object_inspect_test.rb +0 -38
  237. data/test/unit/object_methods_test.rb +0 -46
  238. data/test/unit/parameter_matchers/all_of_test.rb +0 -26
  239. data/test/unit/parameter_matchers/any_of_test.rb +0 -26
  240. data/test/unit/parameter_matchers/anything_test.rb +0 -21
  241. data/test/unit/parameter_matchers/equals_test.rb +0 -25
  242. data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
  243. data/test/unit/parameter_matchers/has_entry_test.rb +0 -129
  244. data/test/unit/parameter_matchers/has_key_test.rb +0 -55
  245. data/test/unit/parameter_matchers/has_value_test.rb +0 -57
  246. data/test/unit/parameter_matchers/includes_test.rb +0 -59
  247. data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
  248. data/test/unit/parameter_matchers/is_a_test.rb +0 -25
  249. data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
  250. data/test/unit/parameter_matchers/not_test.rb +0 -26
  251. data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
  252. data/test/unit/parameter_matchers/responds_with_test.rb +0 -32
  253. data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
  254. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
  255. data/test/unit/parameters_matcher_test.rb +0 -121
  256. data/test/unit/receivers_test.rb +0 -66
  257. data/test/unit/return_values_test.rb +0 -63
  258. data/test/unit/sequence_test.rb +0 -104
  259. data/test/unit/single_return_value_test.rb +0 -14
  260. data/test/unit/single_yield_test.rb +0 -18
  261. data/test/unit/state_machine_test.rb +0 -98
  262. data/test/unit/string_inspect_test.rb +0 -11
  263. data/test/unit/thrower_test.rb +0 -20
  264. data/test/unit/yield_parameters_test.rb +0 -93
@@ -4,18 +4,20 @@ require 'mocha/argument_iterator'
4
4
  require 'mocha/expectation_error_factory'
5
5
 
6
6
  module Mocha
7
-
8
7
  # Methods added to all objects to allow mocking and stubbing on real (i.e. non-mock) objects.
9
8
  #
10
9
  # Both {#expects} and {#stubs} return an {Expectation} which can be further modified by methods on {Expectation}.
11
10
  module ObjectMethods
12
-
13
11
  # @private
14
12
  alias_method :_method, :method
15
13
 
16
14
  # @private
17
- def mocha
18
- @mocha ||= Mocha::Mockery.instance.mock_impersonating(self)
15
+ def mocha(instantiate = true)
16
+ if instantiate
17
+ @mocha ||= Mocha::Mockery.instance.mock_impersonating(self)
18
+ else
19
+ defined?(@mocha) ? @mocha : nil
20
+ end
19
21
  end
20
22
 
21
23
  # @private
@@ -33,17 +35,22 @@ module Mocha
33
35
  self
34
36
  end
35
37
 
38
+ # @private
39
+ def stubba_class
40
+ singleton_class
41
+ end
42
+
36
43
  # Adds an expectation that the specified method must be called exactly once with any parameters.
37
44
  #
38
45
  # The original implementation of the method is replaced during the test and then restored at the end of the test. The temporary replacement method has the same visibility as the original method.
39
46
  #
40
- # @param [Symbol,String] method_name name of expected method
41
- # @param [Hash] expected_methods_vs_return_values expected method name symbols as keys and corresponding return values as values - these expectations are setup as if {#expects} were called multiple times.
47
+ # @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
48
+ # @raise [StubbingError] if attempting to stub method which is not allowed.
42
49
  #
43
50
  # @overload def expects(method_name)
51
+ # @param [Symbol,String] method_name name of expected method
44
52
  # @overload def expects(expected_methods_vs_return_values)
45
- # @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
46
- # @raise [StubbingError] if attempting to stub method which is not allowed.
53
+ # @param [Hash] expected_methods_vs_return_values expected method name symbols as keys and corresponding return values as values - these expectations are setup as if {#expects} were called multiple times.
47
54
  #
48
55
  # @example Setting up an expectation on a non-mock object.
49
56
  # product = Product.new
@@ -71,14 +78,14 @@ module Mocha
71
78
  expectation = nil
72
79
  mockery = Mocha::Mockery.instance
73
80
  iterator = ArgumentIterator.new(expected_methods_vs_return_values)
74
- iterator.each { |*args|
81
+ iterator.each do |*args|
75
82
  method_name = args.shift
76
83
  mockery.on_stubbing(self, method_name)
77
84
  method = stubba_method.new(stubba_object, method_name)
78
85
  mockery.stubba.stub(method)
79
86
  expectation = mocha.expects(method_name, caller)
80
- expectation.returns(args.shift) if args.length > 0
81
- }
87
+ expectation.returns(args.shift) unless args.empty?
88
+ end
82
89
  expectation
83
90
  end
84
91
 
@@ -86,13 +93,13 @@ module Mocha
86
93
  #
87
94
  # The original implementation of the method is replaced during the test and then restored at the end of the test. The temporary replacement method has the same visibility as the original method.
88
95
  #
89
- # @param [Symbol,String] method_name name of stubbed method
90
- # @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {#stubs} were called multiple times.
96
+ # @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
97
+ # @raise [StubbingError] if attempting to stub method which is not allowed.
91
98
  #
92
99
  # @overload def stubs(method_name)
100
+ # @param [Symbol,String] method_name name of stubbed method
93
101
  # @overload def stubs(stubbed_methods_vs_return_values)
94
- # @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
95
- # @raise [StubbingError] if attempting to stub method which is not allowed.
102
+ # @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {#stubs} were called multiple times.
96
103
  #
97
104
  # @example Setting up a stubbed methods on a non-mock object.
98
105
  # product = Product.new
@@ -117,14 +124,14 @@ module Mocha
117
124
  expectation = nil
118
125
  mockery = Mocha::Mockery.instance
119
126
  iterator = ArgumentIterator.new(stubbed_methods_vs_return_values)
120
- iterator.each { |*args|
127
+ iterator.each do |*args|
121
128
  method_name = args.shift
122
129
  mockery.on_stubbing(self, method_name)
123
130
  method = stubba_method.new(stubba_object, method_name)
124
131
  mockery.stubba.stub(method)
125
132
  expectation = mocha.stubs(method_name, caller)
126
- expectation.returns(args.shift) if args.length > 0
127
- }
133
+ expectation.returns(args.shift) unless args.empty?
134
+ end
128
135
  expectation
129
136
  end
130
137
 
@@ -158,18 +165,5 @@ module Mocha
158
165
  mockery.stubba.unstub(method)
159
166
  end
160
167
  end
161
-
162
- # @private
163
- def method_exists?(method, include_public_methods = true)
164
- if include_public_methods
165
- return true if public_methods(include_superclass_methods = true).include?(method)
166
- return true if respond_to?(method.to_sym)
167
- end
168
- return true if protected_methods(include_superclass_methods = true).include?(method)
169
- return true if private_methods(include_superclass_methods = true).include?(method)
170
- return false
171
- end
172
-
173
168
  end
174
-
175
169
  end
@@ -1,12 +1,10 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches if all +matchers+ match.
8
6
  #
9
- # @param [*Array<Base>] parameter_matchers parameter matchers.
7
+ # @param [*Array<Base>] matchers parameter matchers.
10
8
  # @return [AllOf] parameter matcher.
11
9
  #
12
10
  # @see Expectation#with
@@ -28,7 +26,6 @@ module Mocha
28
26
 
29
27
  # Parameter matcher which combines a number of other matchers using a logical AND.
30
28
  class AllOf < Base
31
-
32
29
  # @private
33
30
  def initialize(*matchers)
34
31
  @matchers = matchers
@@ -42,11 +39,8 @@ module Mocha
42
39
 
43
40
  # @private
44
41
  def mocha_inspect
45
- "all_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
42
+ "all_of(#{@matchers.map(&:mocha_inspect).join(', ')})"
46
43
  end
47
-
48
44
  end
49
-
50
45
  end
51
-
52
46
  end
@@ -1,12 +1,10 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches if any +matchers+ match.
8
6
  #
9
- # @param [*Array<Base>] parameter_matchers parameter matchers.
7
+ # @param [*Array<Base>] matchers parameter matchers.
10
8
  # @return [AnyOf] parameter matcher.
11
9
  #
12
10
  # @see Expectation#with
@@ -34,7 +32,6 @@ module Mocha
34
32
 
35
33
  # Parameter matcher which combines a number of other matchers using a logical OR.
36
34
  class AnyOf < Base
37
-
38
35
  # @private
39
36
  def initialize(*matchers)
40
37
  @matchers = matchers
@@ -48,11 +45,8 @@ module Mocha
48
45
 
49
46
  # @private
50
47
  def mocha_inspect
51
- "any_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
48
+ "any_of(#{@matchers.map(&:mocha_inspect).join(', ')})"
52
49
  end
53
-
54
50
  end
55
-
56
51
  end
57
-
58
52
  end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches any parameters. This is used as the default for a newly built expectation.
8
6
  #
9
7
  # @return [AnyParameters] parameter matcher.
@@ -26,22 +24,18 @@ module Mocha
26
24
 
27
25
  # Parameter matcher which always matches whatever the parameters.
28
26
  class AnyParameters < Base
29
-
30
27
  # @private
31
28
  def matches?(available_parameters)
32
- while available_parameters.length > 0 do
29
+ until available_parameters.empty?
33
30
  available_parameters.shift
34
31
  end
35
- return true
32
+ true
36
33
  end
37
34
 
38
35
  # @private
39
36
  def mocha_inspect
40
- "any_parameters"
37
+ 'any_parameters'
41
38
  end
42
-
43
39
  end
44
-
45
40
  end
46
-
47
41
  end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches any object.
8
6
  #
9
7
  # @return [Anything] parameter matcher.
@@ -23,20 +21,16 @@ module Mocha
23
21
 
24
22
  # Parameter matcher which always matches a single parameter.
25
23
  class Anything < Base
26
-
27
24
  # @private
28
25
  def matches?(available_parameters)
29
26
  available_parameters.shift
30
- return true
27
+ true
31
28
  end
32
29
 
33
30
  # @private
34
31
  def mocha_inspect
35
- "anything"
32
+ 'anything'
36
33
  end
37
-
38
34
  end
39
-
40
35
  end
41
-
42
36
  end
@@ -1,12 +1,9 @@
1
1
  module Mocha
2
-
3
2
  module ParameterMatchers
4
-
5
3
  # @abstract Subclass and implement +#matches?+ and +#mocha_inspect+ to define a custom matcher. Also add a suitably named instance method to {ParameterMatchers} to build an instance of the new matcher c.f. {#equals}.
6
4
  class Base
7
-
8
5
  # @private
9
- def to_matcher
6
+ def to_matcher(_expectation = nil)
10
7
  self
11
8
  end
12
9
 
@@ -16,7 +13,7 @@ module Mocha
16
13
  #
17
14
  # This shorthand will not work with an implicit equals match. Instead, an explicit {Equals} matcher should be used.
18
15
  #
19
- # @param [Base] matcher parameter matcher.
16
+ # @param [Base] other parameter matcher.
20
17
  # @return [AllOf] parameter matcher.
21
18
  #
22
19
  # @see Expectation#with
@@ -30,8 +27,8 @@ module Mocha
30
27
  #
31
28
  # object.expects(:run).with(has_key(:foo) & has_key(:bar))
32
29
  # object.run(:foo => 'foovalue', :bar => 'barvalue)
33
- def &(matcher)
34
- AllOf.new(self, matcher)
30
+ def &(other)
31
+ AllOf.new(self, other)
35
32
  end
36
33
 
37
34
  # A shorthand way of combining two matchers when at least one must match.
@@ -40,7 +37,7 @@ module Mocha
40
37
  #
41
38
  # This shorthand will not work with an implicit equals match. Instead, an explicit {Equals} matcher should be used.
42
39
  #
43
- # @param [Base] matcher parameter matcher.
40
+ # @param [Base] other parameter matcher.
44
41
  # @return [AnyOf] parameter matcher.
45
42
  #
46
43
  # @see Expectation#with
@@ -60,12 +57,9 @@ module Mocha
60
57
  # object.run(1) # passes
61
58
  # object.run(2) # passes
62
59
  # object.run(3) # fails
63
- def |(matcher)
64
- AnyOf.new(self, matcher)
60
+ def |(other)
61
+ AnyOf.new(self, other)
65
62
  end
66
-
67
63
  end
68
-
69
64
  end
70
-
71
65
  end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches any +Object+ equalling +value+.
8
6
  #
9
7
  # @param [Object] value expected value.
@@ -22,14 +20,13 @@ module Mocha
22
20
  # object = mock()
23
21
  # object.expects(:method_1).with(equals(2))
24
22
  # object.method_1(3)
25
- # # error raised, because method_1 was not called with an +Object+ that equals 3
23
+ # # error raised, because method_1 was not called with an +Object+ that equals 2
26
24
  def equals(value)
27
25
  Equals.new(value)
28
26
  end
29
27
 
30
28
  # Parameter matcher which matches when actual parameter equals expected value.
31
29
  class Equals < Base
32
-
33
30
  # @private
34
31
  def initialize(value)
35
32
  @value = value
@@ -45,9 +42,6 @@ module Mocha
45
42
  def mocha_inspect
46
43
  @value.mocha_inspect
47
44
  end
48
-
49
45
  end
50
-
51
46
  end
52
-
53
47
  end
@@ -1,34 +1,33 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
  require 'uri'
3
+ require 'cgi'
3
4
 
4
5
  module Mocha
5
6
  module ParameterMatchers
6
-
7
7
  # Matches a URI without regard to the ordering of parameters in the query string.
8
8
  #
9
9
  # @param [String] uri URI to match.
10
- # @return [QueryStringMatches] parameter matcher.
10
+ # @return [EquivalentUri] parameter matcher.
11
11
  #
12
12
  # @see Expectation#with
13
13
  #
14
- # @example Actual URI has equivalent query string.
14
+ # @example Actual URI is equivalent.
15
15
  # object = mock()
16
- # object.expects(:method_1).with(has_equivalent_query_string('http://example.com/foo?a=1&b=2))
16
+ # object.expects(:method_1).with(equivalent_uri('http://example.com/foo?a=1&b=2))
17
17
  # object.method_1('http://example.com/foo?b=2&a=1')
18
18
  # # no error raised
19
19
  #
20
- # @example Actual URI does not have equivalent query string.
20
+ # @example Actual URI is not equivalent.
21
21
  # object = mock()
22
- # object.expects(:method_1).with(has_equivalent_query_string('http://example.com/foo?a=1&b=2))
22
+ # object.expects(:method_1).with(equivalent_uri('http://example.com/foo?a=1&b=2))
23
23
  # object.method_1('http://example.com/foo?a=1&b=3')
24
24
  # # error raised, because the query parameters were different
25
- def has_equivalent_query_string(uri)
26
- QueryStringMatches.new(uri)
25
+ def equivalent_uri(uri)
26
+ EquivalentUri.new(uri)
27
27
  end
28
28
 
29
29
  # Parameter matcher which matches URIs with equivalent query strings.
30
- class QueryStringMatches < Base
31
-
30
+ class EquivalentUri < Base
32
31
  # @private
33
32
  def initialize(uri)
34
33
  @uri = URI.parse(uri)
@@ -43,16 +42,16 @@ module Mocha
43
42
 
44
43
  # @private
45
44
  def mocha_inspect
46
- "has_equivalent_query_string(#{@uri.mocha_inspect})"
45
+ "equivalent_uri(#{@uri.mocha_inspect})"
47
46
  end
48
47
 
49
- private
48
+ private
49
+
50
50
  # @private
51
51
  def explode(uri)
52
- query_hash = (uri.query || '').split('&').inject({}){ |h, kv| h.merge(Hash[*kv.split('=')]) }
53
- URI::Generic::COMPONENT.inject({}){ |h, k| h.merge(k => uri.__send__(k)) }.merge(:query => query_hash)
52
+ query_hash = CGI.parse(uri.query || '')
53
+ URI::Generic::COMPONENT.inject({}) { |h, k| h.merge(k => uri.__send__(k)) }.merge(:query => query_hash)
54
54
  end
55
-
56
55
  end
57
56
  end
58
57
  end
@@ -3,9 +3,7 @@ require 'mocha/parameter_matchers/all_of'
3
3
  require 'mocha/parameter_matchers/has_entry'
4
4
 
5
5
  module Mocha
6
-
7
6
  module ParameterMatchers
8
-
9
7
  # Matches +Hash+ containing all +entries+.
10
8
  #
11
9
  # @param [Hash] entries expected +Hash+ entries.
@@ -24,13 +22,13 @@ module Mocha
24
22
  # object.expects(:method_1).with(has_entries('key_1' => 1, 'key_2' => 2))
25
23
  # object.method_1('key_1' => 1, 'key_2' => 99)
26
24
  # # error raised, because method_1 was not called with Hash containing entries: 'key_1' => 1, 'key_2' => 2
27
- def has_entries(entries)
25
+ #
26
+ def has_entries(entries) # rubocop:disable Naming/PredicateName
28
27
  HasEntries.new(entries)
29
28
  end
30
29
 
31
30
  # Parameter matcher which matches when actual parameter contains all expected +Hash+ entries.
32
31
  class HasEntries < Base
33
-
34
32
  # @private
35
33
  def initialize(entries)
36
34
  @entries = entries
@@ -47,9 +45,6 @@ module Mocha
47
45
  def mocha_inspect
48
46
  "has_entries(#{@entries.mocha_inspect})"
49
47
  end
50
-
51
48
  end
52
-
53
49
  end
54
-
55
50
  end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches +Hash+ containing entry with +key+ and +value+.
8
6
  #
9
7
  # @overload def has_entry(key, value)
@@ -41,36 +39,27 @@ module Mocha
41
39
  # object.expects(:method_1).with(has_entry('key_1' => 1))
42
40
  # object.method_1('key_1' => 2, 'key_2' => 1)
43
41
  # # error raised, because method_1 was not called with Hash containing entry: 'key_1' => 1
44
- def has_entry(*options)
42
+ #
43
+ def has_entry(*options) # rubocop:disable Naming/PredicateName
45
44
  case options.length
45
+ when 0
46
+ raise ArgumentError, 'No arguments. Expecting at least one.'
46
47
  when 1
47
- case options[0]
48
- when Hash
49
- case options[0].length
50
- when 0
51
- raise ArgumentError.new("Argument has no entries.")
52
- when 1
53
- key, value = options[0].first
54
- else
55
- raise ArgumentError.new("Argument has multiple entries. Use Mocha::ParameterMatchers#has_entries instead.")
56
- end
57
- else
58
- raise ArgumentError.new("Argument is not a Hash.")
59
- end
48
+ key, value = parse_option(options[0])
60
49
  when 2
61
50
  key, value = options
62
51
  else
63
- raise ArgumentError.new("Too many arguments; use either a single argument (must be a Hash) or two arguments (a key and a value).")
52
+ raise ArgumentError, 'Too many arguments; use either a single argument (must be a Hash) or two arguments (a key and a value).'
64
53
  end
65
54
  HasEntry.new(key, value)
66
55
  end
67
56
 
68
57
  # Parameter matcher which matches when actual parameter contains expected +Hash+ entry.
69
58
  class HasEntry < Base
70
-
71
59
  # @private
72
60
  def initialize(key, value)
73
- @key, @value = key, value
61
+ @key = key
62
+ @value = value
74
63
  end
75
64
 
76
65
  # @private
@@ -85,9 +74,25 @@ module Mocha
85
74
  def mocha_inspect
86
75
  "has_entry(#{@key.mocha_inspect} => #{@value.mocha_inspect})"
87
76
  end
88
-
89
77
  end
90
78
 
91
- end
79
+ private
92
80
 
81
+ # @private
82
+ def parse_option(option)
83
+ case option
84
+ when Hash
85
+ case option.length
86
+ when 0
87
+ raise ArgumentError, 'Argument has no entries.'
88
+ when 1
89
+ option.first
90
+ else
91
+ raise ArgumentError, 'Argument has multiple entries. Use Mocha::ParameterMatchers#has_entries instead.'
92
+ end
93
+ else
94
+ raise ArgumentError, 'Argument is not a Hash.'
95
+ end
96
+ end
97
+ end
93
98
  end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches +Hash+ containing +key+.
8
6
  #
9
7
  # @param [Object] key expected key.
@@ -22,13 +20,13 @@ module Mocha
22
20
  # object.expects(:method_1).with(has_key('key_1'))
23
21
  # object.method_1('key_2' => 2)
24
22
  # # error raised, because method_1 was not called with Hash containing key: 'key_1'
25
- def has_key(key)
23
+ #
24
+ def has_key(key) # rubocop:disable Naming/PredicateName
26
25
  HasKey.new(key)
27
26
  end
28
27
 
29
28
  # Parameter matcher which matches when actual parameter contains +Hash+ entry with expected key.
30
29
  class HasKey < Base
31
-
32
30
  # @private
33
31
  def initialize(key)
34
32
  @key = key
@@ -45,9 +43,6 @@ module Mocha
45
43
  def mocha_inspect
46
44
  "has_key(#{@key.mocha_inspect})"
47
45
  end
48
-
49
46
  end
50
-
51
47
  end
52
-
53
48
  end
@@ -0,0 +1,53 @@
1
+ require 'mocha/parameter_matchers/base'
2
+
3
+ module Mocha
4
+ module ParameterMatchers
5
+ # Matches +Hash+ containing +keys+.
6
+ #
7
+ # @param [*Array<Object>] keys expected keys.
8
+ # @return [HasKeys] parameter matcher.
9
+ #
10
+ # @see Expectation#with
11
+ #
12
+ # @example Actual parameter contains entry with expected keys.
13
+ # object = mock()
14
+ # object.expects(:method_1).with(has_keys(:key_1, :key_2))
15
+ # object.method_1(:key_1 => 1, :key_2 => 2, :key_3 => 3)
16
+ # # no error raised
17
+ #
18
+ # @example Actual parameter does not contain all expected keys.
19
+ # object = mock()
20
+ # object.expects(:method_1).with(has_keys(:key_1, :key_2))
21
+ # object.method_1(:key_2 => 2)
22
+ # # error raised, because method_1 was not called with Hash containing key: :key_1
23
+ #
24
+ def has_keys(*keys) # rubocop:disable Naming/PredicateName
25
+ HasKeys.new(*keys)
26
+ end
27
+
28
+ # Parameter matcher which matches when actual parameter contains +Hash+ with all expected keys.
29
+ class HasKeys < Base
30
+ # @private
31
+ def initialize(*keys)
32
+ raise ArgumentError, 'No arguments. Expecting at least one.' if keys.empty?
33
+
34
+ @keys = keys
35
+ end
36
+
37
+ # @private
38
+ def matches?(available_parameters)
39
+ parameter = available_parameters.shift
40
+ return false unless parameter.respond_to?(:keys)
41
+
42
+ @keys.map(&:to_matcher).all? do |matcher|
43
+ parameter.keys.any? { |key| matcher.matches?([key]) }
44
+ end
45
+ end
46
+
47
+ # @private
48
+ def mocha_inspect
49
+ "has_keys(#{@keys.mocha_inspect(false)})"
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches +Hash+ containing +value+.
8
6
  #
9
7
  # @param [Object] value expected value.
@@ -22,13 +20,13 @@ module Mocha
22
20
  # object.expects(:method_1).with(has_value(1))
23
21
  # object.method_1('key_2' => 2)
24
22
  # # error raised, because method_1 was not called with Hash containing value: 1
25
- def has_value(value)
23
+ #
24
+ def has_value(value) # rubocop:disable Naming/PredicateName
26
25
  HasValue.new(value)
27
26
  end
28
27
 
29
28
  # Parameter matcher which matches when actual parameter contains +Hash+ entry with expected value.
30
29
  class HasValue < Base
31
-
32
30
  # @private
33
31
  def initialize(value)
34
32
  @value = value
@@ -45,9 +43,6 @@ module Mocha
45
43
  def mocha_inspect
46
44
  "has_value(#{@value.mocha_inspect})"
47
45
  end
48
-
49
46
  end
50
-
51
47
  end
52
-
53
48
  end