mocha 1.1.0 → 1.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (263) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +1 -0
  3. data/.rubocop.yml +61 -0
  4. data/.rubocop_todo.yml +27 -0
  5. data/.yardopts +1 -0
  6. data/CONTRIBUTING.md +4 -9
  7. data/README.md +114 -28
  8. data/RELEASE.md +248 -1
  9. data/Rakefile +53 -35
  10. data/gemfiles/Gemfile.test-unit.latest +5 -1
  11. data/init.rb +1 -3
  12. data/lib/mocha/any_instance_method.rb +12 -72
  13. data/lib/mocha/api.rb +121 -56
  14. data/lib/mocha/argument_iterator.rb +4 -8
  15. data/lib/mocha/backtrace_filter.rb +1 -5
  16. data/lib/mocha/block_matcher.rb +31 -0
  17. data/lib/mocha/cardinality.rb +60 -49
  18. data/lib/mocha/central.rb +21 -12
  19. data/lib/mocha/change_state_side_effect.rb +0 -4
  20. data/lib/mocha/class_methods.rb +19 -20
  21. data/lib/mocha/configuration.rb +361 -18
  22. data/lib/mocha/debug.rb +3 -2
  23. data/lib/mocha/deprecation.rb +8 -11
  24. data/lib/mocha/detection/mini_test.rb +0 -2
  25. data/lib/mocha/detection/test_unit.rb +3 -5
  26. data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
  27. data/lib/mocha/exception_raiser.rb +4 -6
  28. data/lib/mocha/expectation.rb +125 -89
  29. data/lib/mocha/expectation_error.rb +1 -1
  30. data/lib/mocha/expectation_error_factory.rb +0 -1
  31. data/lib/mocha/expectation_list.rb +7 -11
  32. data/lib/mocha/hooks.rb +1 -3
  33. data/lib/mocha/in_state_ordering_constraint.rb +0 -4
  34. data/lib/mocha/inspect.rb +30 -38
  35. data/lib/mocha/instance_method.rb +15 -8
  36. data/lib/mocha/integration/mini_test/adapter.rb +2 -4
  37. data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
  38. data/lib/mocha/integration/mini_test/nothing.rb +4 -4
  39. data/lib/mocha/integration/mini_test/version_13.rb +4 -1
  40. data/lib/mocha/integration/mini_test/version_140.rb +4 -1
  41. data/lib/mocha/integration/mini_test/version_141.rb +4 -1
  42. data/lib/mocha/integration/mini_test/version_142_to_172.rb +4 -1
  43. data/lib/mocha/integration/mini_test/version_200.rb +4 -1
  44. data/lib/mocha/integration/mini_test/version_201_to_222.rb +4 -1
  45. data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +4 -1
  46. data/lib/mocha/integration/mini_test/version_2112_to_320.rb +4 -1
  47. data/lib/mocha/integration/mini_test/version_230_to_2101.rb +4 -1
  48. data/lib/mocha/integration/mini_test.rb +7 -0
  49. data/lib/mocha/integration/monkey_patcher.rb +8 -2
  50. data/lib/mocha/integration/test_unit/adapter.rb +5 -6
  51. data/lib/mocha/integration/test_unit/gem_version_200.rb +5 -2
  52. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +5 -2
  53. data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +5 -2
  54. data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +5 -2
  55. data/lib/mocha/integration/test_unit/nothing.rb +4 -4
  56. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +4 -1
  57. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +4 -1
  58. data/lib/mocha/integration/test_unit.rb +7 -0
  59. data/lib/mocha/integration.rb +2 -5
  60. data/lib/mocha/invocation.rb +77 -0
  61. data/lib/mocha/is_a.rb +0 -2
  62. data/lib/mocha/logger.rb +0 -4
  63. data/lib/mocha/macos_version.rb +5 -0
  64. data/lib/mocha/method_matcher.rb +1 -5
  65. data/lib/mocha/minitest.rb +8 -0
  66. data/lib/mocha/mock.rb +94 -46
  67. data/lib/mocha/mockery.rb +72 -98
  68. data/lib/mocha/names.rb +2 -12
  69. data/lib/mocha/not_initialized_error.rb +7 -0
  70. data/lib/mocha/object_methods.rb +25 -31
  71. data/lib/mocha/parameter_matchers/all_of.rb +2 -8
  72. data/lib/mocha/parameter_matchers/any_of.rb +2 -8
  73. data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
  74. data/lib/mocha/parameter_matchers/anything.rb +2 -8
  75. data/lib/mocha/parameter_matchers/base.rb +6 -12
  76. data/lib/mocha/parameter_matchers/equals.rb +1 -7
  77. data/lib/mocha/parameter_matchers/{query_string.rb → equivalent_uri.rb} +15 -15
  78. data/lib/mocha/parameter_matchers/has_entries.rb +2 -7
  79. data/lib/mocha/parameter_matchers/has_entry.rb +26 -21
  80. data/lib/mocha/parameter_matchers/has_key.rb +2 -7
  81. data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
  82. data/lib/mocha/parameter_matchers/has_value.rb +2 -7
  83. data/lib/mocha/parameter_matchers/includes.rb +50 -8
  84. data/lib/mocha/parameter_matchers/instance_methods.rb +18 -0
  85. data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
  86. data/lib/mocha/parameter_matchers/is_a.rb +2 -7
  87. data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
  88. data/lib/mocha/parameter_matchers/not.rb +2 -7
  89. data/lib/mocha/parameter_matchers/optionally.rb +4 -10
  90. data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
  91. data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
  92. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
  93. data/lib/mocha/parameter_matchers.rb +3 -4
  94. data/lib/mocha/parameters_matcher.rb +6 -9
  95. data/lib/mocha/raised_exception.rb +11 -0
  96. data/lib/mocha/receivers.rb +10 -14
  97. data/lib/mocha/return_values.rb +4 -8
  98. data/lib/mocha/ruby_version.rb +4 -0
  99. data/lib/mocha/sequence.rb +4 -9
  100. data/lib/mocha/setup.rb +5 -0
  101. data/lib/mocha/single_return_value.rb +2 -5
  102. data/lib/mocha/singleton_class.rb +9 -0
  103. data/lib/mocha/state_machine.rb +33 -46
  104. data/lib/mocha/stubbed_method.rb +125 -0
  105. data/lib/mocha/stubbing_error.rb +2 -13
  106. data/lib/mocha/test_unit.rb +7 -2
  107. data/lib/mocha/thrower.rb +4 -6
  108. data/lib/mocha/thrown_object.rb +12 -0
  109. data/lib/mocha/version.rb +1 -1
  110. data/lib/mocha/yield_parameters.rb +7 -17
  111. data/lib/mocha.rb +8 -0
  112. data/mocha.gemspec +42 -40
  113. data/yard-templates/default/layout/html/google_analytics.erb +6 -9
  114. data/yard-templates/default/layout/html/setup.rb +2 -3
  115. metadata +45 -191
  116. data/bin/build-matrix +0 -71
  117. data/gemfiles/Gemfile.minitest.1.3.0 +0 -7
  118. data/gemfiles/Gemfile.minitest.1.4.0 +0 -7
  119. data/gemfiles/Gemfile.minitest.1.4.1 +0 -7
  120. data/gemfiles/Gemfile.minitest.1.4.2 +0 -7
  121. data/gemfiles/Gemfile.minitest.2.0.0 +0 -7
  122. data/gemfiles/Gemfile.minitest.2.0.1 +0 -7
  123. data/gemfiles/Gemfile.minitest.2.11.0 +0 -7
  124. data/gemfiles/Gemfile.minitest.2.11.2 +0 -7
  125. data/gemfiles/Gemfile.minitest.2.3.0 +0 -7
  126. data/gemfiles/Gemfile.test-unit.2.0.0 +0 -7
  127. data/gemfiles/Gemfile.test-unit.2.0.1 +0 -7
  128. data/gemfiles/Gemfile.test-unit.2.0.3 +0 -7
  129. data/lib/mocha/class_method.rb +0 -127
  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/single_yield.rb +0 -18
  138. data/lib/mocha/standalone.rb +0 -4
  139. data/lib/mocha/unexpected_invocation.rb +0 -26
  140. data/lib/mocha_standalone.rb +0 -4
  141. data/test/acceptance/acceptance_test_helper.rb +0 -41
  142. data/test/acceptance/bug_18914_test.rb +0 -43
  143. data/test/acceptance/bug_21465_test.rb +0 -34
  144. data/test/acceptance/bug_21563_test.rb +0 -25
  145. data/test/acceptance/exception_rescue_test.rb +0 -55
  146. data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -55
  147. data/test/acceptance/expected_invocation_count_test.rb +0 -232
  148. data/test/acceptance/failure_messages_test.rb +0 -64
  149. data/test/acceptance/issue_65_test.rb +0 -63
  150. data/test/acceptance/issue_70_test.rb +0 -55
  151. data/test/acceptance/mocha_example_test.rb +0 -98
  152. data/test/acceptance/mocha_test_result_test.rb +0 -84
  153. data/test/acceptance/mock_test.rb +0 -100
  154. data/test/acceptance/mock_with_initializer_block_test.rb +0 -51
  155. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -78
  156. data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -68
  157. data/test/acceptance/optional_parameters_test.rb +0 -70
  158. data/test/acceptance/parameter_matcher_test.rb +0 -337
  159. data/test/acceptance/partial_mocks_test.rb +0 -47
  160. data/test/acceptance/prepend_test.rb +0 -88
  161. data/test/acceptance/raise_exception_test.rb +0 -39
  162. data/test/acceptance/return_value_test.rb +0 -52
  163. data/test/acceptance/sequence_test.rb +0 -192
  164. data/test/acceptance/states_test.rb +0 -70
  165. data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -34
  166. data/test/acceptance/stub_any_instance_method_test.rb +0 -238
  167. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -106
  168. data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -78
  169. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -75
  170. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -112
  171. data/test/acceptance/stub_everything_test.rb +0 -56
  172. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -93
  173. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -69
  174. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -69
  175. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -75
  176. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -75
  177. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
  178. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -70
  179. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -72
  180. data/test/acceptance/stub_module_method_test.rb +0 -163
  181. data/test/acceptance/stub_test.rb +0 -52
  182. data/test/acceptance/stubba_example_test.rb +0 -102
  183. data/test/acceptance/stubba_test_result_test.rb +0 -66
  184. data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
  185. data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
  186. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -48
  187. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
  188. data/test/acceptance/stubbing_nil_test.rb +0 -59
  189. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -130
  190. data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
  191. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
  192. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
  193. data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
  194. data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
  195. data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
  196. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -35
  197. data/test/acceptance/throw_test.rb +0 -45
  198. data/test/acceptance/unexpected_invocation_test.rb +0 -25
  199. data/test/acceptance/unstubbing_test.rb +0 -168
  200. data/test/assertions.rb +0 -6
  201. data/test/deprecation_disabler.rb +0 -15
  202. data/test/execution_point.rb +0 -36
  203. data/test/integration/mini_test_test.rb +0 -8
  204. data/test/integration/shared_tests.rb +0 -174
  205. data/test/integration/test_unit_test.rb +0 -8
  206. data/test/method_definer.rb +0 -24
  207. data/test/mini_test_result.rb +0 -90
  208. data/test/minitest_result.rb +0 -49
  209. data/test/simple_counter.rb +0 -13
  210. data/test/test_helper.rb +0 -50
  211. data/test/test_runner.rb +0 -58
  212. data/test/test_unit_result.rb +0 -20
  213. data/test/unit/any_instance_method_test.rb +0 -132
  214. data/test/unit/array_inspect_test.rb +0 -16
  215. data/test/unit/backtrace_filter_test.rb +0 -19
  216. data/test/unit/cardinality_test.rb +0 -56
  217. data/test/unit/central_test.rb +0 -100
  218. data/test/unit/change_state_side_effect_test.rb +0 -41
  219. data/test/unit/class_method_test.rb +0 -223
  220. data/test/unit/class_methods_test.rb +0 -40
  221. data/test/unit/configuration_test.rb +0 -38
  222. data/test/unit/date_time_inspect_test.rb +0 -21
  223. data/test/unit/exception_raiser_test.rb +0 -42
  224. data/test/unit/expectation_list_test.rb +0 -82
  225. data/test/unit/expectation_test.rb +0 -497
  226. data/test/unit/hash_inspect_test.rb +0 -16
  227. data/test/unit/hooks_test.rb +0 -29
  228. data/test/unit/in_state_ordering_constraint_test.rb +0 -43
  229. data/test/unit/method_matcher_test.rb +0 -28
  230. data/test/unit/mock_test.rb +0 -341
  231. data/test/unit/mockery_test.rb +0 -151
  232. data/test/unit/module_methods_test.rb +0 -19
  233. data/test/unit/multiple_yields_test.rb +0 -18
  234. data/test/unit/no_yields_test.rb +0 -18
  235. data/test/unit/object_inspect_test.rb +0 -38
  236. data/test/unit/object_methods_test.rb +0 -46
  237. data/test/unit/parameter_matchers/all_of_test.rb +0 -26
  238. data/test/unit/parameter_matchers/any_of_test.rb +0 -26
  239. data/test/unit/parameter_matchers/anything_test.rb +0 -21
  240. data/test/unit/parameter_matchers/equals_test.rb +0 -25
  241. data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
  242. data/test/unit/parameter_matchers/has_entry_test.rb +0 -129
  243. data/test/unit/parameter_matchers/has_key_test.rb +0 -55
  244. data/test/unit/parameter_matchers/has_value_test.rb +0 -57
  245. data/test/unit/parameter_matchers/includes_test.rb +0 -59
  246. data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
  247. data/test/unit/parameter_matchers/is_a_test.rb +0 -25
  248. data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
  249. data/test/unit/parameter_matchers/not_test.rb +0 -26
  250. data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
  251. data/test/unit/parameter_matchers/responds_with_test.rb +0 -32
  252. data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
  253. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
  254. data/test/unit/parameters_matcher_test.rb +0 -121
  255. data/test/unit/receivers_test.rb +0 -66
  256. data/test/unit/return_values_test.rb +0 -63
  257. data/test/unit/sequence_test.rb +0 -104
  258. data/test/unit/single_return_value_test.rb +0 -14
  259. data/test/unit/single_yield_test.rb +0 -18
  260. data/test/unit/state_machine_test.rb +0 -98
  261. data/test/unit/string_inspect_test.rb +0 -11
  262. data/test/unit/thrower_test.rb +0 -20
  263. data/test/unit/yield_parameters_test.rb +0 -93
