mocha 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) 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 +29 -0
  8. data/README.md +110 -106
  9. data/RELEASE.md +306 -1
  10. data/Rakefile +52 -45
  11. data/gemfiles/Gemfile.minitest.latest +1 -0
  12. data/gemfiles/Gemfile.test-unit.latest +2 -5
  13. data/lib/mocha/any_instance_method.rb +9 -62
  14. data/lib/mocha/api.rb +84 -68
  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 -21
  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 +5 -7
  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 +99 -51
  50. data/lib/mocha/mockery.rb +70 -99
  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 +0 -6
  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 +6 -7
  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 +1 -2
  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 +14 -65
  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 +26 -266
  97. data/bin/build-matrix +0 -70
  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 -119
  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_272_test.rb +0 -52
  151. data/test/acceptance/issue_65_test.rb +0 -63
  152. data/test/acceptance/issue_70_test.rb +0 -55
  153. data/test/acceptance/mocha_example_test.rb +0 -98
  154. data/test/acceptance/mocha_test_result_test.rb +0 -84
  155. data/test/acceptance/mock_test.rb +0 -100
  156. data/test/acceptance/mock_with_initializer_block_test.rb +0 -51
  157. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -78
  158. data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -68
  159. data/test/acceptance/optional_parameters_test.rb +0 -70
  160. data/test/acceptance/parameter_matcher_test.rb +0 -337
  161. data/test/acceptance/partial_mocks_test.rb +0 -47
  162. data/test/acceptance/prepend_test.rb +0 -89
  163. data/test/acceptance/raise_exception_test.rb +0 -39
  164. data/test/acceptance/return_value_test.rb +0 -52
  165. data/test/acceptance/sequence_test.rb +0 -192
  166. data/test/acceptance/states_test.rb +0 -70
  167. data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -34
  168. data/test/acceptance/stub_any_instance_method_test.rb +0 -280
  169. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -106
  170. data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -78
  171. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -75
  172. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -112
  173. data/test/acceptance/stub_everything_test.rb +0 -56
  174. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -93
  175. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -69
  176. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -69
  177. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -75
  178. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -78
  179. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
  180. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -70
  181. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -72
  182. data/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb +0 -39
  183. data/test/acceptance/stub_module_method_test.rb +0 -163
  184. data/test/acceptance/stub_test.rb +0 -52
  185. data/test/acceptance/stubba_example_test.rb +0 -102
  186. data/test/acceptance/stubba_test_result_test.rb +0 -66
  187. data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
  188. data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
  189. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -48
  190. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
  191. data/test/acceptance/stubbing_nil_test.rb +0 -61
  192. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -143
  193. data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
  194. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
  195. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
  196. data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
  197. data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
  198. data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
  199. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -35
  200. data/test/acceptance/throw_test.rb +0 -45
  201. data/test/acceptance/unexpected_invocation_test.rb +0 -25
  202. data/test/acceptance/unstubbing_test.rb +0 -168
  203. data/test/assertions.rb +0 -8
  204. data/test/deprecation_disabler.rb +0 -15
  205. data/test/execution_point.rb +0 -36
  206. data/test/integration/mini_test_test.rb +0 -8
  207. data/test/integration/shared_tests.rb +0 -174
  208. data/test/integration/test_unit_test.rb +0 -8
  209. data/test/method_definer.rb +0 -24
  210. data/test/mini_test_result.rb +0 -90
  211. data/test/minitest_result.rb +0 -49
  212. data/test/simple_counter.rb +0 -13
  213. data/test/test_helper.rb +0 -50
  214. data/test/test_runner.rb +0 -58
  215. data/test/test_unit_result.rb +0 -20
  216. data/test/unit/any_instance_method_test.rb +0 -134
  217. data/test/unit/array_inspect_test.rb +0 -16
  218. data/test/unit/backtrace_filter_test.rb +0 -19
  219. data/test/unit/cardinality_test.rb +0 -56
  220. data/test/unit/central_test.rb +0 -100
  221. data/test/unit/change_state_side_effect_test.rb +0 -41
  222. data/test/unit/class_method_test.rb +0 -225
  223. data/test/unit/class_methods_test.rb +0 -40
  224. data/test/unit/configuration_test.rb +0 -38
  225. data/test/unit/date_time_inspect_test.rb +0 -21
  226. data/test/unit/exception_raiser_test.rb +0 -42
  227. data/test/unit/expectation_list_test.rb +0 -82
  228. data/test/unit/expectation_test.rb +0 -497
  229. data/test/unit/hash_inspect_test.rb +0 -16
  230. data/test/unit/hooks_test.rb +0 -29
  231. data/test/unit/in_state_ordering_constraint_test.rb +0 -43
  232. data/test/unit/method_matcher_test.rb +0 -28
  233. data/test/unit/mock_test.rb +0 -342
  234. data/test/unit/mockery_test.rb +0 -151
  235. data/test/unit/module_methods_test.rb +0 -19
  236. data/test/unit/multiple_yields_test.rb +0 -18
  237. data/test/unit/no_yields_test.rb +0 -18
  238. data/test/unit/object_inspect_test.rb +0 -39
  239. data/test/unit/object_methods_test.rb +0 -46
  240. data/test/unit/parameter_matchers/all_of_test.rb +0 -26
  241. data/test/unit/parameter_matchers/any_of_test.rb +0 -26
  242. data/test/unit/parameter_matchers/anything_test.rb +0 -21
  243. data/test/unit/parameter_matchers/equals_test.rb +0 -25
  244. data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
  245. data/test/unit/parameter_matchers/has_entry_test.rb +0 -129
  246. data/test/unit/parameter_matchers/has_key_test.rb +0 -55
  247. data/test/unit/parameter_matchers/has_value_test.rb +0 -57
  248. data/test/unit/parameter_matchers/includes_test.rb +0 -102
  249. data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
  250. data/test/unit/parameter_matchers/is_a_test.rb +0 -25
  251. data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
  252. data/test/unit/parameter_matchers/not_test.rb +0 -26
  253. data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
  254. data/test/unit/parameter_matchers/responds_with_test.rb +0 -32
  255. data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
  256. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
  257. data/test/unit/parameters_matcher_test.rb +0 -121
  258. data/test/unit/receivers_test.rb +0 -66
  259. data/test/unit/return_values_test.rb +0 -63
  260. data/test/unit/sequence_test.rb +0 -104
  261. data/test/unit/single_return_value_test.rb +0 -14
  262. data/test/unit/single_yield_test.rb +0 -18
  263. data/test/unit/state_machine_test.rb +0 -98
  264. data/test/unit/string_inspect_test.rb +0 -11
  265. data/test/unit/thrower_test.rb +0 -20
  266. 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
  #
