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
@@ -2,9 +2,7 @@ require 'mocha/parameter_matchers/all_of'
2
2
  require 'mocha/parameter_matchers/base'
3
3
 
4
4
  module Mocha
5
-
6
5
  module ParameterMatchers
7
-
8
6
  # Matches any object that responds with +true+ to +include?(item)+
9
7
  # for all items.
10
8
  #
@@ -22,39 +20,83 @@ module Mocha
22
20
  # @example Actual parameter does not include all items.
23
21
  # object.method_1(['foo', 'baz'])
24
22
  # # error raised, because ['foo', 'baz'] does not include 'bar'.
23
+ #
24
+ # @example Actual parameter includes item which matches nested matcher.
25
+ # object = mock()
26
+ # object.expects(:method_1).with(includes(has_key(:key)))
27
+ # object.method_1(['foo', 'bar', {:key => 'baz'}])
28
+ # # no error raised
29
+ #
30
+ # @example Actual parameter does not include item matching nested matcher.
31
+ # object.method_1(['foo', 'bar', {:other_key => 'baz'}])
32
+ # # error raised, because no element matches `has_key(:key)` matcher
33
+ #
34
+ # @example Actual parameter is a String including substring.
35
+ # object = mock()
36
+ # object.expects(:method_1).with(includes('bar'))
37
+ # object.method_1('foobarbaz')
38
+ # # no error raised
39
+ #
40
+ # @example Actual parameter is a String not including substring.
41
+ # object.method_1('foobaz')
42
+ # # error raised, because 'foobaz' does not include 'bar'
43
+ #
44
+ # @example Actual parameter is a Hash including the given key.
45
+ # object = mock()
46
+ # object.expects(:method_1).with(includes(:bar))
47
+ # object.method_1({:foo => 1, :bar => 2})
48
+ # # no error raised
49
+ #
50
+ # @example Actual parameter is a Hash without the given key.
51
+ # object.method_1({:foo => 1, :baz => 2})
52
+ # # error raised, because hash does not include key 'bar'
53
+ #
54
+ # @example Actual parameter is a Hash with a key matching the given matcher.
55
+ # object = mock()
56
+ # object.expects(:method_1).with(includes(regexp_matches(/ar/)))
57
+ # object.method_1({'foo' => 1, 'bar' => 2})
58
+ # # no error raised
59
+ #
60
+ # @example Actual parameter is a Hash no key matching the given matcher.
61
+ # object.method_1({'foo' => 1, 'baz' => 3})
62
+ # # error raised, because hash does not include a key matching /ar/
25
63
  def includes(*items)
26
64
  Includes.new(*items)
27
65
  end
28
66
 
29
67
  # Parameter matcher which matches when actual parameter includes expected values.
30
68
  class Includes < Base
31
-
32
69
  # @private
33
70
  def initialize(*items)
34
71
  @items = items
35
72
  end
36
73
 
37
74
  # @private
75
+ # rubocop:disable Metrics/PerceivedComplexity
38
76
  def matches?(available_parameters)
39
77
  parameter = available_parameters.shift
40
78
  return false unless parameter.respond_to?(:include?)
41
-
42
79
  if @items.size == 1
43
- return parameter.include?(@items.first)
80
+ # rubocop:disable Style/GuardClause
81
+ if parameter.respond_to?(:any?) && !parameter.is_a?(String)
82
+ parameter = parameter.keys if parameter.is_a?(Hash)
83
+ return parameter.any? { |p| @items.first.to_matcher.matches?([p]) }
84
+ else
85
+ return parameter.include?(@items.first)
86
+ end
87
+ # rubocop:enable Style/GuardClause
44
88
  else
45
89
  includes_matchers = @items.map { |item| Includes.new(item) }
46
90
  AllOf.new(*includes_matchers).matches?([parameter])
47
91
  end
48
92
  end
93
+ # rubocop:enable Metrics/PerceivedComplexity
49
94
 
50
95
  # @private
51
96
  def mocha_inspect
52
97
  item_descriptions = @items.map(&:mocha_inspect)
53
98
  "includes(#{item_descriptions.join(', ')})"
54
99
  end
55
-
56
100
  end
57
-
58
101
  end
59
-
60
102
  end