data/lib/mocha/names.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  module Mocha
2
-
3
2
  class ImpersonatingName
4
-
5
3
  def initialize(object)
6
4
  @object = object
7
5
  end
@@ -9,11 +7,9 @@ module Mocha
9
7
  def mocha_inspect
10
8
  @object.mocha_inspect
11
9
  end
12
-
13
10
  end
14
11
 
15
12
  class ImpersonatingAnyInstanceName
16
-
17
13
  def initialize(klass)
18
14
  @klass = klass
19
15
  end
@@ -21,23 +17,19 @@ module Mocha
21
17
  def mocha_inspect
22
18
  "#<AnyInstance:#{@klass.mocha_inspect}>"
23
19
  end
24
-
25
20
  end
26
21
 
27
22
  class Name
28
-
29
23
  def initialize(name)
30
- @name = name
24
+ @name = name.to_s
31
25
  end
32
26
 
33
27
  def mocha_inspect
34
28
  "#<Mock:#{@name}>"
35
29
  end
36
-
37
30
  end
38
31
 
39
32
  class DefaultName
40
-
41
33
  def initialize(mock)
42
34
  @mock = mock
43
35
  end
@@ -45,9 +37,7 @@ module Mocha
45
37
  def mocha_inspect
46
38
  address = @mock.__id__ * 2