@@ -68,36 +66,37 @@ module Mocha
68
66
 
69
67
  # Parameter matcher which matches when actual parameter includes expected values.
70
68
  class Includes < Base
71
-
72
69
  # @private
73
70
  def initialize(*items)
74
71
  @items = items
75
72
  end
76
73
 
77
74
  # @private
75
+ # rubocop:disable Metrics/PerceivedComplexity
78
76
  def matches?(available_parameters)
79
77
  parameter = available_parameters.shift
80
78
  return false unless parameter.respond_to?(:include?)
81
79
  if @items.size == 1
80
+ # rubocop:disable Style/GuardClause
82
81
  if parameter.respond_to?(:any?) && !parameter.is_a?(String)
83
- return parameter.any? { |(p,_)| @items.first.to_matcher.matches?([p]) }
82
+ parameter = parameter.keys if parameter.is_a?(Hash)
83
+ return parameter.any? { |p| @items.first.to_matcher.matches?([p]) }
84
84
  else
85
85
  return parameter.include?(@items.first)
86
86
  end
87
+ # rubocop:enable Style/GuardClause
87
88
  else
88
89
  includes_matchers = @items.map { |item| Includes.new(item) }
89
90
  AllOf.new(*includes_matchers).matches?([parameter])
90
91
  end
91
92
  end
93
+ # rubocop:enable Metrics/PerceivedComplexity
92
94
 
93
95
  # @private
94
96
  def mocha_inspect
95
97
  item_descriptions = @items.map(&:mocha_inspect)
96
98
  "includes(#{item_descriptions.join(', ')})"
97
99
  end
98
-
99
100
  end
100
-
101
101
  end
102
-
103
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
@@ -1,4 +1,3 @@
1
1
  module Mocha
2
- PRE_RUBY_V19 = Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('1.9')
3
- RUBY_V2_PLUS = Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2')
2
+ RUBY_V27_PLUS = Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.7')
4
3
  end
@@ -1,16 +1,14 @@
1
1
  module Mocha
2
-
3
2
  # Used to constrain the order in which expectations can occur.
4
3
  #
5
4
  # @see API#sequence
6
5
  # @see Expectation#in_sequence
7
6
  class Sequence
8
-
9
7
  # @private
10
8
  class InSequenceOrderingConstraint
11
-
12
9
  def initialize(sequence, index)
13
- @sequence, @index = sequence, index
10
+ @sequence = sequence
11
+ @index = index
14
12
  end
15
13
 
16
14
  def allows_invocation_now?
@@ -20,7 +18,6 @@ module Mocha
20
18
  def mocha_inspect
21
19
  "in sequence #{@sequence.mocha_inspect}"
22
20
  end
23
-
24
21
  end
25
22
 
26
23
  # @private
@@ -38,14 +35,12 @@ module Mocha
38
35
 
39
36
  # @private
40
37
  def satisfied_to_index?(index)
41
- @expectations[0...index].all? { |expectation| expectation.satisfied? }
38
+ @expectations[0...index].all?(&:satisfied?)
42
39
  end
43
40
 
44
41
  # @private
45
42
  def mocha_inspect
46
- "#{@name.mocha_inspect}"
43
+ @name.mocha_inspect.to_s
47
44
  end
48
-
49
45
  end
50
-
51
46
  end
@@ -1,17 +1,14 @@
1
1
  require 'mocha/is_a'
2
2
 
3
3
  module Mocha
4
-
5
4
  class SingleReturnValue
6
-
7
5
  def initialize(value)
8
6
  @value = value
9
7
  end
10
8
 
11
- def evaluate
9
+ def evaluate(invocation)
10
+ invocation.returned(@value)
12
11
  @value
13
12
  end
14
-
15
13
  end
16
-
17
14
  end