@@ -0,0 +1,27 @@
1
+ require 'mocha/parameter_matchers/equals'
2
+ require 'mocha/parameter_matchers/positional_or_keyword_hash'
3
+
4
+ module Mocha
5
+ module ParameterMatchers
6
+ # @private
7
+ module InstanceMethods
8
+ # @private
9
+ def to_matcher(_expectation = nil)
10
+ Mocha::ParameterMatchers::Equals.new(self)
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ # @private
17
+ class Object
18
+ include Mocha::ParameterMatchers::InstanceMethods
19
+ end
20
+
21
+ # @private
22
+ class Hash
23
+ # @private
24
+ def to_matcher(expectation = nil)
25
+ Mocha::ParameterMatchers::PositionalOrKeywordHash.new(self, expectation)
26
+ end
27
+ 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 that is an instance of +klass+
8
6
  #
9
7
  # @param [Class] klass expected class.
@@ -29,7 +27,6 @@ module Mocha
29
27
 
30
28
  # Parameter matcher which matches when actual parameter is an instance of the specified class.
31
29
  class InstanceOf < Base
32
-
33
30
  # @private
34
31
  def initialize(klass)
35
32
  @klass = klass
@@ -45,9 +42,6 @@ module Mocha
45
42
  def mocha_inspect
46
43
  "instance_of(#{@klass.mocha_inspect})"
47
44
  end
48
-
49
45
  end
50
-
51
46
  end
52
-
53
47
  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 that is a +klass+.
8
6
  #
9
7
  # @param [Class] klass expected class.
@@ -23,13 +21,13 @@ module Mocha
23
21
  # object.expects(:method_1).with(is_a(Integer))
24
22
  # object.method_1('string')
25
23
  # # error raised, because method_1 was not called with an Integer
26
- def is_a(klass)
24
+ #
25
+ def is_a(klass) # rubocop:disable Naming/PredicateName
27
26
  IsA.new(klass)
28
27
  end
29
28
 
30
29
  # Parameter matcher which matches when actual parameter is a specific class.
31
30
  class IsA < Base
32
-
33
31
  # @private
34
32
  def initialize(klass)
35
33
  @klass = klass
@@ -45,9 +43,6 @@ module Mocha
45
43
  def mocha_inspect
46
44
  "is_a(#{@klass.mocha_inspect})"
47
45
  end
48
-
49
46
  end
50
-
51
47
  end
52
-
53
48
  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+ that is a kind of +klass+.
8
6
  #
9
7
  # @param [Class] klass expected class.
@@ -29,7 +27,6 @@ module Mocha
29
27
 
30
28
  # Parameter matcher which matches when actual parameter is a kind of specified class.
31
29
  class KindOf < Base
32
-
33
30
  # @private
34
31
  def initialize(klass)
35
32
  @klass = klass
@@ -38,16 +35,15 @@ module Mocha
38
35
  # @private
39
36
  def matches?(available_parameters)
40
37
  parameter = available_parameters.shift
38
+ # rubocop:disable Style/ClassCheck
41
39
  parameter.kind_of?(@klass)
40
+ # rubocop:enable Style/ClassCheck
42
41
  end
43
42
 
44
43
  # @private
45
44
  def mocha_inspect
46
45
  "kind_of(#{@klass.mocha_inspect})"
47
46
  end
48
-
49
47
  end
50
-
51
48
  end
52
-
53
49
  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 if +matcher+ does *not* match.
8
6
  #
9
7
  # @param [Base] matcher matcher whose logic to invert.
@@ -22,13 +20,13 @@ module Mocha
22
20
  # object.expects(:method_1).with(Not(includes(1)))
23
21
  # object.method_1([0, 1, 2, 3])
24
22
  # # error raised, because method_1 was not called with object not including 1
25
- def Not(matcher)
23
+ #
24
+ def Not(matcher) # rubocop:disable Naming/MethodName
26
25
  Not.new(matcher)
27
26
  end
28
27
 
29
28
  # Parameter matcher which inverts the logic of the specified matcher using a logical NOT operation.
30
29
  class Not < Base
31
-
32
30
  # @private
33
31
  def initialize(matcher)
34
32
  @matcher = matcher
@@ -44,9 +42,6 @@ module Mocha
44
42
  def mocha_inspect
45
43
  "Not(#{@matcher.mocha_inspect})"
46
44
  end
47
-
48
45
  end
49
-
50
46
  end
51
-
52
47
  end
@@ -1,7 +1,5 @@
1
1
  module Mocha
2
-
3
2
  module ParameterMatchers
4
-
5
3
  # Matches optional parameters if available.
6
4
  #