47
39
  address += 0x100000000 if address < 0
48
- "#<Mock:0x#{'%x' % address}>"
40
+ "#<Mock:0x#{format('%x', address)}>"
49
41
  end
50
-
51
42
  end
52
-
53
43
  end
@@ -0,0 +1,7 @@
1
+ require 'mocha/error_with_filtered_backtrace'
2
+
3
+ module Mocha
4
+ # Exception raised when Mocha has not been initialized, e.g. outside the
5
+ # context of a test.
6
+ class NotInitializedError < ErrorWithFilteredBacktrace; end
7
+ end
@@ -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,10 +1,7 @@
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
6
  def to_matcher
10
7
  self
@@ -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,34 @@
1
+ require 'mocha/deprecation'
1
2
  require 'mocha/parameter_matchers/base'
2
3
  require 'uri'
4
+ require 'cgi'
3
5
 
4
6
  module Mocha
5
7
  module ParameterMatchers
6
-
7
8
  # Matches a URI without regard to the ordering of parameters in the query string.
8
9
  #
9
10
  # @param [String] uri URI to match.
10
- # @return [QueryStringMatches] parameter matcher.
11
+ # @return [EquivalentUri] parameter matcher.
11
12
  #
12
13
  # @see Expectation#with
13
14
  #
14
- # @example Actual URI has equivalent query string.
15
+ # @example Actual URI is equivalent.
15
16
  # object = mock()