7
5
  # @param [*Array<Base>] matchers matchers for optional parameters.
@@ -38,30 +36,26 @@ module Mocha
38
36
 
39
37
  # Parameter matcher which allows optional parameters to be specified.
40
38
  class Optionally < Base
41
-
42
39
  # @private
43
40
  def initialize(*parameters)
44
- @matchers = parameters.map { |parameter| parameter.to_matcher }
41
+ @matchers = parameters.map(&:to_matcher)
45
42
  end
46
43
 
47
44
  # @private
48
45
  def matches?(available_parameters)
49
46
  index = 0
50
- while (available_parameters.length > 0) && (index < @matchers.length) do
47
+ while !available_parameters.empty? && (index < @matchers.length)
51
48
  matcher = @matchers[index]
52
49
  return false unless matcher.matches?(available_parameters)
53
50
  index += 1
54
51
  end
55
- return true
52
+ true
56
53
  end
57
54
 
58
55
  # @private
59
56
  def mocha_inspect
60
- "optionally(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
57
+ "optionally(#{@matchers.map(&:mocha_inspect).join(', ')})"
61
58
  end
62
-
63
59
  end
64
-
65
60
  end
66
-
67
61
  end
@@ -0,0 +1,64 @@
1
+ require 'mocha/configuration'
2
+ require 'mocha/deprecation'
3
+ require 'mocha/parameter_matchers/base'
4
+
5
+ module Mocha
6
+ module ParameterMatchers
7
+ # @private
8
+ class PositionalOrKeywordHash < Base
9
+ def initialize(value, expectation)
10
+ @value = value
11
+ @expectation = expectation
12
+ end
13
+
14
+ def matches?(available_parameters)
15
+ parameter, is_last_parameter = extract_parameter(available_parameters)
16
+ return false unless parameter == @value
17
+
18
+ if is_last_parameter && !same_type_of_hash?(parameter, @value)
19
+ return false if Mocha.configuration.strict_keyword_argument_matching?
20
+
21
+ deprecation_warning(parameter, @value) if Mocha::RUBY_V27_PLUS
22
+ end
23
+
24
+ true
25
+ end
26
+
27
+ def mocha_inspect
28
+ @value.mocha_inspect
29
+ end
30
+
31
+ private
32
+
33
+ def extract_parameter(available_parameters)
34
+ [available_parameters.shift, available_parameters.empty?]
35
+ end
36
+
37
+ def same_type_of_hash?(actual, expected)
38
+ ruby2_keywords_hash?(actual) == ruby2_keywords_hash?(expected)
39
+ end
40
+
41
+ def deprecation_warning(actual, expected)
42
+ details1 = "Expectation #{expectation_definition} expected #{hash_type(expected)} (#{expected.mocha_inspect}),".squeeze(' ')
43
+ details2 = "but received #{hash_type(actual)} (#{actual.mocha_inspect})."
44
+ sentence1 = 'These will stop matching when strict keyword argument matching is enabled.'
45
+ sentence2 = 'See the documentation for Mocha::Configuration#strict_keyword_argument_matching=.'
46
+ Deprecation.warning([details1, details2, sentence1, sentence2].join(' '))
47
+ end
48
+
49
+ def hash_type(hash)
50
+ ruby2_keywords_hash?(hash) ? 'keyword arguments' : 'positional hash'
51
+ end
52
+
53
+ def ruby2_keywords_hash?(hash)
54
+ hash.is_a?(Hash) && ::Hash.ruby2_keywords_hash?(hash)
55
+ end
56
+
57
+ def expectation_definition
58
+ return nil unless @expectation
59
+
60
+ "defined at #{@expectation.definition_location}"
61
+ end
62
+ end
63
+ end
64
+ 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 that matches +regexp+.
8
6
  #
9
7
  # @param [Regexp] regexp regular expression to match.
@@ -29,7 +27,6 @@ module Mocha
29
27
 
30
28
  # Parameter matcher which matches if specified regular expression matches actual paramter.
31
29
  class RegexpMatches < Base
32
-
33
30
  # @private
34
31
  def initialize(regexp)
35
32
  @regexp = regexp
@@ -46,9 +43,6 @@ module Mocha
46
43
  def mocha_inspect
47
44
  "regexp_matches(#{@regexp.mocha_inspect})"
48
45
  end
49
-
50
46
  end
51
-
52
47
  end
53
-
54
48
  end
@@ -2,9 +2,7 @@ require 'mocha/parameter_matchers/base'
2
2
  require 'yaml'
3
3
 
4
4
  module Mocha
5
-
6
5
  module ParameterMatchers
7
-
8
6
  # Matches any object that responds to +message+ with +result+. To put it another way, it tests the quack, not the duck.
9
7
  #
10
8
  # @param [Symbol] message method to invoke.
@@ -30,25 +28,22 @@ module Mocha
30
28
 
31
29
  # Parameter matcher which matches if actual parameter returns expected result when specified method is invoked.
32
30
  class RespondsWith < Base
33
-
34
31
  # @private
35
32
  def initialize(message, result)
36
- @message, @result = message, result
33
+ @message = message
34
+ @result = result
37
35
  end
38
36
 
39
37
  # @private
40
38
  def matches?(available_parameters)
41
39
  parameter = available_parameters.shift
42
- @result.to_matcher.matches?( [parameter.__send__(@message)] )
40
+ @result.to_matcher.matches?([parameter.__send__(@message)])
43
41
  end
44
42
 
45
43
  # @private
46
44
  def mocha_inspect
47
45
  "responds_with(#{@message.mocha_inspect}, #{@result.mocha_inspect})"
48
46
  end
49
-
50
47
  end
51
-
52
48
  end
53
-
54
49
  end
@@ -2,9 +2,7 @@ require 'mocha/parameter_matchers/base'
2
2
  require 'yaml'
3
3
 
4
4
  module Mocha
5
-
6
5
  module ParameterMatchers
7
-
8
6
  # Matches any YAML that represents the specified +object+
9
7
  #
10
8
  # @param [Object] object object whose YAML to compare.
@@ -29,7 +27,6 @@ module Mocha
29
27
 
30
28
  # Parameter matcher which matches if actual parameter is YAML equivalent of specified object.
31
29
  class YamlEquivalent < Base
32
-
33
30
  # @private
34
31
  def initialize(object)
35
32
  @object = object
@@ -38,16 +35,15 @@ module Mocha
38
35
  # @private
39
36
  def matches?(available_parameters)
40
37
  parameter = available_parameters.shift
38
+ # rubocop:disable Security/YAMLLoad
41
39
  @object == YAML.load(parameter)
40
+ # rubocop:enable Security/YAMLLoad
42
41
  end
43
42
 
44
43
  # @private
45
44
  def mocha_inspect
46
45
  "yaml_equivalent(#{@object.mocha_inspect})"
47
46
  end
48
-
49
47
  end
50
-
51
48
  end
52
-
53
49
  end
@@ -1,11 +1,9 @@
1
1
  module Mocha
2
-
3
2
  # Used as parameters for {Expectation#with} to restrict the parameter values which will match the expectation. Can be nested.
4
3
  module ParameterMatchers; end
5
-
6
4
  end
7
5
 
8
- require 'mocha/parameter_matchers/object'
6
+ require 'mocha/parameter_matchers/instance_methods'
9
7
 
10
8
  require 'mocha/parameter_matchers/all_of'
11
9
  require 'mocha/parameter_matchers/any_of'
@@ -15,6 +13,7 @@ require 'mocha/parameter_matchers/equals'
15
13
  require 'mocha/parameter_matchers/has_entry'
16
14
  require 'mocha/parameter_matchers/has_entries'
17
15
  require 'mocha/parameter_matchers/has_key'
16
+ require 'mocha/parameter_matchers/has_keys'
18
17
  require 'mocha/parameter_matchers/has_value'
19
18
  require 'mocha/parameter_matchers/includes'
20
19
  require 'mocha/parameter_matchers/instance_of'
@@ -25,4 +24,4 @@ require 'mocha/parameter_matchers/optionally'
25
24
  require 'mocha/parameter_matchers/regexp_matches'
26
25
  require 'mocha/parameter_matchers/responds_with'
27
26
  require 'mocha/parameter_matchers/yaml_equivalent'
28
- require 'mocha/parameter_matchers/query_string'
27
+ require 'mocha/parameter_matchers/equivalent_uri'
@@ -2,36 +2,33 @@ require 'mocha/inspect'
2
2
  require 'mocha/parameter_matchers'
3
3
 
4
4
  module Mocha
5
-
6
5
  class ParametersMatcher