16
- # object.expects(:method_1).with(has_equivalent_query_string('http://example.com/foo?a=1&b=2))
17
+ # object.expects(:method_1).with(equivalent_uri('http://example.com/foo?a=1&b=2))
17
18
  # object.method_1('http://example.com/foo?b=2&a=1')
18
19
  # # no error raised
19
20
  #
20
- # @example Actual URI does not have equivalent query string.
21
+ # @example Actual URI is not equivalent.
21
22
  # object = mock()
22
- # object.expects(:method_1).with(has_equivalent_query_string('http://example.com/foo?a=1&b=2))
23
+ # object.expects(:method_1).with(equivalent_uri('http://example.com/foo?a=1&b=2))
23
24
  # object.method_1('http://example.com/foo?a=1&b=3')
24
25
  # # error raised, because the query parameters were different
25
- def has_equivalent_query_string(uri)
26
- QueryStringMatches.new(uri)
26
+ def equivalent_uri(uri)
27
+ EquivalentUri.new(uri)
27
28
  end
28
29
 
29
30
  # Parameter matcher which matches URIs with equivalent query strings.
30
- class QueryStringMatches < Base
31
-
31
+ class EquivalentUri < Base
32
32
  # @private
33
33
  def initialize(uri)
34
34
  @uri = URI.parse(uri)
@@ -43,16 +43,16 @@ module Mocha
43
43
 
44
44
  # @private
45
45
  def mocha_inspect
46
- "has_equivalent_query_string(#{@uri.mocha_inspect})"
46
+ "equivalent_uri(#{@uri.mocha_inspect})"
47
47
  end
48
48
 
49
- private
49
+ private
50
+
50
51
  # @private
51
52
  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)
53
+ query_hash = CGI.parse(uri.query || '')
54
+ URI::Generic::COMPONENT.inject({}) { |h, k| h.merge(k => uri.__send__(k)) }.merge(:query => query_hash)
54
55
  end
55
-
56
56
  end
57
57
  end
58
58
  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