7
-
8
- def initialize(expected_parameters = [ParameterMatchers::AnyParameters.new], &matching_block)
9
- @expected_parameters, @matching_block = expected_parameters, matching_block
6
+ def initialize(expected_parameters = [ParameterMatchers::AnyParameters.new], expectation = nil, &matching_block)
7
+ @expected_parameters = expected_parameters
8
+ @expectation = expectation
9
+ @matching_block = matching_block
10
10
  end
11
11
 
12
12
  def match?(actual_parameters = [])
13
13
  if @matching_block
14
- return @matching_block.call(*actual_parameters)
14
+ @matching_block.call(*actual_parameters)
15
15
  else
16
- return parameters_match?(actual_parameters)
16
+ parameters_match?(actual_parameters)
17
17
  end
18
18
  end
19
19
 
20
20
  def parameters_match?(actual_parameters)
21
- matchers.all? { |matcher| matcher.matches?(actual_parameters) } && (actual_parameters.length == 0)
21
+ matchers.all? { |matcher| matcher.matches?(actual_parameters) } && actual_parameters.empty?
22
22
  end
23
23
 
24
24
  def mocha_inspect
25
25
  signature = matchers.mocha_inspect
26
26
  signature = signature.gsub(/^\[|\]$/, '')
27
- signature = signature.gsub(/^\{|\}$/, '') if matchers.length == 1
28
27
  "(#{signature})"
29
28
  end
30
29
 
31
30
  def matchers
32
- @expected_parameters.map { |parameter| parameter.to_matcher }
31
+ @expected_parameters.map { |p| p.to_matcher(@expectation) }
33
32
  end
34
-
35
33
  end
36
-
37
34
  end
@@ -0,0 +1,11 @@
1
+ module Mocha
2
+ class RaisedException
3
+ def initialize(exception)
4
+ @exception = exception
5
+ end
6
+
7
+ def mocha_inspect
8
+ "raised #{@exception}"
9
+ end
10
+ end
11
+ end
@@ -1,41 +1,39 @@
1
1
  module Mocha
2
-
3
2
  class ObjectReceiver
4
-
5
3
  def initialize(object)
6
4
  @object = object
7
5
  end
8
6
 
9
7
  def mocks
10
- object, mocks = @object, []
11
- while object do
12
- mocks << object.mocha
8
+ object = @object
9
+ mocks = []
10
+ while object
11
+ mocha = object.mocha(false)
12
+ mocks << mocha if mocha
13
13
  object = object.is_a?(Class) ? object.superclass : nil
14
14
  end
15
15
  mocks
16
16
  end
17
-
18
17
  end
19
18
 
20
19
  class AnyInstanceReceiver
21
-
22
20
  def initialize(klass)
23
21
  @klass = klass
24
22
  end
25
23
 
26
24
  def mocks
27
- klass, mocks = @klass, []
28
- while klass do
29
- mocks << klass.any_instance.mocha
25
+ klass = @klass
26
+ mocks = []
27
+ while klass
28
+ mocha = klass.any_instance.mocha(false)
29
+ mocks << mocha if mocha
30
30
  klass = klass.superclass
31
31
  end
32
32
  mocks
33
33
  end
34
-
35
34
  end
36
35
 
37
36
  class DefaultReceiver
38
-
39
37
  def initialize(mock)
40
38
  @mock = mock
41
39
  end
@@ -43,7 +41,5 @@ module Mocha
43
41
  def mocks
44
42
  [@mock]
45
43
  end
46
-
47
44
  end
48
-
49
45
  end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/single_return_value'
2
2
 
3
3
  module Mocha
4
-
5
4
  class ReturnValues
6
-
7
5
  def self.build(*values)
8
6
  new(*values.map { |value| SingleReturnValue.new(value) })
9
7
  end
@@ -14,18 +12,16 @@ module Mocha
14
12
  @values = values
15
13
  end
16
14
 
17
- def next
15
+ def next(invocation)
18
16
  case @values.length
19
- when 0 then nil
20
- when 1 then @values.first.evaluate
21
- else @values.shift.evaluate
17
+ when 0 then nil
18
+ when 1 then @values.first.evaluate(invocation)
19
+ else @values.shift.evaluate(invocation)
22
20
  end
23
21
  end
24
22
 
25
23
  def +(other)
26
24
  self.class.new(*(@values + other.values))
27
25
  end
28
-
29
26
  end
30
-
31
27
  end
@@ -0,0 +1,3 @@
1
+ module Mocha
2
+ RUBY_V27_PLUS = Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.7')
3
+ end